操作 MySQL 数据库是十分危险的,生产环境,经常会有人因手滑把数据误改或者误删,为此可以制定一些规则来减少风险。


我的规则是:

  • 禁止执行没有 WHERE 条件的删除操作,例如:DELETE FROM <表名>
  • 禁止执行等同于删除全表数据的删除操作,例如:DELETE FROM <表名> WHERE 1=1
  • 禁止执行没有 WHERE 条件的更新操作,例如:UPDATE <表名> SET <字段名> = <值>
  • 禁止执行等同于更新全表数据的更新操作,例如:UPDATE <表名> SET <字段名> = <值> WHERE 1=1


具体实施步骤

1.访问ProxySQL的6032管理端口

mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='Admin> '

-- 插入新的DELETE规则 (无WHERE子句)
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, error_msg, apply) 
VALUES (101, 1, '^DELETE\s+FROM\s+[^\s]+\s*$', 'DELETE语句必须包含有效的WHERE条件.', 1);

-- 插入新的DELETE规则 (无效WHERE子句)
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, error_msg, apply) 
VALUES (102, 1, '^DELETE\s+FROM\s+[^\s]+\s+WHERE\s+[0-9]+=[0-9]+$', 'DELETE 语句必须包含有效的WHERE条件.', 1);

-- 插入新的UPDATE规则 (无WHERE子句)
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, error_msg, apply)
VALUES (103, 1, '^UPDATE\s+[^\s]+\s+SET\s+[^\s]+\s*$', 'UPDATE语句必须包含WHERE条件', 1);

-- 插入新的UPDATE规则 (无效WHERE子句)
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, error_msg, apply)
VALUES (104, 1, '^UPDATE\s+[^\s]+\s+SET\s+[^\s]+\s+WHERE\s+[0-9]+=[0-9]+$', 'UPDATE 语句必须包含有效的WHERE条件', 1);

-- 注释:
-- 1. 规则1和3匹配不包含WHERE子句的DELETE和UPDATE语句
-- 2. 规则2和4匹配包含无效WHERE条件的DELETE和UPDATE语句
-- 3. 无效WHERE条件包括: 数字相等、TRUE、FALSE

-- 加载和保存规则
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;


使用

2.DBA、运维或者研发直接访问ProxySQL的6033端口

mysql -u rd -p123456 -h 127.0.0.1 -P6033

当设定好的规则被触发时,ProxySQL会将其拦截,如下图所示:

ProxySQL 设置拦截危险SQL_误删