docker postgresql 备份

    技术2022-07-10  142

    官方镜像的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
    Processed: 0.008, SQL: 9