Apa pengaturan mysqldump optimal? [Tutup]

14

Setelah beberapa pencarian saya berakhir dengan pengaturan berikut:

    mysqldump\
    --host=localhost\
    --port=3306\
    --databases ****\
    --user=****\
    --password=****\
    --default-character-set=utf8\
    --add-drop-database\
    --add-drop-table\
    --add-locks\
    --complete-insert\
    --extended-insert\
    --lock-all-tables\
    --create-options\
    --disable-keys\
    --quick\
    --order-by-primary\
    --set-charset\
    --tz-utc\
    > dump/test.sql

Sejauh ini bagus tapi saya punya beberapa pertanyaan tentang parameter serta pelaksanaannya.

Mengenai masalah pertama saya, saya hanya ingin memastikan bahwa semuanya diperlukan dan tidak menimbulkan konflik saat digunakan bersama. Pada akhirnya, saya ingin membuat file dump yang sangat kuat dan konsisten, dengan jutaan catatan, yang membuat tabel, database, dan memasukkan data. Hal yang baik adalah membuat database tidak tersedia untuk sementara waktu tidak menjadi masalah bagi saya. Satu-satunya tujuan saya adalah membuat file dump yang kuat dan konsisten.

Mengenai konser kedua saya, saya ingin tahu bagaimana cara mendapat informasi ketika perintah salah dan jika demikian berikan pengecualian.

Ada ide?

EDIT

Ini adalah perintah mysqldump saya yang diperbarui berdasarkan umpan balik RolandoMySQLDBA.

mysqldump\
--host=localhost\
--port=3306\
--databases ****\
--user=****\
--password=****\
--default-character-set=utf8\
--opt\
--single-transaction\
--routines\
--triggers\
--events\
--add-drop-database\
--add-drop-table\
--complete-insert\
--delayed-insert\
--tz-utc\
> dump/test.sql
pengguna706838
sumber
Baca setiap argumen dan manfaatnya dan pilih yang sesuai dengan Anda. Juga kenali skrip untuk memicu kegagalan.
Mannoj
Keren. Tetapi ini tidak benar-benar menjawab pertanyaan saya. Misalnya, siapa di antara mereka yang selalu ANDA gunakan?
user706838
Maafkan ketidaktahuan saya, pertanyaan ini bukan tentang merekomendasikan buku atau situs web. Jadi saya pikir itu seharusnya bukan jenis pertanyaan berdasarkan pendapat. Yang mengatakan beberapa jawaban tentu akan lebih berkualitas tergantung pada keahlian dan didukung oleh tes. Menurut pendapat saya, pertanyaannya dinyatakan dengan sempurna dengan tujuan yang jelas.
user10089632

Jawaban:

30

Anda akan menemukan ini mengejutkan, tetapi Anda hanya perlu satu opsi utama: --opt

Apa itu --opt ?

Opsi ini, diaktifkan secara default, adalah singkatan untuk kombinasi --add-drop-table --add-locks --create-options --disable- keys --extended-insert --lock-tables --quick - set-charset . Ini memberikan operasi dump cepat dan menghasilkan file dump yang dapat dimuat ulang ke server MySQL dengan cepat.

Karena opsi - -opt diaktifkan secara default , Anda hanya menentukan kebalikannya, --skip-opt untuk mematikan beberapa pengaturan default. Lihat pembahasan grup opsi mysqldump untuk informasi tentang mengaktifkan atau menonaktifkan sebagian pilihan yang dipengaruhi oleh --opt.

Karena --opt sudah diaktifkan, Anda tidak perlu menentukan --opt . Meskipun demikian, Anda mungkin memerlukan beberapa opsi yang diperlukan yang tidak termasuk.

Jalankan kueri ini di basis data Anda

SELECT engine,COUNT(1) TableCount
FROM information_schema.tables
WHERE engine IN ('InnoDB','MyISAM')
AND table_schema NOT IN ('information_schema','mysql','performance_schema')
GROUP BY engine;

Jika Anda memiliki semua tabel InnoDB, maka Anda perlu menentukan --single-transaction . Ini akan secara otomatis menonaktifkan --lock-tables dan memungkinkan Anda untuk membuang semua tabel dalam titik-waktu yang sama dan memungkinkan penulisan baru untuk datang pada saat yang sama.

Jika Anda memiliki satu atau lebih tabel MyISAM, maka Anda perlu menentukan --lock-all-tables . Ini akan secara otomatis menonaktifkan --lock-tables , nonaktifkan --single-transaction , mengunci semua tabel di semua database, lalu membuat dump. Menulis ke tabel InnoDB masih dapat terjadi, tetapi mereka hanya akan mengantri sampai kunci dilepaskan. Koneksi DB yang mencoba menulis ke tabel MyISAM akan benar-benar ditangguhkan sampai semua kunci dilepaskan.

Jalankan kueri ini: SELECT COUNT(1) Number_Of_Stored_Procedures FROM mysql.proc;

Jika Number_Of_Stored_Procedures lebih besar dari nol, gunakan --routines .

Jalankan kueri ini: SELECT COUNT(1) Number_Of_Triggers FROM information_schema.triggers;

Jika Number_Of_Triggerslebih besar dari nol, gunakan --triggers .

CAVEAT : Tolong Jangan Menggunakan --order-by-primary untuk membuang semua basis data karena berpotensi membuat indeks BTREE agak miring pada pengisian ulang.--order-by-primary hanya boleh digunakan saat membuang tabel individual yang Anda tahu memiliki kunci primer integer dan akan memiliki banyak pemindaian rentang dari aplikasi Anda.

Jika Anda membutuhkan jenis cadangan mysqldump yang lebih kreatif, lihat posting lama saya. Bagaimana cara mengoptimalkan mysqldump dari database besar?.

Silakan baca semua opsi untuk mysqldump .

UPDATE 2014-12-29 09:44 EST

Saya telah memperbarui perintah mysqldump saya (silakan lihat edit saya). Saya punya pertanyaan terakhir. Apakah menurut Anda layak menggunakan semua argumen berikut juga? --add-drop-database \ --add-drop-table \ --complete-insert \ --delayed-insert \ --tz-utc

Melihat komentar Anda dan edit terakhir Anda, mari kita lihat masing-masing opsi ini dan lihat apakah Anda membutuhkannya

  • --opt : Saya sudah mengatakan Anda tidak perlu menentukannya karena diaktifkan secara default.
  • --delayed-insert : Saya tetap menjauh dari ini dengan semua database InnoDB. Bahkan, saya dengan tegas menjauh dari PERIODE ini !!! . Karena 1) dimungkinkan untuk INSERT DELAYED dapat kehilangan data, 2) dikonversi menjadi INSERT untuk MySQL Replication slave, 3) ada laporan bug terbuka tentang penggunaannya dengan pemicu di MySQL 5.6 dan tidak dianggap sebagai bug , 4 ) itu ditinggalkan dalam MySQL 5.6, dan 5) Morgan Tocker (MySQL Guru terkenal) meramalkan depresiasi kembali pada tahun 2012 , Anda harus melupakan opsi ini pernah ada. Jangan pernah, tidak pernah (tak terhingga) menggunakannya !!!
  • --complete-insert : Ini akan digunakan INSERT INTO tblname (colnam_1,colnam_2,...colnam_n) VALUES ...sebagai ganti INSERT INTO tblname VALUES .... Ini bisa mengasapi mysqldump jika ada banyak kolom dalam definisi tabel dan banyak baris dalam tabel. Jangan gunakan itu.
  • --add-drop-table : Karena --opt mengaktifkannya untuk Anda, Anda tidak perlu menentukannya.
  • --add-drop-database : Jika Anda menjatuhkan --add-drop-database , itu hanya membuat DROP TABLE IF EXISTS(yang ditambahkan oleh --add-drop-table ) berjalan lebih cepat. Tidak menggunakannya cukup memungkinkan DROP TABLE IF EXISTSterjadi untuk setiap tabel. Jadi, menggunakan --add-drop-database adalah masalah pilihan pribadi.
  • --tz-utc : Jika Anda berencana untuk mengembalikan data ke server yang sama dengan cadangan, Anda tidak perlu --tz-utc . Jika Anda mengembalikan data ke pusat data lain di zona waktu yang berbeda dan ...
    • jika Anda ingin menyimpan zona waktu yang sama dengan cadangan, Anda tidak perlu --tz-utc .
    • jika Anda ingin data menggunakan zona waktu dari pusat data baru, Anda perlu --tz-utc .
    • CONTOH: Katakanlah Anda membuat cadangan basis data di New York. Itu EST. Jika Anda memiliki pusat data lain di Seattle, itu adalah PST. Jika Anda ingin Cadangan New York dipulihkan di Seattle dan Anda ingin cap waktu dalam database tetap mewakili New York, Anda tidak ingin menggunakan --tz-utc .
  • --default-character-set

Menyesuaikan hasil edit terakhir Anda, inilah yang sangat Anda butuhkan

mysqldump\
--host=localhost\
--port=3306\
--databases ****\
--user=****\
--password=****\
--single-transaction\
--routines\
--triggers\
--events\
--add-drop-database\
> dump/test.sql

Sekali lagi, saya katakan tolong baca semua opsi untuk mysqldump .

RolandoMySQLDBA
sumber
Tentang --add-drop-database: bukankah ini juga memastikan tidak ada tabel acak lain dalam database Anda yang tidak ada dalam dump Anda? Jika seseorang secara manual membuat tabel tes acak di database Anda, maka itu akan tetap ada setelah memuat ulang dari dump tanpa opsi ini. Jadi, itu tergantung pada apakah Anda menginginkannya atau tidak. Baik?
jschultz410
Bagaimana dengan --add-drop-trigger?
Lonix