ฉันจะสร้างผู้ใช้ MySQL แบบอ่านอย่างเดียวเพื่อการสำรองข้อมูลด้วย mysqldump ได้อย่างไร


14

ฉันใช้automysqlbackupสคริปต์เพื่อถ่ายโอนฐานข้อมูล mysql ของฉัน แต่ฉันต้องการให้ผู้ใช้แบบอ่านอย่างเดียวทำเช่นนี้เพื่อที่ฉันจะไม่เก็บรหัสผ่านฐานข้อมูลรูทของฉันลงในไฟล์ธรรมดา

ฉันได้สร้างผู้ใช้เช่นนั้น:

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

เมื่อฉันเรียกใช้mysqldump(ผ่านautomysqlbackupหรือโดยตรง) ฉันได้รับคำเตือนต่อไปนี้:

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

ฉันทำผิดหรือเปล่า? ฉันต้องการเงินช่วยเหลือเพิ่มเติมสำหรับผู้ใช้แบบอ่านอย่างเดียวหรือไม่? หรือสามารถrootล็อคinformation_schemaตารางเท่านั้น? เกิดอะไรขึ้น?

แก้ไข:

GAH และตอนนี้ก็ใช้งานได้ ฉันอาจไม่ได้เรียกใช้สิทธิ์ล้างก่อนหน้านี้

นอกจากนี้สิ่งนี้เกิดขึ้นโดยอัตโนมัติบ่อยเพียงใด

แก้ไข:

ไม่มันไม่ทำงาน การเรียกใช้mysqldump -u username -p --all-databases > dump.sqlด้วยตนเองไม่ได้สร้างข้อผิดพลาด แต่ไม่ถ่ายโอนข้อมูล data_schema automysqlbackupจะทำให้เกิดข้อผิดพลาด


โอ๊ะโอ ... จากหน้า man สำหรับmysqldump: mysqldump ไม่ได้ถ่ายโอนฐานข้อมูล Information_SCHEMA ถ้าคุณชื่อฐานข้อมูลที่ชัดเจนในบรรทัดคำสั่ง mysqldump เงียบไม่สนใจมันดูเหมือนว่าทั้งหน้าคนออกจากวันที่ (และมันจะยกระดับการเตือน) หรือมีประสิทธิภาพตรวจสอบเพิ่มเติมบางประการเกี่ยวกับการถ่ายโอนข้อมูลสำหรับautomysqlbackup information_schemaไม่แน่ใจว่ามันคืออะไร แต่ไม่เกี่ยวข้องกับการมอบสิทธิ์ของผู้ใช้
stickmangumby

1
มันไม่ใช่ปัญหาของ GRANT คุณไม่จำเป็นต้องทำการแบ็คอัพ Information_SCHEMA (ดูที่: dev.mysql.com/doc/refman/5.0/en/information-schema.html )
SmallClanger

1
ในการเพิ่มสิ่งที่ SmallClanger กล่าวไว้ Information_SCHEMA เป็นฐานข้อมูลเสมือนสร้างขึ้นใหม่ทุกครั้งที่มีการรีสตาร์ท MySQL ดังนั้นจึงไม่มีประโยชน์ในการสำรองข้อมูลเพราะคุณไม่สามารถกู้คืนได้
John Gardeniers

คำตอบ:


4

สิทธิ์เหล่านั้นควรเป็นสิ่งที่จำเป็นสำหรับ mysqldump

เนื่องจากคุณได้รับ LOCK TABLES และมีข้อผิดพลาดใน LOCK TABLES ดูเหมือนว่าสิทธิ์จะไม่สอดคล้องกัน คุณเรียกใช้FLUSH PRIVILEGES?


1

โอ๊ะโอ ... จากหน้า man สำหรับmysqldump:

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

ดูเหมือนว่าทั้งหน้าคนออกจากวันที่ (และมันจะยกระดับการเตือน) หรือมีประสิทธิภาพตรวจสอบเพิ่มเติมบางประการเกี่ยวกับการถ่ายโอนข้อมูลสำหรับautomysqlbackupinformation_schema

ไม่แน่ใจว่ามันคืออะไร แต่ไม่เกี่ยวข้องกับการมอบสิทธิ์ของผู้ใช้

แก้ไข

ใช่มันเป็นข้อบกพร่องในautomysqlbackupรุ่น 2.5.1 (ใช้ MySQL 5.1.41 ภายใต้ Ubuntu 10.04) - มันพยายามสำรองinformation_schemaเมื่อไม่ควรทำ

การแก้ไข: เพิ่มinformation_schemaไปยังDBEXCLUDEในบรรทัด 76 ของสคริปต์


มันไม่ใช่ปัญหาของ GRANT คุณไม่จำเป็นต้องทำการแบ็คอัพ Information_SCHEMA (ดูที่: dev.mysql.com/doc/refman/5.0/en/information-schema.html )
SmallClanger

ในการเพิ่มสิ่งที่ SmallClanger กล่าวไว้ Information_SCHEMA เป็นฐานข้อมูลเสมือนสร้างขึ้นใหม่ทุกครั้งที่มีการรีสตาร์ท MySQL ดังนั้นจึงไม่มีประโยชน์ในการสำรองข้อมูลเพราะคุณไม่สามารถกู้คืนได้
John Gardeniers

0

สร้างผู้ใช้

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

ตรวจสอบสิทธิพิเศษ

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' |
+-----------------------------------------------------------------------------------------------+

ใช้โปรแกรมแก้ไขรายการโปรดเล็กน้อยเพื่อสร้างไฟล์~/.my.cnfด้วยchmod 400

[client]
user=dump
password=plaintext-pass

สร้างโฟลเดอร์สำหรับทิ้งเช่นเดียวกับตัวอย่าง

mkdir ~/db-dumps

ตรวจสอบว่ามันใช้งานได้

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

เลือกที่คุณสามารถทำให้ทิ้งdailyและweeklyแล้วลบทุกdailyเดือนแล้วที่มีอายุมากกว่า

#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 {} \;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.