2017-05-17 15 views
14

因此,我嘗試將sql文件導入rds(1G MEM,1個CPU)。 SQL文件就像是1.4G訪問被拒絕;您需要(至少一個)SUPER權限(s)用於此操作

的mysql -h xxxx.rds.amazonaws.com -u用戶-ppass --max允許的數據包=33554432分貝< db.sql

它被困在:

ERROR 1227 (42000) at line 374: Access denied; you need (at least one of) the SUPER privilege(s) for this operation 

實際的SQL內容是:

/*!50003 CREATE*/ /*!50017 DEFINER=`another_user`@`1.2.3.4`*/ /*!50003 TRIGGER `change_log_BINS` BEFORE INSERT ON `change_log` FOR EACH ROW 
IF (NEW.created_at IS NULL OR NEW.created_at = '00-00-00 00:00:00' OR NEW.created_at = '') THEN 
     SET NEW.created_at = NOW(); 
END IF */;; 

another_user不存在RDS,所以我做的:

GRANT ALL PRIVILEGES ON db.* TO [email protected]'localhost'; 

仍然沒有運氣。

回答

23

從您的sqldump文件中刪除DEFINER=..語句,或者用CURRENT_USER替換用戶值。

由RDS提供的MySQL服務器不允許其他用戶使用DEFINER語法(以我的經驗)。

可以使用sed腳本從文件中刪除:

sed 's/\sDEFINER=`[^`]*`@`[^`]*`//g' -i oldfile.sql 
+0

你是正確的。不起作用的原因是,當登錄用戶沒有「SUPER」權限(本身在RDS中不允許)時,將其他用戶指定爲「DEFINER」將允許任意權限升級 - 存儲的程序以默認情況下,他們的DEFINER的憑證和權限(與主叫用戶的INVINER相反)。另外[在服務器故障](https://serverfault.com/a/555983/153161)。 –

+0

你是一個拯救生命的人。如果我的託管公司在導出時告訴我損壞的數據庫並且沒有任何可以恢復的數據。完美解決方案 – Woody

+3

由於某些原因,我必須使用*而不是+:'''sed's/\ sDEFINER ='[^'] *'@'[^'] *'//'-i oldfile.sql''' ' –

相關問題