docker postgresql 备份

官方镜像的postgresql启动以下面的方式来启动:

docker run -it --rm -d --name postgres -e POSTGRES_PASSWORD=xxx -p 5432:5432 -v /data/postgresql/data:/var/lib/postgresql/data postgres:12

postgresql全备份通过pg_basebackup来执行,因为要通过postgres用户来执行,所以命令如下:

docker exec -it --user postgres postgres pg_basebackup  -F t -z -R -D /var/lib/postgresql/data/backup

但这个有个问题,pg_basebackup命令本身备份的就是/var/lib/postgresql/data这整个目录,所以备份文件不能放在这目录下面,我试过发现它会把部分备份的文件再备份进来。于是,我打算把备份目录放到其他地方,像下面这样:

docker exec -it --user postgres postgres pg_basebackup  -F t -z -R -D /var/lib/postgresql/backup

但/var/lib/postgresql/backup这个还得在启动的时候映射一下,不然就备份到容器里面了,宿主中看不到。于是启动命令改成下面这样:

docker run -it --rm -d --name postgres -e POSTGRES_PASSWORD=xxx -p 5432:5432 -v /data/postgresql/data:/var/lib/postgresql/data -v /data/postgresql/backup:/var/lib/postgresql/backup postgres:12

然而再次执行备份命令报错了:

[root@iZuf6542zl60b5kv3wehbyZ data]# docker exec -it --user postgres postgres pg_basebackup  -F t -z -R -D /var/lib/postgresql/backup
pg_basebackup: error: pg_basebackup: error: could not open write-ahead log file "000000010000016B000000A8": Permission denied

原因是/var/lib/postgresql/backup这个目录映射到宿主目录只有root用户有权限,而备份的时候用的是postgres这个用户,所以没有权限。可以进入容器,通过root用户给这个目录改变目录属主为postgres。

docker exec -it postgres bash
chown -R postgres:postgres /var/lib/postgresql/data/backup

这样是可以的,不过通常postgresql要除了主库,可能还要安装若干个从库,每次都去改太麻烦了。后面我自己制作了一个镜像,其实就是在官方镜像中的docker-entrypoint.sh中添加postgres用户对/var/lib/postgresql/backup的权限就可以了,这个文件中对/var/lib/postgresql/data做了修改,依葫芦画瓢对我的目录也修改下就可以了。有兴趣的可以到docker hub上搜我的镜像:wjf8882300/postgres:12

自定义镜像启动

docker run -it --rm -d --name postgres -e POSTGRES_PASSWORD=xxx -p 5432:5432 -v /data/postgresql/data:/var/lib/postgresql/data -v /data/postgresql/backup:/var/lib/postgresql/backup wjf8882300/postgres:12

直接备份,无需再到容器里面修改权限了

docker exec -it --user postgres postgres pg_basebackup  -F t -z -R -D /var/lib/postgresql/backup

备份结果,可以看到有文件生成

[root@iZuf6542zl60b5kv3wehbyZ backup]# ls
base.tar.gz  pg_wal.tar.gz
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章