Mysql

為什麼mysqldump不備份程序?

  • December 25, 2021

我正在執行 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

根據MySQL 文件,您需要全域 SELECT 權限

–常式,-R

在輸出中包括轉儲數據庫的儲存常式(過程和函式)。此選項需要全域 SELECT 權限

使用 –routines 生成的輸出包含用於創建常式的 CREATE PROCEDURE 和 CREATE FUNCTION 語句。

您可能需要按以下方式調整贈款

GRANT PROCESS,SELECT ON *.* TO `dump`@`localhost`

或僅出於轉儲儲存過程的目的創建單獨的使用者

GRANT PROCESS,SELECT ON *.* TO `dump_storedprocs`@`localhost`

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