vlambda博客
学习文章列表

mysql数据灾难恢复方案

数据库备份:将数据库中存在的现有数据,进行存放成为副本数据,可以解决数据容灾,提高系统的高可用性和灾难恢复性,数据崩溃时,以最小代价重新恢复数据。
数据备份的分类:
  1. 物理备份:指对数据库操作系统的物理文件(数据文件、日志文件)等的备份;

  2. 冷备份:必须在数据库关闭的状态下进行备份,能够更好的保证数据库的完整性;

  3. 热备份:能够在数据库处于正常运行的情况下备份,能够更高的保证服务的可用性;

  4. 逻辑备份:指对数据库的逻辑组件(数据库、表、数据对象)进行备份;

  5. 完全备份:将数据进行完整的备份,包含完整的库、表、索引、视图等,需要花费更长的时间

  6. 差异备份:备份自上次完全备份到现在发生改变的数据库内容,备份的文件比完整备份的文件小,备份的速度更快;

  7. 增量备份:备份至上次完全备份或增量备份后被修改的数据库内容

增量备份之前需 要查看配置文件,是否开启log_bin。 进行mysql命令终使用命令查看 mysql数据灾难恢复方案 修改配置 件,查看配置文件位置 mysql数据灾难恢复方案 m y.cnf添加如下配置 mysql数据灾难恢复方案       系统变量binlog_format 指定二进制日志的类型。 分别有statement、row、mined三种值。mysql  5.7.6之前默认为statement模式。 MySQL 5.7.7之后默认为row模式。 这个参数主要影响主从复制。 制的模式有下面几种:基于SQL语句的复制(statement-based replication, SBR),基于行的复制(row-based replication, RBR),混合模式复制(mixed-based replication, mbr)。 重启m ysql服务器,在命令终端查看 mysql数据灾难恢复方案
查看二进制日志文件的状态

mysql数据灾难恢复方案

查看某个二进制日志文件的变化

show binlog events in "mysql_binlog.000002";

mysql数据灾难恢复方案

故障恢复

全量数据恢复source /home/mysql/xxx.sql
增量数据部分恢复 mysqlbinlog --start-position=1 --stop-position=795 /home/mysql/mysql_binlog.000002 |mysql -uroot -p密码
 增量数据全部恢复  mysqlbinlog /home/mysql/mysql_binlog.000001 |mysql -uroot -p密码  查看二进制的内容  mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql_binlog.000002

新增用户赋予权限用来用备份(这部可以忽略)

脚本代码 增量保留,并且删除一个月之前的binlog文件

backupDir=/home/mysql/binlogBinDir=/var/lib/mysqlLogFile=/home/mysql/log/binlog.logBinFile=/var/lib/mysql/mysql_binlog.indexmysqladmin -uroot -p123456 flush-logs#读取mysql_binlog.index 文件Counter=`wc -l $BinFile |awk '{print $1}'`NextNum=0#这个for循环用于比对$Counter,$NextNum这两个值来确定文件是不是存在或最新的。for file in `cat $BinFile`do base=`basename $file` #basename用于截取mysql-bin.00000*文件名,去掉./mysql-bin.000005前面的./ NextNum=`expr $NextNum + 1` if [ $NextNum -eq $Counter ] then echo $base skip! >> $LogFile else dest=$backupDir/$base if(test -e $dest) #test -e用于检测目标文件是否存在,存在就写exist!到$LogFile去。 then echo $base exist! >> $LogFile else mv $BinDir/$base $backupDir echo $base copying >> $LogFile fi fidoneecho `date +"%Y年%m月%d日 %H:%M:%S"` Backup success! >> $LogFile
echo "delet a mothon ago log data";#1个月清空一次log文件
find /home/mysql/binlog/ -mtime +30 -name "*.log*" -exec rm -rf {} \;
echo "delete success";

脚本代码 全量保存 一个月删除一次

#!/bin/bash#需要备份的数据库dbNames=(db1 db2 db3 db4)
Date=$(date --date="now" +%Y%m%d)
ODate=$(date --date="-1 month" +%Y%m%d)
newDir=/home/mysql/data/$Date#需要删除的目录oldDir=/home/mysql/data/$ODate#数据库密码password=123456
#删除过期备份数据if [ -d $oldDir ]then echo "当前的路径为"$oldDir #rm -rf $oldDirfi
#创建新备份文件加,如果创建不会重新创建if [ ! -d $newDir ]then mkdir $newDirfi
#对需要备份的数据库进行备份for dbname in ${dbNames[*]}do dumpFile=$dbname-$Date.sql.gz mysqldump -uroot -p$password $dbname | gzip > $newDir/$dumpFiledone
echo "succ";

生成环境数据备份策略

  • 在数据库压力小的时段继续全量备份,根据自已公司的业务情况,设置某个时间端进行全量备份

  • 数据更新频繁且比较重要,可以选择增量备份,记住定期删除日志文件

我采取的备份方案:

每周末进行一次全量备份,每天进行一次增量备份,如果发生故障可以先进行全量恢复,再根据mysqlbinlog命令根据posititon值或者时间点进行恢复。具体操作根据实际情况调整。

编辑任务 contab -e

重启crontab加载配置 service crond reload 就能开启定时任务备份

至此mysql如何进行备份实战就至此结束了,觉得我的文章有用的就分享给身边的小伙伴。