postgresql主从备份_postgresql 主从复制并切换

本文详细介绍了在Kylin环境下,如何设置PostgreSQL的主从备份及故障切换。首先,通过yum安装并配置主库,然后进行基础备份创建备库,调整备库参数并创建恢复文件。在验证主从同步后,进行了数据测试和故障切换操作,确保主从数据一致性。同时,文中还展示了如何处理从库变为新主库后旧主库的恢复策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 环境

192.168.19.145 Kylin 3.3 mysqlhq  9.5.2  psql_master

192.168.19.227 Kylin 3.3 mysql3    9.5.2  psql_standby

postgres=# select version();

version

-------------------------------------------------------------------------------------------------------------

PostgreSQL 9.5.2 on x86_64-kylin-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-11), 64-bit

prot=5432

2 yum 安装pgsql

[root@mysqlhq ~]# yum list | grep postgresql

[root@mysqlhq ~]# yum install postgresql-server postgresql-contrib

[root@mysqlhq ~]# service postgresql initdb

[root@mysqlhq ~]# systemctl start postgresql

[root@mysqlhq ~]# systemctl status postgresql

[root@mysqlhq ~]# netstat -lnt|grep 5432

tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN

[root@mysqlhq ~]# ps -ef|grep postgres

[root@mysqlhq ~]# su - postgres

-bash-4.2$ psql

psql (9.5.2)

Type "help" for help.

3 修改主库的配置文件

#default 路径///var/lib/pgsql/data

[root@mysqlhq ~]# cd /var/lib/pgsql/data/

[root@mysqlhq data]# cp postgresql.conf postgresql.conf.bk20181213

[root@mysqlhq data]# vim postgresql.conf

listen_addresses = ‘*‘

max_connections = 1000

wal_level = hot_standby

#synchronous_commit = on(同步复制,-- 实时,如果需要异步改为off)

checkpoint_timeout = 5min

archive_mode = on

archive_command = ‘/bin/date‘

max_wal_senders = 2

wal_keep_segments = 16

hot_standby = on

max_standby_archive_delay = 300s

max_standby_streaming_delay = 30s

wal_receiver_status_interval = 1s

hot_standby_feedback = on

wal_receiver_timeout = 60s

-bash-4.2$ cat /var/lib/pgsql/data/pg_hba.conf | grep -v ‘^#‘ | grep -v ‘^$‘

local all all peer

host all all 127.0.0.1/32 trust

host all all 10.15.7.115/32 trust

host all all 192.168.19.145/32 md5

host all all ::1/128 ident

host replication repuser 192.168.19.227/32 md5

[root@mysqlhq data]# su - postgres

Last login: Tue Dec 11 16:34:47 CST 2018 on pts/3

-bash-4.2$ psql

psql (9.5.2)

Type "help" for help.

postgres=# create role repuser login replication encrypted password ‘pgreplication‘;

CREATE ROLE

-bash-4.2$ /usr/bin/pg_ctl stop

waiting for server to shut down.... done

server stopped

-bash-4.2$ /usr/bin/pg_ctl start

server starting

-bash-4.2$ netstat -lnt|grep 5432

tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN

tcp6 0 0 :::5432 :::* LISTEN

查看日志

tail -f -n 100 /var/lib/pgsql/data/pg_log/postgresql-Thu.log

从库配置

1 基础备份

从库安装完成后,不初始化,若已经初始化,删除其data目录

[root@mysql3 pgsql]# rm -rf data/

[root@mysql3 pgsql]# /usr/bin/pg_basebackup -D /var/lib/pgsql/data -F p -X stream -R -v -P -h 192.168.19.145 -p 5432 -U repuser

口令:

事务日志起始于时间点: 0/7000028, 基于时间表1

pg_basebackup: 启动后台 WAL 接收进程

73823/73876 kB (100%), 2/2 表空间

pg_basebackup: 无法得到来自服务器的事务日志终止位置: ERROR: could not open file "./postgresql.conf.bk20181213": Permission denied

删除文件./postgresql.conf.bk20181213,这些配置文件的备份需要放在非data目录

-R 备份后对文件recovery.conf进行写操作

删除数据目录,重新pg_basebackup

[root@mysql3 pgdata]# /usr/bin/pg_basebackup -D /var/lib/pgsql/data -F p -X stream -R -v -P -h 192.168.19.145 -p 5432 -U repuser

口令:

事务日志起始于时间点: 0/9000028, 基于时间表1

pg_basebackup: 启动后台 WAL 接收进程

73859/73859 kB (100%), 2/2 表空间

transaction log end point: 0/90000F8

pg_basebackup: 等待后台进程结束流操作...

pg_basebackup: base backup completed

2 配置备库参数postgresql.conf

[root@mysql3 data]# vim postgresql.conf

#在基础备份时,初始化文件是从主库复制来的,所以配置文件一致,注释掉

wal_level,

max_wal_senders

wal_keep_segments等参数

打开如下参数:

hot_standby = on   #在备份的同时允许查询

max_standby_streaming_delay = 30s#可选,流复制最大延迟

wal_receiver_status_interval = 10s#可选,从向主报告状态的最大间隔时间

hot_standby_feedback = on#可选,查询冲突时向主反馈

max_connections = 1000#默认参数,非主从配置相关参数,表示到数据库的连接数,一般从库做主要的读服务时,设置值需要高于主库

3 创建恢复文件recovery.conf

yum安装的pg,所以在pg_basebackup的时候加上-R参数,生成recovery.conf

[root@mysql3 data]# cat recovery.conf

standby_mode = ‘on‘ #指明从库身份

primary_conninfo = ‘user=repuser password=pgreplication host=192.168.19.145 port=5432 sslmode=prefer sslcompression=1 krbsrvname=postgres‘ #连接到主库信息

[root@mysql3 data]# vim recovery.conf

recovery_target_timeline = ‘latest‘ #同步到最新数据

#trigger_file = ‘/postgres/data/trigger_activestandby‘

指定触发文件,文件存在时,将触发从库提升为主库,前提是必须设置”standby_mode = on”;如果不设置此参数,也可采用”pg_ctl promote“触发从库切换成主库

chown -R postgres:postgres /var/lib/pgsql/data

chown -R postgres:postgres /usr/local/pgdata

[root@mysql3 data]# /usr/bin/pg_ctl start

pg_ctl: 无法以 root 用户运行

请以服务器进程所属用户 (非特权用户) 登录 (或使用 "su")

[root@mysql3 data]# su - postgres

上一次登录:四 12月 13 18:01:23 CST 2018pts/1 上

-bash-4.2$ /usr/bin/pg_ctl start

正在启动服务器进程

-bash-4.2$ LOG: redirecting log output to logging collector process

HINT: Future log output will appear in directory "pg_log".

4 验证主从

1 主库进程 sender

-bash-4.2$ ps -ef|grep postgres

postgres 4087 26671 0 09:44 ? 00:00:00 postgres: wal sender process repuser 192.168.19.227(55336) streaming 0/D000140

postgres 4093 24928 31 09:45 pts/3 00:00:00 ps -ef

postgres 4094 24928 7 09:45 pts/3 00:00:00 grep --color=auto postgres

root 24927 30012 0 Dec13 pts/3 00:00:00 su - postgres

postgres 24928 24927 0 Dec13 pts/3 00:00:00 -bash

postgres 26671 1 0 Dec13 pts/3 00:00:04 /usr/bin/postgres

postgres 26672 26671 0 Dec13 ? 00:00:00 postgres: logger process

postgres 26674 26671 0 Dec13 ? 00:00:02 postgres: checkpointer process

postgres 26675 26671 0 Dec13 ? 00:00:00 postgres: writer process

postgres 26676 26671 0 Dec13 ? 00:00:01 postgres: wal writer process

postgres 26677 26671 0 Dec13 ? 00:00:04 postgres: autovacuum launcher process

postgres 26678 26671 0 Dec13 ? 00:00:00 postgres: archiver process last was 00000001000000000000000C

postgres 26679 26671 0 Dec13 ? 00:00:05 postgres: stats collector process

2 验证从库 recovering

-bash-4.2$ ps -ef|grep postgres

root 32525 9758 0 09:44 pts/1 00:00:00 su - postgres

postgres 32526 32525 0 09:44 pts/1 00:00:00 -bash

postgres 32563 1 0 09:44 pts/1 00:00:00 /usr/bin/postgres

postgres 32564 32563 0 09:44 ? 00:00:00 postgres: logger process

postgres 32565 32563 0 09:44 ? 00:00:00 postgres: startup process recovering 00000001000000000000000D

postgres 32566 32563 0 09:44 ? 00:00:00 postgres: checkpointer process

postgres 32567 32563 0 09:44 ? 00:00:00 postgres: writer process

postgres 32568 32563 0 09:44 ? 00:00:00 postgres: stats collector process

postgres 32569 32563 0 09:44 ? 00:00:00 postgres: wal receiver process streaming 0/D000140

postgres 32586 32526 0 09:46 pts/1 00:00:00 ps -ef

postgres 32587 32526 0 09:46 pts/1 00:00:00 grep --color=auto postgres

3 sql查询主从状态

-bash-4.2$ psql

psql (9.5.2)

Type "help" for help.

postgres=# select * from pg_stat_replication;

pid | usesysid | usename | application_name | client_addr | client_hostname | client_port | backend_start | backend_xmin | state | sent_location | write_location | flush_location | replay

_location | sync_priority | sync_state

------+----------+---------+------------------+----------------+-----------------+-------------+-------------------------------+--------------+-----------+---------------+----------------+----------------+-------

----------+---------------+------------

4087 | 25404 | repuser | walreceiver | 192.168.19.227 | | 55336 | 2018-12-14 09:44:45.165618+08 | 2103 | streaming | 0/D000140 | 0/D000140 | 0/D000140 | 0/D000

140 | 0 | async

(1 row)

select pg_is_in_recovery();

4 主从数据测试

主库 192.168.19.145

postgres-# \c yhq1

yhq1=# CREATE TABLE yhq22(id integer not null,date TIMESTAMP NOT NULL DEFAULT LOCALTIMESTAMP(0));

CREATE TABLE

yhq1=# INSERT INTO yhq22 (id) VALUES (1);

INSERT 0 1

yhq1=# INSERT INTO yhq22 (id) VALUES (1);

INSERT 0 1

yhq1=# INSERT INTO yhq22 (id) VALUES (1);

INSERT 0 1

yhq1=# commit;

WARNING: there is no transaction in progress

COMMIT

yhq1=# select * from yhq22;

id | date

----+---------------------

1 | 2018-12-14 09:52:51

1 | 2018-12-14 09:52:53

1 | 2018-12-14 09:52:53

(3 rows)

从库

postgres=# \c yhq1

您现在已经连接到数据库 "yhq1",用户 "postgres".

yhq1=# \d

关联列表

架构模式 | 名称 | 类型 | 拥有者

----------+-------+--------+----------

public | yhq | 数据表 | postgres

public | yhq22 | 数据表 | postgres

(2 行记录)

yhq1=# select * from yhq22;

id | date

----+---------------------

1 | 2018-12-14 09:52:51

1 | 2018-12-14 09:52:53

1 | 2018-12-14 09:52:53

(3 行记录)

yhq1=# INSERT INTO yhq22 (id) VALUES (2);

ERROR: cannot execute INSERT in a read-only transaction

5命令查看主从状态

主 192.168.19.145

-bash-4.2$ pg_controldata /var/lib/pgsql/data/

pg_control version number: 942

Catalog version number: 201510051

Database system identifier: 6606088538881141528

Database cluster state: in production

pg_control last modified: Fri 14 Dec 2018 10:33:14 AM CST

Latest checkpoint location: 0/D017540

Prior checkpoint location: 0/D017460

Latest checkpoint‘s REDO location: 0/D017508

Latest checkpoint‘s REDO WAL file: 00000001000000000000000D

Latest checkpoint‘s TimeLineID: 1

Latest checkpoint‘s PrevTimeLineID: 1

Latest checkpoint‘s full_page_writes: on

Latest checkpoint‘s NextXID: 0/2107

Latest checkpoint‘s NextOID: 33597

Latest checkpoint‘s NextMultiXactId: 1

Latest checkpoint‘s NextMultiOffset: 0

Latest checkpoint‘s oldestXID: 1823

Latest checkpoint‘s oldestXID‘s DB: 1

Latest checkpoint‘s oldestActiveXID: 2107

Latest checkpoint‘s oldestMultiXid: 1

Latest checkpoint‘s oldestMulti‘s DB: 24598

Latest checkpoint‘s oldestCommitTsXid:0

Latest checkpoint‘s newestCommitTsXid:0

Time of latest checkpoint: Fri 14 Dec 2018 10:33:14 AM CST

从 192.168.19.227

-bash-4.2$ pg_controldata /var/lib/pgsql/data/

pg_control 版本: 942

Catalog 版本: 201510051

数据库系统标识符: 6606088538881141528

数据库簇状态: 正在归档恢复

pg_control 最后修改: 2018年12月14日 星期五 10时34分46秒

最新检查点位置: 0/D017540

优先检查点位置: 0/D017460

最新检查点的 REDO 位置: 0/D017508

最新检查点的重做日志文件: 00000001000000000000000D

最新检查点的 TimeLineID: 1

最新检查点的PrevTimeLineID: 1

最新检查点的full_page_writes: 开启

最新检查点的 NextXID: 0/2107

最新检查点的 NextOID: 33597

最新检查点的NextMultiXactId: 1

最新检查点的NextMultiOffsetD: 0

最新检查点的oldestXID: 1823

最新检查点的oldestXID所在的数据库:1

最新检查点检查oldestActiveXID: 2107

最新检查点检查oldestMultiXid: 1

最新检查点的oldestMulti所在的数据库:24598

Latest checkpoint‘s oldestCommitTsXid:0

Latest checkpoint‘s newestCommitTsXid:0

最新检查点的时间: 2018年12月14日 星期五 10时33分14秒

不带日志的关系: 0/1使用虚假的LSN计数器

6 主从切换

主 192.168.19.145

-bash-4.2$ pg_ctl stop

waiting for server to shut down...... done

server stopped

-bash-4.2$ pg_controldata /var/lib/pgsql/data/

pg_control version number: 942

Catalog version number: 201510051

Database system identifier: 6606088538881141528

Database cluster state: shut down

pg_control last modified: Fri 14 Dec 2018 10:38:54 AM CST

Latest checkpoint location: 0/E000028

Prior checkpoint location: 0/D017620

Latest checkpoint‘s REDO location: 0/E000028

从 192.168.19.227

从库日志

-bash-4.2$ tail -n 100 /var/lib/pgsql/data/pg_log/postgresql-Fri.log

LOG: database system is ready to accept read only connections

LOG: started streaming WAL from primary at 0/D000000 on timeline 1

ERROR: syntax error at or near "select" at character 35

STATEMENT: INSERT INTO yhq22 (id) VALUES (2)

select * from yhq22;

LOG: replication terminated by primary server

DETAIL: End of WAL reached on timeline 1 at 0/E000098.

FATAL: could not send end-of-streaming message to primary: no COPY in progress

LOG: invalid record length at 0/E000098

FATAL: could not connect to the primary server: could not connect to server: Connection refused

Is the server running on host "192.168.19.145" and accepting

TCP/IP connections on port 5432?

.....

LOG: received promote request

LOG: redo done at 0/E000028

LOG: last completed transaction was at log time 2018-12-14 09:52:53.356998+08

LOG: selected new timeline ID: 2

LOG: archive recovery complete

LOG: MultiXact member wraparound protections are now enabled

LOG: database system is ready to accept connections

LOG: autovacuum launcher started

-bash-4.2$ pg_ctl promote

服务器重新加载中

-bash-4.2$ pg_controldata /var/lib/pgsql/data/

pg_control 版本: 942

Catalog 版本: 201510051

数据库系统标识符: 6606088538881141528

数据库簇状态: 在运行中

pg_control 最后修改: 2018年12月14日 星期五 10时40分21秒

最新检查点位置: 0/E000100

优先检查点位置: 0/E000028

最新检查点的 REDO 位置: 0/E0000C8

最新检查点的重做日志文件: 00000002000000000000000E

从库正常读写

yhq1=# INSERT INTO yhq22 (id) VALUES (2);

INSERT 0 1

yhq1=# select * from yhq22;

id | date

----+---------------------

1 | 2018-12-14 09:52:51

1 | 2018-12-14 09:52:53

1 | 2018-12-14 09:52:53

2 | 2018-12-14 10:41:04

从库的文件 变成recovery.conf

-rw-r--r-- 1 postgres postgres 195 12月 14 09:41 recovery.done

原主库操作(恢复原主库为从库)

1 重新搭建新主从 ?

2 增量搭建

这时候原从库已经写入了很多其他数据

yhq1=# select count(*) from yhq22;

count

-------

8

测试1

从 192.168.19.145

新建文件recovery.conf 并修改文件postgresql.conf

-bash-4.2$ vim recovery.conf

standby_mode = ‘on‘

primary_conninfo = ‘user=repuser password=pgreplication host=192.168.19.227 port=5432 sslmode=prefer sslcompression=1 krbsrvname=postgres‘

recovery_target_timeline = ‘latest‘

-bash-4.2$ vim postgresql.conf

#max_wal_senders

#wal_keep_segments

-bash-4.2$ /usr/bin/pg_ctl start

server starting

-bash-4.2$ LOG: redirecting log output to logging collector process

HINT: Future log output will appear in directory "pg_log".

从 192.168.19.145

-bash-4.2$ pg_controldata /var/lib/pgsql/data/

pg_control version number: 942

Catalog version number: 201510051

Database system identifier: 6606088538881141528

Database cluster state: in archive recovery

pg_control last modified: Fri 14 Dec 2018 11:31:48 AM CST

Latest checkpoint location: 0/E000028

Prior checkpoint location: 0/E000028

Latest checkpoint‘s REDO location: 0/E000028

Latest checkpoint‘s REDO WAL file: 00000001000000000000000E

Latest checkpoint‘s TimeLineID: 1

Latest checkpoint‘s PrevTimeLineID: 1

Latest checkpoint‘s full_page_writes: on

Latest checkpoint‘s NextXID: 0/2107

主 192.168.19.227

-bash-4.2$ pg_controldata /var/lib/pgsql/data/

pg_control 版本: 942

Catalog 版本: 201510051

数据库系统标识符: 6606088538881141528

数据库簇状态: 在运行中

pg_control 最后修改: 2018年12月14日 星期五 11时30分22秒

最新检查点位置: 0/E000E00

优先检查点位置: 0/E000D20

最新检查点的 REDO 位置: 0/E000DC8

最新检查点的重做日志文件: 00000002000000000000000E

最新检查点的 TimeLineID: 2

最新检查点的PrevTimeLineID: 2

最新检查点的full_page_writes: 开启

最新检查点的 NextXID: 0/2112

yhq1=# select * from pg_stat_replication;

pid | usesysid | usename | application_name | client_addr | client_hostname | client_port | backend_start | backend_xmin | state | sent_location | write_location | flush_location | replay_location | sync_priorit

y | sync_state

-----+----------+---------+------------------+-------------+-----------------+-------------+---------------+--------------+-------+---------------+----------------+----------------+-----------------+-------------

--+------------

(0 行记录)

新从--是没有新增加的数据的

postgres=# \c yhq1

You are now connected to database "yhq1" as user "postgres".

yhq1=# select *from yhq22;

id | date

----+---------------------

1 | 2018-12-14 09:52:51

1 | 2018-12-14 09:52:53

1 | 2018-12-14 09:52:53

yhq1=# select * from pg_stat_replication;

pid | usesysid | usename | application_name | client_addr | client_hostname | client_port | backend_start | backend_xmin | state | sent_location | write_location | flush_location | replay_location | sync_priorit

y | sync_state

-----+----------+---------+------------------+-------------+-----------------+-------------+---------------+--------------+-------+---------------+----------------+----------------+-----------------+-------------

--+------------

-bash-4.2$ tail -n 100 /var/lib/pgsql/data/pg_log/postgresql-Fri.log

FATAL: could not connect to the primary server: FATAL: no pg_hba.conf entry for replication connection from host "192.168.19.145", user "repuser", SSL off

FATAL: could not connect to the primary server: FATAL: no pg_hba.conf entry for replication connection from host "192.168.19.145", user "repuser", SSL off

主 192.168.19.227

-bash-4.2$ vim pg_hba.conf

host replication repuser 192.168.19.145/32 md5

-bash-4.2$/usr/bin/pg_ctl reload

yhq1=# select * from pg_stat_replication;

pid | usesysid | usename | application_name | client_addr | client_hostname | client_port | backend_start | backend_xmin | state | sent_location | write_location | flush_location | replay

_location | sync_priority | sync_state

------+----------+---------+------------------+----------------+-----------------+-------------+-------------------------------+--------------+-----------+---------------+----------------+----------------+-------

----------+---------------+------------

2061 | 25404 | repuser | walreceiver | 192.168.19.145 | | 52776 | 2018-12-14 11:40:34.130154+08 | 2112 | streaming | 0/E001068 | 0/E001068 | 0/E001068 | 0/E001

068 | 0 | async

(1 行记录)

新从 192.168.19.145

数据同步

yhq1=# select *from yhq22;

id | date

----+---------------------

1 | 2018-12-14 09:52:51

1 | 2018-12-14 09:52:53

1 | 2018-12-14 09:52:53

2 | 2018-12-14 10:41:04

2 | 2018-12-14 11:24:06

2 | 2018-12-14 11:24:07

2 | 2018-12-14 11:24:07

2 | 2018-12-14 11:24:08

(8 rows)

-bash-4.2$ tail -n 100 /var/lib/pgsql/data/pg_log/postgresql-Fri.log

LOG: fetching timeline history file for timeline 2 from primary server

LOG: started streaming WAL from primary at 0/E000000 on timeline 1

LOG: replication terminated by primary server

DETAIL: End of WAL reached on timeline 1 at 0/E000098.

LOG: new target timeline is 2

LOG: restarted WAL streaming at 0/E000000 on timeline 2

LOG: redo starts at 0/E000098

-bash-4.2$ ps -ef|grep postgres

root 4627 13226 0 10:37 pts/2 00:00:00 su - postgres

postgres 4628 4627 0 10:37 pts/2 00:00:00 -bash

postgres 4806 1 0 11:31 pts/3 00:00:01 /usr/bin/postgres

postgres 4807 4806 0 11:31 ? 00:00:00 postgres: logger process

postgres 4808 4806 0 11:31 ? 00:00:00 postgres: startup process recovering 00000002000000000000000E

postgres 4809 4806 0 11:31 ? 00:00:00 postgres: checkpointer process

postgres 4810 4806 0 11:31 ? 00:00:00 postgres: writer process

postgres 4811 4806 0 11:31 ? 00:00:00 postgres: stats collector process

postgres 4861 24928 0 11:35 pts/3 00:00:00 psql

postgres 4864 4806 0 11:35 ? 00:00:00 postgres: postgres yhq1 [local] idle

postgres 4940 4806 0 11:40 ? 00:00:04 postgres: wal receiver process streaming 0/E002E40

postgres 5117 4628 0 14:31 pts/2 00:00:00 ps -ef

postgres 5118 4628 0 14:31 pts/2 00:00:00 grep --color=auto postgres

root 24927 30012 0 Dec13 pts/3 00:00:00 su - postgres

postgres 24928 24927 0 Dec13 pts/3 00:00:00 -bash

yhq1=# show synchronous_commit ;

synchronous_commit

--------------------

on

(1 row)

yhq1=# select txid_current_snapshot(); #返回主库记录点、备库记录点;主库每增加一条写入,记录点的值就会加1

txid_current_snapshot

-----------------------

2117:2117:

(1 行记录)

yhq1=# select txid_current_snapshot();

txid_current_snapshot

-----------------------

2117:2117:

(1 row)

查看备库落后主库多少个字节的wal日志

yhq1=# select pg_xlog_location_diff(pg_current_xlog_location(),replay_location) from pg_stat_replication;

pg_xlog_location_diff

-----------------------

(0 rows)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值