前面,我写了一篇文章,介绍了如何备份Docker环境下的PostgreSQL数据库。现在我将MySQL数据库相关的经验也一并介绍给大家吧。
虽然半年前,我就已经把我开发的所有应用的数据库,完成了从MySQL到PostgreSQL的迁移。但不能否认的是,MySQL仍是当今最受欢迎的开源数据之一,仍然有庞大的用户群体。我过往的一些经验,也许还能够帮助到大家。
同时,我在此特别向伟大的MySQL致敬。感谢她在过去的二十年里,陪伴着我一起奋斗一起成长。虽然因性能上原因我不得不抛弃她转投别的阵营。但在精神上,感情上,我们仍然是在一起的。
OK,一番“渣男宣言”讲完之后,我们直接进入正题。
一、安装
1、拉取Docker镜像
docker pull mysql:latest
2、新建目录
主要用于保存持久化数据及配置、日志等
## 数据目录
mkdir -p /var/docker/mysql/data
## 备份脚本及备份目录
mkdir -p /var/docker/mysql/backup/scripts
## 日志目录
mkdir -p /var/docker/mysql/logs
## 配置目录
mkdir -p /var/docker/mysql/conf
3、启动脚本
docker run -d --restart=always \
--name mysql-server \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=12345678 \
-v /var/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf:rw \
-v /var/docker/mysql/logs:/var/log/mysql:rw \
-v /var/docker/mysql/data:/var/lib/mysql:rw \
-v /var/docker/mysql/backup:/var/db-backup:rw \
-v /etc/localtime:/etc/localtime:ro \
-d mysql
4、创建数据库
为了方便后续脚本测试,我们在此创建一个用户账号:testuser,然后在创建一个数据库:test_db。
## 进入docker容器
docker exec -it mysql-server bash
## 用户登录
mysql -uroot -p12345678
## 创建新用户
CREATE USER 'testuser'@'%' IDENTIFIED WITH caching_sha2_password BY '123456';
## 授权
grant all privileges on *.* to 'testuser'@'%';
FLUSH PRIVILEGES;
## 创建数据库并指定用户
create database test_db;
## 列出数据库
show databases;
## 退出mysql客户端
quit
## 退出docker容器
exit
二、备份脚本
1、创建脚本
此脚本是在docker容器内部执行的,因此必须放在备份目录中。
touch /var/docker/mysql/backup/scripts/backup-testdb.sh
打开刚才所创建的脚本文件backup-testdb.sh
,写入以下内容:
# 备份数据库
backup_dir="/var/db-backup"
backup_file="testdb_$(date +%Y%m%d%H%M%S).dump"
# 定义数据库名和登录信息
db_name="test_db"
db_user="root"
db_pass="12345678"
# 备份数据库
/usr/bin/mysqldump -u$db_user -p$db_pass $db_name > $backup_dir/$backup_file
脚本中,我们使用到了mysql自带的mysqldump
工具。如果想了解里面的命令参数,请到mysql官方网站查阅,我在此不做赘述了。
2、执行备份脚本
docker exec -it mysql-server bash -c "bash /var/db-backup/scripts/backup-testdb.sh"
注意:以上脚本路径是Docker容器内的路径,并非宿主系统的路径,请注意区分!
执行脚本后,生成的备份文件(*.dump),会出现在目录/var/docker/mysql/backup/
下。
三、定时备份
在Linux系统上,如果希望设置定时任务执行以上脚本做数据备份,使用crontab
服务应当是不二之选。
1、创建cron脚本
touch cron_script
打开文件cron_script
,写入以下内容:
45 5 * * * docker exec -it mysql-server bash -c "bash /var/backup/pgsql/scripts/backup-testdb.sh"
以上cron表达式的意思是:每天的5点45分执行备份test_db
数据库的脚本。
2、cron脚本注入服务中
## 将cron脚本注入到crontab服务中
crontab cron_script
## 查看crontab计划列表
crontab -l
四、最后对比一下MySQL与PostgreSQL
- 空跑着的MySQL
- 拖着6个应用在跑的PostgreSQL
来一场PK吧,敲下命令:
docker stats
不解释了,请自己看图吧。。