詳解MySQL如何使用離線模式維護服務器
離線模式
作為 DBA,最常見的任務之一就是批量處理 MySQL 服務的啟?;蚱渌恍┗顒?。在停止 MySQL 服務前,我們可能需要檢查是否有活動連接;如果有,我們可能需要把它們全部殺死。通常,我們使用 pt-kill 殺死應用連接或使用 SELECT
語句查詢準備殺死語句。例如:
pt-kill --host=192.168.11.11 --user=percona -p --sentinel /tmp/pt-kill.sentinel2 --pid /tmp/pt-kill.pid --victims all --match-command 'Query' --ignore-user 'pmm|rdsadmin|system_user|percona' --busy-time 10 --verbose --print --kill select concat('kill ',id,';') from information_schema.processlist where user='app_user';
MySQL 有一個名為 offline_mode
的變量來將服務器設置為維護模式。設置此選項后,它會立即斷開所有不具有 SYSTEM_VARIABLES_ADMIN 和 CONNECTION_ADMIN 權限的客戶端連接,并且不允許新連接,除非用戶擁有這些權限。如果您手動終止連接或使用 pt-kill
,則無法避免新連接的創(chuàng)建。但通過使用這種模式,我們可以避免新的連接。這是一個全局動態(tài)變量,我們可以在服務器運行時設置此模式。
啟用 offline_mode
要啟用 offline_mode
,用戶帳戶必須具有 SYSTEM_VARIABLES_ADMIN* 權限和 CONNECTION_ADMIN 權限(或已棄用的 SUPER 權限,它涵蓋了這兩個權限)。CONNECTION_ADMIN 從 MySQL 8.0.31 開始是必需的,并建議在所有版本中使用,以防止意外鎖定。讓我們測試一下。
要對此進行測試,請創(chuàng)建一個新用戶 app_user,該用戶僅具有 DDL/DML 權限。
mysql> create user app_user identified by 'App@!234TEst'; Query OK, 0 rows affected (0.20 sec) mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP , REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE,CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE on *.* to app_user; Query OK, 0 rows affected (0.00 sec)
使用 aap_user 用戶啟動 sysbench 工具
[root@centos12 vagrant]# sysbench /usr/share/sysbench/oltp_read_write.lua --threads=10 --time=100? --mysql-db=sysbench --mysql-user=app_user --mysql-password='App@!234TEst' run sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2) Running the test with following options: Number of threads: 10 Initializing random number generator from current time Initializing worker threads...
mysql> show processlist; +----+-----------------+---------------------+----------+-------------+------+-----------------------------------------------------------------+------------------------------------------------------------------------------------------------------+---------+-----------+---------------+ | Id | User | Host | db | Command | Time | State | Info | Time_ms | Rows_sent | Rows_examined | +----+-----------------+---------------------+----------+-------------+------+-----------------------------------------------------------------+------------------------------------------------------------------------------------------------------+---------+-----------+---------------+ | 5 | event_scheduler | localhost | NULL | Daemon | 2151 | Waiting for next activation | NULL | 2151034 | 0 | 0 | | 9 | bhuvan | 192.168.33.11:50642 | NULL | Binlog Dump | 2102 | Source has sent all binlog to replica; waiting for more updates | NULL | 2102317 | 0 | 0 | | 14 | bhuvan | localhost | NULL | Query | 0 | init | show processlist | 0 | 0 | 0 | | 20 | app_user | localhost | sysbench | Execute | 0 | waiting for handler commit | COMMIT | 11 | 0 | 0 | | 21 | app_user | localhost | sysbench | Execute | 0 | updating | DELETE FROM sbtest1 WHERE id=5000 | 6 | 0 | 0 | | 23 | app_user | localhost | sysbench | Execute | 0 | waiting for handler commit | COMMIT | 8 | 0 | 0 | | 24 | app_user | localhost | sysbench | Execute | 0 | waiting for handler commit | COMMIT | 18 | 0 | 0 | | 25 | app_user | localhost | sysbench | Execute | 0 | updating | UPDATE sbtest1 SET c='99153469917-25523144931-18125321038-96151238215-88445737418-14906501975-136014 | 13 | 0 | 0 | | 27 | app_user | localhost | sysbench | Execute | 0 | waiting for handler commit | COMMIT | 7 | 0 | 0 | | 28 | app_user | localhost | sysbench | Execute | 0 | statistics | SELECT c FROM sbtest1 WHERE id=5003 | 0 | 0 | 0 | | 29 | app_user | localhost | sysbench | Execute | 0 | updating | UPDATE sbtest1 SET c='84180675456-88426921120-90373546373-84823361786-77912396694-08592771856-912331 | 13 | 0 | 0 | +----+-----------------+---------------------+----------+-------------+------+-----------------------------------------------------------------+------------------------------------------------------------------------------------------------------+---------+-----------+---------------+ 13 rows in set (0.00 sec)
當 sysbench 運行時,設置 offline_mode=ON
,來自 sysbech with Sysbench") 的所有連接都將被終止。您將在 sysbench 中看到錯誤。
mysql> select @@offline_mode; +----------------+ | @@offline_mode | +----------------+ | 0 | +----------------+ 1 row in set (0.15 sec) mysql> set global offline_mode=1; Query OK, 0 rows affected (0.15 sec) mysql> show processlist; +----+-----------------+---------------------+------+-------------+------+-----------------------------------------------------------------+------------------+---------+-----------+---------------+ | Id | User | Host | db | Command | Time | State | Info | Time_ms | Rows_sent | Rows_examined | +----+-----------------+---------------------+------+-------------+------+-----------------------------------------------------------------+------------------+---------+-----------+---------------+ | 5 | event_scheduler | localhost | NULL | Daemon | 2178 | Waiting for next activation | NULL | 2178008 | 0 | 0 | | 9 | bhuvan | 192.168.33.11:50642 | NULL | Binlog Dump | 2129 | Source has sent all binlog to replica; waiting for more updates | NULL | 2129291 | 0 | 0 | | 14 | bhuvan | localhost | NULL | Query | 0 | init | show processlist | 0 | 0 | 0 | +----+-----------------+---------------------+------+-------------+------+-----------------------------------------------------------------+------------------+---------+-----------+---------------+ 3 rows in set (0.01 sec)
如果您在 offline_mode=1
時嘗試使用 app_user 連接數(shù)據庫,它將不允許連接并收到一條錯誤消息,表明服務器當前處于離線模式。這個 offline_mode
不會影響復制??梢钥吹缴厦娴?processlist 日志,當我們設置 offline_mode=1
時,復制線程并沒有斷開。要禁用 offline_mode
,請將值設置為 0。
mysql> set global offline_mode=0; Query OK, 0 rows affected (0.00 sec)
結論
offline_mode
是將服務器置于維護模式的一個不錯的選擇。只需確保應用程序用戶沒有管理員權限,只有管理員有。我們可以在以下情況下使用 offline_mode
:
- 在將數(shù)據庫服務器取出進行維護或其相關活動之前,請在配置文件中進行更改并保持此模式,直到所有活動完成。
- 在從服務器進行備份時,我們可以設置這個
offline_mode
,以避免服務器的負載,使備份速度更快。 - 如果由于大量查詢而導致副本上出現(xiàn)大量復制,我們可以設置此模式,直到復制與主服務器同步。
- 當您想立即終止所有應用程序連接時。
譯自:https://www.percona.com/blog/mysql-offline-mode-to-disconnect...
以上就是MySQL 如何使用離線模式維護服務器的詳細內容,更多關于MySQL 如何使用離線模式維護服務器的資料請關注腳本之家其它相關文章!
相關文章
MYSQL ON UPDATE CURRENT_TIMESTAMP當字段值發(fā)生改變時才會更
本文主要介紹了MYSQL ON UPDATE CURRENT_TIMESTAMP當字段值發(fā)生改變時才會更新記錄的時間,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-01-01