#!/usr/bin/env bash
# ==============================================================================
# 脚本名称: check_mysql_safe.sh
# 功能描述: MySQL Binlog 防线与 8.0 版本高危状态探活 (纯只读)
# 使用方式: 宿主机直接执行 (需确保可通过 root 免密连接或修改登录参数)
# ==============================================================================
set -o pipefail
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
PLAIN='\033[0m'
echo -e "${BLUE}================================================================${PLAIN}"
echo -e "${BLUE} MySQL 核心数据防线与版本探测巡检 ${PLAIN}"
echo -e "${BLUE}================================================================${PLAIN}"
# 定义 MySQL 执行别名 (请根据实际环境修改密码或免密方式)
# 示例针对 Docker 容器环境
MYSQL_CMD="docker exec -i mysql-recovery-demo mysql -uroot -pRoot@2026! -N -B"
# 测试连通性
if ! $MYSQL_CMD -e "SELECT 1;" &>/dev/null; then
echo -e "${RED}[ERROR] 无法连接到 MySQL 实例,请检查容器名称或登录凭证配置!${PLAIN}"
exit 1
fi
# 1. 探测 MySQL 版本
echo -e "\n${YELLOW}[1/3] 探测数据库版本号与物理反解兼容性...${PLAIN}"
DB_VERSION=$($MYSQL_CMD -e "SELECT @@version;")
MAJOR_VERSION=$(echo "$DB_VERSION" | cut -d'.' -f1)
echo -e " -> 当前 MySQL 实例版本: ${DB_VERSION}"
if [ "$MAJOR_VERSION" -ge 8 ]; then
echo -e " -> ${RED}[WARN] 实例为 MySQL 8.0+。因 SDI 数据字典重构,底层 ibd 反解工具极难生效。${PLAIN}"
VERSION_RISK=1
else
echo -e " -> ${GREEN}[OK] 实例为 MySQL 5.x,物理文件具备可反解性 (undrop-for-innodb 兼容)。${PLAIN}"
VERSION_RISK=0
fi
# 2. 检查 Binlog 开启状态
echo -e "\n${YELLOW}[2/3] 检查核心防线: log_bin 状态...${PLAIN}"
BINLOG_STATUS=$($MYSQL_CMD -e "SHOW VARIABLES LIKE 'log_bin';" | awk '{print $2}')
if [ "$BINLOG_STATUS" == "ON" ]; then
echo -e " -> ${GREEN}[OK] Binlog 已开启。若发生误删,可通过 binlog2sql 或 Flashback 进行逻辑回滚。${PLAIN}"
else
echo -e " -> ${RED}[DANGER] log_bin 处于 OFF 状态!全量误删后将丢失逻辑重放途径!${PLAIN}"
if [ "$VERSION_RISK" -eq 1 ]; then
echo -e "\n${RED}!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!${PLAIN}"
echo -e "${RED}[FATAL] 致命风险:MySQL 8.0+ 且未开启 Binlog!一旦误删数据将难以恢复。${PLAIN}"
echo -e "${RED}!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!${PLAIN}"
fi
fi
# 3. 检查独立表空间配置
echo -e "\n${YELLOW}[3/3] 检查 InnoDB 独立表空间配置...${PLAIN}"
FILE_PER_TABLE=$($MYSQL_CMD -e "SHOW VARIABLES LIKE 'innodb_file_per_table';" | awk '{print $2}')
if [ "$FILE_PER_TABLE" == "ON" ]; then
echo -e " -> ${GREEN}[OK] innodb_file_per_table=ON,每张表拥有独立的 .ibd 文件,便于隔离恢复。${PLAIN}"
else
echo -e " -> ${RED}[WARN] 使用了共享表空间 (ibdata1)。底层反解时数据页杂糅,恢复难度极大。${PLAIN}"
fi
echo -e "\n${BLUE}================================================================${PLAIN}"
echo -e "${BLUE}巡检完毕。强烈建议保持 log_bin 处于 ON 状态,物理抢救仅作为最后退路。${PLAIN}"
echo -e "${BLUE}================================================================${PLAIN}"