#!/usr/bin/env bash
# ==============================================================================
# 脚本名称: check_sql_safe.sh
# 功能描述: 自动检测 MySQL Binlog 闪回兼容性与安全更新 (sql_safe_updates) 状态
# 使用方式: 在宿主机直接执行 (需确保可通过配置的凭证连接 MySQL)
# ==============================================================================
set -o pipefail
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
PLAIN='\033[0m'
# 定义 MySQL 执行命令 (请根据实际环境修改免密或账号连接方式)
MYSQL_CMD="docker exec -i prod-db-main mysql -uroot -pRoot@2026! -N -B"
echo -e "${BLUE}================================================================${PLAIN}"
echo -e "${BLUE} MySQL 误操作防线与 Binlog 闪回能力安全巡检 ${PLAIN}"
echo -e "${BLUE}================================================================${PLAIN}"
# 1. 检查 Binlog 格式配置
echo -e "\n${YELLOW}[1/2] 检查 Binlog 记录格式 (数据闪回的基础前提)...${PLAIN}"
BINLOG_FORMAT=$($MYSQL_CMD -e "SHOW VARIABLES LIKE 'binlog_format';" 2>/dev/null | awk '{print $2}')
if [ -z "$BINLOG_FORMAT" ]; then
echo -e "${RED}[ERROR] 无法连接到 MySQL 实例或查询变量失败,请检查连接凭证。${PLAIN}"
exit 1
fi
if [ "$BINLOG_FORMAT" == "ROW" ]; then
echo -e " -> 当前格式: ${GREEN}${BINLOG_FORMAT}${PLAIN}"
echo -e " -> ${GREEN}[OK] 已开启行级全镜像记录。发生 DML 误删改时支持使用 binlog2sql -B 进行闪回。${PLAIN}"
else
echo -e " -> 当前格式: ${RED}${BINLOG_FORMAT}${PLAIN}"
echo -e " -> ${RED}[FATAL] 当前非 ROW 格式!未记录行级数据镜像,发生全表误删改时将无法通过闪回恢复!${PLAIN}"
fi
# 2. 检查全局安全更新限制
echo -e "\n${YELLOW}[2/2] 检查全局安全更新参数 (sql_safe_updates)...${PLAIN}"
SAFE_UPDATES=$($MYSQL_CMD -e "SHOW GLOBAL VARIABLES LIKE 'sql_safe_updates';" 2>/dev/null | awk '{print $2}')
if [ "$SAFE_UPDATES" == "ON" ]; then
echo -e " -> 限制状态: ${GREEN}${SAFE_UPDATES}${PLAIN}"
echo -e " -> ${GREEN}[OK] 全局安全更新限制已开启。无 WHERE 条件或无索引的 UPDATE/DELETE 将被直接拒绝。${PLAIN}"
else
echo -e " -> 限制状态: ${RED}${SAFE_UPDATES}${PLAIN}"
echo -e " -> ${RED}[WARN] 全局安全更新限制未开启 (OFF)。${PLAIN}"
echo -e " -> ${YELLOW}[风险] 直接执行遗漏 WHERE 条件的 DELETE/UPDATE 语句会导致全表数据被立即清空或覆写。${PLAIN}"
echo -e " -> ${GREEN}[加固建议] 建议在 DMS/客户端层面开启安全管控,或在 my.cnf 中配置 sql_safe_updates=1。${PLAIN}"
fi
echo -e "\n${BLUE}================================================================${PLAIN}"
echo -e "${BLUE}巡检完毕。生产环境请确保保持 binlog_format=ROW 并配合事前 SQL 审核机制。${PLAIN}"
echo -e "${BLUE}================================================================${PLAIN}"