mysql 使用binlog 恢复数据

发布时间 2023-08-03 20:57:08作者: black2bi

1.恢复大原则

想恢复数据,比如删除一行,如果没有备份,要从插入数据的那一行或者那一天开始恢复。
如果从未备份,想恢复删除的数据,要从系统开始一点一点恢复,会把这个系统建立后所有执行的语句再执行一遍。所以要经常备份。否则出幺蛾子难搞

2.恢复操作

1.把binlog日志复制到另外文件夹,这个是恢复的点位。
2.如果有备份使用备份恢复数据库,否则删掉的比较久的数据,只能从日志的开头开始恢复了。
3.寻找出错的binlog日志。备份时间和错误操作的时间。
show master status;最后一个日志
4.加这个可以控制能看懂字符
--base64-output=decode-rows
按照时间抓
mysqlbinlog --no-defaults --start-datetime="2023-08-03 09:16:59" --stop-datetime="2023-08-03 20:59:48" --base64-output=decode-rows C:\DESKTOP-SRMKC0Q-bin.000116 -d 11111> d:\test5.sql
按照行数抓
mysqlbinlog --no-defaults --start-position=4 --stop-position=610 C:\DESKTOP-SRMKC0Q-bin.000116 -d 11111> d:\test5.sql
5.mysql -uroot -proot
6.use tardb;
7.source d:\test5.sql;

 

 

3.binlog设定
MySQL-uroot -p 进去MySQL 系统
binlog管理
在[mysqld]标签内增加如下内容
expire_logs_days=30
max_binlog_size=1024M
 
修改保存后,以下3种情况才生效
1)当binlog大小超过max_binlog_size
2)手动执行flush logs
3)重新启动

 
为了使之生效,需要执行flush logs。
mysql> flush logs;


4 windows备份
@echo off
echo link message
set host=127.0.0.1
set port=3306
set user=root
set pass=root
echo backupname
set dbname=11111
echo getdatainfo 2022-12-13-14-30-40

set backup_date=%date:~0,4%-%date:~5,2%-%date:~8,2%-%time:~0,2%-%time:~3,2%-%time:~6,2%
echo 设置备份文件的路径
set backupfile=D:\test\backup\%dbname%-%backup_date%.sql
echo 使用mysqldump对指定的MySql进行备份
echo 注意路径中有空格的要加上双引号
"C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqldump" -h%host% -P%port% -u%user% -p%pass% -c --add-drop-table %dbname% > %backupfile%
echo 删除过期文件,这里是超过30天就删除
forfiles /p D:\test\backup\ /s /m *.sql /d -30 /c "cmd /c del @file /f"
exist

 

5.linux 全量备份

1、创建一个备份脚本文件,例如 backup_mysql.sh,并将以下代码复制到文件中:

[root@k8s-node3 ~]# vim /hqtbj/hqtwww/Script/mysql/mysql_bak_full.sh
#!/bin/bash 
#mysqldump.sh
#Date: 2022-05-17
#Author: fandaoshuai
#Function: mysql数据库全量备份,并保留一个月;一个月之后再清理;

DB_User='xxx' #数据库用户
DB_Passwd='xxxx' #数据库密码

DATE=`date -d "now" +%Y-%m-%d` #显示当前的时间
Old_DATE=`date -d "-1 month" +%Y-%m-%d` #显示一个月前的时间

Bak_Dir=/hqtbj/hqtwww/data/mysql-bak/full/$DATE #备份目录
Old_Bak_Dir=/hqtbj/hqtwww/data/mysql-bak/full/$Old_DATE #一个月前的备份目录

echo $DATE"备份开始"
##创建目录##
if [ ! -d "$Bak_Dir" ];then
  mkdir -p $Bak_Dir
  echo "备份目录不存在,已创建;"
fi

##开始备份##
echo "开始全量备份"
BackupName=FULL-$DATE.sql.gz #备份完成之后的名字
/usr/local/mysql/bin/mysqldump -h127.0.0.1 -P3306 -u${DB_User} -p${DB_Passwd} --all-databases 2>/dev/null | gzip > $Bak_Dir/$BackupName
if [ $? -eq 0 ];then
  echo "数据库全量备份已完成:"$Bak_Dir/$BackupName
else
  echo $BackupName"-数据库全量备份失败"
fi

##清理一个月前的备份文件##
echo "开始清理一个月前的备份文件-备份目录为:" $Old_Bak_Dir
if [ -d "$Old_Bak_Dir" ];then
  rm -rf $Old_Bak_Dir
  echo "一个月前的备份文件已被清理;" 
fi


6.linux 增量备份
[root@k8s-node3 ~]# vim /hqtbj/hqtwww/Script/mysql/mysql_bak_incremental.sh 
#!/bin/bash 
#mysqldump.sh
#Date: 2022-05-17
#Author: fandaoshuai
#Function: mysql数据库增量备份,并保留一个月;一个月之后再清理;

DB_User='xxx' #数据库用户
DB_Passwd='xxxx' #数据库密码

DATE=`date -d "now" +%Y-%m-%d` #显示当前的时间
Old_DATE=`date -d "-1 month" +%Y-%m-%d` #显示一个月前的时间

Bak_Dir=/hqtbj/hqtwww/data/mysql-bak/incremental/$DATE #备份目录
Old_Bak_Dir=/hqtbj/hqtwww/data/mysql-bak/incremental/$Old_DATE #一个月前的备份目录

Binlog_Dir=/usr/local/mysql/logs #binlog的日志目录
Binlog_File=$Binlog_Dir/mysql-bin.index  #binlog日志的索引文件

echo $DATE"备份开始"
/usr/local/mysql/bin/mysqladmin -h127.0.0.1 -P3306 -u${DB_User} -p${DB_Passwd} flush-log #刷新binlog日志文件

Counter=`wc -l $Binlog_File | awk '{print $1}'`
NextNum=0

##创建目录##
if [ ! -d "$Bak_Dir" ];then
  mkdir -p $Bak_Dir
  echo "备份目录不存在,已创建;"
fi

##开始备份##
for file in `cat $Binlog_File`
do
  Base=`basename $file`
  NextNum=`expr $NextNum + 1`
  if [ $NextNum -eq $Counter ]
    then
    echo $Base "新日志文件已经跳过"
  else
    dest=$Bak_Dir/$Base
    if (test -e $dest)
    then
    echo $Base"备份文件已存在"
    else
    echo "拷贝备份文件"$Base"至备份目录"
    cp $Binlog_Dir/$Base $Bak_Dir
    echo "增量备份文件"$Base"成功"
    fi
  fi
done


##清理一个月前的备份文件##
echo "开始清理一个月前的备份文件-备份目录为:" $Old_Bak_Dir
if [ -d "$Old_Bak_Dir" ];then
  rm -rf $Old_Bak_Dir
  echo "一个月前的备份文件已被清理;" 
fi

7.linux 自动备份任务
[root@k8s-node3 ~]# crontab -e
0 4 */7 * * sh /hqtbj/hqtwww/Script/mysql/mysql_bak_full.sh 1>>/hqtbj/hqtwww/Script/mysql/logs/mysql_full.log 2>&1
0 4 * * * sh /hqtbj/hqtwww/Script/mysql/mysql_bak_incremental.sh 1>>/hqtbj/hqtwww/Script/mysql/logs/mysql_incremental.log 2>&1