操作 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会将其拦截,如下图所示: