MySQL从库过滤所有DELETE操作的几种方案

 更新时间:2025年10月12日 11:26:39   作者:学亮编程手记  
在 MySQL 从库 上,有没有一种 全局配置方式,可以直接禁止或过滤所有 DELETE(乃至 UPDATE)操作?本文我会详细说明 生产可用的几种方法(推荐从强到弱排列),需要的朋友可以参考下

MySQL 从库 上,有没有一种 全局配置方式,可以直接禁止或过滤所有 DELETE(乃至 UPDATE)操作?

答案是 —— 有几种可选方案,但要看你希望的“层级”和“严格程度”。
本文我会详细说明 生产可用的几种方法(推荐从强到弱排列)

方案一:使用 read_only 或 super_read_only(最推荐)

配置方式:

在从库 my.cnf(或 mysqld.cnf)中添加:

[mysqld]
read_only=ON
super_read_only=ON

然后重启 MySQL:

systemctl restart mysqld

工作原理:

  • read_only=ON:普通用户不能对从库进行写入(INSERT, UPDATE, DELETE, CREATE, DROP等);
  • super_read_only=ON即使是拥有 SUPER 权限的用户,也无法执行写入(除非关闭此选项)。

主从复制线程(replication SQL thread)不受此限制——

也就是说:

从库仍然可以接收主库的 binlog 更新(包括删除),
但任何手动 DELETE 都会被拒绝。

效果

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

主库发来的删除日志仍能正常同步执行,不受影响。

推荐用途

  • 用于 防止 DBA 或程序误操作
  • 适合所有生产从库;
  • 只要从库不承担写操作,就应该启用。

方案二:使用 binlog_ignore_db(仅对复制过滤)

主库的 my.cnf 中设置(而不是从库):

[mysqld]
binlog_ignore_db=your_database_name

这样主库的 DELETE/UPDATE/INSERT 对该数据库不会写入 binlog,因此从库自然不会同步这些修改。

但这属于主库层面的过滤,无法阻止直接在从库上执行删除。

方案三:在从库使用 sql_log_bin=0(会话级控制)

你之前提到的:

SET sql_log_bin=0;

虽然能避免写入 binlog,但并不能阻止 DELETE 执行。
换句话说:

  • DELETE 仍然在从库执行;
  • 只是不会再同步给其他级联从库(如果存在)。

这种方法适合临时会话,不适合全局防护。

方案四:触发器(不推荐,但可用)

你可以为每个表添加触发器,阻止删除操作:

CREATE TRIGGER prevent_delete
BEFORE DELETE ON your_table
FOR EACH ROW
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'DELETE not allowed on slave';

但:

  • 要对每个表单独添加;
  • 表结构变动时需重新创建;
  • 不适合大型系统。

方案五:修改从库权限(限制账号)

如果你的应用程序在主从库上使用相同账号,可以在从库上收紧权限:

REVOKE DELETE, UPDATE, INSERT ON *.* FROM 'appuser'@'%';

这样即使程序误连从库,也无法执行写操作。

总结对比

方法作用范围能防止所有 DELETE推荐度
super_read_only=ON全局、系统级✅ 完全禁止🥇 最推荐
read_only=ON普通用户级✅(SUPER用户除外)🥈
binlog_ignore_db主库过滤❌(从库仍可删)🥉
sql_log_bin=0会话级🔹 临时调试
触发器防删表级✅(但繁琐)⚠️ 一般不推荐
权限控制用户级✅(仅限指定账号)✅ 辅助方案

推荐安全配置组合

在从库 /etc/my.cnf 中加上:

[mysqld]
read_only=ON
super_read_only=ON
skip_slave_start=0

这样可以:

  • 防止任何手动删除;
  • 仍然允许主库复制更新;
  • 从库安全可靠。

到此这篇关于MySQL从库过滤所有DELETE操作的几种方案的文章就介绍到这了,更多相关MySQL过滤所有DELETE操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL主从同步与分库分表原理及实现方法

    MySQL主从同步与分库分表原理及实现方法

    MySQL主从同步和分库分表技术是解决高并发和大数据量问题的关键,本文详细解析了这两项技术的原理、实现方法及最佳实践,帮助读者构建高性能的MySQL架构,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • mysql中rpm方式安装的详解

    mysql中rpm方式安装的详解

    在本文中小编给大家整理了关于mysql安装之rpm方式安装的详细步骤以及注意点,需要的朋友们学习下。
    2019-03-03
  • 远程连接mysql数据库注意点记录

    远程连接mysql数据库注意点记录

    有时候我们需要远程连接mysql数据库,那么就需要注意如下问题,需要的朋友可以参考下
    2012-08-08
  • Windows下安装MySQL5.5.19图文教程

    Windows下安装MySQL5.5.19图文教程

    这篇文章主要介绍了Windows下安装MySQL5.5.19图文教程,非常详细,对每一步都做了说明,需要的朋友可以参考下
    2014-07-07
  • MySQL实现merge into四种方法代码实例

    MySQL实现merge into四种方法代码实例

    Merge into是一个数据库操作术语,通常用于将两个或多个表中的数据合并到一个表中,这篇文章主要给大家介绍了关于MySQL实现merge into四种方法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • MySql索引使用策略分析

    MySql索引使用策略分析

    这篇文章主要介绍了MySql索引使用策略分析,帮助大家更好的理解和使用MySQL,感兴趣的朋友可以了解下
    2020-11-11
  • Mysql修改字段类型、长度及添加删除列实例代码

    Mysql修改字段类型、长度及添加删除列实例代码

    在MySQL中可以使用ALTER TABLE语句来修改表结构,包括添加自增属性,下面这篇文章主要给大家介绍了关于Mysql修改字段类型、长度及添加删除列的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • mysql如何获取自增id

    mysql如何获取自增id

    这篇文章主要介绍了mysql如何获取自增id问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • MySQL缓存优化方案总结

    MySQL缓存优化方案总结

    最近迭代的产品版本从2.X来到了3.X,属于一个非常大的产品升级,比上个版本多了很多功能,那么上线之前肯定要在一个干净的环境里进行测试回归以及性能测试,本文总结一下数据库层面的一些缓存机制对查询速度整体的优化,需要的朋友可以参考下
    2023-08-08
  • 查看修改mysql编码方式让它支持中文(gbk或者utf8)

    查看修改mysql编码方式让它支持中文(gbk或者utf8)

    MySQL的默认编码是Latin1,不支持中文,要支持中文需要把数据库的默认编码修改为gbk或者utf8,真的是很麻烦啊,不过本文提供了详细的修改教程,感兴趣的你可不要走开啊,希望本文对你有所帮助
    2013-01-01

最新评论