操作 MySQL 数据库是十分危险的,生产环境,经常会有人因手滑把数据误改或者误删,那么如何避免?


我的规则是:

  • delete from,这种SQL禁止执行
  • delete from...where 1=1,这种SQL禁止执行
  • update ... set ...,这种SQL禁止执行
  • update ... set ...where 1=1,这种SQL禁止执行


实施

访问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;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.

ProxySQL 设置拦截危险SQL_mysql