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中INSERT+SELECT的使用方式

    MySQL中INSERT+SELECT的使用方式

    MySQL的INSERT INTO SELECT FROM语句允许用户通过一条SQL语句实现从一个或多个表中查询数据并将结果插入到另一个表中,这种方式特别适用于需要将数据从一张表迁移到另一张表,或者基于多表查询结果创建新表的场景
    2024-10-10
  • 解决Mysql主从同步时Slave_IO_Running:Connecting;Slave_SQL_Running:Yes的故障排除问题

    解决Mysql主从同步时Slave_IO_Running:Connecting;Slave_SQL_Running:Ye

    排查MySQL主从复制错误,依次检查网络、账户密码、防火墙,确认桥接模式、互ping通、防火墙关闭;检查配置文件log_bin和server_id,验证连接语法及主服务器权限设置,确保IP允许访问
    2025-07-07
  • MySQL免安装版(zip)安装配置详细教程

    MySQL免安装版(zip)安装配置详细教程

    这篇文章主要为大家详细介绍了MySQL免安装版(zip)安装配置详细教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • MySQL to_date()日期转换的用法及注意事项

    MySQL to_date()日期转换的用法及注意事项

    这篇文章主要介绍了MySQL to_date()日期转换的用法及注意事项,TO_DATE()函数在不同数据库系统中用于将字符串转换为日期格式,其语法和参数可能有所不同,需要的朋友可以参考下
    2025-01-01
  • MySQL 中的服务器配置和状态详解(MySQL Server Configuration and Status)

    MySQL 中的服务器配置和状态详解(MySQL Server Configuration and Statu

    MySQL服务器配置和状态设置包括服务器选项、系统变量和状态变量三个方面,可以通过命令行、配置文件或SQL语句进行设置和查看,服务器选项和系统变量可以是全局或会话级别的,状态变量只读且不可修改,sql_mode是一个特殊的变量,影响SQL语句的执行模式,感兴趣的朋友一起看看吧
    2025-02-02
  • 详解MySQL中DROP,TRUNCATE 和DELETE的区别实现mysql从零开始

    详解MySQL中DROP,TRUNCATE 和DELETE的区别实现mysql从零开始

    注意:这里说的delete是指不带where子句的delete语句 相同点: truncate和不带where子句的delete, 以及drop都会删除表内的数据
    2008-04-04
  • MySQL之主键索引排序失效问题

    MySQL之主键索引排序失效问题

    这篇文章主要介绍了MySQL之主键索引排序失效问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Mysql 远程连接遇到的问题排查

    Mysql 远程连接遇到的问题排查

    无法连接到远程MySQL数据库可能是由于多种原因导致的,本文主要介绍了Mysql远程连接遇到的问题排查,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • MySQL中any、some和all的用法实例

    MySQL中any、some和all的用法实例

    最近一直在练习MYSQL的多表查询,基本上每个查询语句我都会写至少两次,下面这篇文章主要给大家介绍了关于MySQL中any、some和all用法的相关资料,需要的朋友可以参考下
    2022-11-11
  • mysql中包含查询的五种方法总结

    mysql中包含查询的五种方法总结

    这篇文章主要给大家介绍了关于mysql中包含查询的五种方法, 在MySQL中,包含语句是一种用来包含其他查询语句的语句,通常用在WHERE语句中,需要的朋友可以参考下
    2023-08-08

最新评论