type
status
date
slug
summary
tags
category
icon
password
MySQL 5.7.5 中新增了 offline_mode 功能,如字面上的意思可以讓 MySQL 處於離線的狀態,方便 Admin 在不受其他連線的影響下調整 DB:

需要具有 SYSTEM_VARIABLES_ADMIN 權限或是已棄用的 SUPER 權限才能開關 offline_mode。
在 offline mode 啟動時會有以下特性:
- 沒有 CONNECTION_ADMIN 或 SUPER 權限的使用者的連線會被斷開,並且會中止執行中的語句並釋放鎖,下一次執行查詢時會收到 ER_SERVER_OFFLINE_MODE 的錯誤,之後也無法請求新的連線。
- 具有 CONNECTION_ADMIN 或 SUPER 權限不會被斷開連線,並且可以發起新的連線請求。
- Replication 線程不受任何影響,仍會繼續將數據應用到 DB。
文檔原文如下:
Replication threads are permitted to keep applying data to the server.
這邊經過實測如果 replication 帳號沒有 CONNECTION_ADMIN 權限,則 replica 上的 SQL_thread 狀態會是 YES,但是 IO_thread 狀態會是 Connection,並且 Last_IO_Error 會出現 message: The server is currently in offline mode 的訊息。
如果說需要在 offline_mode 下繼續維持 replication,可以授予 replication 的帳號 CONNECTION_ADMIN 權限即可。
- 從 MySQL 8.0.30 開始若開啟 offline_mode 的使用者沒有 SYSTEM_USER 權限,則現有已連線具有 SYSTEM_USER 權限的使用者將不會斷開連線,但除非他們具有 CONNECTION_ADMIN 或 SUPER 權限,否則無法在請求新的連線。這是因為只有 SYSTEM_USER 權限才能終止具有 SYSTEM_USER 的 sesssion。
演示
首先使用一個沒有 CONNECTION_ADMIN 或 SUPER 權限的使用者連線進 DB 並進行操作:
接著使用 admin 帳號開啟 offline_mode:
可以看到沒有 CONNECTION_ADMIN 或 SUPER 權限的使用者會被斷開連線,也包括用來 replication 的帳號。