主节点宕机数据,备库数据恢复
背 景
在从节点停止服务,然后往主库不断写入数据,然后把主机宕机掉,启动从库,把主库宕机期间的增量wal日志复制到从库的archive目录下, 执行恢复脚本,则会把主机宕机后的增量数据追加到数据库。
- 环境
服务器 | 角色 |
---|---|
10.10.56.16 | master |
10.10.56.18 | slave |
- 配置16 master 的 pg_hba,conf
文件
host all all 10.10.56.0/0 md5
host replication all 10.10.56.0/0 trust
"pg_hba.conf" 96L, 4652C
- 配置16 master的
postgresql.conf
listen_addresses = '*'
max_connections = 1000
wal_level = logical
archive_mode = on
archive_command = '/bin/true'
log_destination = 'csvlog'
logging_collector = on
log_filename = 'postgresql-%Y-%m-%d.log'
log_rotation_size = 20MB
log_statement = 'mod'
log_replication_commands = on
deadlock_timeout = 100ms
- 配置18 slave,初始化数据库从master pg_basebackup
/opt/pgsql-10/bin/pg_basebackup -h 10.10.56.16 -U repl -W -Fp -Pv -Xs -R -D /pgdata/10/poc/data/
- 配置18的
recovery.conf
,从归档目录恢复数据
#standby_mode = 'on'
#primary_conninfo = 'user=repl password=123456 host=10.10.56.16 port=5432 sslmode=disable sslcompression=1 target_session_attrs=any'
restore_command = 'cp /pgdata/10/archive/%f %p'
以上就实现了主从异步流复制
启动16查询 为 f 表示为 主库
pocdb=# select pg_is_in_recovery();
pg_is_in_recovery
-------------------
f
(1 row)
Time: 0.786 ms
pocdb=#
在16 创建用户 repl 、创建表、略
主库16正常时,p表数据为
pocdb=# select max(id) from p;
max
---------
3774121
(1 row)
- 从库18 p表数据
pocdb=# select max(id) from p;
max
---------
3774121
(1 row)
- 主库宕机前(16)
pocdb=# select max(id) from p;
max
---------
4005263
(1 row)
主库(16)宕机后,从库进行恢复后,数据已经追加:
postgres@clw-db3:/pgdata/10/poc/data> /opt/pgsql-10/bin/psql pocdb
psql (10.3)
Type "help" for help.
pocdb=# select max(id) from p;
max
---------
4005263
(1 row)