2012-07-22 117 views
44

我試圖我的MySQL數據庫從亞馬遜EC2複製到RDS:的MySQL /亞馬遜RDS錯誤:「你沒有SUPER權限的......」

我successfuly做我的數據庫的mysqldump成使用這個我的根文件夾:

[email protected]:~# mysqldump my_database -u my_username -p > my_database.sql 

然後我試圖此.sql文件傳輸到新的RDS數據庫:

[email protected]:~# 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初學者,所以對於這樣一個簡單的問題抱歉。思考?

+5

你不能'對RDS GRANT SUPER'。 RDS無法獲得SUPER權限。 – ceejayoz 2012-07-22 21:47:53

+0

@ceejayoz,謝謝,我知道了。你可以在下面幫我解決RDS Cli的問題嗎? – 2012-07-22 22:07:21

+0

使用相同的MySQL用戶名來創建轉儲並恢復它(對於轉儲中的連接和DEFINER關鍵字)。更改log_bin_trust_function_creators不是所需的解決方案。最糟糕的是在這種情況下使用-f參數 – ad4s 2017-01-16 11:51:25

回答

40

根據http://getasysadmin.com/2011/06/amazon-rds-super-privileges/,你需要在AWS console中將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會報告錯誤,但會繼續處理轉儲的剩餘文件。

+0

hi @Ross,謝謝你。不幸的是,使用'-f'沒有幫助。我得到了同樣的錯誤。使用您的鏈接,我遇到了RDS Cli工具語法的問題。意思是,當我去更改權限時,出現以下錯誤:'rds-modify-db-parameter-group:格式錯誤的輸入 - 無法識別的選項: --parameters = name = log_bin_trust_function_creators, 用法: rds-modify-db -parameter組 DBParameterGroupName --parameters 「名稱=值,值=值, 方法=值」[--parameters 「名稱=值,值=值,方法=值」 ...] [常規選項] ' – 2012-07-22 22:17:52

+0

這是我的命令,給了我上面的錯誤:'./rds-modify-db-parameter-group mygroup --parameters「name = log_bin_trust_function_creators,value = on,method = immediate」-I =「accesskeyxxxxxx」-S = 「secretkeyxxxxxxxx」'我知道它必須是一個引號或雙重短劃線的問題,但這些類型的變化目前都沒有發揮作用,唉! – 2012-07-22 22:31:30

+2

'-f'選項不會使錯誤消失,它只會允許處理文件中的非違規SQL語句。從我讀到的,RDS在轉儲文件中的存儲過程上窒息。嘗試創建一個沒有存儲過程的轉儲文件,看看是否加載OK:'mysqldump --routines = 0 --triggers = 0 --events = 0 my_database -u my_username -p' – 2012-07-22 22:36:40

20

轉儲文件中的觸發器和存儲過程的問題是這些定義包括存儲過程應該由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 

如前面的回答說,你應該設置DB參數:

log_bin_trust_function_creators = 1 
+1

清理定義也可以使用sed來完成:sed -i's/DEFINER ='OldDefiner' @ localhost'/DEFINER ='NewDefiner' @ localhost'/g'./TargetSqlFile.sql – siliconrockstar 2015-06-24 20:07:35

+0

感謝Anders,工作完美。 – Jafo 2015-07-23 00:30:41

+0

是的,這個伎倆! – ThomasSquall 2016-05-07 13:24:10

52
  1. 打開RDS Web控制檯。
  2. 打開「參數組」選項卡。
  3. 創建一個新的參數組。在對話框中,選擇與您的MySQL數據庫版本兼容的MySQL系列,給它一個名稱並確認。 選擇剛創建的參數組併發出「編輯參數」。
  4. 查找參數'log_bin_trust_function_creators'並將其值設置爲'1'。
  5. 保存更改。
  6. 打開「實例」選項卡。展開您的MySQL實例併發出名爲「修改」的「實例操作」。
  7. 選擇剛創建的參數組並啓用「立即應用」。
  8. 點擊「繼續」並確認更改。
  9. 再次打開「實例」選項卡。展開您的MySQL實例併發出名爲「修改」的「實例操作」。
  10. 不要忘記:打開「實例」選項卡。展開您的MySQL實例併發出名爲「Reboot」的「實例操作」。
+1

這解決了我將本地測試數據庫遷移到rds的問題,這是迄今爲止最簡單的方法。 – 2016-04-10 14:33:05

+0

點9是做什麼的? – Sushil 2018-01-31 19:07:49

2

根據AWS文檔中的定義,觸發器,過程和函數默認處於禁用狀態,因爲默認情況下啓用了二進制日誌記錄。禁用基本上使您的數據庫更安全,但如果您已通過網絡妥善保護,則無關緊要。

按照這些步驟,你的問題將 https://aws.amazon.com/premiumsupport/knowledge-center/rds-mysql-functions/

而且創建過程時,你不應該使用定義者。一個簡單的sed命令可以刪除它。