docker搭建postgresql 14主从库 及使用shell脚本备份数据库

docker搭建postgresql 14主从库 及使用shell脚本备份数据库

1、地址规划

IP地址名称备注
192.168.1.11pg1主库
192.168.1.21pg2从库

2、安装部署主库

[root@cn01 ~]# mkdir -p /data/postgressql/data
[root@cn01 ~]# docker run --name pgtest --restart=always -v /data/postgressql/data/:/var/lib/postgresql/data -e POSTGRES_PASSWORD=123456 -p 5432:5432 -d postgres:latest
97fb21c9e700842e131269907f88e17ca274794e9410d702ef9da9fbf89c140e
[root@cn01 data]# docker exec -it pgtest /bin/bash   #进入到容器	
root@97fb21c9e700:/# su postgres                     #进入到postgres用户下
postgres@97fb21c9e700:/$ psql
psql (14.2 (Debian 14.2-1.pgdg110+1))
Type "help" for help.

postgres=# CREATE ROLE replica login replication encrypted password 'replica'; #创建用户
CREATE ROLE
postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of 
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 replica   | Replication                                                | {}
postgres=# \
postgres@97fb21c9e700:/$ exit
exit

#修改postgresql配置文件
[root@cn01 data]# vim postgresql.conf
listen_addresses = '*'
archive_mode = on
archive_command = '/bin/date'
max_connections = 100 
max_wal_senders = 32
wal_sender_timeout = 60s
wal_keep_size = 16
wal_level = replica

3、安装部署从库

[root@cn21 ~]# docker run --name pgtest --restart=always -v /data/postgressql/data/:/var/lib/postgresql/data -e POSTGRES_PASSWORD=123456 -p 5432:5432 -d postgres:latest
6cd25ae30181b20bf70d7a2b2a813b724dc972a6bef09c2d7ec5186a6ebf3363
[root@cn21 ~]# docker exec -it pgtest /bin/bash
root@6cd25ae30181:/# rm -rf /var/lib/postgresql/data/* #此时可能会退出容器,只需要重新登入进去即可
[root@cn21 ~]# docker exec -it pgtest /bin/bash
root@6cd25ae30181:/# pg_basebackup -R -D /var/lib/postgresql/data -P -h 192.168.10.11 -p 5432 -U replica
26288/26288 kB (100%), 1/1 tablespace
[root@cn21 ~]# docker restart pgtest
pgtest
[root@cn21 ~]# cat /data/postgressql/data/postgresql.auto.conf 
# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
primary_conninfo = 'user=replica passfile=''/root/.pgpass'' channel_binding=prefer host=192.168.10.11 port=5432 sslmode=prefer sslcompression=0 sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=prefer krbsrvname=postgres target_session_attrs=any'


4、查看进程

[root@cn01 ~]# ps -ef|grep postgres
polkitd   13707  13678  0 15:11 ?        00:00:00 postgres
polkitd   13767  13707  0 15:11 ?        00:00:00 postgres: checkpointer
polkitd   13768  13707  0 15:11 ?        00:00:00 postgres: background writer
polkitd   13769  13707  0 15:11 ?        00:00:00 postgres: walwriter
polkitd   13770  13707  0 15:11 ?        00:00:00 postgres: autovacuum launcher
polkitd   13772  13707  0 15:11 ?        00:00:00 postgres: stats collector
polkitd   13773  13707  0 15:11 ?        00:00:00 postgres: logical replication launcher
polkitd   18562  13707  0 15:13 ?        00:00:00 postgres: walsender replica 192.168.10.21(57954) streaming 0/4000060                                #
root      22923  13304  0 15:15 pts/0    00:00:00 grep --color=auto postgres

[root@cn21 ~]# docker ps |grep postgres  #查看从数据库
6cd25ae30181        postgres:latest     "docker-entrypoint..."   11 minutes ago      Up About a minute   0.0.0.0:5432->5432/tcp   pgtest

5、测试同步

postgres=# create database test12; #主机
CREATE DATABASE
postgres=# \list
                                 List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges   
-----------+----------+----------+------------+------------+-----------------------
 postgres  | postgres | UTF8     | en_US.utf8 | en_US.utf8 | 
 template0 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
 test      | postgres | UTF8     | en_US.utf8 | en_US.utf8 | 
 test12    | postgres | UTF8     | en_US.utf8 | en_US.utf8 | 
(5 rows)

postgres=# \list   #从机查看已经同步
                                 List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges   
-----------+----------+----------+------------+------------+-----------------------
 postgres  | postgres | UTF8     | en_US.utf8 | en_US.utf8 | 
 template0 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
 test      | postgres | UTF8     | en_US.utf8 | en_US.utf8 | 
 test12    | postgres | UTF8     | en_US.utf8 | en_US.utf8 | 
(5 rows)

6、shell脚本定期备份postgresql数据库

#!/bin/bash
folder=/backup/pgdatabackup
if [ ! -d folder ];then
mkdir -p "$folder"
fi
cd $folder
day=`date +%Y%m%d%M`
FILENAME=$day.backup
mkdir -p "$day"
#cd $day
host=192.168.10.21
user=postgres
password=123456
db=test
docker exec -i pgtest /bin/bash -c 'PASSWORD='$password' /usr/bin/pg_dump -Fc -p 5432 -U '$user' -d '$db'>/home/'$FILENAME''
docker cp 'pgtest:/home/'$FILENAME'' ''$folder'/'$FILENAME''
docker exec -i pgtest /bin/bash -c 'rm -rf /home/'$FILENAME''

7、shell脚本定时任务

crontab -e
*/1 * * * * /test/pgbackup.sh       #每一分钟执行一次
*/10 * * * * /test/pgbackup.sh      #每十分钟执行一次
0 */1 * * * /test/pgbackup.sh       #每一个小时执行一次
30 1 * * * /test/pgbackup.sh        #每天1:30分执行一次
0 23-7/2,8 * * * /test/pgbackup.sh #晚上11点到早上7点每两个小时执行一次,早上八点执行一次
0 11 4 * 1-3 /test/pgbackup.sh      #每个月的4号和每周的周一、周三的11时
22 4 * * 0 /test/pgbackup.sh        #每周日凌晨4:22执行
42 4 1 * * /test/pgbackup.sh        #每月1日4:42分执行一次
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值