PostgreSQL HOT-Standby 的主备切换

--1 环境信息
Postgresql 版本: Postgresql 9.1beta3
OS : Red Hat Enterprise Linux Server release 5.5
硬件环境 : 笔记本上的两台虚拟机
主库 IP : 192.168.1.25
主库 PORT : 1921
备库 IP : 192.168.1.26
备库 PORT : 1921

--2 如何区别主库和备库
有时在论坛上会有人问,如何区分主库和备库,这里提供两种方法

--2.1 方法一,根据主机进程判断
[postgres@pg1 pg_root]$ ps -ef | grep "wal"
postgres 17715 17684 0 20:41 ? 00:00:00 postgres: wal writer process
postgres 17746 17684 0 20:43 ? 00:00:00 postgres: wal sender process repuser 192.168.1.26(43246) streaming 0/700178A8
postgres 17819 17590 0 21:00 pts/2 00:00:00 grep wal

备注:这里显示了wal 日志发送进程"wal sender process",说明是主库。

[postgres@pgb pg_xlog]$ ps -ef | grep wal
postgres 29436 29386 0 20:43 ? 00:00:00 postgres: wal receiver process streaming 0/700178A8
postgres 29460 29289 0 21:00 pts/3 00:00:00 grep wal

备注:这里显示了 wal 日志接收进程 "wal receiver process" ,说明是备库;

--2.2 方法二,根据 pg_controldata 输出
pg_controldata 输出数据库服务的当前状态,可以根据 "Database cluster state: " 的信息来判断,
如果值为 "in production" 说明是主库,如果值为 "in archive recovery" 说明是备库。

主库的 pg_controldata 输出
[postgres@pg1 pg_root]$ pg_controldata
pg_control version number: 903
Catalog version number: 201105231
Database system identifier: 5640897481082175487
Database cluster state: in production
...

备库的 pg_controldata 输出
[postgres@pgb pg_xlog]$ pg_controldata
pg_control version number: 903
Catalog version number: 201105231
Database system identifier: 5640897481082175487
Database cluster state: in archive recovery
...


--3 recovery.conf 文件介绍
recovery.conf 是一个配置文件,用于主库,备库切换时的参数配置,可以从 $PGHOME/share 目录下
复制一份 recovery.conf.sample 到备库 $PGDATA 目录,里面有众多参数,这里只介绍用于切换时的
关键参数

standby_mode = '' --标记PG为STANDBY SERVER
primary_conninfo = '' --标识主库信息
trigger_file = '' --标识触发器文件

主备切换
--4.1 创建备库recovery.conf 文件( On Slave )
cp $PGHOME/share/recovery.conf.sample $PGDATA/recovery.conf

配置以下参数
standby_mode = 'on' --标记PG为STANDBY SERVER
primary_conninfo = 'host=192.168.1.25 port=1921 user=repuser ' --标识主库信息
trigger_file = '/opt/pgdata/pg_root/postgresql.trigger.1921' --标识触发器文件


--4.2 关闭主库(on Primary)
[postgres@pg1 pg_root]$ pg_ctl stop -m fast -D $PGDATA
waiting for server to shut down....... done
server stopped


--4.3 激活备库到主库状态 ( on slave )
激活备库只要创建一个文件即可,根据备库 recovery.conf 配置文件的参数 trigger_file 值,
创建这个 trigger 文件即可。 例如 "touch /opt/pgdata/pg_root/postgresql.trigger.1921 "

[postgres@pgb pg_root]$ touch /opt/pgdata/pg_root/postgresql.trigger.1921

过一会儿发现 recovery.conf 文件变成 recovery.done ,说明备库已经激活。

[postgres@pgb pg_root]$ ll
total 176K
-rw------- 1 postgres postgres 168 Aug 24 10:24 backup_label.old
drwx------ 5 postgres postgres 4.0K Aug 15 10:03 base
drwx------ 2 postgres postgres 4.0K Aug 24 20:50 global
drwx------ 2 postgres postgres 4.0K Aug 15 10:03 pg_clog
-rw------- 1 postgres postgres 4.5K Aug 24 10:39 pg_hba.conf
-rw------- 1 postgres postgres 1.6K Aug 15 10:03 pg_ident.conf
drwx------ 4 postgres postgres 4.0K Aug 15 10:03 pg_multixact
drwx------ 2 postgres postgres 4.0K Aug 24 20:42 pg_notify
drwx------ 2 postgres postgres 4.0K Aug 15 10:03 pg_serial
drwx------ 2 postgres postgres 4.0K Aug 15 10:03 pg_stat_tmp
drwx------ 2 postgres postgres 4.0K Aug 15 10:03 pg_subtrans
drwx------ 2 postgres postgres 4.0K Aug 21 20:21 pg_tblspc
drwx------ 2 postgres postgres 4.0K Aug 15 10:03 pg_twophase
-rw------- 1 postgres postgres 4 Aug 15 10:03 PG_VERSION
drwx------ 3 postgres postgres 4.0K Aug 24 21:20 pg_xlog
-rw------- 1 postgres postgres 19K Aug 24 10:24 postgresql.conf
-rw------- 1 postgres postgres 51 Aug 24 20:42 postmaster.opts
-rw------- 1 postgres postgres 69 Aug 24 20:42 postmaster.pid
-rw-r--r-- 1 postgres postgres 4.7K Aug 24 20:42 recovery.conf


--查看从库CSV日志(正在激活成主库)
2011-08-24 21:20:55.130 CST,29388,4e54f1c5.72cc,11,2011-08-24 20:42:45 CST,1/0,LOG,00000,"selected new timeline ID: 6",""
2011-08-24 21:20:58.119 CST,12,"archive recovery complete",""
2011-08-24 21:20:58.495 CST,29386,4e54f1c3.72ca,5,2011-08-24 20:42:43 CST,"database system is ready to accept connections",""

说明从库已经为OPEN状态,可以进行读写操作。

--4.4 激活原来的主库,让其转变成从库 (在原来的主库上执行)
--创建 $PGDATA/recovery.conf 文件,配置以下参数
recovery_target_timeline = 'latest'
standby_mode = 'on' --标记PG为STANDBY SERVER
primary_conninfo = 'host=192.168.1.26 port=1921 user=repuser ' --标识主库信息
trigger_file = '/opt/pgdata/pg_root/postgresql.trigger.1921' --标识触发器文件

--创建密码文件 /home/postgres/.pgpass 密码文件,输入以下内容
192.168.1.26:1921:replication:repuser:rep123us345er

--修改 pg_hba.conf (现在的主库上增加),添加以下配置
host replication repuser 192.168.1.25/32 md5

--将原来的主库(现在的从库)启动
[postgres@pg1 pg_root]$ pg_ctl start -D $PGDATA
server starting

--查看从库日志, 发现大量 FATAL 错误信息
2011-08-24 21:31:59.178 CST,17889,4e54fd4f.45e1,1,2011-08-24 21:31:59 CST,FATAL,XX000,"timeline 6 of the primary does not match recovery target timeline 5",""
2011-08-24 21:32:04.208 CST,17891,4e54fd54.45e3,2011-08-24 21:32:04 CST,""
2011-08-24 21:32:09.135 CST,17892,4e54fd59.45e4,2011-08-24 21:32:09 CST,""
2011-08-24 21:32:14.136 CST,17895,4e54fd5e.45e7,2011-08-24 21:32:14 CST,""

备注:出现了大量 FATAL,"timeline 6 of the primary does not match recovery target timeline 5
估计是时间线有问题,网上查了下资料也没啥结果,后来咨询了下德哥,只要将从库 $PGDATA/pg_xlog
一个文件考过来就行。

--将主库文件 00000006.history 复制到从库
[postgres@pgb pg_xlog]$ scp 00000006.history postgres@192.168.1.25:/opt/pgdata/pg_root/pg_xlog
postgres@192.168.1.25's password:
00000006.history

--再次查看从库日志
2011-08-24 21:36:04.819 CST,17948,4e54fe44.461c,2011-08-24 21:36:04 CST,""
2011-08-24 21:36:09.742 CST,17885,4e54fd44.45dd,2011-08-24 21:31:48 CST,"new target timeline is 6",""
2011-08-24 21:36:09.824 CST,17977,4e54fe49.4639,2011-08-24 21:36:09 CST,"streaming replication successfully connected to primary",""

备注:根据日志信息,说明从库已经恢复正常;

--4.5 测试
主库上创建一张表
postgres=# \c skytf skytf
You are Now connected to database "skytf" as user "skytf".
skytf=> \d
List of relations
Schema | Name | Type | Owner
--------+--------------------+-------+----------
public | pg_stat_statements | view | postgres
skytf | pgbench_accounts | table | skytf
skytf | pgbench_branches | table | skytf
skytf | pgbench_history | table | skytf
skytf | pgbench_tellers | table | skytf
skytf | test_stadnby | table | skytf
(16 rows)

skytf=> create table test_11 (id integer,name varchar(32));
CREATE TABLE

skytf=> \d
List of relations
Schema | Name | Type | Owner
--------+--------------------+-------+----------
public | pg_stat_statements | view | postgres
skytf | pgbench_accounts | table | skytf
skytf | pgbench_branches | table | skytf
skytf | pgbench_history | table | skytf
skytf | pgbench_tellers | table | skytf
skytf | test_11 | table | skytf
skytf | test_stadnby | table | skytf
(17 rows)

从库上查询
[postgres@pgb pg_root]$ psql
psql (9.1beta3)
Type "help" for help.

postgres=# \c skytf skytf
skytf=> \d
List of relations
Schema | Name | Type | Owner
--------+--------------------+-------+----------
public | pg_stat_statements | view | postgres
skytf | pgbench_accounts | table | skytf
skytf | pgbench_branches | table | skytf
skytf | pgbench_history | table | skytf
skytf | pgbench_tellers | table | skytf
skytf | test_11 | table | skytf
skytf | test_stadnby | table | skytf

备注:可见表 test_11 迅速从主库上同步过来了,到此为止,库切换完成。


--5 总结: 1 Hot-Standby 切换步骤比较多,有些配置可以提前做好的,例如 .pgpass,pg_hba.conf 等; 2 主,备切换时,务必先将主库关闭,否则一旦从库被激活时,而主库尚未关闭,会有问题; 3 主,备切换可作为生产库迁移的一种方式,因为这最大限度减少了业务停机时间。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果是个PostGreSQL的数据,于是装数据库,但这个也不懂呀,而且本系统用的Oracle,于是得解决迁移转换的问题。 总结下来两个思路。1、PostgresToOracle多金的
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么查看PostgreSQL数据库中所有表”文章能帮助大...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正确。  pg_hba.conf文件在Postgre安装文件目录下的data文件夹中。解决方案1、进入到data目录下,找到pg_hba.conf文件
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本地localhost访问正常,在相同网段的远程机器访问报如下错误
wamp 环境 这个提示就是说你的版本低于10了。 先打印php_info(),查看自己的版本(我这边是已经处理后的,之前的忘记截图了)
psycopg2.OperationalError: SSL SYSCALL error: EOF detected 问题提示:exception psycopg2.OperationalError
项目 postgres 连接不上, 所有连接报错 :psql: FATAL: sorry, too many clients already问题原由程序使用连接未及时释放, 连接一直处于 idle 状态处理方式1、 程序里面未释放的连接, 在使用后及时释放
服务器在同一个数据目录上启动了两个PostgreSQL实例(它已经删除postmaster.pid并使用了新的端口号,因此绕过了这种行为的正常保护措施被绕过),导致PostgreSQL的误操作postgresql 报错 FATAL: the database system is
问题原因:数据库崩溃,内存不足造成 或者 数据已损坏,磁盘故障造成首先介绍一下背景,在测试Deepgreen(Greenplum升级版)数据库时,pgbench并发数设置过多,导致数据库卡死了,在进行连接、重启、关闭时,都报同样
第 11 届 PostgreSQL 中国技术大会于 2022 年 1 月 7 日至 9 日在武汉光谷会展酒店成功举办。作为 PostgreSQL 技术领域的年度盛事,postgreSQL 中文社区旨在搭建开放、合作共享的平台,基于开源,创新驱动,共同探讨数据库行业数字化发展方向和未来新机遇。
即将到来的 PostgreSQL 15 已经确认会增加 MERGE 语句,MERGE 可以在单个语句中实现 INSERT、UPDATE 以及 DELETE 操作。在此之前,我们可以使用 INSERT … ON CONFLICT DO …. 语句代替该功能。
本文介绍了PostgreSQL 访问和操作 MySQL 数据库的外部数据包装器:mysql_fdw。mysql_fdw 提供了读写 MySQL 外部表、连接池、WHERE 条件下推、返回字段下推、预编译语句、JOIN 下推、聚合函数(min、max、sum、avg、count)下推、ORDER BY 下推以及 LIMIT OFFSET 下推等功能。
本文给大家分享了一些 PostgreSQL 实用小技巧。
PostgreSQL 全球开发组于 2021-05-20 发布了 PostgreSQL 14 的第一个 beta 版本。本文介绍了该版本中的主要新特性和增强功能,包括性能、新的 multirange 类型、SQL 语句、管理、复制和恢复、安全以及其他方面。
本文介绍了 PostgreSQL 横向子查询(LATERAL)的语法的作用。SELECT 就像一个循环语句,而 LATERAL 就像是一个嵌套循环语句,对于左侧表中的每行记录执行一次子查询操作。
PostgreSQL 15 增加了大量符合 SQL/JSON 标准的函数,使得 JSON 数据的处理更加简单。
PostgreSQL 支持多个不同级别的灵活加密技术,包括密码加密、字段加密、存储加密、传输加密、认证加密以及应用加密,可以保护数据不因数据库服务器被盗、内部管理员或者不安全的网络传输而导致泄露。
目录1.编译incubator-datasketches-cpp编译datasketches-cpp项目编译datasketches-cpp项目的PythonWrapperforDatasketches2.编译incubator-datasketches-postgresql3.Verifyinginstallationofdatasketches-postgresqlwithatestdatabase4.AdvancedExamplesofdata
连接pg需要指定以下的参数:·主机地址·端口·数据库名·用户·密码 如果没有指定上面的参数的话,pg会从环境变量中寻找以下的变量值:·PGHOST或PGHOSTADDR·PGPORT·PGDATABASE·PGUSER·PGPASSWORD 如果只是指定了前面四个参数,pg会尝试寻找口令文件。
pg库也是常用的数据库之一,有些刚开始接触开发的老师可能不熟,这里简单介绍一下,总体使用方法和mysql类似,所以这里只讲配置方法。这个地方test1是数据库1,test2是数据库2,yml文件一定要主要好格式,建议用properties。MyBaitsSqlSessionFactory配置文件。不同数据源的dao层要放到对应文件夹下。TimedConfig配置文件。文件夹格式,这里直接放贴图。Bd3Config配置文件。下面是数据源的配置文件。