不得不说,Docker的出现确实给开我们发者们带来了无比愉快的运维体验。
很多像我一样的懒人,现在都已经习惯“一切皆Docker”。甚至连数据库服务器,也会往Docker里面装。
当然,有人会提出反对意见,说Docker不如原生系统安装性能好。诚然,这一点他们说得是对的,但是如果在不太追求极致性能的场景下,这10%的性能损失,我认为还是值得的。因为在运维的人力成本上,大概率应该能够得到补偿。
不管如何,用不用Docker安装部署数据库,大家可以根据自己的实际场景先算一笔账,再做决定。我在这里既不黑也不吹。
今天,我想探讨的是,假如我们把数据库安装在Docker环境下。应当怎么去做数据库的备份呢?下面给大家分享一下我的做法。
一、安装
1、拉取Docker镜像
docker pull postgres:14.10
2、新建目录
主要用于保存持久化数据以及配置
## 数据目录
mkdir -p /var/docker/postgres/data
## 备份脚本及备份目录
mkdir -p /var/docker/postgres/backup/scripts
3、启动脚本
docker run -d --restart=always \
--name postgres-server \
-p 5432:5432 \
-e POSTGRES_PASSWORD=12345678 \
-v /var/docker/postgres/data:/var/lib/postgresql/data \
-v /var/docker/postgres/backup:/var/backup/pgsql:rw \
-v /etc/localtime:/etc/localtime:ro \
-d postgres:14.10
4、创建数据库
为了方便后续脚本测试,我们在此创建一个用户账号:testuser,然后在创建一个数据库:test_db。并将数据的owner指定为testuser。
## 进入docker容器
docker exec -it postgres-server bash
## 用户登录
psql -U postgres
## 创建新用户
create user testuser with password '123456';
## 创建数据库并指定用户
create database test_db with owner testuser;
## 列出数据库
\l
## 退出postgres客户端
\q
## 退出docker容器
exit
二、备份脚本
1、创建脚本
此脚本是在docker容器内部执行的,因此必须放在备份目录中。
touch /var/docker/postgres/backup/scripts/backup-testdb.sh
打开刚才所创建的脚本文件backup-testdb.sh
,写入以下内容:
# 备份数据库
backup_dir="/var/backup/pgsql"
backup_file="testdb_$(date +%Y%m%d%H%M%S).dump"
# 定义数据库名和登录信息
db_name="test_db"
db_owner="testuser"
db_user="postgres"
db_pass="12345678"
# 备份数据库
pg_dump --file $backup_dir/$backup_file --host 127.0.0.1 --port 5432 --username $db_user --dbname $db_name -c --role $db_owner --format=c --blobs --encoding "UTF8"
脚本中,我们使用到了postgres自带的pg_dump
工具。如果想了解里面的命令参数,请到postgres官方网站查阅,我在此不做赘述了。
2、执行备份脚本
docker exec -it postgres-server bash -c "bash /var/backup/pgsql/scripts/backup-testdb.sh"
注意:以上脚本路径是Docker容器内的路径,并非宿主系统的路径,请注意区分!
执行脚本后,生成的备份文件(*.dump),会出现在目录/var/docker/postgres/backup/
下。
三、定时备份
在Linux系统上,如果希望设置定时任务执行以上脚本做数据备份,使用crontab
服务应当是不二之选。
1、创建cron脚本
touch cron_script
打开文件cron_script
,写入以下内容:
45 5 * * * docker exec -it postgres-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