Mysqldump tidak lengkap

11

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.

Cerin
sumber
Apakah ada cukup ruang disk? Dan apakah Anda menjalankan CHECK TABLE untuk melihat tidak ada kerusakan DB di atas meja?
Sudahkah Anda mencoba menghapus --forceparam untuk melihat kesalahan apa yang Anda dapatkan? Atau --quick?
@Adrian, Ya, saya memiliki ruang kosong sekitar 10GB, lebih dari cukup. Dan ya, semua tabel periksa ok.
@Yzmir, Ya, masalah yang sama terjadi.

Jawaban:

5

Mungkin ada masalah dengan max_allowed_packettidak 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.

Cerin
sumber
4

Sudahkah Anda mencoba?

mysqldump --compress --add-drop-table data --routines --events  --comments --extended-insert -h {host} -u {user} -p {database} > dbdump.sql

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.

Rui Marques
sumber
1
Saya mendapat kesalahan berikut ketika mencoba menjalankan perintah itu:mysqldump: Got error: 1049: "Unknown database 'data'" when selecting the database
Andy
1
@Andy Anda benar ada yang salah dengan ini sekarang. dev.mysql.com/doc/refman/5.7/en/… . Saya pikir "data" tidak boleh ada sama sekali.
Rui Marques
1

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"?

Noam Kremen
sumber
Saya menerima kesalahan yang sama.
Cerin
Saya tidak dapat menemukan apa pun di dokumentasi untuk mendukung pernyataan ini. AFAIK membaca dan menulis di atas meja didukung ketika - transaksi tunggal dilakukan, tetapi pernyataan mengubah struktur tabel (ALTER, CREATE, TRUNCATE, dll) dapat menyebabkan dump gagal atau memberikan data yang tidak terduga. ( dev.mysql.com/doc/refman/5.7/en/… )
Code Commander
1

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\Gdi atas meja di Slave, saya mendapat kesalahan "Table Not Found". Ketika saya berlari SHOW CREATE TABLE tblname\Gdi 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

  • Anda dapat menampilkan struktur tabel menggunakan SHOW CREATE TABLE
  • Anda dapat menanyakan segala sesuatu tentang tabel dari INFORMATION_SCHEMA.TABLES
RolandoMySQLDBA
sumber
0

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):

SET innodb_lock_wait_timeout = 120;
RolandoMySQLDBA
sumber
innodb_lock_wait_timeout adalah parameter statis pada RDS yang tidak dapat diubah.
Cerin
@Cerin: Menurut Documents, Anda dapat mengaturnya di sesi Anda.
RolandoMySQLDBA
Apa maksudmu "sesi saya"? mysqldump tidak mencantumkan opsi untuk menyesuaikan batas waktu.
Cerin
Maaf, saya melihatnya mundur. Saya bermaksud mengatakan set innodb_lock_wait_timeout di Amazon RDS.
RolandoMySQLDBA