>>> 注意事项 !!!
1、数据库备份对正在运行的数据库服务会有影响,请选择合适的时间进行备份。
2、Linux 定制任务执行备份脚本,注意定时任务表达式及对应的操作系统。
3、备份文件存放目录建议单独隔离开,如:/data/mysqlbak 等单独的文件夹下。
4、恢复数据库时,慎重选择数据库。
1、单机版本MySQL
场景案例:项目中 MySQL 由 docker 部署在服务器上,备份文件存放同一台服务器。
由于已经有了 mysqldump 的前置环境,这里直接使用 docker exec 执行 mysql容器内部的 mysqldump 命令来实现数据库备份。
如在 /data/mysqlbak 文件下存放备份的 sql 文件,脚本在 /root 目录下(bak.sh)。
- 手动立刻执行备份:在 /root 目录下,执行
sh bak.sh
或./bak.sh
即立刻对数据库进行备份,备份的文件在 /data/mysqlbak 下 - 定时备份:如每周二周四晚上凌晨1点执行
1.1 打开 crontab 编辑器:crontab -e
1.2 添加以下定时任务,这里以脚本在
/root/bak.sh
下为例子0 1 * * 2,4 /root/bak.sh
以下提供备份脚本案例,可以根据实际 MySQL所在ip及密码,修改脚本。
#!/bin/bash
set -ex
source /etc/profile
# 设置mysql的登录用户名和密码(根据实际情况填写)
mysql_user="root"
mysql_password="mysql_sciyon123456!!"
mysql_host="192.168.1.23"
mysql_port="3306"
mysql_charset="utf8"
#备份文件存放地址(根据实际情况填写,需要放在单独的文件夹)
backup_location=/data/mysqlbak
#是否删除过期数据
expire_backup_delete="ON"
expire_days=7
backup_time=`date +%Y%m%d%H%M`
backup_dir=$backup_location
welcome_msg="Welcome to use MySQL backup tools!"
#备份指定数据库中数据(此处假设数据库是syncplant)
docker exec mysql mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -E -R --single-transaction syncplant > $backup_dir/64-mysql-$backup_time.sql
#删除过期数据
if [ "$expire_backup_delete" == "ON" -a "$backup_location" != "" ];then
`find $backup_location/ -type f -mtime +$expire_days | xargs rm -rf`
echo "Expired backup data delete complete!"
fi
2、备份服务器搭建
场景案例:如自动化运维部署的k8s集群,或重要数据的项目需要单独保存MySQL备份,单独部署一台1T磁盘容量的服务器,来对MySQL的重要数据进行备份。
2.1 离线部署Docker
演示对于 CentOS7 操作系统的无网条件下的 Docker 部署
(1)本地离线源
附件中的 repo.zip 放到 /data/repo
目录下,对应本地源的索引地址
cd /etc/yum.repos.d/
# 创建备份文件
mkdir bakup
mv Cent* bakup
# 创建本地repo源
cat > /etc/yum.repos.d/local.repo << EOF
[docker]
name=docker
baseurl=file:///data/repo
gpgcheck=0
enabled=1
EOF
# 建立缓存
yum makecache
(2)安装 docker
在本地源准备好之后,执行如下命令安装 docker
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
安装完成后,设置docker开机自启
systemctl enable docker --now
2.2 启动容器
docker load -i mysql837.tar
进入 MySQL 的 compose 配置文件中,使用附件提供的 docker compose 启动文件启动 MySQL
docker compose up -d
2.3 数据备份
2.3.1 编辑配置
文档提供的 MySQL 配置仅供参考,具体连接信息,数据库密码等配置需要依据实际现场情况来配置。
附件中脚本文件,实际操作请调整配置。
#!/bin/bash
set -ex
source /etc/profile
# 设置mysql的登录用户名和密码(根据实际情况填写)
mysql_user="root"
mysql_password="mysql_sciyon123456!!"
mysql_host="10.128.14.64"
mysql_port="3306"
mysql_charset="utf8mb4"
# 备份文件存放地址(根据实际情况填写)
backup_location=/data/mysqlbak
# 是否删除过期数据
expire_backup_delete="ON"
expire_days=7
backup_time=`date +%Y%m%d%H%M`
backup_dir=$backup_location
welcome_msg="Welcome to use MySQL backup tools!"
# 备份指定数据库中数据(此处假设数据库是mysql_backup_test)
docker exec mysql mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -E -R --single-transaction syncplant > $backup_dir/64-mysql-$backup_time.sql
# 删除过期数据
if [ "$expire_backup_delete" == "ON" -a "$backup_location" != "" ];then
`find $backup_location/ -type f -mtime +$expire_days | xargs rm -rf`
echo "Expired backup data delete complete!"
fi
备份的文件在指定的目录下,mysqldump 备份的数据文件 不包含 创建库的命令,可以使用参数指定包含。
上述为备份单个数据库的配置,如需一次备份所有数据库,可以按照如下案例操作:
#!/bin/bash
set -ex
source /etc/profile
# 设置mysql的登录用户名和密码(根据实际情况填写)
mysql_user="root"
mysql_password="mysql_sciyon123456!!"
mysql_host="10.128.14.64"
mysql_port="3306"
mysql_charset="utf8mb4"
#备份文件存放地址(根据实际情况填写,建议最好是单独文件夹)
backup_location=/data/mysqlbak
#是否删除过期数据
expire_backup_delete="ON"
expire_days=7
backup_time=`date +%Y%m%d%H%M`
backup_dir=$backup_location
welcome_msg="Welcome to use MySQL backup tools!"
#根据实际情况填写需要备份的数据库
databases="syncplant mobile datacenter srm xiaoke-doc"
for db in $databases; do
docker exec mysql mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -E -R --single-transaction $db > $backup_dir/64-mysql-$backup_time.sql
sleep 100s
done
#备份指定数据库中数据(此处假设数据库是syncplant)
docker exec mysql mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -E -R --single-transaction syncplant > $backup_dir/64-mysql-$backup_time.sql
# 删除过期数据
if [ "$expire_backup_delete" == "ON" -a "$backup_location" != "" ];then
`find $backup_location/ -type f -mtime +$expire_days | xargs rm -rf`
echo "Expired backup data delete complete!"
fi
## 2.2 执行备份
首先给 bak.sh 赋执行权限
```shell
chmod 777 bak.sh
对 MySQL 进行备份对数据库性能有影响,不建议在生产环境高峰期执行。
1、立刻备份(需要考虑实际生产):手动立刻执行脚本本 `/bak.sh`
2、定时任务
参考不同的操作系统,进行定时任务的编写,这里提供CentOS7操作系统的定时任务编写:
每周二周四晚上凌晨1点执行
1.1 打开 crontab 编辑器:
crontab -e
1.2 添加以下定时任务,这里以脚本在 `/data/bak.sh` 下为例子
0 1 * * 2,4 /data/bak.sh
保存退出即可。
2.3.2 还原数据
对于备份文件的恢复,进入mysql命令行后,选中需要恢复到的数据库,如新建一个test数据库,然后恢复数据到test
use test;
source /路径名/64-mysql-xxx.sql;