数据库备份:将数据库中存在的现有数据,进行存放成为副本数据,可以解决数据容灾,提高系统的高可用性和灾难恢复性,数据崩溃时,以最小代价重新恢复数据。数据备份的分类:
物理备份:指对数据库操作系统的物理文件(数据文件、日志文件)等的备份;
冷备份:必须在数据库关闭的状态下进行备份,能够更好的保证数据库的完整性;
热备份:能够在数据库处于正常运行的情况下备份,能够更高的保证服务的可用性;
逻辑备份:指对数据库的逻辑组件(数据库、表、数据对象)进行备份;
完全备份:将数据进行完整的备份,包含完整的库、表、索引、视图等,需要花费更长的时间
差异备份:备份自上次完全备份到现在发生改变的数据库内容,备份的文件比完整备份的文件小,备份的速度更快;
增量备份:备份至上次完全备份或增量备份后被修改的数据库内容
增量备份之前需要查看配置文件,是否开启log_bin。进行mysql命令终端使用命令查看修改配置文件,查看配置文件位置f添加如下配置 系统变量binlog_format 指定二进制日志的类型。分别有statement、row、mined三种值。mysql5.7.6之前默认为statement模式。MySQL 5.7.7之后默认为row模式。这个参数主要影响主从复制。复制的模式有下面几种:基于SQL语句的复制(statement-based replication, SBR),基于行的复制(row-based replication, RBR),混合模式复制(mixed-based replication, mbr)。重启mysql服务器,在命令终端查看查看二进制日志文件的状态
查看某个二进制日志文件的变化
showbinlogeventsin"mysql_binlog.000002";
故障恢复
全量数据恢复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-vmysql_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! >> $LogFileecho "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=(db1db2db3db4)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/$dumpFiledoneecho "succ";
生成环境数据备份策略
在数据库压力小的时段继续全量备份,根据自已公司的业务情况,设置某个时间端进行全量备份
数据更新频繁且比较重要,可以选择增量备份,记住定期删除日志文件
我采取的备份方案:
每周末进行一次全量备份,每天进行一次增量备份,如果发生故障可以先进行全量恢复,再根据mysqlbinlog命令根据posititon值或者时间点进行恢复。具体操作根据实际情况调整。
编辑任务 contab -e
重启crontab加载配置 service crond reload 就能开启定时任务备份
至此mysql如何进行备份实战就至此结束了,觉得我的文章有用的就分享给身边的小伙伴。