MySQL從庫過濾所有DELETE操作的幾種方案
在 MySQL 從庫 上,有沒有一種 全局配置方式,可以直接禁止或過濾所有 DELETE(乃至 UPDATE)操作?
答案是 —— 有幾種可選方案,但要看你希望的“層級”和“嚴(yán)格程度”。
本文我會(huì)詳細(xì)說明 生產(chǎn)可用的幾種方法(推薦從強(qiáng)到弱排列)。
方案一:使用 read_only 或 super_read_only(最推薦)
配置方式:
在從庫 my.cnf(或 mysqld.cnf)中添加:
[mysqld] read_only=ON super_read_only=ON
然后重啟 MySQL:
systemctl restart mysqld
工作原理:
read_only=ON:普通用戶不能對從庫進(jìn)行寫入(INSERT,UPDATE,DELETE,CREATE,DROP等);super_read_only=ON:即使是擁有 SUPER 權(quán)限的用戶,也無法執(zhí)行寫入(除非關(guān)閉此選項(xiàng))。
主從復(fù)制線程(replication SQL thread)不受此限制——
也就是說:
從庫仍然可以接收主庫的 binlog 更新(包括刪除),
但任何手動(dòng) DELETE 都會(huì)被拒絕。
效果
mysql> delete from user where id=5; ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement
主庫發(fā)來的刪除日志仍能正常同步執(zhí)行,不受影響。
推薦用途
- 用于 防止 DBA 或程序誤操作;
- 適合所有生產(chǎn)從庫;
- 只要從庫不承擔(dān)寫操作,就應(yīng)該啟用。
方案二:使用 binlog_ignore_db(僅對復(fù)制過濾)
在 主庫的 my.cnf 中設(shè)置(而不是從庫):
[mysqld] binlog_ignore_db=your_database_name
這樣主庫的 DELETE/UPDATE/INSERT 對該數(shù)據(jù)庫不會(huì)寫入 binlog,因此從庫自然不會(huì)同步這些修改。
但這屬于主庫層面的過濾,無法阻止直接在從庫上執(zhí)行刪除。
方案三:在從庫使用 sql_log_bin=0(會(huì)話級控制)
你之前提到的:
SET sql_log_bin=0;
雖然能避免寫入 binlog,但并不能阻止 DELETE 執(zhí)行。
換句話說:
DELETE仍然在從庫執(zhí)行;- 只是不會(huì)再同步給其他級聯(lián)從庫(如果存在)。
這種方法適合臨時(shí)會(huì)話,不適合全局防護(hù)。
方案四:觸發(fā)器(不推薦,但可用)
你可以為每個(gè)表添加觸發(fā)器,阻止刪除操作:
CREATE TRIGGER prevent_delete BEFORE DELETE ON your_table FOR EACH ROW SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'DELETE not allowed on slave';
但:
- 要對每個(gè)表單獨(dú)添加;
- 表結(jié)構(gòu)變動(dòng)時(shí)需重新創(chuàng)建;
- 不適合大型系統(tǒng)。
方案五:修改從庫權(quán)限(限制賬號)
如果你的應(yīng)用程序在主從庫上使用相同賬號,可以在從庫上收緊權(quán)限:
REVOKE DELETE, UPDATE, INSERT ON *.* FROM 'appuser'@'%';
這樣即使程序誤連從庫,也無法執(zhí)行寫操作。
總結(jié)對比
| 方法 | 作用范圍 | 能防止所有 DELETE | 推薦度 |
|---|---|---|---|
| super_read_only=ON | 全局、系統(tǒng)級 | ? 完全禁止 | ?? 最推薦 |
| read_only=ON | 普通用戶級 | ?(SUPER用戶除外) | ?? |
| binlog_ignore_db | 主庫過濾 | ?(從庫仍可刪) | ?? |
| sql_log_bin=0 | 會(huì)話級 | ? | ?? 臨時(shí)調(diào)試 |
| 觸發(fā)器防刪 | 表級 | ?(但繁瑣) | ?? 一般不推薦 |
| 權(quán)限控制 | 用戶級 | ?(僅限指定賬號) | ? 輔助方案 |
推薦安全配置組合
在從庫 /etc/my.cnf 中加上:
[mysqld] read_only=ON super_read_only=ON skip_slave_start=0
這樣可以:
- 防止任何手動(dòng)刪除;
- 仍然允許主庫復(fù)制更新;
- 從庫安全可靠。
到此這篇關(guān)于MySQL從庫過濾所有DELETE操作的幾種方案的文章就介紹到這了,更多相關(guān)MySQL過濾所有DELETE操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL主從同步與分庫分表原理及實(shí)現(xiàn)方法
MySQL主從同步和分庫分表技術(shù)是解決高并發(fā)和大數(shù)據(jù)量問題的關(guān)鍵,本文詳細(xì)解析了這兩項(xiàng)技術(shù)的原理、實(shí)現(xiàn)方法及最佳實(shí)踐,幫助讀者構(gòu)建高性能的MySQL架構(gòu),感興趣的朋友跟隨小編一起看看吧2025-12-12
遠(yuǎn)程連接mysql數(shù)據(jù)庫注意點(diǎn)記錄
有時(shí)候我們需要遠(yuǎn)程連接mysql數(shù)據(jù)庫,那么就需要注意如下問題,需要的朋友可以參考下2012-08-08
MySQL實(shí)現(xiàn)merge?into四種方法代碼實(shí)例
Merge?into是一個(gè)數(shù)據(jù)庫操作術(shù)語,通常用于將兩個(gè)或多個(gè)表中的數(shù)據(jù)合并到一個(gè)表中,這篇文章主要給大家介紹了關(guān)于MySQL實(shí)現(xiàn)merge?into四種方法的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07
查看修改mysql編碼方式讓它支持中文(gbk或者utf8)
MySQL的默認(rèn)編碼是Latin1,不支持中文,要支持中文需要把數(shù)據(jù)庫的默認(rèn)編碼修改為gbk或者utf8,真的是很麻煩啊,不過本文提供了詳細(xì)的修改教程,感興趣的你可不要走開啊,希望本文對你有所幫助2013-01-01

