如何恢复mysql,避免被研发删库跑路

一、制订全量备份策略

比如每天全量备份2次分别为12点和凌晨2点,但是这样的问题在于如果数据库被研发删库跑路了依然会丢失几个小时的数据。

一个典型的全量备份脚本如下

sh 复制代码
#!/bin/bash

mysql_user="root" #MySQL备份用户
mysql_password="xx" #MySQL备份用户的密码
mysql_host="xx.xx.xx.xx"
mysql_port="3306"
mysql_charset="utf8" #MySQL编码
backup_db_arr=("xx" "xx") #要备份的数据库名称,多个用空格分开隔开 如("db1" "db2" "db3")
backup_location=/mysqlbackdata  #备份数据存放位置,末尾请不要带"/",此项可以保持默认,程序会自动创建文件夹
expire_backup_delete="ON" #是否开启过期备份删除 ON为开启 OFF为关闭
expire_days=30 #过期时间天数 默认为三天,此项只有在expire_backup_delete开启时有效
backup_time=`date +%Y%m%d%H%M`  #定义备份详细时间
backup_Ymd=`date +%Y-%m-%d` #定义备份目录中的年月日时间
backup_3ago=`date -d '3 days ago' +%Y-%m-%d` #3天之前的日期
backup_dir=$backup_location/$backup_Ymd  #备份文件夹全路径
welcome_msg="Welcome to use MySQL backup tools!" #欢迎语
mysql_ps=`ps -ef |grep mysql |wc -l`
mysql_listen=`netstat -an |grep LISTEN |grep $mysql_port|wc -l`
if [ [$mysql_ps == 0] -o [$mysql_listen == 0] ]; then
        echo "ERROR:MySQL is not running! backup stop!"
        exit
else
        echo $welcome_msg
fi
mysql -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password <<end
use yrt;
exit
end
flag=`echo $?`
if [ $flag != "0" ]; then
        echo "ERROR:Can't connect mysql server! backup stop!"
        exit
else
        echo "MySQL connect ok! Please wait......"
        # 判断有没有定义备份的数据库,如果定义则开始备份,否则退出备份
        if [ "$backup_db_arr" != "" ];then
                #dbnames=$(cut -d ',' -f1-5 $backup_database)
                #echo "arr is (${backup_db_arr[@]})"
                for dbname in ${backup_db_arr[@]}
                do
                        echo "database $dbname backup start..."
                        `mkdir -p $backup_dir`
                        `mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password $dbname --single-transaction --skip-lock-tables --ignore-table=yrt.sys_oper_post_log --ignore-table=yrt.sys_oper_log --ignore-table=yrt.udi_device_record --ignore-table=yrt.product_specification --ignore-table=yrt.product_mdrf --ignore-table=yrt.product_unit --ignore-table=yrt.product --ignore-table=yrt.dealer_hospital_odo_product_detail --ignore-table=yrt.dealer_hospital_odo --ignore-table=yrt.finance_manage_info_record --ignore-table=yrt.dealer_dealer_grn_product_detail --ignore-table=yrt.inspection_record_detail --ignore-table=yrt.product_unit_inner_sn_max --ignore-table=yrt.arrival_record_detail --ignore-table=yrt.dealer_dealer_grn --ignore-table=yrt.vendor_odo_type --ignore-table=yrt.dealer_product_min_unit_inventory --ignore-table=yrt.odo_detail --ignore-table=yrt.product_premium_percent --ignore-table=yrt.vendor --ignore-table=yrt.dealer_stmdbrc_code68 --ignore-table=yrt.dealer_vendor_grn_product_detail --ignore-table=yrt.product_mdrf_image_inner_sn_max --ignore-table=yrt.dealer_maaiol_code68 --ignore-table=yrt.log --ignore-table=yrt.dealer_po_dealer_so_product_detail --ignore-table=yrt.product_mdrf_inner_sn_max --ignore-table=yrt.product_image_inner_sn_max --ignore-table=yrt.inventory_snapshot --default-character-set=$mysql_charset | gzip > $backup_dir/$dbname-$backup_time.sql.gz`
                        flag=`echo $?`
                        if [ $flag == "0" ];then
                                echo "database $dbname success backup to $backup_dir/$dbname-$backup_time.sql.gz"
                        else
                                echo "database $dbname backup fail!"
                        fi
                done
        else
                echo "ERROR:No database to backup! backup stop"
                exit
        fi
        # 如果开启了删除过期备份,则进行删除操作
        if [ "$expire_backup_delete" == "ON" -a  "$backup_location" != "" ];then
                 #`find $backup_location/ -type d -o -type f -ctime +$expire_days -exec rm -rf {} \;`
                 `find $backup_location/ -type d -mtime +$expire_days | xargs rm -rf`
                 echo "Expired backup data delete complete!"
        fi
        echo "All database backup success! Thank you!"
        exit
fi
echo $(date)

二、开启bin_log以恢复到对应时间点

怎么开启bin_log略,网上资料很多,通过如下命令判断有没有开启

sql 复制代码
SHOW VARIABLES LIKE 'log_bin'; -- 显示为on代表已开启
SHOW BINARY LOGS; -- 查看目前已经生成的bin_log文件

在服务器找到对应的bin_log文件

sql 复制代码
find / -name mysql-bin.000761

去到/mysql/mysql-bin/目录下,接线来就是怎么把这些bin_log文件提取为可执行的sql,这里用 mysqlbinlog 生成可执行的 SQL

sh 复制代码
mysqlbinlog \
  --start-datetime="2025-07-24 12:34:56" \
  --stop-datetime="$(date '+%F %T')" \
  --base64-output=DECODE-ROWS \
  --verbose \
  /var/lib/mysql/mysql-bin.* \
  > recovery.sql

那么问题来了,里面的起点和终点怎么获取。

怎么获取 start-datetime

打开前面全量数据备份的文件末尾会有如下标注,可以用这个时间作为开始时间
-- Dump completed on 2025-07-24 13:00:36

sql 复制代码
SHOW MASTER STATUS;


怎么获取stop-datetime

终点因为是删库的时间,可以使用当前时间, 即脚本里面的$(date '+%F %T')

如果不想恢复成sql文件而是希望直接回放bin_log可以使用如下语句

sh 复制代码
mysqlbinlog \
  --start-datetime="2025-07-24 12:34:56" \
  --stop-datetime="$(date '+%F %T')" \
  /var/lib/mysql/mysql-bin.* \
  | mysql -uroot -p
相关推荐
又见情义3 分钟前
RK3568 Android 13 SDK 开机自动开启共享热点实践
android
mmsx1 小时前
return false 不是拦截:一次按键触发两个动作的事件冒泡陷阱
android·bug
DU_YULIN1 小时前
Camera HAL ThreadManager概述
android·camera hal
淡淡的香烟2 小时前
Android中的MQTT通信原理解析
android·物联网
淡淡的香烟2 小时前
Android Camera开发详解
android·音视频
mmsx3 小时前
基于 Android 的校园信息管理系统源码
android·java·okhttp
菀亓4 小时前
ubuntu系统mysql安装
mysql
YF02114 小时前
如何进入Android工程模式
android
程序员贺加贝4 小时前
别被 saveBatch 骗了:一次 MyBatis-Plus 批量插入性能排查
mysql
l1258654 小时前
# RAG上线评估指标体系:六大核心指标与压测实战全解析
数据库·人工智能·python·mysql·langchain·milvus