Mysql
為什麼mysqldump不備份程序?
我正在執行 MySQL 8.0.23 並嘗試備份/恢復程序。因此,我創建了一個具有以下權限的使用者“dump@localhost”:
> Grants for dump@localhost > GRANT PROCESS ON *.* TO `dump`@`localhost` > GRANT SELECT, LOCK TABLES, SHOW VIEW, TRIGGER ON `mydb`.* TO `dump`@`localhost`
像這樣創建備份:
mysqldump -u dump -p -n -d -t -R mydb > test.sql
命令執行,但 sql 文件中沒有過程。
-- -- Dumping routines for database 'mydb' -- /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; -- Dump completed on 2021-12-25 17:21:39
但是,如果我使用自己的使用者帳戶而不是“轉儲”或同時使用 root,它將轉儲程序。
根據 MySQL 8 文件,提供的權限應該足夠了: https ://dev.mysql.com/doc/refman/8.0/en/mysqldump.html
mysqldump 至少需要轉儲表的 SELECT 權限,轉儲視圖的 SHOW VIEW ,轉儲觸發器的 TRIGGER ,如果不使用 –single-transaction 選項,則需要 LOCK TABLES ,並且(從 MySQL 8.0.21 開始)如果 –不使用 no-tablespaces 選項。如選項描述中所述,某些選項可能需要其他權限。
我的一個典型程序如下所示:
create definer = root@localhost procedure SUM_prices_d() INSERT IGNORE INTO SUM_prices_d ...
我缺少什麼權利?
您很有可能需要再獲得一筆資助:
GRANT SELECT ON mysql.proc TO `dump`@`localhost`;
原因:轉儲儲存過程需要讀取
mysql.proc
更新 2021-12-25 12:20
–常式,-R
在輸出中包括轉儲數據庫的儲存常式(過程和函式)。此選項需要全域 SELECT 權限。
使用 –routines 生成的輸出包含用於創建常式的 CREATE PROCEDURE 和 CREATE FUNCTION 語句。
您可能需要按以下方式調整贈款
GRANT PROCESS,SELECT ON *.* TO `dump`@`localhost`
或僅出於轉儲儲存過程的目的創建單獨的使用者
GRANT PROCESS,SELECT ON *.* TO `dump_storedprocs`@`localhost`