Categories
Database Backup

** Discover why mysqldump fails large MySQL databases and learn how to implement enterprise-grade physical backups using Percona XtraBackup and CloudSave to drastically reduce your RTO.

Kwa miongo kadhaa, mysqldump imekuwa zana kuu isiyopingika ya kuhifadhi nakala za hifadhidata za MySQL. Inapatikana kila mahali, ni rahisi kutumia, na inakuja ikiwa imesakinishwa awali na kila usambazaji wa MySQL na MariaDB. Kwa hifadhidata ndogo hadi za wastani, inafanya kazi vizuri sana.

Hata hivyo, kadiri mashirika yanavyokua na seti za data zinapovuka vizingiti vya 100GB, 500GB, au terabaiti nyingi, kutegemea mysqldump kunabadilika kutoka kuwa mbinu bora na kuwa hatari kubwa ya kiusanifu. Ikiwa wewe ni DBA au mhandisi wa DevOps anayesimamia hifadhidata kubwa za uzalishaji, huenda umeshapata uzoefu wa hitilafu zisizojulikana, kushuka kwa utendaji wa uzalishaji, na Malengo ya Muda wa Urejeshaji (RTO) yasiyokubalika yanayohusiana na nakala za kimantiki (logical dumps).

Katika makala haya, tutachambua mapungufu ya kiusanifu ya mysqldump, tutachunguza kwa nini inashindwa kwa kiwango kikubwa, na tutaelezea jinsi ya kutekeleza mikakati ya kuhifadhi nakala za kimwili (physical backups) ya kiwango cha biashara ili kulinda data yako muhimu.

Mapungufu ya Kiusanifu ya mysqldump

Ili kuelewa kwa nini mysqldump inashindwa kwa kiwango kikubwa, lazima tuchunguze jinsi inavyofanya kazi kwa ndani. mysqldump hufanya nakala za kimantiki. Inauliza injini ya hifadhidata, inasoma data, na kuitafsiri kuwa mfululizo wa amri za SQL (hasa CREATE TABLE na INSERT INTO).

Ingawa hii inatengeneza faili inayoweza kubebeka kwa urahisi na inayoweza kusomeka na binadamu, inaleta vikwazo vikali katika mazingira yenye mtiririko mkubwa wa data.

1. Kikwazo cha Thread Moja (Single-Threaded Bottleneck)

Kwa muundo wake, mysqldump ni operesheni ya thread moja. Inachakata jedwali moja kwa wakati mmoja, mstari kwa mstari. Ingawa vifaa vya kisasa vina makumi ya cores za CPU na hifadhi ya NVMe inayoweza kufikia gigabytes kwa sekunde, mysqldump hutumia sehemu ndogo tu ya rasilimali hizi.

Hata unapotumia alama za kawaida kwa majedwali ya InnoDB:

mysqldump -u root -p --single-transaction --routines --triggers --events --quick production_db > backup.sql

Alama ya --quick inalazimisha mysqldump kuchota mistari moja baada ya nyingine badala ya kuhifadhi jedwali zima kwenye kumbukumbu, jambo ambalo huzuia hitilafu za “Out of Memory” (OOM) kwa upande wa mteja. Hata hivyo, asili ya thread moja inamaanisha kuwa hifadhidata ya 500GB inaweza kuchukua saa 10 hadi 15 kuhifadhiwa, jambo linaloathiri vibaya Lengo lako la Muda wa Urejeshaji (RPO).

2. Uchafuzi wa InnoDB Buffer Pool

Wakati mysqldump inaposoma kila mstari wa kila jedwali, inalazimisha injini ya MySQL kupakia data hiyo kutoka kwenye diski hadi kwenye InnoDB buffer pool. Katika mazingira ya uzalishaji, buffer pool yako imejazwa kwa uangalifu na seti yako ya data inayotumika mara kwa mara (“hot” working dataset).

Nakala kubwa ya kimantiki itafagia buffer pool, ikiondoa faharasa (indexes) na kurasa za data zinazofikiwa mara kwa mara ili kupata nafasi kwa data baridi inayohifadhiwa. Hii husababisha ongezeko la ghafla na kubwa la I/O ya diski kwani hoja za uzalishaji (production queries) zinalazimika kusoma kutoka kwenye diski, na kusababisha ucheleweshaji mkubwa wa programu.

3. Metadata Locks na Migogoro ya DDL

Ili kudumisha uthabiti, DBA hutegemea alama ya --single-transaction, ambayo huweka kiwango cha kutengwa kwa miamala (transaction isolation level) kuwa REPEATABLE READ na kuanzisha muamala kabla ya kuhifadhi data.

Ingawa hii inazuia kufuli za kusoma za kiwango cha jedwali (FLUSH TABLES WITH READ LOCK), haitoi ulinzi dhidi ya mabadiliko ya Lugha ya Ufafanuzi wa Data (DDL). Ikiwa amri ya ALTER TABLE, DROP TABLE, au TRUNCATE TABLE itatekelezwa kwenye jedwali wakati mysqldump inafanya kazi, nakala hiyo itaharibika na hitilafu ya table definition has changed, please retry transaction. Katika mazingira ya CI/CD yenye uhamiaji wa mara kwa mara wa schema, hii husababisha hitilafu za mara kwa mara za nakala.

4. Ndoto ya RTO: Muda wa Kurejesha

Hitilafu mbaya zaidi ya mysqldump haionekani wakati wa kuhifadhi, bali wakati wa kurejesha.

Kurejesha nakala ya kimantiki kunahitaji injini ya MySQL kuchanganua na kutekeleza mamilioni ya amri za INSERT. Kwa kila mstari unaoingizwa, MySQL lazima:
* Iangalie vizuizi (Foreign Keys, Unique Keys).
* Iunde upya faharasa za sekondari (secondary indexes) papo hapo.
* Iandike kwenye InnoDB redo log.
* Iandike kwenye binlog (ikiwa imewashwa).

Kurejesha hifadhidata ya 1TB kutoka kwa nakala ya kimantiki kunaweza kuchukua siku kadhaa. Ikiwa biashara yako ina RTO ya saa 4, mysqldump inakuhakikishia kuwa utashindwa kufikia Makubaliano ya Kiwango cha Huduma (SLA).

Njia Mbadala za Kiwango cha Biashara: Kuhamia kwenye Nakala za Kimwili

Ili kufikia uhifadhi na urejeshaji wa haraka kwa seti kubwa za data, lazima uachane na nakala za kimantiki na utumie nakala za kimwili.

Nakala za kimwili hupita injini ya utekelezaji wa SQL ya MySQL kabisa. Badala yake, zinanakili faili za data za binary (faili za .ibd, redo logs, na undo logs) moja kwa moja kutoka kwenye mfumo wa faili. Kwa sababu zinanakili faili tu, zinaweza kufanya kazi kwa kasi ya juu zaidi ya kusoma/kuandika ya vifaa vyako vya hifadhi na zinaweza kufanywa kwa sambamba (parallelized) kwa kiwango kikubwa.

Percona XtraBackup: Kiwango cha Sekta

Kwa injini za InnoDB na XtraDB, Percona XtraBackup ndiyo zana kuu ya chanzo huria ya kuhifadhi nakala za kimwili. Inafanya nakala za “hot” na zisizozuia (non-blocking) za hifadhidata za MySQL.

Jinsi XtraBackup Inavyofanya Kazi

  1. Kunakili Data: XtraBackup huanza kunakili faili za data za InnoDB (.ibd).
  2. Kufuatilia Log: Kwa sababu hifadhidata iko hai, data itabadilika wakati faili zinanakiliwa. XtraBackup huanzisha thread ya usuli inayofuatilia na kunakili InnoDB redo log (ib_logfile0, n.k.) kwa miamala yoyote inayotokea wakati wa dirisha la kuhifadhi nakala.
  3. Maandalizi (Urejeshaji wa Ajali): Baada ya kuhifadhi nakala, faili za data zilizokopiwa ziko katika hali isiyo thabiti. XtraBackup hutumia redo logs zilizokopiwa kwenye faili za data (sawa na jinsi MySQL inavyofanya urejeshaji wa ajali wakati wa kuanza), na kusababisha picha thabiti kabisa ya hifadhidata katika wakati kamili ambao nakala ilimalizika.

Utekelezaji wa Mkakati wa Nakala za Kimwili

Huu hapa ni mwongozo wa kiufundi wa kutekeleza mkakati wa nakala za kimwili kwa kutumia Percona XtraBackup.

Hatua ya 1: Kutiririsha Nakala (Streaming the Backup)

Kuandika nakala kubwa kwenye diski ya ndani mara nyingi husababisha matatizo ya uwezo. Mbinu bora ni kutiririsha nakala moja kwa moja kwenye umbizo la kumbukumbu, kuibana, na kuituma kwenye eneo la muda au moja kwa moja kwenye jukwaa la kuhifadhi nakala.

Kwa kutumia xbstream, tunaweza kufanya nakala kwa sambamba na kuibana papo hapo:

xtrabackup --backup 
  --user=backup_user 
  --password=SecurePassword! 
  --parallel=4 
  --stream=xbstream | lz4 > /mnt/backups/mysql_prod_backup.xbstream.lz4
  • --parallel=4: Inatumia thread 4 kusoma faili za data kwa wakati mmoja.
  • --stream=xbstream: Inatoa nakala katika umbizo maalum la kutiririsha la Percona.
  • lz4: Inatoa mgandamizo wa haraka sana na wa chini wa CPU.

Hatua ya 2: Kuandaa Nakala kwa Urejeshaji

Kabla ya nakala ya kimwili kurejeshwa, lazima “iandaliwe” (kwa kutumia redo logs). Kwanza, toa na ufungue mtiririko huo:

mkdir -p /data/restore
lz4 -d /mnt/backups/mysql_prod_backup.xbstream.lz4 | xbstream -x -C /data/restore

Kisha, endesha awamu ya maandalizi. Hatua hii inahitaji kumbukumbu, kwa hivyo hakikisha seva ina RAM ya kutosha iliyotengwa:

xtrabackup --prepare --use-memory=4G --target-dir=/data/restore

Hatua ya 3: Kurejesha Hifadhidata

Ili kurejesha, saraka ya data ya MySQL inayolengwa lazima iwe tupu kabisa. Simamisha huduma ya MySQL, futa saraka, na unakili faili kurudi:

systemctl stop mysql
rm -rf /var/lib/mysql/*

xtrabackup --copy-back --target-dir=/data/restore

Mwisho, rekebisha ruhusa za mfumo wa faili kabla ya kuanza huduma:

chown -R mysql:mysql /var/lib/mysql
systemctl start mysql

Kwa sababu faili za data tayari zimejengwa na faharasa zimekusanywa, hifadhidata inaanza mara moja. Urejeshaji uliokuwa ukichukua saa 48 na mysqldump sasa unachukua muda tu wa kunakili faili kwenye mtandao au diski yako—mara nyingi ukipunguza RTO hadi dakika chache.

Kuboresha Urejeshaji wa Kimantiki (Unapopaswa Kuitumia)

Ikiwa unalazimika kurejesha nakala kubwa ya kimantiki (k.m., kuhama kati ya matoleo makuu tofauti ya MySQL au usanifu tofauti wa CPU ambapo faili za kimwili haziendani), lazima urekebishe kwa muda usanidi wako wa MySQL ili kuboresha mtiririko mkubwa wa uandishi.

Tumia mipangilio hii kwenye my.cnf yako kabla ya kuanza urejeshaji wa kimantiki:

[mysqld]
# Zima binlogging kwa muda ikiwa huu ni urejeshaji wa pekee
disable_log_bin

# Chelewesha uandishi kwenye diski ili kuongeza kasi ya uandishi
innodb_flush_log_at_trx_commit = 2

# Ongeza buffer pool ili kutoshea sehemu kubwa ya seti ya kazi iwezekanavyo
innodb_buffer_pool_size = <Weka hadi 70% ya jumla ya RAM>

# Ongeza ukubwa wa faili ya logi ili kuzuia ukaguzi mkali
innodb_log_file_size = 2G

# Zima doublewrite buffer (ni hatari kwa uzalishaji, salama kwa upakiaji wa awali)
innodb_doublewrite = 0

Kumbuka: Daima rudisha mipangilio hii kwenye chaguomsingi zake zinazotii ACID (innodb_flush_log_at_trx_commit = 1, innodb_doublewrite = 1) na uanzishe upya huduma ya MySQL kabla ya kuruhusu trafiki ya uzalishaji.

Kuhifadhi na Kulinda Nakala na CloudSave

Ingawa zana kama Percona XtraBackup zinatatua mechanics ya kuchota data kwa ufanisi, mkakati wa kweli wa urejeshaji wa maafa wa biashara unahitaji uratibu, hifadhi salama ya nje, na usimamizi wa mzunguko wa maisha. Kutegemea hati za bash maalum na cron jobs kusimamia nakala za kimwili huleta hatari kubwa ya hitilafu zisizojulikana na ukiukaji wa kufuata sheria.

Hapa ndipo kuunganisha safu yako ya hifadhidata na jukwaa la biashara kama CloudSave kunapokuwa muhimu.

CloudSave inaziba pengo kati ya huduma mbichi za hifadhidata na kufuata sheria za biashara. Kwa kutumia uwezo wa CloudSave wa kabla na baada ya hati, timu za DevOps zinaweza kuchochea XtraBackup kutoa picha thabiti ya kimwili. CloudSave kisha huingiza mtiririko wa nakala bila mshono, inatumia usimbaji fiche wa AES-256, na kuondoa nakala rudufu (deduplication) kabla ya kuinakili kwenye hifadhi ya wingu isiyoweza kubadilika.

Usanifu huu unahakikisha kuwa:
1. Utendaji wa Uzalishaji Unadumishwa: Nakala hufanya kazi kwa kasi ya hifadhi bila kuchafua InnoDB buffer pool.
2. Ulinzi dhidi ya Ransomware: Sera za hifadhi zisizoweza kubadilika ndani ya CloudSave huzuia watendaji wabaya kufuta au kusimba kumbukumbu za hifadhidata yako.
3. Uhifadhi wa Kiotomatiki: Sera za uhifadhi za Grandfather-Father-Son (GFS) hushughulikiwa kiotomatiki, kuhakikisha kufuata sheria za mamlaka ya data na mahitaji ya ukaguzi.
4. RTO Inayotabirika: Kwa sababu CloudSave inasimamia kumbukumbu za faili za kimwili, kurejesha hifadhidata ya terabaiti nyingi kwenye mfano mpya kunaweza kuratibiwa haraka, kufikia malengo madhubuti ya RTO.

Hitimisho

Kuendelea kutumia mysqldump kwa hifadhidata kubwa ni kamari na muda wa kufanya kazi na uadilifu wa data wa shirika lako. Asili ya thread moja, uchafuzi wa buffer pool, na muda mbaya wa kurejesha hufanya iwe isiyofaa kimsingi kwa mazingira ya kisasa yenye mtiririko mkubwa wa data.

Kwa kuhama kwenye nakala za kimwili kwa kutumia zana kama Percona XtraBackup, na kuratibu mzunguko wa maisha, usimbaji fiche, na nakala za nje kupitia jukwaa thabiti kama CloudSave, unabadilisha mkakati wako wa kuhifadhi nakala za hifadhidata kutoka kuwa dhima dhaifu na kuwa mali thabiti ya kiwango cha biashara. Tathmini vipimo vyako vya sasa vya RTO na RPO leo—ikiwa urejeshaji unachukua muda mrefu kuliko biashara yako inavyoweza kumudu kuwa nje ya mtandao, ni wakati wa kuacha mysqldump.