Senario
Seorang pentadbir pangkalan data melaporkan bahawa operasi sandaran dan pemulihan mengambil masa yang terlalu lama, menjejaskan ketersediaan pengeluaran. Contohnya, pangkalan data MySQL 200GB mengambil masa 4 jam dengan mysqldump lalai, dan pangkalan data PostgreSQL bersaiz sama mengambil masa 3 jam dengan pg_dump. Operasi pemulihan juga kerap tamat masa.
Simptom
- Masa pelaksanaan arahan sandaran jauh melebihi jangkaan (contohnya, kelajuan sandaran di bawah 50MB/s)
- I/O cakap tinggi semasa pemulihan (iostat menunjukkan %util > 90%)
- Kelewatan replikasi meningkat (terutamanya semasa sandaran)
- Saiz fail sandaran terlalu besar (hampir saiz data asal apabila tidak dimampatkan)
Diagnosis
MySQL
- Periksa arahan sandaran semasa:
mysqldump --single-transaction --routines --triggers --events --all-databases > backup.sql - Pantau prestasi semasa sandaran:
pt-query-digest --processlist --interval=1atauSHOW FULL PROCESSLIST; - Analisis prestasi cakap:
iostat -x 1untuk melihat penggunaan cakap - Periksa saiz buffer pool InnoDB:
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read_requests';
PostgreSQL
- Periksa arahan sandaran:
pg_dump -Fc -j 4 -f backup.dump dbname(-j untuk pekerjaan selari) - Gunakan pg_stat_statements untuk menganalisis pertanyaan:
SELECT query, calls, total_time FROM pg_stat_statements ORDER BY total_time DESC LIMIT 10; - Periksa kadar penjanaan WAL:
pg_waldump -p /path/to/pg_wal/atauSELECT * FROM pg_stat_wal; - Pantau I/O:
iostat -x 1
Arahan
Arahan Sandaran Dioptimumkan Prestasi
MySQL
- Sandaran dimampatkan:
mysqldump --single-transaction --compress --all-databases > backup.sql.gz - Eksport selari menggunakan mydumper:
mydumper -h localhost -u root -p password -o /backup --threads=4 - Sandaran fizikal dengan XtraBackup:
xtrabackup --backup --parallel=4 --target-dir=/backup
PostgreSQL
- pg_dump selari:
pg_dump -Fd -j 8 -f /backup/dumpdir dbname(format direktori) - Sandaran fizikal dengan pg_basebackup:
pg_basebackup -D /backup -X fetch -P -v - Laraskan keselarian:
pg_dump -Fc -j $(nproc) -f backup.dump dbname
Pengoptimuman Pemulihan
MySQL
- Pemulihan titik masa menggunakan mysqlbinlog:
mysqlbinlog --start-datetime="2023-01-01 00:00:00" binlog.000001 | mysql -u root - Lumpuhkan semakan kunci asing semasa import:
SET FOREIGN_KEY_CHECKS=0;kemudian hidupkan semula.
PostgreSQL
- Pemulihan selari dengan pg_restore:
pg_restore -d dbname -j 4 -Fc backup.dump - Gunakan replikasi strim untuk pemulihan pantas: konfigurasikan standby dan dayakan hot standby.
Kawalan Risiko
- Sebelum sandaran: Pastikan ruang cakap mencukupi (disyorkan 1.5x saiz data). Gunakan
--single-transactionuntuk mengelakkan kunci jadual (MySQL InnoDB). Tetapkanlock_wait_timeoutuntuk mengelakkan menunggu kunci yang lama. - Semasa sandaran: Pantau beban sistem, elakkan sandaran penuh semasa waktu puncak. Gunakan
niceuntuk menurunkan keutamaan proses sandaran:nice -n 19 mysqldump ... - Sebelum pemulihan: Sandarkan pangkalan data sasaran (jika wujud). Uji proses pemulihan dalam persekitaran bukan pengeluaran.
- Semasa pemulihan: Lumpuhkan auto-commit dan penyelenggaraan indeks jika mungkin untuk mempercepatkan pemulihan.
Gulung Balik
Jika sandaran atau pemulihan gagal, hentikan operasi dengan segera:
- MySQL: Bunuh proses sandaran, periksa integriti fail, pulih daripada sandaran berjaya terakhir jika perlu.
- PostgreSQL: Bunuh proses pg_dump atau pg_restore, bersihkan fail separa. Gunakan pg_ctl untuk memulakan semula perkhidmatan selepas mengesahkan konsistensi data.
Pastikan sandaran penuh terkini tersedia. Jika rosak, gulung balik menggunakan snapshot atau sandaran fizikal.
Pengesahan
Pengesahan Sandaran
- MySQL: Selepas
mysqldump --all-databases | gzip > backup.sql.gz, nyahmampat dan periksa jadual:gunzip -c backup.sql.gz | grep -i "CREATE TABLE". Gunakanmysqlcheckuntuk memeriksa integriti jadual. - PostgreSQL: Gunakan
pg_restore -l backup.dumpuntuk menyenaraikan kandungan, atauzcat backup.sql.gz | head -n 50. Pulihkan ke pangkalan data ujian dan jalankanANALYZE.
Pengesahan Pemulihan
- Bandingkan kiraan baris:
SELECT COUNT(*) FROM table;antara pangkalan data asal dan yang dipulihkan. - Kira checksum:
mysqldump --all-databases --order-by-primary | md5sumbandingkan output sandaran dan pemulihan. - Jalankan ujian aplikasi: pastikan sambungan berfungsi dan pertanyaan mengembalikan hasil yang betul.
Bila Menghantar Tiket OpsGlobal
- Selepas pengoptimuman, sandaran atau pemulihan masih gagal memenuhi SLA (contohnya, melebihi 4 jam)
- Kerap berlaku kerosakan sandaran atau kegagalan pemulihan
- Perlu bantuan pakar untuk mengkonfigurasi sandaran fizikal (seperti XtraBackup atau pg_basebackup) atau seni bina ketersediaan tinggi
- Disyaki masalah storan atau rangkaian asas yang memerlukan analisis peringkat infrastruktur
Dengan mengikuti panduan ini, anda boleh meningkatkan prestasi sandaran dan pemulihan pangkalan data dengan ketara, memastikan kesinambungan perniagaan.
Senario Penggunaan
Sesuai untuk pasukan yang menyelesaikan isu Database dan memerlukan aliran kerja yang jelas.
Latar Belakang Masalah
Pelajari cara mendiagnosis dan meningkatkan prestasi sandaran dan pemulihan untuk MySQL dan PostgreSQL. Panduan ini merangkumi simptom biasa, arahan diagnostik, kawalan risiko, prosedur gulung balik, dan langkah pengesahan untuk persekitaran pengeluaran.
Langkah Penyelesaian
Sahkan impak dan perubahan terkini, kumpul log, konfigurasi dan metrik, kemudian baiki mengikut risiko.
Contoh Arahan
Gantikan contoh dengan nama sumber sebenar dan simpan kata laluan, token atau kunci dalam pembolehubah persekitaran.
Risiko
Sebelum operasi produksi, semak sandaran, akses, tetingkap perubahan dan pelan rollback.
Pelan Rollback
Simpan konfigurasi dan versi asal; rollback konfigurasi, imej atau perubahan pangkalan data jika metrik tidak normal.
Senarai Serahan
Rekod punca isu, arahan penting, langkah pembaikan, hasil pengesahan dan cadangan susulan.
Perlu bantuan isu teknikal serupa?
Jika pelayan, Kubernetes, Docker, CI/CD, pangkalan data atau pemantauan anda bermasalah, hantar log dan konfigurasi untuk diagnosis jauh.