Bagaimana cara membuat pengguna MySQL hanya baca untuk keperluan cadangan dengan mysqldump?

14

Saya menggunakan automysqlbackupskrip untuk membuang basis data mysql saya, tetapi saya ingin memiliki pengguna read-only untuk melakukan ini sehingga saya tidak menyimpan kata sandi basis data root saya dalam file plaintext.

Saya telah membuat pengguna seperti ini:

grant select, lock tables on *.* to 'username'@'localhost' identified by 'password';

Ketika saya menjalankan mysqldump(baik melalui automysqlbackupatau secara langsung) saya mendapatkan peringatan berikut:

mysqldump: Got error: 1044: Access denied for user 'username'@'localhost' to database 'information_schema' when using LOCK TABLES

Apakah saya salah? Apakah saya memerlukan hibah tambahan untuk pengguna hanya baca saya? Atau hanya bisa rootmengunci information_schemameja? Apa yang sedang terjadi?

Edit:

GAH dan sekarang berfungsi. Saya mungkin belum pernah menjalankan FLUSH PRIVILEGES sebelumnya.

Selain itu, seberapa sering hal ini terjadi secara otomatis?

Edit:

Tidak, itu tidak berhasil. Menjalankan mysqldump -u username -p --all-databases > dump.sqlsecara manual tidak menghasilkan kesalahan, tetapi tidak membuang information_schema. automysqlbackuptidak menimbulkan kesalahan.

stickmangumby
sumber
Ups ... dari halaman manual untuk mysqldump: mysqldump tidak membuang database INFORMATION_SCHEMA. Jika Anda memberi nama database itu secara eksplisit pada baris perintah, mysqldump diam-diam mengabaikannya. Sepertinya halaman manual kedaluwarsa (dan memang memunculkan peringatan), atau automysqlbackupsedang melakukan beberapa pemeriksaan tambahan pada dump untuk information_schema. Tidak yakin yang mana, tapi itu tidak terkait dengan hibah pengguna.
stickmangumby
1
Ini bukan masalah GRANT. Anda tidak perlu mencadangkan INFORMATION_SCHEMA (Lihat: dev.mysql.com/doc/refman/5.0/en/information-schema.html )
SmallClanger
1
Untuk menambah apa yang dikatakan SmallClanger, INFORMATION_SCHEMA adalah database virtual, dibangun kembali setiap kali MySQL dimulai ulang, jadi tidak ada gunanya untuk mencadangkannya karena Anda toh tidak dapat mengembalikannya.
John Gardeniers

Jawaban:

4

Izin-izin itu haruslah yang dibutuhkan untuk mysqldump.

Karena Anda telah memberikan LOCK TABLES, dan kesalahan pada LOCK TABLES, sepertinya izinnya tidak konsisten. Sudahkah Anda menjalankan FLUSH PRIVILEGES?

Shane Madden
sumber
1

Ups ... dari halaman manual untuk mysqldump:

mysqldump does not dump the INFORMATION_SCHEMA database. If you name that database explicitly on the command line, mysqldump silently ignores it

Sepertinya halaman manual kedaluwarsa (dan memang menimbulkan peringatan), atau automysqlbackupsedang melakukan beberapa pemeriksaan tambahan pada dump information_schema.

Tidak yakin yang mana, tapi itu tidak terkait dengan hibah pengguna.

Edit

Yap, ini adalah bug dalam automysqlbackupversi 2.5.1 (menggunakan MySQL 5.1.41 di bawah Ubuntu 10.04) - ia mencoba melakukan backup information_schemaketika seharusnya tidak.

PERBAIKI: Tambahkan information_schemake DBEXCLUDEpada baris 76 dari skrip.

stickmangumby
sumber
Ini bukan masalah GRANT. Anda tidak perlu mencadangkan INFORMATION_SCHEMA (Lihat: dev.mysql.com/doc/refman/5.0/en/information-schema.html )
SmallClanger
Untuk menambah apa yang dikatakan SmallClanger, INFORMATION_SCHEMA adalah database virtual, dibangun kembali setiap kali MySQL dimulai ulang, jadi tidak ada gunanya untuk mencadangkannya karena Anda toh tidak dapat mengembalikannya.
John Gardeniers
0

Buat pengguna

GRANT USAGE ON *.* TO 'dump'@'localhost' IDENTIFIED BY 'plaintext-pass';
GRANT SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER ON `my-db`.* TO 'dump'@'localhost';

Periksa hak istimewa

mysql> SHOW GRANTS FOR dump@'localhost';
+-----------------------------------------------------------------------------------------------+
| Grants for dump@localhost                                                                     |
+-----------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'dump'@'localhost'                                                      |
| GRANT SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER ON `my-db`.* TO 'dump'@'localhost' |
+-----------------------------------------------------------------------------------------------+

Gunakan editor favorit Menunjuk untuk membuat file ~/.my.cnfdenganchmod 400

[client]
user=dump
password=plaintext-pass

Buat folder untuk dump, seperti contohnya

mkdir ~/db-dumps

Periksa apakah itu berfungsi

mysqldump -u dump --hex-blob --routines --triggers my-db | gzip > ~/db-dumps/manual-my-db-dump-`date +%F`.sql.gz

Secara opsional, Anda dapat melakukan dump dailydan weeklykemudian menghapus semua yang dailylebih tua bulan itu

#m h  dom mon dow   command
0  3  *   *   0,2-6 /usr/bin/mysqldump -u dump --hex-blob --routines --triggers my-db | gzip > ~/db-dumps/daily-my-db-dump-`date +%F`.sql.gz;
0  3  *   *   1     /usr/bin/mysqldump -u dump --hex-blob --routines --triggers my-db | gzip > ~/db-dumps/weekly-my-db-dump-`date +%F`.sql.gz;
0  4  *   *   *     /usr/bin/find ~/db-dumps/ -name "daily-*" -type f -mtime +30 -exec rm -f {} \;
Vasilii Suricov
sumber