linux环境下mysql热备份脚本

需求

  1. 定期全量备份
  2. 备份文件周期性滚动覆盖.

备份脚本

以下备份脚本参考自csdn博主"三七有脾气"

  1. 创建脚本
vim mysql_backup.sh
  1. 粘贴脚本代码, 注意需要替换数据库及备份路径
#!/bin/bash
#完成数据库的定时备份
#备份的路径 需要提前建好
BACKUP=/mnt/backup/db
#当前的时间作为文件名
DATETIME=$(date +%Y_%m_%d_%H%M%S)
#可以输出变量调试
#echo ${DATETIME}
echo "==========开始备份==========="
echo "备份的路径是 $BACKUP/$DATETIME.tar.gz"

#主机
HOST=localhost
#用户名
DB_USER=root
#密码
DB_PWD=root
#备份数据库名
DATABASE=test_database
#创建备份的路径
#如果备份的路径文件夹存在就使用,否则创建
[ ! -d "$BACKUP/$DATETIME"  ]  && mkdir -p "$BACKUP/$DATETIME" 
#执行mysql的备份数据库的指令
mysqldump -u${DB_USER} -p${DB_PWD} --host=$HOST  $DATABASE | gzip  > $BACKUP/$DATETIME/$DATETIME.sql.gz
#打包备份文件
cd $BACKUP
tar -zcvf  $DATETIME.tar.gz  $DATETIME
#删除临时目录
rm -rf  $BACKUP/$DATETIME

#删除10天前的备份文件(-exec rm -rf {} \是固定写法,删除查询出来的数据)
find $BACKUP -mtime +10 -name  "*.tar.gz" -exec rm -rf {} \;
echo "==========备份完成==========="

3.完成后 立即执行, 查看是否生成备份文件

./mysql_backup.sh

定期执行

crontab -e
# 例如每天2:30执行,具体用法可以搜索cron表达式生成器
30 2 * * * /mnt/mysql_backup.sh

数据恢复

# 创建新库
mysql -u root -p -e "create database database_name";
# 将数据恢复到新库中
mysql -u root -p database_name < database_name.sql

常见问题及解决方式

执行mysql_backup.sh时提示"权限不足"

将文件权限改为777 执行 chmod 777 /mnt/mysql_backup.sh

mysqldump 命令找不到

原因: mysql指令未添加全局变量.

# 既然属于mysql的bin目录下面,那我们可以把此目录配置环境变量中,再次执行命令也可以
vim /etc/profile

# 添加mysql的环境变量 (路径需要换成您的安装路径)
export MYSQL_HOME=/usr/local/mysql
export PATH=.:${MYSQL_HOME}/bin:$PATH

# 刷新环境变量
source /etc/profile

# 再执行此命令后即可。

定时任务不生效

测试直接执行脚本是否可以正常生成备份文件. 如果正常通过, 原因可能有以下几方面

  1. linux时间不对. - 修改为正确时间即可
  2. cron表达式有误. - 从cron在线生成器中重新生成表达式.
  3. 路径填写有误 - crontab中需要填写全路径.
  4. crontab 服务未启动 - service crond start

参考资料

  • shell脚本部分参考自:csdn博主:三七有脾气
  • crontab定时任务不生效参考自: 简书文章 公子小白123

拓展

冷备份和热备份

冷备:

直接copy数据库文件称为冷备份,适用大型数据库. 优点就是快, 缺点是 受限于数据库版本, 需要停机.

热备:

备份的生成建表、建库、插入等操作所执行SQL语句,适用于中小型数据库,效率相对较低。 优点就是不用停机,也不影响读写操作 ,缺点就是性能一般

温备:

备份不影响读取操作,但是影响写入操作

具体可以参考知乎-mysql的备份与恢复

你可能感兴趣的:(mysql,linux,mysql,运维)