当你需要升级PostgreSQL,有各种各样的方法,您可以使用。为了避免应用程序宕机,然后并不是所有的选择合适的升级postgres。当避免停机时间是至关重要的,那么你可以考虑使用复制的升级,并根据您的情况,您可以选择接近这个任务使用逻辑复制或物理(流)复制。在这里,我们看看逻辑和物理复制在PostgreSQL的区别。然后我们探索如何实现升级使用逻辑更详细地复制,并通过这样做,避免应用程序停机时间。在后续的文章中,我们将探讨物理复制。
我们已经讨论了几个方法来执行在我们之前的博文- PostgreSQL升级PostgreSQL升级使用pg_dumpall和使用pg_dump / pg_restore PostgreSQL升级——是我们的一部分PostgreSQL新版本升级或迁移遗留PostgreSQL系列。然而,这两种方法涉及到应用程序停机时间。
类型的逻辑复制
在这里,我们将讨论两种类型的复制可以实现:
- PostgreSQL 10和11版本之间的复制使用内置逻辑复制。
- PostgreSQL 9.4或(< PG 11)之间复制PostgreSQL 11使用一个扩展名为pglogical。
我们可能会选择实现复制的方法升级为应用程序最小化停机时间。一旦到目前为止的所有数据被复制到另一个PostgreSQL服务器最新版本,你可以简单的应用程序切换到新服务器与最小停机时间…当然这取决于应用程序的复杂性。
逻辑复制在PostgreSQL允许用户执行一个选择性复制几个表和打开一个备用写道。而物理复制在PostgreSQL块复制水平。在这种情况下,每个数据库的主复制到备用,备用并不是开放写道。展望未来,我们将参考物理复制流复制。
对于逻辑复制,启用备用可以复制从多个主人。这可能是有用的在你需要的情况下复制数据从多个PostgreSQL数据库(OLTP)到一个PostgreSQL服务器报告和数据仓库。
最大的优势之一的逻辑流复制是逻辑复制允许我们更改从一个旧版本复制PostgreSQL以后的版本。流复制作品只有当主和备用都相同的主版本。我们建议他们为最佳实践也同样小版本。
PostgreSQL 10和11版本之间的复制
从PostgreSQL 10、逻辑复制默认使用PostgreSQL源。所以,你可以很容易地复制10 PostgreSQL数据库PostgreSQL 11。逻辑复制使用发布和订阅模型。节点发送的变化成为一个出版商。和节点,成为订阅者订阅这些更改。你可能有一个或多个订阅刊物。
出版
出版是一组的变化产生的一组表。它被称为一个变更集或复制设置。出版物可以只包含表和不能包含任何其他对象。摘要在这些表可以被复制而不是ddl。
在出版物中,您可以选择什么类型的DML复制:插入或删除或更新或全部。默认情况下,这是所有。你必须有一个复制表上设置的身份发表复制更新和删除用户。一套副本的身份有助于识别行被更新或者删除。
一个表的主键是其默认副本的身份。你也可以让一个没有NULL值的惟一索引作为一个副本的身份。如果没有主键或惟一索引没有null,那么你可以设置replica_identity满。当一个副本的身份将完整、postgres使用整个行作为一个关键。当然,这可能是低效的。
你可能会看到错误如果表没有主键和一个非默认副本身份已被添加到一个更新或删除操作后出版。
订阅
用户可以订阅一个或多个出版物。添加订阅之前,您必须确保在用户创建了表被复制节点。为了达到这个目的,您可以执行模式从出版商转储到用户节点。
逻辑复制的一个例子
下面的示例步骤为PostgreSQL 10和11版本之间的逻辑复制工作。
在发布节点上,创建一个出版。您可以添加或选择所有表选择的表添加到出版。
|
1
2
3
4
5
|
- - -
为
添加
所有
表
在
数据库
创建
出版
percpub
为
所有
表
;
- - -
为
添加
选择
表
在
数据库
创建
出版
percpub
为
表
斯科特
.employee
斯科特
.departments
;
|
在用户节点上,创建一个订阅,指的是出版商节点上出版。执行表的DDL转储到用户节点创建订阅之前,正如上面提到的,
|
1
2
|
美元
pg_dump
- - - - - -
h
publisher_server_ip
- - - - - -
p
5432年
- - - - - -
d
雷竞技下载官网
- - - - - -
足球俱乐部
- - - - - -
年代
- - - - - -
U
postgres
|
pg_restore
- - - - - -
d
雷竞技下载官网
- - - - - -
h
subscriber_node_ip
- - - - - -
p
5432年
- - - - - -
U
postgres
创建
订阅
percsub
连接
“主机= publisher_server_ip dbname =雷竞技下载官网 percona用户= postgres密码=秘密端口= 5432 '
出版
percpub
;
|
上面的命令也复制已有的数据表。如果你想禁用已存在的数据的副本,您可以使用以下的语法。它只会开始更改复制到出版商在你运行这个命令。
|
1
|
创建
订阅
percsub
连接
“主机= publisher_server_ip dbname =雷竞技下载官网 percona用户= postgres密码= oracle端口= 5432 '
出版
percpub
与
(
copy_data
=
假
)
;
|
raybet雷竞技竞猜在线官网监控复制发布节点上使用下面的命令。
|
1
2
3
|
美元
psql
\
x
选择
*
从
pg_stat_replication
;
|
复制PostgreSQL 9.4和PostgreSQL 11之间
现在,PostgreSQL 10以上的版本呢?为此,有一个扩展名为pglogical适用于版本从9.4到11。使用pglogical,您可以很容易地复制PostgreSQL 9.4到PostgreSQL 11。
下面的一系列步骤演示了一个高级程序设置复制9.4 PG之间和PG 11使用pglogical扩展。
步骤1:认为pgserver_94是源服务器与数据库:percona_94 PostgreSQL 9.4上运行。雷竞技下载官网创建以下扩展。
|
1
2
3
4
|
(
pgserver_94
:
]
psql美元
- - - - - -
d
雷竞技下载官网percona_94
- - - - - -
c
“创建扩展pglogical_origin”
创建
扩展
(
pgserver_94
:
]
psql美元
- - - - - -
d
雷竞技下载官网percona_94
- - - - - -
c
“创建扩展pglogical”
创建
扩展
|
步骤2:现在,您可以继续添加选择的表或一个模式中的所有表或多个模式复制。在接下来的例子中,你可以看到一个错误当没有主键的表。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.
21
22
|
(
pgserver_94
:
]
psql美元
- - - - - -
d
雷竞技下载官网percona_94
psql
(
9.4.21
)
类型
“帮助”
为
帮助
。
雷竞技下载官网percona_94
=
#选择pglogical。create_node(node_name := 'provider1',dsn := 'host=192.168.0.24 port=5432 dbname=percona_94');
create_node
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
2976894835
(
1
行
)
雷竞技下载官网percona_94
=
#选择pglogical。复制_set_add_all_tables('default', ARRAY['public']);
错误
:
表
pgbench_history
不能
是
添加
来
复制
集
默认的
细节
:
表
做
不
有
主
关键
和
鉴于
复制
集
是
配置
来
复制
更新
和
/
或
删除
提示
:
添加
一个
主
关键
来
的
表
雷竞技下载官网percona_94
=
# ALTER TABLE pgbench_history添加主键(tid,援助,δ);
改变
表
雷竞技下载官网percona_94
=
#选择pglogical。复制_set_add_all_tables('default', ARRAY['public']);
replication_set_add_all_tables
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
t
(
1
行
)
|
步骤3
在用户节点上,这是我们11 PostgreSQL数据库,您可以运行类似的命令如下。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
(
pgserver_11
:
]
psql美元
- - - - - -
d
雷竞技下载官网percona_11
psql
(
11.2
)
类型
“帮助”
为
帮助
。
雷竞技下载官网percona_11
=
#选择pglogical。create_node(node_name := 'subscriber1',dsn := 'host=127.0.0.1 port=5432 dbname=percona_11 password=secret');
create_node
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
330520249
(
1
行
)
雷竞技下载官网percona_11
=
#选择pglogical。create_subscription(年代ubscription_name := 'subscription1',provider_dsn := 'host=192.168.0.24 port=5432 dbname=percona_94 password=secret');
create_subscription
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
1763399739
(
1
行
)
|
步骤4然后您可以验证复制状态通过查询几个表pglogical总是更新:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
雷竞技下载官网percona_11
=
#从pglogical.local_sync_status select *;
sync_kind
|
sync_subid
|
sync_nspname
|
sync_relname
|
sync_status
|
sync_statuslsn
- - -
- - -
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
f
|
1763399739
|
公共
|
pgbench_accounts
|
r
|
0
/
2 eb7d48
f
|
1763399739
|
公共
|
pgbench_history
|
r
|
0
/
2 eb7d48
f
|
1763399739
|
公共
|
pgbench_tellers
|
r
|
0
/
2 eb7d48
f
|
1763399739
|
公共
|
pgbench_branches
|
r
|
0
/
2 eb7d48
d
|
1763399739
|
|
|
r
|
0
/
0
(
5
行
)
雷竞技下载官网percona_11
=
#从pglogical.subscription select *;
sub_id
|
sub_name
|
sub_origin
|
sub_target
|
sub_origin_if
|
sub_target_if
|
sub_enabled
|
sub_slot_name
|
sub_rep
lication_sets
|
sub_forward_origins
|
sub_apply_delay
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
+
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - - - - -
1763399739
|
subscription1
|
2976894835
|
330520249
|
2402836775
|
2049915666
|
t
|
pgl_雷竞技下载官网percona_11_provider1_subscription1
|
{
默认的
,
defaul
t_insert_only
,
ddl_sql
}
|
{
所有
}
|
00
:
00
:
00
(
1
行
)
|
主键选择
在步骤2中,您看到了如何所有的表的模式:公共被添加到一个复制集通过创建一个主键的表,目前没有一个。我选的主键可能不是正确的表,因为它只是用于演示。然而,当你选择一个主键,确保你选择正确的。它需要总是独一无二的,使用列(s)通常不包含null。如果你不研究主键选择彻底,你应用程序可能导致停机。这里有一个例子你可以遇到的错误:
|
1
2
3
|
(
pgserver_94
:
]
pgbench美元
- - - - - -
c
10
- - - - - -
T
300年
- - - - - -
n
雷竞技下载官网percona_94
客户端
7
流产
在
状态
12
:
错误
:
重复的
关键
价值
违反了
独特的
约束
“pgbench_history_pkey”
细节
:
关键
(
tid
,
援助
,
δ
)
=
(
7
,
63268年
,
2491年
)
已经
存在
。
|
到目前为止,我们已经看到了如何使用pglogical创建复制一个旧版本到PostgreSQL更新版本。设置复制之后,您可以很容易地切换应用程序到最新版本较低的停机时间。






嗨
目前尚不清楚在percona_11 pglog雷竞技下载官网ical扩展看起来如何?
人们可能会认为你不需要安装它,因为有一个内置的逻辑复制。
这是一个伟大的谢尔盖。感谢你的阅读,建议。是的,我们需要在percona_11 pglogical扩展。雷竞技下载官网我们只有把高水平的文档不包括一个详细的安装/配置等过程。我肯定会把这一点补充道。
谢谢你的伟大的指导!在pglogical的情况下,我们如何知道当完成复制和提供者可以关闭吗?
嗨Avinash,费尔南多,Jobin Nickolay,
任何建议,我们需要得到描述寻找pglogical.local_sync_status的列和价值观;吗?
例子:列“sync_status”下,我们做得到不同值像‘r’,‘d’,或者‘我’。
同样,列“sync_kind”下,我们看到的价值观就像‘f’,‘d’或‘我’。