Mysqldump adalah alat pencadangan logis populer untuk MySQL yang aslinya ditulis oleh Igor Romanenko.
Mysqldump melakukan pencadangan logis (set pernyataan SQL). Secara default, mysqldump tidak membuang tabel information_schema dan tidak pernah membutuhkan performance_schema. Tetapi kelemahan utama dari mysqldump adalah ia hanya menggunakan satu utas saat melakukan pencadangan dan pemulihan. (Bahkan server Anda memiliki 64 core). Untuk mengatasi kelemahan ini, MySQL memperkenalkan utilitas baru pada klien Shell. Di blog ini saya akan menjelaskan utilitas cadangan baru ini.
Ikhtisar MySQL Shell
Shell MySQL adalah klien dan editor kode yang kuat dan canggih untuk server MySQL. MySQL shell 8.0.21 menyertakan beberapa utilitas baru yang menarik untuk membuat dump logis dan melakukan pemulihan logis untuk seluruh instance database, termasuk pengguna.
MySQL shell 8.0.22 menyertakan pencadangan logis dari tabel dan pemulihan tertentu.
Utilitas
- util.dumpInstance() - Buang seluruh instance database, termasuk pengguna
- util.dumpSchemas() - Buang sekumpulan skema
- util.loadDump() - Memuat dump ke database target
- util.dumpTables() - Memuat tabel dan tampilan tertentu.
util.dumpInstance()
Utilitas dumpInstance() akan membuang semua database yang disajikan di direktori data MySQL. Ini akan mengecualikan information_schema, mysql, ndbinfo, performance_schema, dan skema sistem saat mengambil dump.
Sintaks
util.dumpInstance(outputUrl[, options])
Ini akan dibuang ke sistem file lokal, outputUrl adalah string yang menentukan jalur ke direktori lokal tempat file dump akan ditempatkan. Anda dapat menentukan jalur absolut atau jalur relatif terhadap direktori kerja saat ini.
Dalam utilitas ini, ada opsi menjalankan kering untuk memeriksa skema dan melihat masalah kompatibilitas, kemudian menjalankan dump dengan opsi kompatibilitas yang sesuai diterapkan untuk menghapus masalah.
Opsi
Mari kita lihat beberapa opsi penting untuk dumputilitas ini.
ocimds :[Benar | Salah]
Ketika opsi ini disetel ke true, Ini akan memeriksa kamus data, kamus indeks, dan opsi enkripsi dalam pernyataan CREATE TABLE dikomentari dalam file DDL, untuk memastikan bahwa semua tabel berada di Direktori data MySQL dan menggunakan enkripsi skema default.
Dan itu akan memeriksa mesin penyimpanan apa pun dalam pernyataan CREATE TABLE selain InnoDB, untuk pemberian hak istimewa yang tidak sesuai untuk pengguna atau peran, dan untuk masalah kompatibilitas lainnya.
Jika ditemukan pernyataan SQL yang tidak sesuai, pengecualian akan muncul dan dump dihentikan.
Jadi kami menyarankan untuk menggunakan opsi dryRun untuk membuat daftar semua masalah dengan item di dump sebelum proses dumping dimulai. Gunakan opsi kompatibilitas untuk memperbaiki masalah di keluaran dump secara otomatis.
Catatan:Opsi ini hanya memiliki dukungan untuk utilitas dump Instance dan utilitas dump skema.
Contoh 1
MySQL localhost:3306 ssl cart JS > util.dumpInstance("/home/vagrant/production_backup", {ocimds: true,compatibility: ["strip_restricted_grants"]})
Acquiring global read lock
Global read lock acquired
All transactions have been started
Locking instance for backup
NOTE: Backup lock is not supported in MySQL 5.7 and DDL changes will not be blocked. The dump may fail with an error or not be completely consistent if schema changes are made while dumping.
Global read lock has been released
Checking for compatibility with MySQL Database Service 8.0.22
NOTE: MySQL Server 5.7 detected, please consider upgrading to 8.0 first. You can check for potential upgrade issues using util.checkForServerUpgrade().
NOTE: User 'backupuser'@'localhost' had restricted privileges (RELOAD, SUPER, CREATE TABLESPACE) removed
NOTE: User 'root'@'127.0.0.1' had restricted privileges (RELOAD, SHUTDOWN, FILE, SUPER, CREATE TABLESPACE) removed
NOTE: User 'root'@'::1' had restricted privileges (RELOAD, SHUTDOWN, FILE, SUPER, CREATE TABLESPACE) removed
NOTE: User 'root'@'localhost' had restricted privileges (RELOAD, SHUTDOWN, FILE, SUPER, CREATE TABLESPACE, PROXY) removed
ERROR: Table 'cart'.'sales' uses unsupported storage engine MyISAM (fix this with 'force_innodb' compatibility option)
Compatibility issues with MySQL Database Service 8.0.22 were found. Please use the 'compatibility' option to apply compatibility adaptations to the dumped DDL.
Util.dumpInstance: Compatibility issues were found (RuntimeError)
Jadi kami memiliki tabel myisam di database keranjang saya. Opsi dry run jelas menimbulkan kesalahan.
Jika Anda ingin memperbaiki kesalahan ini secara otomatis di file dump Anda, berikan opsi kompatibilitas sebagai argumen dalam perintah Anda.
Contoh 2
MySQL localhost:3306 ssl cart JS > util.dumpInstance("/home/vagrant/production_backup", {dryRun: true ,ocimds: true,compatibility: ["strip_restricted_grants","force_innodb"]})
Acquiring global read lock
Global read lock acquired
All transactions have been started
Locking instance for backup
NOTE: Backup lock is not supported in MySQL 5.7 and DDL changes will not be blocked. The dump may fail with an error or not be completely consistent if schema changes are made while dumping.
Global read lock has been released
Checking for compatibility with MySQL Database Service 8.0.22
NOTE: MySQL Server 5.7 detected, please consider upgrading to 8.0 first. You can check for potential upgrade issues using util.checkForServerUpgrade().
NOTE: User 'backupuser'@'localhost' had restricted privileges (RELOAD, SUPER, CREATE TABLESPACE) removed
NOTE: User 'root'@'127.0.0.1' had restricted privileges (RELOAD, SHUTDOWN, FILE, SUPER, CREATE TABLESPACE) removed
NOTE: User 'root'@'::1' had restricted privileges (RELOAD, SHUTDOWN, FILE, SUPER, CREATE TABLESPACE) removed
NOTE: User 'root'@'localhost' had restricted privileges (RELOAD, SHUTDOWN, FILE, SUPER, CREATE TABLESPACE, PROXY) removed
NOTE: Table 'cart'.'sales' had unsupported engine MyISAM changed to InnoDB
Compatibility issues with MySQL Database Service 8.0.22 were found and repaired. Please review the changes made before loading them.
Writing global DDL files
Writing users DDL
Writing DDL for schema `cart`
Writing DDL for table `cart`.`salaries`
Writing DDL for table `cart`.`sales`
Writing DDL for table `cart`.`t1`
Preparing data dump for table `cart`.`salaries`
Data dump for table `cart`.`salaries` will be chunked using column `id`
Preparing data dump for table `cart`.`sales`
Data dump for table `cart`.`sales` will be chunked using column `id`
Preparing data dump for table `cart`.`t1`
NOTE: Could not select a column to be used as an index for table `cart`.`t1`. Chunking has been disabled for this table, data will be dumped to a single file.
Sekarang dry run baik-baik saja dan tidak ada pengecualian. Mari kita jalankan perintah dump instance untuk mengambil cadangan instance.
Direktori target harus kosong sebelum ekspor dilakukan. Jika direktori belum ada di direktori induknya, utilitas akan membuatnya.
Contoh 3
MySQL localhost:3306 ssl cart JS > util.dumpInstance("/home/vagrant/production_backup", {compatibility: ["strip_restricted_grants","force_innodb"],threads : 12})
Acquiring global read lock
Global read lock acquired
All transactions have been started
Locking instance for backup
Global read lock has been released
Writing global DDL files
Writing users DDL
Writing DDL for schema `cart`
Writing DDL for view `cart`.`price`
Writing DDL for table `cart`.`dummy`
Writing DDL for table `cart`.`salaries`
Writing DDL for schema `sbtest`
Writing DDL for table `sbtest`.`sbtest1`
Writing DDL for table `sbtest`.`sbtest10`
.
.
.
1 thds dumping - 99% (624.55K rows / ~625.40K rows), 896.15K rows/s, 10.13 MB/s uncompressed, 3.73 MB/s compressed
Duration: 00:00:00s
Schemas dumped: 2
Tables dumped: 18
Uncompressed data size: 7.14 MB
Compressed data size: 2.79 MB
Compression ratio: 2.6
Rows written: 624550
Bytes written: 2.79 MB
Average uncompressed throughput: 7.14 MB/s
Average compressed throughput: 2.79 MB/s
Di atas kami telah menggunakan opsi kompatibilitas. Jadi saat mengambil dump, itu akan mengubah tabel myisam menjadi innodb dan menyimpannya ke file.
Log
[[email protected] production_backup]$ cat [email protected]
-- MySQLShell dump 1.0.1 Distrib Ver 8.0.22 for Linux on x86_64 - for MySQL 8.0.22 (MySQL Community Server (GPL)), for Linux (x86_64)
--
-- Host: localhost Database: cart Table: sales
-- ------------------------------------------------------
-- Server version 5.7.32
--
-- Table structure for table `sales`
--
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE IF NOT EXISTS `sales` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(30) DEFAULT NULL,
`address` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
Jika Anda menggunakan mysqldump, itu akan menyimpan output ke dalam satu file. Tapi di sini ia menghasilkan lebih banyak file seperti yang akan kami jelaskan di bawah.
Ini adalah file yang tersedia di direktori cadangan.
[[email protected] production_backup]$ ls -lrth
total 52K
-rw-r-----. 1 vagrant vagrant 707 Nov 6 02:36 @.json
-rw-r-----. 1 vagrant vagrant 287 Nov 6 02:36 cart.json
-rw-r-----. 1 vagrant vagrant 240 Nov 6 02:36 @.sql
-rw-r-----. 1 vagrant vagrant 240 Nov 6 02:36 @.post.sql
-rw-r-----. 1 vagrant vagrant 2.6K Nov 6 02:36 @.users.sql
-rw-r-----. 1 vagrant vagrant 733 Nov 6 02:36 [email protected]
-rw-r-----. 1 vagrant vagrant 486 Nov 6 02:36 cart.sql
-rw-r-----. 1 vagrant vagrant 575 Nov 6 02:36 [email protected]
-rw-r-----. 1 vagrant vagrant 8 Nov 6 02:36 [email protected]@0.tsv.zst.idx
-rw-r-----. 1 vagrant vagrant 8 Nov 6 02:36 [email protected]@@1.tsv.zst.idx
-rw-r-----. 1 vagrant vagrant 47 Nov 6 02:36 [email protected]@0.tsv.zst
-rw-r-----. 1 vagrant vagrant 24 Nov 6 02:36 [email protected]@@1.tsv.zst
-rw-r-----. 1 vagrant vagrant 252 Nov 6 02:36 @.done.json
- File @.json ini berisi detail server dan daftar pengguna, nama database, dan rangkaian karakternya.
- File cart.json ini berisi tampilan, SP, nama fungsi beserta daftar tabelnya.
- File @.sql dan @.post.sql ini berisi detail versi server MySQL.
- File @.users.sql ini berisi daftar pengguna database.
- File [email protected] ini berisi struktur tabel.
- File cart.sql ini berisi pernyataan database.
- File [email protected] ini berisi nama kolom dan set karakter.
- File [email protected]@0.tsv.zst.idx adalah file biner. Ini menyimpan statistik indeks tabel.
- File [email protected]@0.tsv.zst adalah file biner dan menyimpan data.
- File @.done.json ini berisi waktu akhir pencadangan dan ukuran file data dalam KB.
util.dumpSchemas()
Ini akan membuang skema spesifik yang Anda sebutkan dalam argumen untuk utilitas ini.
Sintaks
util.dumpSchemas(schemas, outputUrl[, options])
Contoh
MySQL localhost:3306 ssl cart JS > util.dumpSchemas(["cart"], "/home/vagrant/production_backup",{compatibility: ["strip_restricted_grants","force_innodb"],threads :12})
Acquiring global read lock
Global read lock acquired
All transactions have been started
Locking instance for backup
NOTE: Backup lock is not supported in MySQL 5.7 and DDL changes will not be blocked. The dump may fail with an error or not be completely consistent if schema changes are made while dumping.
Global read lock has been released
Writing global DDL files
Writing DDL for table `cart`.`price_tag`
Writing DDL for schema `cart`
Writing DDL for table `cart`.`salaries`
Writing DDL for table `cart`.`sales`
NOTE: Table 'cart'.'sales' had unsupported engine MyISAM changed to InnoDB
Preparing data dump for table `cart`.`price_tag`
Data dump for table `cart`.`price_tag` will be chunked using column `id`
Data dump for table `cart`.`price_tag` will be written to 1 file
Preparing data dump for table `cart`.`salaries`
Data dump for table `cart`.`salaries` will be chunked using column `id`
Data dump for table `cart`.`salaries` will be written to 2 files
Preparing data dump for table `cart`.`sales`
Data dump for table `cart`.`sales` will be chunked using column `id`
Running data dump using 12 threads.
NOTE: Progress information uses estimated values and may not be accurate.
Data dump for table `cart`.`sales` will be written to 1 file
1 thds dumping - 150% (3 rows / ~2 rows), 0.00 rows/s, 0.00 B/s uncompressed, 0.00 B/s compressed
Duration: 00:00:00s
Schemas dumped: 1
Tables dumped: 3
Uncompressed data size: 53 bytes
Compressed data size: 0 bytes
Compression ratio: 53.0
Rows written: 3
Bytes written: 0 bytes
Average uncompressed throughput: 53.00 B/s
Average compressed throughput: 0.00 B/s
util.dumpTables
Jika Anda ingin membuang tabel tertentu, kami dapat menggunakan utilitas dumpTables.
Untuk tabel yang lebih besar, mysqldump akan memakan waktu lebih lama. Gunakan utilitas dumpTables untuk mengurangi waktu.
Sintaks
util.dumpTables(schema, tables, outputUrl[, options])
Contoh
util.dumpTables("sbtest", [ "sbtest14", "sbtest16" ], "/home/vagrant/specific_table",{dryRun: true})
MySQL localhost:33060+ ssl sbtest JS > util.dumpTables("sbtest", [ "sbtest14", "sbtest16" ], "/home/vagrant/specific_table",{threads: 12})
Acquiring global read lock
Global read lock acquired
All transactions have been started
Locking instance for backup
Global read lock has been released
Writing global DDL files
Writing DDL for table `sbtest`.`sbtest16`
Writing DDL for table `sbtest`.`sbtest14`
Preparing data dump for table `sbtest`.`sbtest16`
Data dump for table `sbtest`.`sbtest16` will be chunked using column `id`
Preparing data dump for table `sbtest`.`sbtest14`
Data dump for table `sbtest`.`sbtest14` will be chunked using column `id`
Running data dump using 12 threads.
NOTE: Progress information uses estimated values and may not be accurate.
Data dump for table `sbtest`.`sbtest16` will be written to 1 file
Data dump for table `sbtest`.`sbtest14` will be written to 1 file
1 thds dumping - 99% (78.07K rows / ~78.08K rows), 0.00 rows/s, 0.00 B/s uncompressed, 0.00 B/s compressed
Duration: 00:00:00s
Schemas dumped: 1
Tables dumped: 2
Uncompressed data size: 892.39 KB
Compressed data size: 348.91 KB
Compression ratio: 2.6
Rows written: 78068
Bytes written: 348.91 KB
Average uncompressed throughput: 892.39 KB/s
Average compressed throughput: 348.91 KB/s
Utilitas Pemuatan Dump
Utilitas pemuatan dump menyediakan streaming data ke penyimpanan jarak jauh, pemuatan tabel atau potongan tabel secara paralel, pelacakan status kemajuan, kemampuan melanjutkan dan menyetel ulang, dan opsi pemuatan bersamaan saat dump masih berlangsung.
Catatan:Utilitas pemuatan dump menggunakan pernyataan LOAD DATA LOCAL INFILE, jadi kita perlu mengaktifkan parameter local_infile ini secara global saat mengimpor.
Utilitas pemuatan dump memeriksa apakah variabel sistem sql_require_primary_key diatur ke AKTIF, dan jika ya, mengembalikan kesalahan jika ada tabel di file dump tanpa kunci utama.
Sintaks
util.loadDump(url[, options])
Contoh
MySQL localhost:3306 ssl sbtest JS > util.loadDump("/home/vagrant/specific_table", {progressFile :"/home/vagrant/specific_table/log.json",threads :12})
Loading DDL and Data from '/home/vagrant/specific_table' using 12 threads.
Opening dump...
Target is MySQL 8.0.22. Dump was produced from MySQL 8.0.22
Checking for pre-existing objects...
Executing common preamble SQL
[Worker006] Executing DDL script for `sbtest`.`sbtest1`
[Worker004] Executing DDL script for `sbtest`.`sbtest12`
2 thds loading \ 100% (892.39 KB / 892.39 KB), 0.00 B/s, 0 / 2 tables done[Worker001] [email protected]@@0.tsv.zst: Records: 39034 Deleted: 0 Skipped: 0 Warnings: 0
[Worker005] [email protected]@@0.tsv.zst: Records: 39034 Deleted: 0 Skipped: 0 Warnings: 0
Executing common postamble SQL
2 chunks (78.07K rows, 892.39 KB) for 2 tables in 1 schemas were loaded in 1 sec (avg throughput 892.39 KB/s)
0 warnings were reported during the load.
Secara default, indeks teks lengkap untuk tabel dibuat hanya setelah tabel dimuat sepenuhnya, yang mempercepat impor.
Anda juga dapat memilih untuk menonaktifkan pembuatan indeks selama impor, dan membuat indeks setelahnya.
Utilitas pemuatan dump mengimpor di beberapa utas untuk memaksimalkan paralelisme. Jika file dump dikompresi oleh utilitas dump MySQL Shell, utilitas dump loading menangani dekompresi.
Anda dapat memilih tabel atau skema individual untuk diimpor atau dikecualikan dari impor.
Anda dapat memilih untuk melewati pencatatan log biner pada instans MySQL target selama proses impor menggunakan pernyataan SET sql_log_bin=0.
Kesimpulan
Ini adalah salah satu utilitas yang kuat di MySQL 8.0. Sekarang dimungkinkan untuk membuang dari MySQL 5.6 dan memuat dump ini ke MySQL 5.7 atau 8.0. Tetapi pembuangan akun pengguna tidak didukung saat membuang dari MySQL 5.6. Di blog saya berikutnya, kita akan membandingkan kecepatan pencadangan/pemulihan MySQLdump dan utilitas shell.