對在移轉至適用於 MySQL 的 Azure 資料庫 - 彈性伺服器期間或之後常發生的錯誤進行疑難排解
適用於:適用於 MySQL 的 Azure 資料庫 - 單一伺服器適用於 MySQL 的 Azure 資料庫 - 彈性伺服器
重要
適用於 MySQL 的 Azure 資料庫單一伺服器位於淘汰路徑上。 強烈建議您升級至適用於 MySQL 的 Azure 資料庫彈性伺服器。 如需移轉至適用於 MySQL 的 Azure 資料庫彈性伺服器的詳細資訊,請參閱適用於 MySQL 的 Azure 資料庫單一伺服器會發生什麼事?
適用於 MySQL 的 Azure 資料庫彈性伺服器是完全受控的服務,由 MySQL 的社群版本提供技術支援。 在受管理的服務環境中,MySQL 體驗可能與您在自己環境中執行 MySQL 的體驗不同。 在本文中,您會看到使用者第一次在適用於 MySQL 的 Azure 資料庫彈性伺服器上進行移轉或開發時,可能會遇到的一些常見錯誤。
常見的連線錯誤
錯誤 1184 (08S01):已中止連線 22 至資料庫:'db-name' 使用者:'user' 主機:'hostIP' (init_connect 命令失敗)
上述錯誤會在成功登入之後,但在建立工作階段時執行任何命令之前發生。 上述訊息表示您已設定不正確的伺服器參數值 init_connect
,這會導致工作階段初始化失敗。
工作階段層級不支援某些伺服器參數如 require_secure_transport
,因此嘗試使用 init_connect
變更這些參數的值可能會導致連線到適用於 MySQL 的 Azure 資料庫彈性伺服器執行個體時發生錯誤 1184,如下所示:
mysql > 顯示資料庫;錯誤 2006 (HY000):MySQL 伺服器已消失且無連線。 正在嘗試重新連線...連線識別碼:64897 目前資料庫:*** 無 *** 錯誤 1184 (08S01):已中止連線 22 至資料庫:'db-name' 使用者:'user' 主機:'hostIP' (init_connect 命令失敗)
解決方法:在 Azure 入口網站中的 [伺服器參數] 索引標籤重設 init_connect
值,並使用 init_connect 參數僅設定支援的伺服器參數。
因缺少 SUPER 權限和 DBA 角色而產生的錯誤
服務上不支援 SUPER 權限和 DBA 角色。 因此,您可能會遇到下列常見錯誤:
ERROR 1419:您沒有 SUPER 權限且二進位記錄已啟用 (您可以使用較不安全的 log_bin_trust_function_creators 變數)
上述錯誤可能發生在建立函式、觸發程序 (如下所示),或匯入結構描述時。 CREATE FUNCTION 或 CREATE TRIGGER 之類的 DDL 陳述式會寫入二進位記錄中,因此次要複本可以執行這些陳述式。 複本 SQL 執行緒具有完整權限,可以利用其來提升權限。 若要在啟用二進位記錄的伺服器上抵禦此危險,MySQL 引擎的已儲存函式建立者除了需要一般的 CREATE ROUTINE 權限之外,還需要具有 SUPER 權限。
CREATE FUNCTION f1(i INT)
RETURNS INT
DETERMINISTIC
READS SQL DATA
BEGIN
RETURN i;
END;
解決方法:若要解決此錯誤,請從入口網站的 [伺服器參數] 刀鋒視窗中將 log_bin_trust_function_creators
設定為 1,執行 DDL 陳述式或匯入結構描述以建立所需的物件。 您可以繼續為伺服器將 log_bin_trust_function_creators
維持為 1,以避免日後發生錯誤。 我們建議在適用於 MySQL 的 Azure 資料庫彈性伺服器中,將 log_bin_trust_function_creators
設定為 MySQL 社群文件中醒目提示的安全性風險為最小,因為間隔記錄不會暴露在任何威脅中。
第 101 行上發生 ERROR 1227 (42000):拒絕存取;您需要 (至少其中一個) SUPER 權限才能執行此作業。 作業失敗,結束代碼為 1
匯入傾印檔案或建立包含定義者 (definer) 的程式時,可能會發生上述錯誤。
解決方法:若要解決此錯誤,管理使用者可藉由執行 GRANT 命令來授與建立或執行程序的權限,如下列範例所示:
GRANT CREATE ROUTINE ON mydb.* TO 'someuser'@'somehost';
GRANT EXECUTE ON PROCEDURE mydb.myproc TO 'someuser'@'somehost';
或者,您可以用執行匯入程序的管理使用者名稱來取代定義者,如下所示。
DELIMITER;;
/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`127.0.0.1`*/ /*!50003
DELIMITER;;
/* Modified to */
DELIMITER ;;
/*!50003 CREATE*/ /*!50017 DEFINER=`AdminUserName`@`ServerName`*/ /*!50003
DELIMITER ;
第 295 行上發生 ERROR 1227 (42000):拒絕存取;您需要此作業的 (至少其中一個) SUPER 或 SET_USER_ID 權限
在匯入傾印檔案或執行指令碼的過程中,使用 DEFINER 陳述式執行 CREATE VIEW 時,就可能會發生上述錯誤。 適用於 MySQL 的 Azure 資料庫彈性伺服器不允許任何使用者具有 SUPER 權限或 SET_USER_ID 權限。
解決方法:
- 如果可能的話,請使用 definer 使用者來執行 CREATE VIEW。 很多使用不同定義者的檢視很可能會有不同的權限,因此這可能不適合。 OR
- 編輯備份檔案或 CREATE VIEW 指令碼,並從備份檔案中將 DEFINER= 陳述式移除。 OR
- 編輯傾印檔案或 CREATE VIEW 指令碼,並將 definer 值取代為執行匯入或執行指令碼檔案且具有管理員權限的使用者。
提示
使用 sed 或 perl 修改傾印檔案或 SQL 指令碼,以取代 DEFINER= 陳述式
第 18 行上發生 ERROR 1227 (42000):拒絕存取;您需要 (至少其中一個) SUPER 權限才能執行此作業
如果您使用嘗試從已啟用 GTID 的適用於 MySQL 的 Azure 資料庫彈性伺服器執行個體匯入備份檔案至目標適用於 MySQL 的 Azure 資料庫彈性伺服器執行個體,就可能會發生上述錯誤。 Mysqldump 會將 SET @@SESSION.sql_log_bin=0 陳述式從使用 GTID 的伺服器新增至傾印檔案,並在傾印檔案重新載入時停用二進位記錄。
解決方法:若要在匯入時解決此錯誤,請將 mysqldump 檔案中的下列幾行移除或註解化,然後再次匯入,確保執行成功。
SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN;
SET @@SESSION.SQL_LOG_BIN= 0; SET @@GLOBAL.GTID_PURGED=''; SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
伺服器管理員登入的常見連線錯誤
建立適用於 MySQL 的 Azure 資料庫彈性伺服器執行個體時,終端使用者會在伺服器建立期間提供伺服器管理員登入。 伺服器管理員登入可讓您建立新的資料庫、加入新的使用者,以及授與權限。 如果刪除伺服器管理員登入、撤銷其權限或變更其密碼,則可能會在連線時在應用程式中看到連線錯誤。 以下是一些常見的錯誤。
錯誤 1045 (28000):拒絕使用者 'username'@'IP 位址' 的存取 (使用密碼:是)
如果是以下狀況,就會發生上述錯誤:
- 使用者名稱不存在。
- 使用者的使用者名稱已刪除。
- 其密碼已變更或重設。
解決方法:
確認 "username" 是否以有效的使用者身分存在於伺服器中,或是否不小心遭到刪除。 您可以登入適用於 MySQL 的 Azure 資料庫彈性伺服器使用者來執行下列查詢:
select user from mysql.user;
如果無法登入適用於 MySQL 的 Azure 資料庫彈性伺服器執行個體來執行上述查詢,建議您使用 Azure 入口網站重設管理員密碼。 Azure 入口網站的重設密碼選項可協助重新建立使用者、重設密碼及還原系統管理員權限,您可以使用伺服器管理員登入並執行進一步的作業。