清风明月-个人博客

🌳做一颗树吧,向下扎根、向上生长。

定时全量备份 mysql 数据库并压缩

当需要全量冷备份数据库的时候,我们一般手动使用图新界面工具如:navicat,或者手动执行mysqldump备份命令,虽然这样也可以但是没有自动周期化执行,要是忘记了备份的时候突然数据库出问题恢复数据可能就不够及时和完整。我们可以利用 linux 系统自带的定时任务工具cron定时调用mysqldump命令备份数据库sql 脚本,再利用 shell 脚本调用7zip( 7zip 是压缩率最高的,测试可以压缩到十分之一大小)把 sql 脚本文件压缩成压缩包并设置一个字符串作为压缩文件的密码,然后还可以定时清理以前的老压缩文件节省空间。

说明:所有操作是在Centos系统下运行的,其它 linux 发行版可能有命令的略微差别。

1.首先需要安装 7zip

 sudo yum install p7zip

安装完成后的 7zip 程序的命令是:7za, 可以使用:7za -version查看7zip的版本。

2.编写shell脚本:mysqlBkTask.sh 保存在用户abc的用户根目录下:/home/abc/mysqlBkTask.sh。

# 定时备份 mysql 数据库
#!/bin/bash

# 保存文件路径
file_path="/home/abc/"

# 获取当前年月日
current_date=$(date +%Y%m%d)

# 拼接掩码字符串:abc 并md5
result_string="${current_date}abc"
md5_value=$(echo -n "$result_string" | md5sum | awk '{print $1}')

echo "当前年月日: $current_date"
echo "MD5 值: $md5_value"

bak_date=`date +%Y%m%d`

# 进入到保存文件目录
cd ${file_path}

# 备份数据库mydatabase到sql脚本
mysqldump --single-transaction -uroot -S /var/lib/mysql/mysql.sock mydatabase > ${file_path}mysql_bak_mydatabase.${bak_date}.sql



# 打包压缩
zip7File=archives-${bak_date}.7z #文件名
zip7FilePath=${file_path}${zip7File} #文件路径+文件
7za a ${zip7File} -p$md5_value -mhe ${file_path}mysql_bak_mydatabase.${bak_date}.sql

#删除sql脚本源文件,只保留压缩包文件
rm ${file_path}mysql_bak_mydatabase.${bak_date}.sql

#删除旧的备份,只保留当前和 3 天以前的文件
find ${file_path} -name '*.7z' -mtime +3 | xargs rm -f

说明:需要注意我这里mysql数据本地 root 账号访问没有密码, mydatabase为需要备份的数据库名,如果要备份所有数据库把数据库名的地方改成参数:–all-databases

3.使用系统定时任务cron来定时执行我们的备份shell脚本:

前面的 mysqlBkTask.sh文件是我们需要定时执行的脚本,假如我们需要每天凌晨 4 点 15 分执行备份任务。输入crontab -e打开编辑定时任务,我们增加以下内容:

15 4 * * * /home/abc/mysqlBkTask.sh

然后按住ctrl+c后输入:wq 保存并退出。

也可以再输入: crontab -l查看任务列表,需要查看定时任务执行日志可以输入:tail -f /var/log/cron


Comments

Leave a Reply

Your email address will not be published. Required fields are marked *