mysql备份与恢复
Posted jipinglong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql备份与恢复相关的知识,希望对你有一定的参考价值。
说明:
主参考:
https://blog.csdn.net/fanren224/article/details/79693860
mysql数据全量备份
1.开启二进制日志,备份指定数据库
#!/bin/bash
BACKUP_USER=‘root‘
BACKUP_PASSWD=‘m4r!adbOP‘
mysqldump --quick --events --routines --triggers --hex-blob --flush-logs --single-transaction --master-data=2 -u$BACKUP_USER -h 127.0.0.1 -p$BACKUP_PASSWD --databases "test","test2" > /root/dbbak.sql--flush-logs 备份开始时滚动一次二进制日志
--routines 备份存储过程和函数
--triggers 备份触发器
--events 备份事件表
--single-transaction 表类型为InnoDB时,热备,表类型为MyISAM时,温备
--master-data=2 以注释的方式记录备份开始时二进制日志的前缀名和位置
--master-data=1 记录备份开始时二进制日志的前缀名和位置,用于从库通过备份sql还原数据,还原后能从指定位置开始同步
2.未开启二进制日志,备份指定数据库
#!/bin/bash
BACKUP_USER=‘root‘
BACKUP_PASSWD=‘m4r!adbOP‘
mysqldump --quick --events --routines --triggers --hex-blob --single-transaction -u$BACKUP_USER -h 127.0.0.1 -p$BACKUP_PASSWD --databases "test","test2" > /root/dbbak.sql
mysql数据恢复
因为恢复数据时会执行大量的insert语句,如果没有特殊要求,还原时没有必要将这些操作记录到二进制日志中,所以关闭当前会话的二进制日志记录。
set sql_log_bin=OFF;
所有恢复操作完成后,再将当前会话中的sql_log_bin再次开启。
恢复命令
source /root/dbbak.sql
此命令只是恢复到了备份sql对应的时间点,还需要进行时间点还原。进行时间点恢复时,备份时间点之后的数据则需要通过二进制日志进行还原,首先,要从二进制日志中提取对应的sql,提取sql的起始位置为备份开始时那一刻二进制文件对应的position,因为在使用mysldump备份时,我们推荐使用--master-data=2选项,所以在对应的数据库备份sql文件中应该存在对应的position,提取sql的结束位置应该是drop语句对应的位置,因为咱们模拟的场景是有人误操作drop了数据库,所以结束位置应该是drop语句的位置。注意,不要把误操作的drop语句提取出来,否则重放对应sql时又会将对应的数据删除,如果是那样就前功尽弃了。
通过二进制日志进行还原:
主参考:
https://blog.csdn.net/liuchen1314/article/details/79628555基于位置恢复,通过查看日志文件信息,确认6259-6362为误操作点
mysqlbinlog --stop-position=6259 mysql-bin.000001 | mysql -uroot -p #从1开始至6259的事件读,不包括6259事件
mysqlbinlog --start-position=6363 mysql-bin.000001 | mysql -uroot -p #从6259的事件开始读
取两事件点
mysqlbinlog --start-position=5786 --stop-position=6254 mysql-bin.000001 | mysql -uroot -p
mysql数据增量备份
#!/bin/bash
PASSWD=‘m4r!adbOP‘
backupdir=/root/backup
dateDIR=`date "+%Y%m%d"`
mkdir $backupdir/$dateDIR
logsindexpath=/usr/local/mysqldata/binlogs/mysql-bin.index
mysqladmin -uroot -h 127.0.0.1 -p$PASSWD flush-logs
binlog_cp=`head -n -1 $logsindexpath`
for i in $binlog_cp
do
mysql -uroot -h 127.0.0.1 -p$PASSWD -e "\! cp -p $i $backupdir/$dateDIR/"
done
binlog_rm=`tail -n 1 $logsindexpath | awk -F ‘/‘ ‘print $NF‘`
mysql -uroot -h 127.0.0.1 -p$PASSWD -e "purge binary logs to ‘$binlog_rm‘"
以上是关于mysql备份与恢复的主要内容,如果未能解决你的问题,请参考以下文章