备份前先检查MySQL主配置文件是否有如下两个参数:
vim /etc/my.cnf
log-bin=mysql-bin
binlog_format=mixed //binlog日志格式,mysql默认采用statement,建议使用mixed
#MIXED说明:对于执行的SQL语句中包含now()这样的时间函数,会在日志中产生对应的unix_timestamp()*1000的时间字符串,slave在完成同步时,取用的是sqlEvent发生的时间来保证数据的准确性。另外对于一些功能性函数slave能完成相应的数据同步,而对于上面指定的一些类似于UDF函数,导致Slave无法知晓的情况,则会采用ROW格式存储这些Binlog,以保证产生的Binlog可以供Slave完成数据同步
如果新添加要记得重启MySQL: /etc/init.d/mysqld restart
增量备份脚本:
#!/bin/bash
#脚本中文件路径需要自行创建
BakDir=/data/backup/binlog/ #备份binlog目录
BinDir=/data/mysql #实际MySQL数据目录
LogFile=/data/backup/binlog/bak.log
BinFile=/data/mysql/mysql-bin.index
mysqladmin -uroot -p123456 flush-logs
Counter=`wc -l $BinFile|awk '{print $1}'`
NextNum=0
for file in `cat $BinFile`
do
base=`basename $file`
NextNum=`expr $NextNum + 1`
if [ $NextNum -eq $Counter ]
then
echo $base skip! >> $LogFile
else
dest=$BakDir/$base
if(test -e $dest)
then
echo $base exist! >> $LogFile
else
cp $BinDir/$base $BakDir/
echo $base copying >> $LogFile
fi
fi
done
echo `date +"%Y年%m月%d日 %H:%M:%S"` $Next Bakup succ~ >> $LogFile
增量备份完成之后可以去备份目录检查:
[root@master ~]# ll /data/backup/binlog/
total 24
-rw-r--r-- 1 root root 345 Jul 22 16:25 bak.log
-rw-r----- 1 root root 143 Jul 22 16:22 mysql-bin.000001
-rw-r----- 1 root root 211 Jul 22 16:22 mysql-bin.000002
-rw-r----- 1 root root 1522 Jul 22 16:22 mysql-bin.000003
-rw-r----- 1 root root 309 Jul 22 16:22 mysql-bin.000004
-rw-r----- 1 root root 512 Jul 22 16:25 mysql-bin.000005
全量备份脚本:
#!/bin/bash
#use mysqldump to fully backup mysql data
#脚本中文件路径需要自行创建
BakDir=/data/backup #备份目录
LogFile=/data/backup/bak.log #执行备份日志
Date=`date +%Y%m%d`
Begin=`date +"%Y年%m月%d日 %H:%M:%S"`
cd $BakDir
DumpFile=$Date.sql
GZDumpFile=$Date.sql.tgz
mysqldump -uroot -p123456 --all-databases --lock-all-tables --routines --triggers --events --master-data=2 --flush-logs > $DumpFile
tar zcvf $GZDumpFile $DumpFile
rm $DumpFile
Last=`date +"%Y年%m月%d日 %H:%M:%S"`
echo 开始:$Begin 结束:$Last $GZDumpFile succ >> $LogFile
参数注释:
--all-databases #备份所有库
--lock-all-tables #为所有表加读锁
--routinge #存储过程与函数
--triggers #触发器
--events #记录事件
--master-data=2 #在备份文件中记录当前二进制日志的位置,并且为注释的,1是不注释掉在主从复制中才有意义
--flush-logs #日志滚动一次
结果如下:
[root@master ~]# ./mysql-fullbak.sh
Warning: Using a password on the command line interface can be insecure.
20200722.sql
[root@master ~]# ll /data/backup/
total 160
-rw-r--r-- 1 root root 156118 Jul 22 16:39 20200722.sql.tgz
-rw-r--r-- 1 root root 94 Jul 22 16:39 bak.log
drwxr-xr-x 2 root root 141 Jul 22 16:25 binlog
[root@master backup]# ls
20200728.sql.tgz bak.log
[root@master backup]# cat bak.log
开始:2020年07月28日 19:02:59 结束:2020年07月28日 19:02:59 20200728.sql.tgz succ
定时任务:
crontab -e
0 2 * * * /bin/bash /root/mysql-zlbak.sh >/dev/null 2>&1
0 4 * * 1 /bin/bash /root/mysql-fullbak.sh >/dev/null 2>&1
#每天的凌晨2点增量备份一次
#每周一的凌晨4点全量备份一次
#>/dev/null 2>&1:丢弃所有输出
#2>&1 的意思就是将标准错误重定向到标准输出。这里标准输出已经重定向到了 /dev/null。那么标准错误也会输出到/dev/null