Saya mencoba menjalankan mysqldump untuk membuat snapshot database, dan saya menemukan itu akan berhenti secara acak di tengah jalan, tanpa melaporkan kesalahan apa pun. Basis data saya relatif kecil (sekitar 100MB) dan menggunakan InnoDB.
Saya menjalankannya seperti:
mysqldump --force --single-transaction --quick --user myuser --password=mypass -h mydatabasehost mydb > /tmp/snapshot.sql
Memeriksa laporan kode keluar 0.
Versi saya adalah: mysqldump Ver 10.13 Distrib 5.1.52, untuk redhat-linux-gnu (i386)
Saya telah melihat beberapa posting serupa dan bahkan laporan bug resmi , tetapi tidak ada solusi yang berlaku.
Bagaimana cara mendapatkan mysqldump untuk mengambil snapshot database lengkap?
EDIT: Basis data saya saat ini berada di RDS Amazon.
--force
param untuk melihat kesalahan apa yang Anda dapatkan? Atau--quick
?Jawaban:
Mungkin ada masalah dengan
max_allowed_packet
tidak diatur cukup tinggi pada kedua klien (yaitu mysqldump) dan server (yaitu Amazon RDS). Saya mengatur ini untuk 500 juta pada keduanya dan yang tampaknya telah memperbaiki masalah.Karena tabel skema informasi InnoDB hanya memberikan perkiraan jumlah baris, sulit untuk mengetahui apakah snapshot saya benar-benar mencakup semuanya dari RDS. Semua tabel ada di sana, tetapi jumlah baris berbeda. Saya akan memperbarui dengan jawaban yang lebih pasti ketika saya memiliki waktu untuk menulis analisis yang lebih menyeluruh.
sumber
Sudahkah Anda mencoba?
Ini sederhana cara saya selalu melakukannya tanpa masalah. Pada dasarnya melakukan dump dengan cara ini Anda mendapatkan semua yang Anda miliki (data, objek dan terkadang komentar berharga) pada saat tertentu mengabaikan transaksi yang tidak dikomit.
sumber
mysqldump: Got error: 1049: "Unknown database 'data'" when selecting the database
Sejauh yang saya mengerti dokumen mysql - transaksi tunggal akan gagal jika pembacaan dilakukan di atas meja saat Anda membuang. Apa hasilnya ketika berjalan tanpa "- force --single-transaction --quick"?
sumber
Sangat mungkin bahwa tabelnya rusak. Saya tidak bermaksud bahwa data dan / atau halaman indeks rusak. Mungkin ada sesuatu yang sangat sederhana yang rusak.
Saya baru-baru ini mengalami masalah dengan skrip cadangan pada Slave Server ketika saya memaralelkan beberapa database mysqldump. Menjalankan mysqldump di salah satu database menghasilkan mysqldump yang sangat kecil. DB memiliki 80+ tabel. Namun, mysqldump berhenti di meja kelima di DB. Ketika saya berlari
SHOW CREATE TABLE tblname\G
di atas meja di Slave, saya mendapat kesalahan "Table Not Found". Ketika saya berlariSHOW CREATE TABLE tblname\G
di Master, deskripsi tabel ditampilkan seperti yang diharapkan.Apa yang terjadi agak gila: Seorang klien meminta pengembalian tabel dan seorang insinyur mengembalikan file .ibd dari tabel InnoDB dari cadangan disk. ID tablespace dari file .ibd (yang 25) tidak cocok dengan id tablespace terdaftar di ibdata1 (yang 28).
Saya memperbaiki masalah dengan menyemprotkan slave, mysqldumping master, dan mengatur replikasi dari awal. Untungnya, data dan indeks spave mencapai 7GB. Jadi proses rstore bukan masalah besar.
PESAN MORAL DALAM CERITA
Masalah dasar adalah bahwa mysqldump tidak melaporkan kesalahan pada InnoDB ketika tablespace id salah. Ketika mysqldump selesai dan tidak membuang setiap tabel dalam urutan abjad, itu menandakan itu diakhiri oleh kesalahan dan melakukannya tanpa mencetak pesan kesalahan.
Periksa untuk memastikan
SHOW CREATE TABLE
sumber
Berikut ini adalah beberapa brainstorming di mysqldump dan InnoDB:
Tolong pikirkan perilaku mysqldump terhadap tabel InnoDB. Jika ada halaman kotor di Pool Buffer InnoDB milik tabel Anda membuang, halaman kotor tabel itu harus dibuang ke disk sebelum
SELECT /* SQL_NO_CACHE */
dapat dieksekusi terhadapnya.Karena Anda menggunakan Amazon RDS, firasat saya adalah bahwa database Anda berada dalam infrastruktur multitenant (Jangan ragu untuk memperbaiki pernyataan ini jika saya terlalu menyederhanakan ini). Basis data lain mungkin menggunakan Pool Buffer InnoDB bersama, file metadata bersama (ibdata1), dan tablespace bersama (ibdata1 jika innodb_file_per_table dinonaktifkan).
Mungkin juga ada beberapa redundansi dari database yang terjadi, yang dapat mempengaruhi MVCC terhadap database, meskipun itu adalah dataset kecil.
Anda mungkin ingin meningkatkan innodb_lock_wait_timeout (default 50 detik) di sesi mysqldump Anda untuk melihat apakah ini berpengaruh pada Amazon RDS (atau meminta Amazon meningkatkan batas ini). Juga, coba bereksperimen dengan membuang tabel individual.
UPDATE 2011-11-14 17:58 EDT
Coba jalankan ini dalam Sesi DB Anda (set ke dua menit):
sumber