RDSforMySQL許可權問題(錯誤程式碼:1227,1725)

田傑發表於2016-12-13

RDS for MySQL許可權問題(錯誤程式碼:1227,1725)

 

1. 錯誤資訊

2. 錯誤出現的場景

3. 錯誤原因

4. 解決

4.1 去除 DEFINER 子句

4.2 去除 GTID_PURGED 子句

4.3 檢查修改後的檔案


1. 錯誤資訊

[Err] 1227 - Access denied; you need (at least one of) the SUPER privilege(s) for this operation --常見於 RDS MySQL 5.6

ERROR 1725 (HY000) at line 1936: OPERATION need to be executed set by ADMIN --常見於 RDS MySQL 5.5

 2. 錯誤出現的場景

  • 在建立 儲存過程、函式、觸發器、事件、檢視的時候出現這個錯誤。

  • 從本地資料庫匯出 SQL,在 RDS 上應用該 SQL 的時候出現該錯誤。

  • 從 RDS for MySQL 5.6 例項下載邏輯備份,匯入到 RDS 或本地資料庫中。

3. 錯誤原因

  • 匯入RDS MySQL 例項:SQL 語句中含有需要 Supper 許可權才可以執行的語句,而 RDS MySQL不提供 Super 許可權,因此需要去除這類語句。
  • 本地 MySQL 例項沒有啟用 GTID。

4. 解決

4.1 去除 DEFINER 子句

檢查 SQL 檔案,去除下面類似的子句

DEFINER=`root`@`%` 

在 Linux 平臺下,可以嘗試使用下面的語句去除:

sed -e `s/DEFINER[ ]*=[ ]*[^*]**/*/ ` your.sql > your_revised.sql

4.2 去除 GTID_PURGED 子句

檢查 SQL 檔案,去除下面類似的語句

SET @@GLOBAL.GTID_PURGED=`d0502171-3e23-11e4-9d65-d89d672af420:1-373,
d5deee4e-3e23-11e4-9d65-d89d672a9530:1-616234`;

在 Linux 平臺,可以使用下面的語句去除

awk `{ if (index($0,"GTID_PURGED")) { getline; while (length($0) > 0) { getline; } } else { print $0 } }` your.sql | grep -iv `set @@` > your_revised.sql

4.3 檢查修改後的檔案

修改完畢後,通過下面的語句檢查是否合乎要求。

egrep -in "definer|set @@" your_revised.sql

如果上面的語句沒有輸出,說明 SQL 檔案符合要求。


相關文章