文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  連線控制外掛程式安裝

8.4.2.1 連線控制外掛程式安裝

本節說明如何安裝連線控制外掛程式 CONNECTION_CONTROLCONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS。如需有關安裝外掛程式的一般資訊,請參閱第 7.6.1 節,〈安裝和解除安裝外掛程式〉

若要讓伺服器可使用外掛程式,外掛程式程式庫檔案必須位於 MySQL 外掛程式目錄中 (由 plugin_dir 系統變數命名的目錄)。如有必要,請在伺服器啟動時設定 plugin_dir 的值,以設定外掛程式目錄位置。

外掛程式程式庫檔案的基礎名稱為 connection_control。檔案名稱後綴因平台而異 (例如,Unix 和類 Unix 系統為 .so,Windows 為 .dll)。

若要在伺服器啟動時載入外掛程式,請使用 --plugin-load-add 選項來命名包含它們的程式庫檔案。使用此外掛程式載入方法時,每次伺服器啟動時都必須提供該選項。例如,將這些行放在伺服器 my.cnf 檔案中,並根據您的平台需要調整 .so 後綴

[mysqld]
plugin-load-add=connection_control.so

修改 my.cnf 後,重新啟動伺服器以使新設定生效。

或者,若要在執行階段載入外掛程式,請使用以下陳述式,並根據您的平台需要調整 .so 後綴

INSTALL PLUGIN CONNECTION_CONTROL
  SONAME 'connection_control.so';
INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS
  SONAME 'connection_control.so';

INSTALL PLUGIN 會立即載入外掛程式,並將其註冊在 mysql.plugins 系統資料表中,以便讓伺服器在每次後續正常啟動時載入它,而無需 --plugin-load-add

要驗證外掛程式是否安裝成功,請檢查 Information Schema 中的 PLUGINS 資料表,或使用 SHOW PLUGINS 陳述式(請參閱章節 7.6.2,「取得伺服器外掛程式資訊」)。例如:

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
       FROM INFORMATION_SCHEMA.PLUGINS
       WHERE PLUGIN_NAME LIKE 'connection%';
+------------------------------------------+---------------+
| PLUGIN_NAME                              | PLUGIN_STATUS |
+------------------------------------------+---------------+
| CONNECTION_CONTROL                       | ACTIVE        |
| CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS | ACTIVE        |
+------------------------------------------+---------------+

如果外掛程式初始化失敗,請檢查伺服器錯誤日誌以取得診斷訊息。

如果外掛程式先前已使用 INSTALL PLUGIN 註冊,或使用 --plugin-load-add 載入,您可以在伺服器啟動時使用 --connection-control--connection-control-failed-login-attempts 選項來控制外掛程式的啟用。例如,若要在啟動時載入外掛程式並防止它們在執行階段被移除,請使用這些選項:

[mysqld]
plugin-load-add=connection_control.so
connection-control=FORCE_PLUS_PERMANENT
connection-control-failed-login-attempts=FORCE_PLUS_PERMANENT

如果希望防止伺服器在沒有給定的連線控制外掛程式的情況下執行,請使用 FORCEFORCE_PLUS_PERMANENT 的選項值,以便在外掛程式初始化失敗時強制伺服器啟動失敗。

注意

可以安裝其中一個外掛程式而不安裝另一個,但必須同時安裝兩個外掛程式才能獲得完整的連線控制功能。特別是,僅安裝 CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS 外掛程式用途不大,因為如果沒有 CONNECTION_CONTROL 外掛程式來提供資料以填充 CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS 資料表,該資料表將永遠是空的。

連線延遲設定

為了啟用其操作設定,CONNECTION_CONTROL 外掛程式會公開這些系統變數:

如果 connection_control_failed_connections_threshold 非零,則啟用連線失敗計數,並具有以下屬性:

  • 直到連續連線嘗試失敗次數達到 connection_control_failed_connections_threshold 之前,延遲時間為零。

  • 此後,伺服器會為後續連續嘗試增加延遲,直到成功連線為止。初始未調整的延遲從 1000 毫秒(1 秒)開始,每次嘗試增加 1000 毫秒。也就是說,一旦帳戶啟用了延遲,後續失敗嘗試的未調整延遲時間為 1000 毫秒、2000 毫秒、3000 毫秒,依此類推。

  • 用戶端實際體驗到的延遲時間是未調整的延遲時間,經過調整後會落在 connection_control_min_connection_delayconnection_control_max_connection_delay 系統變數的值(包含兩端)之間。

  • 一旦帳戶啟用了延遲,該帳戶隨後首次成功連線時也會經歷延遲,但後續連線的失敗計數將會重設。

例如,如果使用預設的 connection_control_failed_connections_threshold 值 3,則帳戶前三次連續連線嘗試失敗不會有延遲。帳戶在第四次及後續失敗連線時實際體驗到的調整後延遲時間取決於 connection_control_min_connection_delayconnection_control_max_connection_delay 的值:

您可以在伺服器啟動時或執行階段設定 CONNECTION_CONTROL 系統變數。假設您希望允許四次連續連線嘗試失敗,然後伺服器才開始延遲其回應,且最小延遲時間為 2000 毫秒。若要在伺服器啟動時設定相關變數,請將下列幾行放在伺服器 my.cnf 檔案中:

[mysqld]
plugin-load-add=connection_control.so
connection_control_failed_connections_threshold=4
connection_control_min_connection_delay=2000

若要在執行階段設定並保存變數,請使用以下陳述式:

SET PERSIST connection_control_failed_connections_threshold = 4;
SET PERSIST connection_control_min_connection_delay = 2000;

SET PERSIST 為正在執行的 MySQL 實例設定值。它也會儲存該值,使其能夠在後續的伺服器重新啟動時保留。若要變更正在執行的 MySQL 實例的值,但不希望它在後續的重新啟動時保留,請使用 GLOBAL 關鍵字,而不是 PERSIST。請參閱章節 15.7.6.1,「SET 變數指派語法」

connection_control_min_connection_delayconnection_control_max_connection_delay 系統變數的最小值和最大值都分別為 1000 和 2147483647。此外,每個變數的允許值範圍也取決於另一個變數的目前值:

因此,若要進行某些設定所需的變更,您可能需要以特定的順序設定變數。假設目前的最小和最大延遲時間分別為 1000 和 2000,而您希望將它們設定為 3000 和 5000。您無法先將 connection_control_min_connection_delay 設定為 3000,因為該值大於目前的 connection_control_max_connection_delay 值 2000。相反地,請先將 connection_control_max_connection_delay 設定為 5000,然後再將 connection_control_min_connection_delay 設定為 3000。

連線失敗評估

當安裝了 CONNECTION_CONTROL 外掛程式時,它會檢查連線嘗試,並追蹤它們是失敗還是成功。為此,連線嘗試失敗是指用戶端使用者和主機符合已知的 MySQL 帳戶,但提供的認證不正確,或者與任何已知的帳戶都不符。

連線失敗計數是以每次連線嘗試的使用者/主機組合為基礎。適用使用者名稱和主機名稱的判斷會考量到 Proxy,並按照以下方式進行:

  • 如果用戶端使用者代理了其他使用者,則連線失敗計數的帳戶是代理使用者,而不是被代理的使用者。例如,如果 external_user@example.com 代理了 proxy_user@example.com,則連線計數會使用代理使用者 external_user@example.com,而不是被代理的使用者 proxy_user@example.comexternal_user@example.comproxy_user@example.com 都必須在 mysql.user 系統資料表中具有有效的項目,並且必須在 mysql.proxies_priv 系統資料表中定義它們之間的代理關係(請參閱章節 8.2.19,「Proxy 使用者」)。

  • 如果用戶端使用者沒有代理其他使用者,但確實符合 mysql.user 條目,則計數會使用對應於該條目的 CURRENT_USER() 值。例如,如果從主機 host1.example.com 連線的使用者 user1 符合 user1@host1.example.com 條目,則計數會使用 user1@host1.example.com。如果使用者符合 user1@%.example.comuser1@%.comuser1@% 條目,則計數會分別使用 user1@%.example.comuser1@%.comuser1@%

對於剛才描述的情況,連線嘗試符合某些 mysql.user 條目,而請求是否成功取決於用戶端是否提供了正確的驗證憑證。例如,如果用戶端提供了不正確的密碼,則連線嘗試會失敗。

如果連線嘗試不符合任何 mysql.user 條目,則嘗試會失敗。在這種情況下,沒有可用的 CURRENT_USER() 值,且連線失敗計數會使用用戶端提供的使用者名稱以及伺服器確定的用戶端主機。例如,如果用戶端嘗試從主機 host2.example.com 以使用者 user2 的身分連線,則使用者名稱部分在用戶端請求中可用,而伺服器會決定主機資訊。用於計數的使用者/主機組合是 user2@host2.example.com

注意

伺服器會維護有關哪些用戶端主機可能連線到伺服器的資訊(本質上是 mysql.user 條目的主機值聯集)。如果用戶端嘗試從任何其他主機連線,伺服器會在連線設定的早期階段拒絕該嘗試。

ERROR 1130 (HY000): Host 'host_name' is not
allowed to connect to this MySQL server

由於這種拒絕發生得非常早,CONNECTION_CONTROL 看不到它,也不會對其進行計數。

連線失敗監控

要監控失敗的連線,請使用以下資訊來源

在執行時間為 connection_control_failed_connections_threshold 指派值會有以下影響