Docker环境下的数据库备份——PostgreSQL篇

时间:03/05/2024 12:38:42   作者:ChenReal    阅读:52

不得不说,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官方网站查阅,我在此不做赘述了。

https://www.postgresql.org/docs/current/app-pgdump.html

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

 

评论
0/200