ApsaraDB RDS for MySQL menerapkan pembatasan izin terhadap pengguna biasa, sehingga beberapa opsi mysqldump standar berperilaku berbeda atau tidak tersedia. Halaman ini mencakup opsi yang perlu dikonfigurasi dengan benar, opsi yang berfungsi sebagaimana mestinya, serta opsi yang diblokir—lengkap dengan pesan error yang muncul jika Anda mencobanya.
Opsi GTID
Dukungan Global Transaction Identifier (GTID) diperkenalkan di MySQL 5.6, bersamaan dengan opsi --set-gtid-purged dalam utilitas mysqldump.
| Option | Default | Values | Description |
|---|---|---|---|
--set-gtid-purged | AUTO | ON | OFF | AUTO | Mengontrol apakah mysqldump menyertakan pernyataan SET @@GLOBAL.GTID_PURGED dalam output dump. |
Nilai:
ON— Selalu menyertakan pernyataanSET @@GLOBAL.GTID_PURGED.OFF— Tidak pernah menyertakan pernyataan tersebut.AUTO(default) — Menyertakan pernyataan tersebut untuk instans yang mendukung GTID; tidak menghasilkan informasi GTID untuk instans yang belum dijalankan atau tidak mendukung GTID.
Jika Anda mengekspor ke instans RDS MySQL 5.5, selalu atur --set-gtid-purged=OFF. MySQL 5.5 tidak mendukung GTID, sehingga penggunaan klien mysqldump MySQL 5.6 atau versi lebih baru tanpa flag ini akan menyebabkan error berikut:
Error: Server has GTIDs disabled.atau
mysqldump: Couldn't execute 'SELECT @@GTID_MODE': Unknown system variable 'GTID_MODE' (1193)Opsi locking
Secara default, mysqldump mengaktifkan --lock-tables, yang mengunci semua tabel sebelum melakukan dump dan memblokir operasi DML selama proses tersebut. InnoDB dan TokuDB—mesin penyimpanan yang didukung oleh ApsaraDB RDS for MySQL—mendukung transaksi, sehingga dump berbasis transaksi lebih aman dan lebih cepat.
Gunakan --single-transaction untuk melakukan dump tabel InnoDB atau TokuDB tanpa mengunci tabel.
| Option | Default | Values | Description |
|---|---|---|---|
--lock-all-tables | FALSE | TRUE | FALSE | Mengambil kunci baca global selama seluruh proses dump, menjadikan semua tabel di semua database read-only. Secara otomatis menonaktifkan --lock-tables dan --single-transaction. Tidak didukung pada ApsaraDB RDS for MySQL — lihat Opsi yang tidak didukung. |
--lock-tables | TRUE | TRUE | FALSE | Mengunci tabel sebelum melakukan dump. Gunakan --skip-lock-tables untuk menonaktifkan. Saat menggunakan --single-transaction, opsi ini secara otomatis dinonaktifkan. |
--single-transaction | FALSE | TRUE | FALSE | Memulai transaksi sebelum melakukan dump data, sehingga menghindari penguncian tabel. Secara otomatis menonaktifkan --lock-tables. Direkomendasikan untuk tabel InnoDB dan TokuDB. |
Perintah yang direkomendasikan
Perintah berikut menggunakan opsi yang direkomendasikan untuk mengekspor data dari instans ApsaraDB RDS for MySQL:
mysqldump --no-defaults \
-u <username> -p<password> \
-h <instance_endpoint> -P 3306 \
--set-gtid-purged=OFF \
--single-transaction \
--hex-blob \
--databases <database_name>--no-defaults— Hanya membaca file.mylogin.cnf, mencegah file opsi lain mengganti pengaturan Anda.--set-gtid-purged=OFF— Diperlukan ketika instans target tidak mendukung GTID (misalnya, RDS MySQL 5.5).--single-transaction— Melakukan dump tabel InnoDB dan TokuDB secara konsisten tanpa mengunci tabel.--hex-blob— Mengekspor kolom biner dalam bentuk heksadesimal untuk menghindari masalah encoding saat migrasi antar versi MySQL.
Set karakter
Jika tidak ada set karakter yang ditentukan, mysqldump menggunakan UTF-8 sebagai default.
| Option | Default | Values | Description |
|---|---|---|---|
--default-character-set | utf8 | Set karakter apa pun yang didukung oleh ApsaraDB RDS for MySQL | Menetapkan set karakter untuk output dump. |
Opsi tambahan
| Option | Default | Values | Description |
|---|---|---|---|
--no-defaults | — | — | Hanya membaca file opsi .mylogin.cnf, mengabaikan semua file opsi lainnya. |
--defaults-file=file_name | — | — | Membaca opsi hanya dari file yang ditentukan. |
--add-drop-database | FALSE | TRUE | FALSE | Menambahkan pernyataan DROP DATABASE sebelum setiap pernyataan CREATE DATABASE dalam dump. |
--add-drop-table | TRUE | TRUE | FALSE | Menambahkan pernyataan DROP TABLE sebelum setiap pernyataan CREATE TABLE. Gunakan --skip-add-drop-table untuk menonaktifkan. |
--add-locks | TRUE | TRUE | FALSE | Membungkus setiap dump tabel dengan LOCK TABLES ... WRITE dan UNLOCK TABLES, yang mempercepat proses insert saat dump dimuat ulang. |
--compatible=name | — | ansi | postgresql | oracle | mssql | Menghasilkan output yang kompatibel dengan tipe database yang ditentukan. |
--compact | FALSE | TRUE | FALSE | Mengaktifkan --skip-add-drop-table, --skip-add-locks, --skip-comments, --skip-disable-keys, dan --skip-set-charset. |
--databases | TRUE | TRUE | FALSE | Memperlakukan semua argumen nama sebagai nama database dan menyertakan pernyataan CREATE DATABASE serta USE dalam output. Tanpa opsi ini, argumen nama pertama dianggap sebagai database dan nama berikutnya sebagai tabel. |
--disable-keys | TRUE | TRUE | FALSE | Membungkus pernyataan INSERT dengan ALTER TABLE ... DISABLE KEYS dan ALTER TABLE ... ENABLE KEYS untuk mempercepat pemuatan. Hanya efektif untuk indeks non-unik pada tabel MyISAM. |
--events | FALSE | TRUE | FALSE | Menyertakan event terjadwal dalam dump. |
--extended-insert | TRUE | TRUE | FALSE | Menggabungkan beberapa pernyataan INSERT baris tunggal menjadi satu pernyataan INSERT multi-baris. |
--hex-blob | FALSE | TRUE | FALSE | Mengekspor kolom BINARY, VARBINARY, dan BLOB dalam notasi heksadesimal. Tambahkan opsi ini saat migrasi data antar versi MySQL yang berbeda untuk menghindari masalah encoding. |
--ignore-table=db.tab | TRUE | TRUE | FALSE | Mengecualikan tabel atau view yang ditentukan dari dump. Format: database_name.table_name. Ulangi opsi ini untuk mengecualikan beberapa tabel. |
--max-allowed-packet | 24MB | 24MB–1GB | Ukuran buffer maksimum untuk komunikasi antara mysqldump dan instans ApsaraDB RDS for MySQL. |
--no-create-db | FALSE | TRUE | FALSE | Menghilangkan pernyataan CREATE DATABASE dari dump. |
--no-create-info | FALSE | TRUE | FALSE | Menghilangkan pernyataan CREATE TABLE dari dump. |
--no-data | FALSE | TRUE | FALSE | Melakukan dump hanya skema, tanpa data tabel. |
--opt | TRUE | TRUE | FALSE | Singkatan yang mengaktifkan --add-drop-table, --add-locks, --create-options, --disable-keys, --extended-insert, --lock-tables, --quick, dan --set-charset. Gunakan --skip-opt untuk menonaktifkan. |
--dump-date | TRUE | TRUE | FALSE | Menambahkan stempel waktu dump ke output saat --comments diaktifkan (yang merupakan default). |
--routines | FALSE | TRUE | FALSE | Menyertakan prosedur tersimpan dan fungsi dalam dump. |
--result-file | TRUE | TRUE | FALSE | Mengarahkan output ke file yang ditentukan. |
--set-charset | TRUE | TRUE | FALSE | Menambahkan SET NAMES default_character_set ke output dump. |
--triggers | TRUE | TRUE | FALSE | Menyertakan pemicu untuk setiap tabel yang di-dump. |
Opsi yang tidak didukung
Opsi berikut tidak tersedia bagi pengguna biasa ApsaraDB RDS for MySQL karena pembatasan izin.
| Option | Reason |
|---|---|
--all-databases | Pengguna biasa tidak memiliki izin pada tabel tertentu di database mysql (seperti slow_log), sehingga dump database lengkap gagal. Untuk mengekspor semua database pengguna, gunakan --databases dan cantumkan setiap database secara eksplisit. |
--flush-logs | Memerlukan hak istimewa RELOAD, yang tidak diberikan kepada pengguna biasa. |
--flush-privileges | Tidak berlaku — ApsaraDB RDS for MySQL tidak mengizinkan ekspor database mysql. |
--lock-all-tables | Memerlukan hak istimewa RELOAD, yang tidak diberikan kepada pengguna biasa. |
--tab=dir_name | Memerlukan mysqldump dan instans RDS berada di mesin fisik yang sama, yang tidak terjadi di lingkungan terkelola. |
Pesan error
Jika Anda menggunakan --all-databases atau --lock-all-tables:
mysqldump: Couldn't execute 'show create table slow_log': SHOW command denied to user 'xxx'@'xx.xx.xx.xx' for table 'slow_log' (1142)Jika Anda menggunakan --flush-logs atau --lock-all-tables:
mysqldump: Couldn't execute 'FLUSH TABLES': Access denied; you need (at least one of) the RELOAD privilege(s) for this operation (1227)Menggunakan `--tab` dengan `--no-data`
Meskipun --tab=dir_name tidak dapat digunakan untuk dump data lengkap, menggabungkannya dengan --no-data memungkinkan Anda mengekspor pernyataan CREATE TABLE untuk setiap tabel ke dalam file .sql terpisah:
# Ekspor hanya pernyataan CREATE TABLE (tanpa data)
mysqldump --no-defaults \
-u <username> -p<password> \
-h <instance_endpoint> -P 3306 \
--set-gtid-purged=OFF \
--single-transaction \
--tab=/tmp \
--no-data \
<database_name>Menggunakan --tab tanpa --no-data menghasilkan error berikut:
mysqldump: Got error: 1045: Access denied for user 'xxx'@'%' (using password: YES) when executing 'SELECT INTO OUTFILE'