项目需要进行对mysql的增量备份和全量备份,大致思路是通过编写crontab(定时任务)执行mysqldump指令下载整个sql文件然后压缩,进行全量备份;开启MySQLbinlog日志,备份binlog日志文件进行增量备份。
检测bin-log是否开启,登录MySQL,输入
show variables like 'log_%'
+----------------------------------------+---------------------------------------+
| Variable_name | Value |
+----------------------------------------+---------------------------------------+
| log_bin | ON | ------> ON表示已经开启binlog日志
| log_bin_basename | /usr/local/mysql/data/mysql-bin |
| log_bin_index | /usr/local/mysql/data/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| log_error | /usr/local/mysql/data/martin.err |
| log_output | FILE |
| log_queries_not_using_indexes | OFF |
| log_slave_updates | OFF |
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
| log_throttle_queries_not_using_indexes | 0 |
| log_warnings | 1 |
+----------------------------------------+---------------------------------------+
如未开启,修改MySQL配置文件,在[mysqld] 区块
设置/添加 log-bin=mysql-bin 确认是打开状态(值 mysql-bin 是日志的基本名或前缀名);
重启mysqld服务使配置生效
# pkill mysqld # /usr/local/mysql/bin/mysqld_safe --user=mysql &
备份脚本
#执行环境变量 source /etc/profile #设置备份目录 BakDir=/data/mysql/bak/fully_bak #设置日志目录 LogFile=/data/mysql/bak/bak.log Date=`date +"%Y-%m-%d"` Begin=`date +"%Y-%m-%d %H:%M:%S"` cd $BakDir DumpFile=$Date.sql GZDumpFile=$Date.sql.tgz echo $DumpFile #执行mysqldump指令,生产备份sql mysqldump -u[在此输入用户名] -p[在此输入密码] --quick --events --databases [在此输入数据库名] >$DumpFile /bin/tar -zvcf $GZDumpFile $DumpFile #压缩备份文件 /bin/rm $DumpFile #删除dump文件,只保留压缩备份 oldDate=`date -d '7 days ago' + %Y%m%d` oldBakFile=$(oldDate)".sql.tgz" Last=`date +"%Y年%m月%d日 %H:%M:%S"` echo 开始:$Begin结束:Last $GZDumpFile succ >> $LogFile #记录备份日志
恢复
找到你需要恢复的文件,进行解压缩
tar -zxvf '恢复文件'
执行解压缩后的sql文件
mysql –u用户名 –p密码 –D数据库<【sql脚本文件路径全名】
备份脚本
# Program # use cp to backup mysql data everyday! # History # Path BakDir=/data/mysql/bak/add_bak #增量备份时复制mysql-bin.00000*的目标目录,提前手动创建这个目录 BinDir=/data/mysql #mysql数据存放目录 LogFile=/data/mysql/bak/add_bak.log #备份日志存放目录 BinFile=/data/mysql/bin.index #mysql数据目录下的index文件 Date=`date +%Y%m%d` Begin=`date +"%Y年%m月%d日 %H:%M:%S"` mysqladmin -uroot -pPassc0de@tpcpjl flush-logs #这个是用于产生新的mysql-bin.00000*文件 Counter=`wc -l $BinFile |awk '{print $1}'` NextNum=0 #这个for循环用于比对$Counter,$NextNum这两个值来确定文件是不是存在或最新的 echo \###################################################### >> $LogFile 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! > /dev/null else dest=$BakDir/$base if(test -e $dest) #test -e用于检测目标文件是否存在,存在就写exist!到$LogFile去 then echo $base exist! >> $LogFile else cp $BinDir/$base $BakDir echo $base copying >> $LogFile fi fi done Last=`date +"%Y年%m月%d日 %H:%M:%S"` echo 开始:$Begin 结束:$Last$Next mysql-daily-backup successful !!! >> $LogFile echo >> $LogFile ls -l -h $BakDir
恢复
通过binlog将日志文件转为sql文件,然后执行sql
mysqlbinlog --base64-output=decode-rows 'binlog文件完整路径'>/opt/excute.sql
执行生成的sql文件
安装
yum install vixie-cron
yum install crontabs
vixie-cron软件包是cron的主程序;
crontabs软件包是用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序。
启动命令
service crond start //启动服务
service crond stop //关闭服务
service crond restart //重启服务
service crond reload //重新载入配置
service crond status //查看状态
chkconfig crond on //设置开机自动启动crond服务:
chkconfig –list crond //开机级别的crond服务运行情况 ,2、3、4、5级别开机会自动启动crond服务
chkconfig crond off//取消开机自动启动crond服务:
定时执行脚本
crontab -e 进入定时任务编辑模式,输入cron表达式和执行脚本完整路径,保存
00 02 * * * /opt/add_bak.sh
cron表达式的一些例子
0 0 10,14,16 * * ? 每天上午10点,下午2点,4点触发 0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时触发 0 0 12 ? * WED 表示每个星期三中午12点触发 0 0 12 * * ? 每天中午12点触发 0 15 10 ? * * 每天上午10:15触发 0 15 10 * * ? 每天上午10:15触发 0 15 10 * * ? * 每天上午10:15触发 0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发 0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发 0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发 0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发 0 15 10 ? * MON-FRI 周一至周五的上午10:15触发 0 15 10 15 * ? 每月15日上午10:15触发 0 15 10 L * ? 每月最后一日的上午10:15触发