‘拒絕訪問;嘗試轉儲表空間時,您需要(至少一個)此操作的 PROCESS 特權
我正在嘗試使用命令備份 mysql
mysqldump -u root -p database_name > backup.sql
,但它拋出一個錯誤:
‘拒絕訪問; 嘗試轉儲表空間時,您需要(至少一個)此操作的 PROCESS 特權
另外,我想備份我的數據庫,所有表都單獨儲存為一個文件。我該怎麼做?
mysql 版本 = 5.7.31
採用
--no-tablespaces
mysqldump至少需要轉儲表的 SELECT 權限,轉儲視圖的 SHOW VIEW ,轉儲觸發器的 TRIGGER ,如果不使用 –single-transaction 選項,則需要 LOCK TABLES ,並且(從 MySQL 8.0.21 開始)PROCESS 如果 –不使用 no-tablespaces 選項。如選項描述中所述,某些選項可能需要其他權限。
並查看 param no-tablespaces的文件
–無表空間,-y
此選項抑制 mysqldump 輸出中的所有 CREATE LOGFILE GROUP 和 CREATE TABLESPACE 語句。
tl;dr次要 MySQL 更新中引入的重大更改,從現在開始使用
--no-tablespaces
選項mysqldump
(推薦)或將全域PROCESS
權限添加到執行命令的使用者。我在一些機器上遇到了同樣的問題。不是一次全部,不是對所有命令,不是對所有使用者。
為什麼不一次全部?
事實證明,這是 2020/07 年 MySQL 次要更新 5.7.31 和 8.0.21 中引入的重大更改。
安全說明
> > 不兼容的更改:對 INFORMATION_SCHEMA.FILES 表的訪問現在需要 PROCESS 權限。 > > > 此更改會影響 mysqldump 命令的使用者,該命令訪問 FILES 表中的表空間資訊,因此現在也需要 PROCESS 權限。不需要轉儲表空間資訊的使用者可以通過使用 –no-tablespaces 選項呼叫 mysqldump 來解決此要求。(缺陷號 30350829) > > >
上述問題編號應在此處http://mybug.no.oracle.com/orabugs/bug.php?id=30350829可用。然而,Oracle 的錯誤跟踪器似乎已關閉。另一個公共問題是https://bugs.mysql.com/bug.php?id=100219。
所以這個問題必鬚髮生在所有具有 MySQL >= 5.7 並最終獲得系統更新的機器上。
次要更新中的重大更改是意料之外的。然而,這是一個安全問題。遺憾的是,這個問題以及如何解決它沒有得到更好的溝通。恕我直言,對於這種重大更改,更實用的解決方案是
mysqldump
預設刪除表空間並添加一個--add-tablespaces
選項。為什麼不在所有命令上?
PROCESS
大多數案例不需要上述特權。mysqldump
但是嘗試訪問該INFORMATION_SCHEMA.FILES
表,如上所述 - 現在需要 PROCESS 權限。所以
mysqldump
現在需要由具有足夠權限的使用者或使用該--no-tablespaces
選項來啟動。請參閱mysqldump 文件
mysqldump 至少需要轉儲表的 SELECT 權限,轉儲視圖的 SHOW VIEW ,轉儲觸發器的 TRIGGER ,如果不使用 –single-transaction 選項,則需要 LOCK TABLES ,並且(從 MySQL 5.7.31 開始)PROCESS 如果 –不使用 no-tablespaces 選項。如選項描述中所述,某些選項可能需要其他權限。
此選項抑制 mysqldump 輸出中的所有 CREATE LOGFILE GROUP 和 CREATE TABLESPACE 語句。
參見過程文件
PROCESS 權限控制對有關在伺服器中執行的執行緒的資訊(即有關會話正在執行的語句的資訊)的訪問。PROCESS 權限還允許使用 SHOW ENGINE 語句、訪問 INFORMATION_SCHEMA InnoDB 表(名稱以 INNODB_ 開頭的表)以及(從 MySQL 5.7.31 開始)訪問 INFORMATION_SCHEMA FILES 表。
什麼是MySQL 表空間是使用它的原因,在 StackOverflow 上的另一個問題中已經很好地解釋了。
一般建議:大多數使用者不需要表空間資訊,因此可以使用該
--no-tablespace
選項安全地忽略它。如果表空間是有意並自願配置的,那麼執行 mysqldumps 的使用者應該獲得足夠的權限。
為什麼不針對所有使用者?
MySQL
root
使用者當然不受影響。其他使用者可能會或可能不會受到影響,具體取決於他們被授予權限的方式。該
GRANT
選項在全域級別、單個數據庫、單個表甚至列或常式上添加權限。某些特權,例如上述PROCESS
特權,需要在全域級別上添加。見撥款文件
下表總結了可以為 GRANT 和 REVOKE 語句指定的允許權限類型,以及可以授予每個權限的級別。
| 特權 | 意義和授予級別 |
| 工藝 | 使使用者能夠使用 SHOW PROCESSLIST 查看所有程序。級別:全球。|
所以 sql 命令
GRANT ALL PRIVILEGES ON somedatabase.* TO someuser@localhost;
只會在一個數據庫上為使用者添加所有可用的權限。使用 . 添加全域權限ON *.*
。在我的情況下,大多數數據庫使用者僅對選定的數據庫具有權限。使用 . 檢查使用者權限
SHOW GRANTS for someuser@localhost;
。要添加全域權限,請使用 SQL 命令
GRANT PROCESS ON *.* TO someuser@localhost;
。除非您知道此特權的後果,否則不要這樣做。對撤銷特權使用REVOKE PROCESS ON *.* FROM someuser@localhost;
。