簡體   English   中英

MySQL/Amazon RDS 錯誤:“您沒有超級權限...”

[英]MySQL/Amazon RDS error: "you do not have SUPER privileges..."

我正在嘗試將我的 mysql 數據庫從 Amazon EC2 復制到 RDS:

我使用這個成功地將我的數據庫的mysqldump放到了我的根文件夾中:

root@ip-xx-xx-xx-xx:~# mysqldump my_database -u my_username -p > my_database.sql

然后我嘗試將 this.sql 文件傳輸到我的新 RDS 數據庫:

root@ip-xx-xx-xx-xx:~# mysql my_database -u my_username -p -h  
my_new_database.xxxxxxxxx.us-east-1.rds.amazonaws.com < my_database.sql

不幸的是,我收到以下錯誤消息:

You do not have the SUPER privilege and binary logging is enabled 
(you *might* want to use  the less safe log_bin_trust_function_creators variable)

我嘗試以多種方式GRANT SUPER..但是當我嘗試這樣做時我也遇到了錯誤。 輸入mysql > FLUSH privileges; 也不起作用。

我是 mysql 初學者,很抱歉回答這么簡單的問題。 想法?

  1. 打開 RDS Web 控制台。
  2. 打開“參數組”選項卡。
  3. 創建一個新的參數組。 在對話框中,選擇與您的 MySQL 數據庫版本兼容的 MySQL 系列,為其命名並確認。 選擇剛剛創建的參數組並發出“編輯參數”。
  4. 查找參數log_bin_trust_function_creators並將其值設置為1
  5. 保存更改。
  6. 打開“實例”選項卡。 展開您的 MySQL 實例並發出名為“修改”的“實例操作”。
  7. 選擇剛剛創建的參數組並啟用“立即應用”。
  8. 單擊“繼續”並確認更改。
  9. 等待“修改”操作完成。
  10. 再次打開“實例”選項卡。 展開您的 MySQL 實例並展開“Instance Action”選項卡並選擇“Reboot”。

不需要重啟,因為log_bin_trust_function_creatorsapply type = dynamic 如果你的 RDS 已經有一個附加的參數組並且你編輯它,而不是創建一個新的參數組,至少這是正確的。 只需保存參數編輯即可。

根據http://getasysadmin.com/2011/06/amazon-rds-super-privileges/ ,您需要在AWS 控制台中將log_bin_trust_function_creators設置為 1,以無誤地加載轉儲文件。

如果你想忽略這些錯誤,並加載轉儲文件的其余部分,你可以使用-f選項:

mysql -f my_database -u my_username -p -h  
my_new_database.xxxxxxxxx.us-east-1.rds.amazonaws.com < my_database.sql

-f將報告錯誤,但會繼續處理轉儲文件的剩余部分。

轉儲文件中觸發器和存儲過程的問題在於,這些定義包括應該由 DEFINER 創建存儲過程的用戶。 該用戶很可能不存在於 RDS 中,因此會引發錯誤。 為了能夠加載轉儲文件,您可以使用 sed 或 Perl 刪除 DEFINER,並與執行導入的用戶一起創建存儲過程/觸發器。

perl -pe 's/\sDEFINER=`[^`]+`@`[^`]+`//' < mysqldump.sql > mysqldump.fixed.sql

現在您應該能夠加載固定的轉儲文件

mysql my_database -u my_username -p -h rds_host < mysqldump.fixed.sql

如前面的回答所述,您應該設置數據庫參數:

log_bin_trust_function_creators = 1

對我來說,我的轉儲文件中只有 2 個命令需要 SUPER 權限:

  • SET @@GLOBAL.gtid_purged
  • SET @@SESSION.SQL_LOG_BIN

根據mysqldump 文檔,您可以使用--set-gtid-purged=OFF禁用它們。

然后查看man mysqldump

如果打算僅使用來自轉儲服務器的部分數據來部署新的復制從站,請使用 ON。 如果打算通過在拓撲中復制表來修復表,請使用 OFF。 如果打算在不相交的復制拓撲之間復制表,請使用 OFF,並將保持不相交。

所以我決定將--set-gtid-purged=OFF添加到我的mysqldump命令中,然后我就可以成功導入生成的轉儲文件。

正如 AWS 文檔中所定義的那樣,觸發器、過程和函數在默認情況下是禁用的,因為二進制日志記錄在默認情況下是啟用的。 禁用基本上可以使您的數據庫更安全,但是如果您通過網絡進行了適當的保護,那將無關緊要。

按照這些步驟操作,您的問題將得到解決https://aws.amazon.com/premiumsupport/knowledge-center/rds-mysql-functions/

此外,在創建過程時不應使用定義器。 一個簡單的 sed 命令就可以刪除它。

除了編輯

log_bin_trust_function_creators = 1

您需要從轉儲文件中刪除所有DEFINER ,請檢查以下鏈接以獲取可幫助清理 sql 轉儲文件的SED命令。

https://www.percona.com/blog/2014/07/02/using-mysql-triggers-and-views-in-amazon-rds/#comment-10968243

要完成 @arun-r 的回答,創建新參數組時需要重新啟動。

在此處輸入圖像描述

使用arun -r answer后,如果問題沒有解決則需要修改你的dump文件。 很簡單。

在轉儲文件中,您會找到類似以下的行:

DELIMITER ;;
CREATE DEFINER=`username_from_dumped_database`@`host_from_dumped_database` PROCEDURE `procedure_or_function_name`()
BEGIN

你必須更換:

  • username_from_dumped_database通過您在 rds 數據庫上的用戶名。
  • host_from_dumped_databse%

我不知道為什么,但這個技巧對我有用。 一個簡單的文本編輯器就足以做到這一點。

AWS/RDS中設置參數的正確方法是創建參數組,就像此處提到的其他響應一樣。

對於這種特殊情況,在創建新參數組時,在參數部分將變量log_bin_trust_function_creators設置為1

修改您的數據庫,然后 select 您的新參數組位於Additional configuration部分下的DB parameter group

盡管我啟用了Apply Immediately ,但它對我不起作用(MySQL v8)。 重啟后就成功了!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM