为实现mysql的不完全恢复实现了如下脚本:

#!/bin/bash

# 配置数据库连接信息
DB_HOST="localhost"
DB_PORT="3306"
DB_USER="root"
DB_PASSWORD="password"
DB_NAME="mydb"

# 配置备份目录和日志目录
BACKUP_DIR="/path/to/backup"
LOG_DIR="/path/to/logs"

# 配置误删表的名称和删除时间
TABLE_NAME="mytable"
DELETE_TIME="2021-11-10 12:00:00"

# 找到最近的一次全量备份
latest_backup=$(ls -1t $BACKUP_DIR/*.sql.gz | head -n1)

echo "恢复备份: $latest_backup"
zcat $latest_backup | mysql -h $DB_HOST -P $DB_PORT -u $DB_USER -p$DB_PASSWORD $DB_NAME

# 获取备份时间点之后的所有 binlog 文件
binlog_files=$(mysqlbinlog --stop-datetime="$DELETE_TIME" --to-last-log $LOG_DIR/mysql-bin.* | grep "^use" | sed 's/use //g' | sort -u | awk '{print "'$LOG_DIR'/" $0}')

# 逐个处理 binlog 文件
for file in $binlog_files; do
    echo "处理binlog文件: $file"
    mysqlbinlog $file | sed -n '/^### DELETE FROM `'${TABLE_NAME}'`/,/^COMMIT/p' >> binlog.sql
done

# 执行生成的 SQL 文件
echo "执行生成的 SQL 文件"
mysql -h $DB_HOST -P $DB_PORT -u $DB_USER -p$DB_PASSWORD $DB_NAME < binlog.sql

echo "完成"

以上脚本假设:

  • 备份文件是以扩展名 .sql.gz 存在指定的备份目录中的。
  • binlog 文件是以扩展名 .00000* 存在指定的日志目录中的。
  • 要恢复的表名是 mytable。
  • MySQL 实例的连接信息是 localhost:3306,用户名是 root,密码是 password,数据库名是 mydb。

使用时需要根据实际情况修改相关配置。