前言
日常工作中,总会有因手抖、写错条件、写错表名、错连生产库造成的误删库表和数据的事情发生。但是,如果每次删库都跑路的话,怕是再也不好找工作了吧!所以,删库跑路不是上上策。
数据恢复的前提的做好备份,且开启 binlog,格式为 row。如果没有备份文件,那么删掉库表后就真的删掉了,lsof 中还有记录的话,有可能恢复一部分文件。但若刚好数据库没有打开这个表文件,那就只能跑路了。如果没有开启 binlog,那么恢复数据后,从备份时间点开始的数据都没了。如果 binlog 格式不为 row,那么在误操作数据后就没有办法做闪回操作,只能老老实实地走备份恢复流程。
数据库备份
计划任务:
crontab -e
0 1 * * * /bin/bash /data/backup.sh #每天晚上1点备份
备份脚本:/data/backup.sh
#!/bin/sh
#description : dump mysql 10.64.35.118 databases to 10.64.35.144:/extArray1/OTS_DB_BACKUP/
myuser='root' # 用户名
mypass='123456' # 密码
socket='/data/public/mysql/sock/118.sock' # sock文件
mycmd="/data/public/mysql/bin/mysql -u$myuser -p$mypass -S $socket" # mysql登录命令
mydump="/data/public/mysql/bin/mysqldump -u$myuser -p$mypass -S $socket" #mysqldump 备份命令
destDir="/data/backup/database/$(date +%F)" # 备份目录
mkdir -p $destDir
for database in `$mycmd -e "show databases;"|sed '1,2d'|egrep -v "mysql|schema|sys"`
do
echo $database
for table in `$mycmd -e "show tables from $database;"|sed '1d'`
do
echo $table
# 按表备份 所有表
$mydump $database $table > $destDir/mysqlbak_"$database"_"$table"_$(date +%F).sql
done
# 按库备份 所有库
$mydump -B $database | gzip > $destDir/mysqlbak_"$database"_$(date +%F).sql.gz
done
#备份到远程服务器
cp -r $destDir /backup/database/idaas/
#gzip /backup/database/idaas/
#清理7天前的数据
#clearFileDate='date -d '8 day ago' +%F'
#rm -f /backup/database/idaas/mysqlbak_*$clearFileDate*.sql