文章允许转载,请注明来源:https://blog.csdn.net/feiniao8651/article/details/96636404
背景
数据库的数据备份已经是老生常谈的话题了,只要是用过数据库的基本都会做过数据备份和恢复。
备份脚本
脚本网上比较多,这里贴一份我用的
#!/bin/bash
mysqldump --set-gtid-purged=off -uroot -p123456 -B pocket | xz > /data/backup/db_pocket_$(date +%Y%m%d_%H%M%S).sql.xz
workdir="/data/backup/"
do_delete()
{
echo file name is $workdir
find $workdir -name '*.sql.xz' -and -mtime +7 -type f -delete
if [ $? -eq 0 ];then
echo $date delete $dir success!
else
echo $date delete $dir FAILD!
fi
}
do_delete
这是参考了其他人的脚本,然后加上了一些自己的调整。
mysqldump --set-gtid-purged=off -uroot -p123456 -B pocket | xz > /data/backup/db_pocket_$(date +%Y%m%d_%H%M%S).sql.xz
主要针对这句进行一些补充。
参数–set-gtid-purged=off
这句话主要用来解决通过.sqsl文件导入数据时遇到的一个报错:
Error Code: 1840 - @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.
GTID即全局事务ID(global transaction identifier),GTID实际上是由UUID+TID组成的。其中UUID是一个MySQL实例的唯一标识。TID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增,所以GTID能够保证每个MySQL实例事务的执行(不会重复执行同一个事务,并且会补全没有执行的事务)。
引入GTID的意义是什么?
1)因为清楚了GTID的格式,所以通过UUID可以知道这个事务在哪个实例上提交的。
2)通过GTID可以极方便的进行复制结构上的故障转移,新主设置。
如果没有设置这个参数,在导出数据的时候也会看到一个warning:
Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don’t want to restore GTIDs, pass –set-gtid-purged=OFF. To make a complete dump, pass –all-databases –triggers –routines –events.
打开导出的.sql文件也能看到类似于下面的执行语句:
SET @@GLOBAL.GTID_PURGED='2c23345d3-8198-1218-a943-00183e100be8:1-1235979'
所以我们需要在导出数据时,mysqldump参数加上–set-gtid-purged=off。
导出后的压缩
linux中常用的压缩命令有以下几种:
- gzip
- bzip2
- zip
- xz
网上有很多人做过几种压缩的性能对比,这里直接说结果,压缩率来说:
xz>bzip2>gzip>zip
压缩率越高,耗时越长。
所以这里因为我们是做数据备份,如果数据量不是很大的情况,可以选择压缩率高一些的,因为耗时不会特别久。如果数据量特别大,那要根据耗时来选择合适的压缩命令了。
之后给脚本添加执行权限,设置crontab定时任务即可。
参考:
【MySQL】数据库定时备份及删除
MySQL5.6 新特性之GTID
mysql错误解决总结
解决@@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.
Linux下几种常见压缩方式测试对比
Linux下常用压缩 解压命令和压缩比率对比
Linux压缩工具的性能比较