Mysql

mysqldump所有數據庫,包括使用者/密碼和授權

  • September 16, 2021

我正在執行10.5.12-MariaDB並嘗試對所有數據庫進行完整備份,包括使用者帳戶/密碼和贈款,但不知何故我無法備份贈款,所以我錯過了一些東西。

例子。

進行完整備份

old-DB # mysqldump --opt --all-databases > /root/openstack.sql

恢復到新的數據庫伺服器

new-DB # mysql < openstack.sql

現在我可以看到mysql.user表中的所有數據庫和所有使用者,但所有使用者都缺少授權。

例子:

old-DB # mysql -e 'show grants for glance';
+-------------------------------------------------------------------------------------------------------+
| Grants for glance@%                                                                                   |
+-------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `glance`@`%` IDENTIFIED BY PASSWORD '*6FE1E5E532A9189C900FB696AC9DEF84CDE2194A' |
| GRANT ALL PRIVILEGES ON `glance`.* TO `glance`@`%`                                                    |
+-------------------------------------------------------------------------------------------------------+

它在新的數據庫伺服器上失去

new-DB# mysql -e 'show grants for glance';
ERROR 1141 (42000) at line 1: There is no such grant defined for user 'glance' on host '%'

所以我做了以下

old-DB# mysql --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql --skip-column-names -A | sed 's/$/;/g' > MySQLUserGrants.sql

現在 MySQLUserGrants.sql 擁有所有使用者授予命令,所以我只需複制粘貼所有命令並粘貼到 new-DB 我得到以下錯誤

MariaDB [(none)]> GRANT USAGE ON *.* TO `glance`@`%` IDENTIFIED BY PASSWORD '*6FE1E5E532A9189C900FB696AC9DEF84CDE2194A';
ERROR 1133 (28000): Can't find any matching row in the user table

問題,我如何進行完整的 mysql 備份,其中包括所有內容,甚至包括贈款。(或者我錯過了什麼?)

是的。你可以使用--system開關。這僅存在於 MariaDB 版本中mysqldump,儘管您可以使用它從 MySQL 數據庫中轉儲。

system=users將為您的使用者和授權轉儲CREATE USER ...和聲明:GRANT ...

mysqldump --opt --system=users --insert-ignore --all-databases > /root/openstack.sql

--insert-ignore選項對於避免在導入轉儲時與現有使用者發生衝突很重要。該選項將導致CREATE USER IF NOT EXISTS語句,而不僅僅是CREATE USER.

真正包含所有內容,請改用--system=all.

請參閱 MariaDB KB mysqldump手冊頁中的文件(搜尋--system)。

這是最近的一項功能,已向後移植到 MariaDB 10.2 及更高版本。

您在邏輯上支持贈款幾乎是在做正確的事情。

大約 7.5 年前我推薦了同樣的方法:導出所有 MySQL 使用者

您還可以使用pt-show-grants並附FLUSH PRIVILEGES;加到輸出

(
  pt-show-grants ...
  echo "FLUSH PRIVILEGES;"
) > user_grants.sql

引用自:https://dba.stackexchange.com/questions/299650