>>> 注意事项 !!!
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;
Avatar photo

By bubua12

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注