Mysql

‘拒絕訪問;嘗試轉儲表空間時,您需要(至少一個)此操作的 PROCESS 特權

  • March 13, 2022

我正在嘗試使用命令備份 mysql

mysqldump -u root -p  database_name > backup.sql

,但它拋出一個錯誤:

‘拒絕訪問; 嘗試轉儲表空間時,您需要(至少一個)此操作的 PROCESS 特權

另外,我想備份我的數據庫,所有表都單獨儲存為一個文件。我該怎麼做?

mysql 版本 = 5.7.31

採用--no-tablespaces

mysqldump-文件

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 中引入的重大更改。

請參閱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 選項。如選項描述中所述,某些選項可能需要其他權限。

請參閱–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 的使用者應該獲得足夠的權限。

為什麼不針對所有使用者?

MySQLroot使用者當然不受影響。其他使用者可能會或可能不會受到影響,具體取決於他們被授予權限的方式。

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;

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