在我这里 postgres 数据库,是通过docker 跑的,所有很对个节点。
我来看导出SQL的命令:
pg_dumpall -f backup.sql
我们通过 docker exec 进入到数据库的容器中,执行上面的命令就可以备份数据库了。
docker exec -u postgres -w /var/lib/postgresql/data xxx_postgres_1 pg_dumpall -f backup.sql
然后将备份的 SQL 从容器中复制出来就可以。
docker cp xxx_postgres_1:/var/lib/postgresql/data/backup.sql backup.sql
我们 postgres 服务用docker跑了多个节点,所以需要利用bash来批量备份。
#!/usr/bin/env bash
ROOT=$(cd "$(dirname "$0")" || exit; pwd)
BACKUP_PATH=${ROOT}/backup/$(date +"%Y-%m-%d")
mkdir -p ${BACKUP_PATH}
NOW=$(date +"%H.%M")
dump_postgres () {
CONTAINER=$1
echo "Dump ${CONTAINER}"
SQL_FILE=${BACKUP_PATH}/${CONTAINER}-${NOW}.sql
docker exec -u postgres -w /var/lib/postgresql/data ${CONTAINER} pg_dumpall -f backup.sql
docker cp ${CONTAINER}:/var/lib/postgresql/data/backup.sql ${SQL_FILE}
gzip ${SQL_FILE}
}
docker ps | grep postgres | awk '{print $NF}' | while read CONTAINER; do
dump_postgres ${CONTAINER}
done
建了一个日期的目录,将要备份的SQL文件放到里面。
考虑到我们一天可能备份很多次,所以文件名记一个时间。
我们写成一个 dump_postgres
的函数, 这个函数导出postgres
数据并复制到备份目录下面,然后压缩。
我们用 docker ps
查看正在运行的 Container,然后用 grep postgres
过滤出 postgres 数据库的 Container, 再用 awk '{print $NF}'
输出最后一列 Container 名称, 最后 while read CONTAINER
读出来,然后执行 dump_postgres ${CONTAINER}
。
通过这个脚本,我们就可以一次导出所有 postgres 的数据,将其备份起来。
网友评论