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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章