背景
-
对于概念的说明不做赘述
个人觉得冷备份数据除了操作方法简单,最大的优点便是安全
为了对比,可参考前面整理的 ——【MySQL 使用 XtraBackup 进行数据热备份指导 [全量+增量]】
-
在此还是声明一下
个人觉得,冷备份也可以不在停机状态的
只要当下没有多少更新操作业务即可 -
环境
CentOS 7.9 MySQl5.7.32
冷备份/还原全部数据
这种方式,备份了整体的
MySQL 数据
,包含默认数据库"mysql、sys、infomation_schema、performance_schema"
☞ tar 打包冷备份
- 首先,要查询到数据存放目录
可以通过查看"my.cnf"
文件,找到参数:datadir
或者,执行 sql 语句:show variables like "%datadir%";
如下结果,则我的数据存放目录为:"/var/lib/mysql/data"
- 然后,关闭
mysql
服务(模拟冷备份环境)
执行如下命令:
cd /var/lib/mysql # 进入上级目录
tar jcvf data_cold_back.tar.bz2 data/ # 打包压缩数据目录到文件 data_cold_back.tar.bz2
至此,已备份完毕,备份数据即在
"data_cold_back.tar.bz2"
文件中
【提示】:
- 为了每次的备份操作方便,可以创建一个执行脚本,
并写入打包指令:touch cold_back.sh # 创建执行脚本
tar jcvf data_cold_back.tar.bz2 data
当需要进行冷备份操作时,chmod -R 755 cold_back.sh # 结予脚本权限
只需执行脚本命令即可(操作会覆盖掉之前备份的压缩文件,没啥不利影响)./cold_back.sh
☞ tar 恢复/还原数据操作
- 首先删除原来的
/var/lib/mysql/data
,或者重命名一下
mv /var/lib/mysql/data /var/lib/mysql/data_back # 为避免出错,重命名一下
tar jxvf data_cold_back.tar.bz2 data # 解压冷备份数据到 data 目录
- 然后,重启
mysql
服务,查看数据就是之前的备份
service mysql start # 普遍的 mysql 启动命令
systemctl start mysql@bootstrap.service # PXC 第一个节点的启动命令
▶▷ 总结
- 首先
我的演示操作都是在目录"/var/lib/mysql/"
下
所有生成的文件也在这里:
tar
压缩命令可以减少存储空间
待还原备份时,进行解压即可
但是要特别注意下,很可能报出这种错误: 【tar 解压缩文件报错: tar: 从成员名中删除开头的“/”解决方法】
【题外话】
个人观点
这种方式的最终目的就是拷贝了数据库
如果像是使用 宝塔管理界面
完全可以直接压缩备份操作的
感觉,这个技术含量不如 —— 使用 XtraBackup 进行数据热备
Shell 脚本自动备份
不过,这种方式需要
MySQL
服务开启,不然无法备份数据
- 个人觉得有点像热备份
但是,鄙人的理解是:
因为无法操作事务更新,不同于标准的热备份
可以理解为当下不对外提供数据更新操作
或者当前时间点离开集群
☞ 脚本配置
- 首先创建脚本
touch backup.sh
- 然后,编辑如下信息
#!/bin/bash
# 以下配置信息请自己修改
mysql_user="root" #MySQL备份用户
mysql_password="MT123456" #MySQL备份用户的密码
mysql_host="localhost"
mysql_port="3306"
mysql_charset="utf8" #MySQL编码
backup_db_arr=("test_pxc") #要备份的数据库名称,多个用空格分开隔开 如("db1" "db2" "db3")
backup_location=/var/lib/mysql/backup #备份数据存放位置,末尾请不要带"/",此项可以保持默认,程序会自动创建文件夹
expire_backup_delete="ON" #是否开启过期备份删除 ON为开启 OFF为关闭
expire_days=3 #过期时间天数 默认为三天,此项只有在expire_backup_delete开启时有效
# 本行开始以下不需要修改
backup_time=`date +%Y%m%d%H%M` #定义备份详细时间
backup_Ymd=`date +%Y-%m-%d` #定义备份目录中的年月日时间
backup_3ago=`date -d '3 days ago' +%Y-%m-%d` #3天之前的日期
backup_dir=$backup_location/$backup_Ymd #备份文件夹全路径
welcome_msg="Welcome to use MySQL backup tools!" #欢迎语
# 判断MYSQL是否启动,mysql没有启动则备份退出
mysql_ps=`ps -ef |grep mysql |wc -l`
mysql_listen=`netstat -an |grep LISTEN |grep $mysql_port|wc -l`
if [ [$mysql_ps == 0] -o [$mysql_listen == 0] ]; then
echo "ERROR:MySQL is not running! backup stop!"
exit
else
echo $welcome_msg
fi
# 连接到mysql数据库,无法连接则备份退出
mysql -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password <<end
use mysql;
select host,user from user where user='root' and host='localhost';
exit
end
flag=`echo $?`
if [ $flag != "0" ]; then
echo "ERROR:Can't connect mysql server! backup stop!"
exit
else
echo "MySQL connect ok! Please wait......"
# 判断有没有定义备份的数据库,如果定义则开始备份,否则退出备份
if [ "$backup_db_arr" != "" ];then
#dbnames=$(cut -d ',' -f1-5 $backup_database)
#echo "arr is (${backup_db_arr[@]})"
for dbname in ${backup_db_arr[@]}
do
echo "database $dbname backup start..."
`mkdir -p $backup_dir`
`mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password $dbname --skip_add_locks --skip-lock-tables --default-character-set=$mysql_charset | gzip > $backup_dir/$dbname-$backup_time.sql.gz`
flag=`echo $?`
if [ $flag == "0" ];then
echo "database $dbname success backup to $backup_dir/$dbname-$backup_time.sql.gz"
else
echo "database $dbname backup fail!"
fi
done
else
echo "ERROR:No database to backup! backup stop"
exit
fi
# 如果开启了删除过期备份,则进行删除操作
if [ "$expire_backup_delete" == "ON" -a "$backup_location" != "" ];then
#`find $backup_location/ -type d -o -type f -ctime +$expire_days -exec rm -rf {} \;`
`find $backup_location/ -type d -mtime +$expire_days | xargs rm -rf`
echo "Expired backup data delete complete!"
fi
echo "All database backup success! Thank you!"
exit
fi
- 然后,需要对脚本赋予权限
chmod -R 755 backup.sh
- 在需要进行数据备份时,执行指令即可
./backup.sh
- 我的打印信息如下:
( 可以到生成的备份文件目录中查看检验)
[root@localhost percona-xtradb-cluster.conf.d]# /var/lib/mysql/backup.sh
Welcome to use MySQL backup tools!
mysql: [Warning] Using a password on the command line interface can be insecure.
MySQL connect ok! Please wait......
database test_pxc backup start...
mysqldump: [Warning] Using a password on the command line interface can be insecure.
database test_pxc success backup to /var/lib/mysql/backup/2021-01-29/test_pxc-202101291158.sql.gz
Expired backup data delete complete!
All database backup success! Thank you!
【提示】:
-
如果是 PXC 集群很可能会报这种错误:
Percona-XtraDB-Cluster prohibits use of LOCK TABLE/FLUSH TABLE <table> WITH READ LOCK with pxc_strict_mode = ENFORCING
百度经验会发现,多数是类似这样的建议:【percona集群mysqldump导出数据库报错】
但是我测试是不管用的
我的做法比较简单,就是将 PXC 节点的配置参数pxc_strict_mode
修改一下
后期可以再改回去
☞ crontab
计划任务
像去哪网、12306 都有一个时间段不提供服务,比如,可以设定在凌晨两点,进行自动备份数据
crontab -e
- 添加计划任务
(每天凌晨两点进行备份操作)
00 02 * * * /var/lib/mysql/backup.sh
crontab
计划任务在添加或修改后,需要保存并重启服务才能生效
systemctl restart crond
▶▷ 总结
-
如果不够合理
还是需要自己做些优化的哦 -
对于后期数据的还原其实只要找到备份文件
解压缩得到一个sql
文件
执行指令语句即可mysql -u username -p [数据库名称] < [解压后的 .sql 文件]
参考我的指令如下:
mysql -uroot -p test_pxc < /var/lib/mysql/backup/2021-01-29/test_pxc-202101291229.sql
- 参考文章 —— 【CentOS MySQL 自动备份 shell 脚本】
【题外话】
个人觉得
这种方式倒是挺适合本地测试或者小型项目
最简单的操作就是:
可以进行 .sql 文件的导出操作嘛
使用 Navicat 等数据库工具
就可以很方便的导出数据
并且
导出操作也较为方便