Share via


對在移轉至適用於 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 入口網站的重設密碼選項可協助重新建立使用者、重設密碼及還原系統管理員權限,您可以使用伺服器管理員登入並執行進一步的作業。

下一步

如果您找不到想要的答案,請參考下列選項: