WAWASAN KE DALAM MELAKUKAN BACKUPS DENGAN mysqldump
IMHO Melakukan pencadangan telah menjadi bentuk seni jika Anda tahu cara mendekatinya
Anda punya opsi
Opsi 1: mysqldump seluruh contoh mysql
Ini adalah yang termudah, no-brainer !!!
mysqldump -h... -u... -p... --hex-blob --routines --triggers --all-databases | gzip > MySQLData.sql.gz
Semuanya ditulis dalam satu file: struktur tabel, indeks, pemicu, prosedur tersimpan, pengguna, kata sandi terenkripsi. Opsi mysqldump lainnya juga dapat mengekspor berbagai gaya perintah INSERT, file log, dan koordinat posisi dari log biner, opsi pembuatan basis data, data sebagian (opsi di mana), dan sebagainya.
Opsi 2: mysqldump memisahkan database menjadi file data terpisah
Mulailah dengan membuat daftar database (2 teknik untuk melakukan ini)
Teknik 1
mysql -h... -u... -p... -A --skip-column-names -e"SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema','mysql')" > ListOfDatabases.txt
Teknik 2
mysql -h... -u... -p... -A --skip-column-names -e"SELECT DISTINCT table_schema FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql')" > ListOfDatabases.txt
Teknik 1 adalah cara tercepat. Teknik 2 adalah yang paling pasti dan paling aman. Teknik 2 lebih baik karena, kadang-kadang, pengguna membuat folder untuk keperluan umum di / var / lib / mysql (datadir) yang tidak terkait database. Information_schema akan mendaftarkan folder sebagai database di tabel information_schema.schemata. Teknik 2 akan memotong folder yang tidak berisi data mysql.
Setelah Anda mengompilasi daftar database, Anda dapat melanjutkan untuk mengulang daftar dan mysqldump mereka, bahkan secara paralel jika diinginkan.
for DB in `cat ListOfDatabases.txt`
do
mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} | gzip > ${DB}.sql.gz &
done
wait
Jika ada terlalu banyak basis data untuk diluncurkan pada satu waktu, paralel membuangnya 10 sekaligus:
COMMIT_COUNT=0
COMMIT_LIMIT=10
for DB in `cat ListOfDatabases.txt`
do
mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} | gzip > ${DB}.sql.gz &
(( COMMIT_COUNT++ ))
if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
then
COMMIT_COUNT=0
wait
fi
done
if [ ${COMMIT_COUNT} -gt 0 ]
then
wait
fi
Opsi 3: mysqldump tabel terpisah menjadi file data terpisah
Mulailah dengan membuat daftar tabel
mysql -h... -u... -p... -A --skip-column-names -e"SELECT CONCAT(table_schema,'.',table_name) FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql')" > ListOfTables.txt
Kemudian buang semua tabel dalam kelompok 10
COMMIT_COUNT=0
COMMIT_LIMIT=10
for DBTB in `cat ListOfTables.txt`
do
DB=`echo ${DBTB} | sed 's/\./ /g' | awk '{print $1}'`
TB=`echo ${DBTB} | sed 's/\./ /g' | awk '{print $2}'`
mysqldump -h... -u... -p... --hex-blob --triggers ${DB} ${TB} | gzip > ${DB}_${TB}.sql.gz &
(( COMMIT_COUNT++ ))
if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
then
COMMIT_COUNT=0
wait
fi
done
if [ ${COMMIT_COUNT} -gt 0 ]
then
wait
fi
Opsi 4: GUNAKAN IMAGINASI ANDA
Coba variasi Pilihan yang disebutkan di atas ditambah teknik untuk snapshot bersih
Contohnya
- Pesanlah daftar tabel dengan ukuran masing-masing tabel naik atau turun.
- Menggunakan proses terpisah, jalankan "FLUSH TABLES WITH READ LOCK; SELECT SLEEP (86400)" sebelum meluncurkan mysqldumps. Matikan proses ini setelah mysqldumps selesai. Ini berguna jika database berisi InnoDB dan MyISAM
- Simpan mysqldumps di folder bertanggal dan putar keluar folder cadangan yang lama.
- Muat seluruh contoh mysqldumps ke server mandiri.
CAVEAT
Hanya Opsi 1 yang membawa semuanya. Kekurangannya adalah mysqldumps yang dibuat dengan cara ini hanya bisa dimuat ulang ke versi rilis mysql majot yang sama dengan mysqldump yang dihasilkan. Dengan kata lain, mysqldump dari database MySQL 5.0 tidak dapat dimuat dalam 5.1 atau 5.5. Alasannya ? Skema mysql sangat berbeda di antara rilis utama.
Opsi 2 dan 3 tidak termasuk menyimpan nama pengguna dan kata sandi.
Berikut adalah cara umum untuk membuang SQL Grants untuk pengguna yang mudah dibaca dan lebih portabel
mysql -h... -u... -p... --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql -h... -u... -p... --skip-column-names -A | sed 's/$/;/g' > MySQLGrants.sql
Opsi 3 tidak menyimpan prosedur yang tersimpan, sehingga Anda dapat melakukan hal berikut
mysqldump -h... -u... -p... --no-data --no-create-info --routines > MySQLStoredProcedures.sql &
Poin lain yang harus diperhatikan adalah tentang InnoDB. Jika Anda memiliki kumpulan buffer InnoDB besar, masuk akal untuk menyiramnya sebaik mungkin sebelum melakukan backup apa pun. Jika tidak, MySQL menghabiskan waktu membersihkan tabel dengan halaman kotor yang tersisa dari buffer pool. Inilah yang saya sarankan:
Sekitar 1 jam sebelum melakukan pencadangan, jalankan perintah SQL ini
SET GLOBAL innodb_max_dirty_pages_pct = 0;
Di MySQL 5.5 default innodb_max_dirty_pages_pct adalah 75. Di MySQL 5.1 dan kembali, innodb_max_dirty_pages_pct default adalah 90. Dengan menetapkan innodb_max_dirty_pages_pct ke 0, ini akan mempercepat pembilasan halaman kotor ke disk. Ini akan mencegah atau setidaknya mengurangi dampak pembersihan setiap komitmen dua fase dari data InnoDB sebelum melakukan mysqldump terhadap tabel InnoDB.
FINAL WORD ON mysqldump
Kebanyakan orang menghindar dari mysqldump demi alat-alat lain dan alat-alat itu memang bagus.
Alat-alat tersebut termasuk
- MAATKIT ( skrip dump / restore paralel , dari Percona [Sudah usang tapi bagus])
- XtraBackup (Cadangan Snapshot TopNotch dari Percona)
- CDP R1Soft ( Opsi Modul MySQL yang mengambil snapshot point-in-time)
- MySQL Enterprise Backup (sebelumnya InnoDB Hot Backups [komersial])
Jika Anda memiliki semangat DBA MySQL yang benar, Anda dapat merangkul mysqldump dan memiliki penguasaan penuh atas hal itu yang dapat dicapai. Semoga semua cadangan Anda mencerminkan keterampilan Anda sebagai DBA MySQL .