前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL 冷备份操作 + shell 脚本自动备份

MySQL 冷备份操作 + shell 脚本自动备份

作者头像
泥豆芽儿 MT
发布2022-01-06 10:41:18
2.8K2
发布2022-01-06 10:41:18
举报

背景

  • 对于概念的说明不做赘述 个人觉得冷备份数据除了操作方法简单,最大的优点便是安全 为了对比,可参考前面整理的 —— 【MySQL 使用 XtraBackup 进行数据热备份指导 [全量+增量]】
  • 在此还是声明一下 个人觉得,冷备份也可以不在停机状态的 只要当下没有多少更新操作业务即可
  • 环境
代码语言:javascript
复制
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 服务(模拟冷备份环境) 执行如下命令:
代码语言:javascript
复制
cd /var/lib/mysql	# 进入上级目录
tar jcvf data_cold_back.tar.bz2 data/	# 打包压缩数据目录到文件 data_cold_back.tar.bz2

至此,已备份完毕,备份数据即在 "data_cold_back.tar.bz2" 文件中

【提示】:

代码语言:javascript
复制
touch cold_back.sh	# 创建执行脚本

tar jcvf data_cold_back.tar.bz2 data 当需要进行冷备份操作时, 只需执行脚本命令即可(操作会覆盖掉之前备份的压缩文件,没啥不利影响)

☞ tar 恢复/还原数据操作

  • 首先删除原来的 /var/lib/mysql/data,或者重命名一下
代码语言:javascript
复制
mv /var/lib/mysql/data /var/lib/mysql/data_back	# 为避免出错,重命名一下
tar jxvf data_cold_back.tar.bz2 data	# 解压冷备份数据到 data 目录
  • 然后,重启 mysql 服务,查看数据就是之前的备份
代码语言:javascript
复制
service mysql start # 普遍的 mysql 启动命令
systemctl start mysql@bootstrap.service # PXC 第一个节点的启动命令

▶▷ 总结

  • 首先 我的演示操作都是在目录 "/var/lib/mysql/" 下 所有生成的文件也在这里:

【题外话】

代码语言:javascript
复制
	   个人观点
	   这种方式的最终目的就是拷贝了数据库
	   如果像是使用 宝塔管理界面
	   完全可以直接压缩备份操作的
	   感觉,这个技术含量不如 —— 使用 XtraBackup 进行数据热备

Shell 脚本自动备份

不过,这种方式需要 MySQL 服务开启,不然无法备份数据

  • 个人觉得有点像热备份 但是,鄙人的理解是: 因为无法操作事务更新,不同于标准的热备份 可以理解为当下不对外提供数据更新操作 或者当前时间点离开集群

☞ 脚本配置

  • 首先创建脚本
代码语言:javascript
复制
touch backup.sh
  • 然后,编辑如下信息
代码语言:javascript
复制
#!/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
  • 然后,需要对脚本赋予权限
代码语言:javascript
复制
chmod -R 755 backup.sh
  • 在需要进行数据备份时,执行指令即可
代码语言:javascript
复制
./backup.sh
  • 我的打印信息如下: ( 可以到生成的备份文件目录中查看检验)
代码语言:javascript
复制
[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 都有一个时间段不提供服务,比如,可以设定在凌晨两点,进行自动备份数据

代码语言:javascript
复制
crontab -e
  • 添加计划任务 (每天凌晨两点进行备份操作)
代码语言:javascript
复制
00 02 * * * /var/lib/mysql/backup.sh
  • crontab 计划任务在添加或修改后,需要保存并重启服务才能生效
代码语言:javascript
复制
systemctl restart crond

▶▷ 总结

参考我的指令如下:

代码语言:javascript
复制
 mysql -uroot -p test_pxc < /var/lib/mysql/backup/2021-01-29/test_pxc-202101291229.sql

【题外话】

代码语言:javascript
复制
	   个人觉得
	   这种方式倒是挺适合本地测试或者小型项目
	   最简单的操作就是:
	   可以进行 .sql 文件的导出操作嘛
	   使用 Navicat 等数据库工具
	   就可以很方便的导出数据
	   并且
	   导出操作也较为方便 
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-01-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 冷备份/还原全部数据
    • ☞ tar 打包冷备份
      • ☞ tar 恢复/还原数据操作
        • ▶▷ 总结
        • Shell 脚本自动备份
          • ☞ 脚本配置
            • ☞ crontab 计划任务
              • ▶▷ 总结
              相关产品与服务
              云数据库 SQL Server
              腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档