許多 DBA 以為設置 read_only=1 就能完全禁止從庫寫入,實際上擁有 SUPER 權限的用戶不受限制。本文通過實測揭示真實行為邏輯。
Master: 192.168.1.100
Slave: 192.168.1.101 (read_only=1)
測試用戶: imbyrd
-- 主庫授權
GRANT ALL ON *.* TO 'imbyrd'@'%' IDENTIFIED BY 'admin';
-- 從庫測試
mysql -u imbyrd -p
INSERT INTO hitest.test VALUES (14, 'fo'); -- ✅ 成功!
結論:SUPER 權限繞過 read_only 限制。
-- 主庫收回 ALL,授予精確權限
REVOKE ALL ON *.* FROM 'imbyrd'@'%';
GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'imbyrd'@'%' IDENTIFIED BY 'admin';
-- 從庫測試
INSERT INTO hitest.test VALUES (16, 'dddd');
-- ❌ ERROR 1290 (HY000): The MySQL server is running with the --read-only option
結論:無 SUPER 時,read_only 生效,寫入被阻擋。
GRANT ALL ON *.* TO 'imbyrd'@'%' IDENTIFIED BY 'admin';
REVOKE SUPER ON *.* FROM 'imbyrd'@'%';
-- 從庫測試
INSERT ... -- ❌ 依然報錯 1290
結論:只要當前會話無 SUPER 權限,read_only 即生效。
read_only=1 + super_read_only=1(MySQL 5.7.8+)[mysqld]
read_only = 1
super_read_only = 1 # 連 SUPER 用戶也禁止寫入,除非進程擁有 SYSTEM_VARIABLES_ADMIN 權限
此參數徹底解決「SUPER 繞過」問題,推薦所有生產從庫啟用。