小象主人的福音——PG数据库到RDS PG数据库全库在线迁移操作指导

网友投稿 836 2022-05-30

据“新花社”最新报道:自MySQL被Oracle收购以后,Postgresql数据库正在成为开源关系型数据库中的一匹黑马,发展势头绝对不可小觑。

相信眼光独到的你一定也已经开始驾驭这头“小象”,并且你一定遇到了接踵而至的一系列头疼问题:如何管理这头“小象”日常的吃、喝、拉、撒、睡?

第一个好消息来了:华为云正在给我们这些“小象”主人们带来福音:华为云RDS服务已经上架了Postgresql!!!从此,我家的“小象”终于可以有一个安全又放心的保姆。这个保姆会帮你解决日常而重要的数据备份、数据安全、多地域存放……等等头疼的问题,而你则可以更加专注于自身业务的开发。

那么,心动的你,一定想知道:“我怎样把我的‘小象’放心地托付给华为云,中间不出任何闪失呢?”

这便是第二个好消息:华为云现在支持将您的PG数据库全库!!,在线!!迁移至华为云RDS PG数据库!!!:

那么,下面开始介绍如何将您的PG数据库迁移至华为云:

首先,做一个体检,看看您的“小象”是否满足如下约束:(下述On-premise PG数据库即指您的数据库)

1、  On-premise PG数据库与RDS PG实例版本需要兼容;

2、  On-premise PG数据库与RDS实例之间可以互相访问;

3、  On-premise PG数据库支持主备复制模式,即配置文件满足以下配置:

wal_level = hot_standby

hot_standby = on

max_wal_senders >= 1

wal_keep_segments >= 32(该值要足够用于保存备份过程中产生的所有xlog,否则会出现备机无法同步日志,导致创建备机启动失败)

如若符合,那么恭喜您!接下来按照如下操作,您就可以放心地将您的“小象”托付给我们了。

首先需要做一些准备工作,保证您的PG数据库满足以下前提条件:

提供主备复制账号rdsRepl,用户创建参考:

2、提供On-premise PG数据库超级用户及其密码,用于恢复RDS PG管理配置。

还有一点要注意:

该迁移方案仅描述了使用默认表空间的情况,如果用到非默认表空间,需要手动在RDS PG实例上建立对应的表空间目录。

接下来,是正式操作步骤:

创建RDS PG HA实例,参考《RDS用户指南》2.2.2章节——购买创建RDS PostgreSQL实例。

登录RDS dataStore节点停止迁移目标RDS PG实例的监控:

1)停止监控:

其中,实例名称分别为RDS PG HA实例的主备实例。

2)获取管理账户信息:

以上密码信息分别对应:rdsAdmin、rdsBackup、rdsRepl、rdsMetric,用于后续恢复使用。

1、 分别登录主、备实例,停止实例Haagent监控:

cd /rds/mgntAgent/v1.6.0

python monitorSwitch.py

回车后,根据需要输入以下参数之一:

{"action":"off","level":"instance"}

然后,继续回车,出现以下提示则表示执行成功:

[result]success

其中1.6.0为引擎管理版本号,根据所用引擎管理版本决定

2、 备份RDS PG HA实例的主备实例的配置文件:

su Ruby

主:

cp /var/chroot/var/lib/pgsql/9.5/data/recovery.done /home/Ruby/

cp /var/chroot/var/lib/pgsql/9.5/data/postgresql.conf /home/Ruby/

cp /var/chroot/var/lib/pgsql/9.5/data/pg_hba.conf /home/Ruby/

备:

cp /var/chroot/var/lib/pgsql/9.5/data/recovery.conf /home/Ruby/

cp /var/chroot/var/lib/pgsql/9.5/data/postgresql.conf /home/Ruby/

cp /var/chroot/var/lib/pgsql/9.5/data/pg_hba.conf /home/Ruby/

其中9.5为版本号,可能取值为9.5,9.6,根据所用PG数据库版本号决定

3、 分别登录RDS PG HA实例的主备实例,执行以下命令停止数据库服务:

service postgresql-9.5 stop

出现以下提示,说明操作成功:

Stopping postgresql-9.5 service: [  OK  ]

其中9.5为版本号,可能取值为9.5,9.6,根据所用PG数据库版本号决定

4、 登录RDS PG HA主实例,根据on-premise PG创建on-premise PG备库。

1)切换到Ruby用户:

su Ruby

2)删除RDS PG实例的数据目录

rm -rf /var/chroot/var/lib/pgsql/9.5/data

2)执行以下命令,进行重建:

pg_basebackup --dbname='host=192.168.64.109 port=8635 user=rdsRepl password=xxxxxx' --pgdata='/var/chroot/var/lib/pgsql/9.5/data' --format=plain --xlog-method=stream --progress

其中192.168.64.109替换为on-premise PG hostIP;8635替换为on-premise PG访问端口;rdsRepl替换为on-premise PG提供的复制账号,xxxx为复制账号的密码。

命令执行完成显示进度100%表示成功,参考:

22561/22561 kB (100%), 1/1 tablespace

3)设置备机配置

cd /var/chroot/var/lib/pgsql/9.5/data

echo "restore_command = '/usr/pgsql-9.5/bin/rds_wal_restore %f %p'" >recovery.conf

echo "standby_mode = on">>recovery.conf

echo "recovery_target_timeline = 'latest'" >> recovery.conf

echo "primary_conninfo = 'host=192.168.64.109 port=8635 user=rdsRepl application_name=dbnode2886729959 password=xxxxxx'" >> recovery.conf

rm -rf recovery.done

4)启动on-premise备机

service postgresql-9.5 start

出现以下提示,说明启动成功:

Starting postgresql-9.5 service: [  OK  ]

执行命令”ps ux”显示结果如下:

USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

Ruby      13984  0.0  1.4 1138992 58684 pts/0   S    03:37   0:00 /usr/pgsql-9.5/bin/postmaster -D /var/lib/pgsql/9.5/data

Ruby      13990  0.0  0.0  74616  1344 ?        Ss   03:37   0:00 postgres: logger process

Ruby      13991  0.0  0.0 1139032 2328 ?        Ss   03:37   0:00 postgres: startup process   recovering 000000010000000000000021

Ruby      13995  0.0  0.0 1138992 1492 ?        Ss   03:37   0:00 postgres: checkpointer process

Ruby      13996  0.0  0.2 1138992 9388 ?        Ss   03:37   0:00 postgres: writer process

Ruby      13998  0.0  0.0  74612  1576 ?        Ss   03:37   0:00 postgres: stats collector process

Ruby      13999  0.1  0.1 1146212 4376 ?        Ss   03:37   0:00 postgres: wal receiver process   streaming 0/21000060

其中:“wal receiver process   streaming 0/20000060”表示与on-premise PG建立连接成功,已xlog同步到0/20000060

5)登录on-premise PG查看当前xlog发送位置:

USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

Ruby       7186  0.0  1.4 1138992 58704 ?       S    01:15   0:00 /usr/pgsql-9.5/bin/postmaster -D /var/lib/pgsql/9.5/data

Ruby       7192  0.0  0.0  74616  1568 ?        Ss   01:15   0:00 postgres: logger process

Ruby       7194  0.0  0.6 1139248 27500 ?       Ss   01:15   0:00 postgres: checkpointer process

Ruby       7195  0.0  0.2 1139184 9900 ?        Ss   01:15   0:00 postgres: writer process

Ruby       7196  0.0  0.4 1138992 18072 ?       Ss   01:15   0:00 postgres: wal writer process

Ruby       7197  0.0  0.0 1139564 2652 ?        Ss   01:15   0:00 postgres: autovacuum launcher process

Ruby       7198  0.0  0.0  74612  1572 ?        Ss   01:15   0:00 postgres: archiver process   last was 000000010000000000000020

Ruby       7199  0.0  0.0  74748  1740 ?        Ss   01:15   0:00 postgres: stats collector process

Ruby       8009  0.1  2.4 2547064 97112 ?       Sl   01:16   0:14 java -Dlog4j.configuration=file:./log4j.properties -jar haagent-0.0.1-SNAPSHOT-jar-with-dependencies.jar

Ruby       8022  0.0  0.2 204060 10392 ?        S    01:16   0:01 python haagentMonitor.py

Ruby      14909  0.0  0.1 1140024 4120 ?        Ss   03:37   0:00 postgres: wal sender process rdsRepl 192.168.64.169(43340) streaming 0/21000060

其中“postgres: wal sender process rdsRepl 192.168.64.169(43340) streaming 0/21000060”表示xlog发送进度

6)查看on-premise PG xlog生成进程:

ll /var/chroot/var/lib/pgsql/9.5/data/pg_xlog/

显示参考如下:

[Ruby@pg_migrate_master-PostgreSQL-1-1 pg_xlog]# ll /var/chroot/var/lib/pgsql/9.5/data/pg_xlog/

total 540680

-rw------- 1 Ruby Ruby 16777216 Sep 11 01:16 000000010000000000000001

-rw------- 1 Ruby Ruby 16777216 Sep 11 01:16 000000010000000000000002

-rw------- 1 Ruby Ruby 16777216 Sep 11 01:21 000000010000000000000003

-rw------- 1 Ruby Ruby 16777216 Sep 11 01:26 000000010000000000000004

-rw------- 1 Ruby Ruby 16777216 Sep 11 01:31 000000010000000000000005

-rw------- 1 Ruby Ruby 16777216 Sep 11 01:36 000000010000000000000006

-rw------- 1 Ruby Ruby 16777216 Sep 11 01:41 000000010000000000000007

-rw------- 1 Ruby Ruby 16777216 Sep 11 01:46 000000010000000000000008

-rw------- 1 Ruby Ruby 16777216 Sep 11 01:51 000000010000000000000009

-rw------- 1 Ruby Ruby 16777216 Sep 11 01:56 00000001000000000000000A

-rw------- 1 Ruby Ruby 16777216 Sep 11 02:01 00000001000000000000000B

-rw------- 1 Ruby Ruby 16777216 Sep 11 02:06 00000001000000000000000C

-rw------- 1 Ruby Ruby 16777216 Sep 11 02:11 00000001000000000000000D

-rw------- 1 Ruby Ruby 16777216 Sep 11 02:16 00000001000000000000000E

-rw------- 1 Ruby Ruby 16777216 Sep 11 02:21 00000001000000000000000F

-rw------- 1 Ruby Ruby 16777216 Sep 11 02:26 000000010000000000000010

-rw------- 1 Ruby Ruby 16777216 Sep 11 02:31 000000010000000000000011

-rw------- 1 Ruby Ruby 16777216 Sep 11 02:36 000000010000000000000012

-rw------- 1 Ruby Ruby 16777216 Sep 11 02:41 000000010000000000000013

-rw------- 1 Ruby Ruby 16777216 Sep 11 02:46 000000010000000000000014

-rw------- 1 Ruby Ruby 16777216 Sep 11 02:51 000000010000000000000015

-rw------- 1 Ruby Ruby 16777216 Sep 11 02:56 000000010000000000000016

-rw------- 1 Ruby Ruby 16777216 Sep 11 03:01 000000010000000000000017

-rw------- 1 Ruby Ruby 16777216 Sep 11 03:06 000000010000000000000018

-rw------- 1 Ruby Ruby 16777216 Sep 11 03:11 000000010000000000000019

-rw------- 1 Ruby Ruby 16777216 Sep 11 03:15 00000001000000000000001A

-rw------- 1 Ruby Ruby 16777216 Sep 11 03:15 00000001000000000000001B

-rw------- 1 Ruby Ruby      305 Sep 11 03:15 00000001000000000000001B.00000028.backup

-rw------- 1 Ruby Ruby 16777216 Sep 11 03:20 00000001000000000000001C

-rw------- 1 Ruby Ruby 16777216 Sep 11 03:25 00000001000000000000001D

“小象”主人的福音——PG数据库到RDS PG数据库全库在线迁移操作指导

-rw------- 1 Ruby Ruby 16777216 Sep 11 03:30 00000001000000000000001E

-rw------- 1 Ruby Ruby 16777216 Sep 11 03:35 00000001000000000000001F

-rw------- 1 Ruby Ruby 16777216 Sep 11 03:40 000000010000000000000020

-rw------- 1 Ruby Ruby 16777216 Sep 11 03:41 000000010000000000000021

drwx------ 2 Ruby Ruby     4096 Sep 11 03:40 archive_status

[Ruby@pg_migrate_master-PostgreSQL-1-1 pg_xlog]#

查看其中最后一个xlog端编号,可推测xlog生成位置

7)当RDS PG实例同步xlog进度、on-premise PG发送xlog进度、on-premise PG生成xlog生成位置大致一致时,可停止on-premise PG上的写业务(如果业务不是太多,建议停止所有业务操作),等待三者进度完全一致时,等待将业务切换到RDS PG实例上。

5、 停止on-premise PG数据库。

6、 登录步骤6所在RDS PG实例,停止数据库服务,修改配置作为主实例启动:

1)切换到Ruby用户;

su Ruby

2)停止数据库服务;

service postgresql-9.5 stop

3)使用步骤4的备份配置文件进行恢复配置:

cp /home/Ruby/postgresql.conf /var/chroot/var/lib/pgsql/9.5/data/

cp /home/Ruby/pg_hba.conf /var/chroot/var/lib/pgsql/9.5/data/

cp /home/Ruby/recovery.done /var/chroot/var/lib/pgsql/9.5/data

rm -rf /var/chroot/var/lib/pgsql/9.5/data/recovery.conf

4)启动数据库

service postgresql-9.5 start

提示如下,表示启动成功:

Starting postgresql-9.5 service: [  OK  ]

5)确认数据库服务进程,执行“ps ux”启动成功进行信息如下:

[Ruby@pgha-zxw09110913-PostgreSQL-HA-1-1 data]# ps ux

USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

Ruby       3036  0.0  0.0  12848  3200 pts/0    S    06:14   0:00 bash

Ruby      15892  0.6  1.4 1138992 58692 pts/0   S    06:30   0:00 /usr/pgsql-9.5/bin/postmaster -D /var/lib/pgsql/9.5/data

Ruby      15898  0.0  0.0  74616  1348 ?        Ss   06:30   0:00 postgres: logger process

Ruby      15900  0.0  0.0 1138992 1708 ?        Ss   06:30   0:00 postgres: checkpointer process

Ruby      15901  0.0  0.0 1138992 1980 ?        Ss   06:30   0:00 postgres: writer process

Ruby      15902  0.0  0.0 1138992 1500 ?        Ss   06:30   0:00 postgres: wal writer process

Ruby      15903  0.0  0.0 1139564 2560 ?        Ss   06:30   0:00 postgres: autovacuum launcher process

Ruby      15904  0.0  0.0  74612  1552 ?        Ss   06:30   0:00 postgres: archiver process   last was 00000001000000000000001B

Ruby      15905  0.0  0.0  74612  1584 ?        Ss   06:30   0:00 postgres: stats collector process

7、 切换用户业务到步骤6所在RDS PG实例,业务恢复正常,但建议控制业务量不要太大,以便进行RDS PG实例的备实例创建。

8、 步骤6所在RDS PG实例上恢复RDS管理账号rdsAdmin、rdsBackup、rdsRepl、rdsMetric、root。

1)切换到Ruby用户下

su Ruby

2)使用on-premise PG超级用户(如userAdmin)登录RDS PG主实例的数据库:

psql postgres –U userAdmin -p8635

根据提示输入on-premise PG超级用户的密码

3)使用步骤2获取的密码创建管理账号,执行以下命令:

说明:rootpassword可由用户自行设定;

setp2_rdsAdmin_password为步骤2获取的rdsAdmin的密码

setp2_rdsMetric_pwd为步骤2获取的rdsMetric的密码

setp2_rdsBackup_pwd为步骤2获取的rdsBackup的密码

setp2_rdsRepl_pwd为步骤2获取的rdsRepl的密码

rdsRepl如果不存在需要创建该用户,这里写错alter原因是,文档开始使用了这个用户名进行创建了,参考前提条件中复制账号提供部分。

9、 恢复RDS PG备实例

1)切换到Ruby用户:

su Ruby

2)删除RDS PG实例的数据目录

rm -rf /var/chroot/var/lib/pgsql/9.5/data

3)获取primary_conninfo信息:

cat /home/Ruby/recovery.conf

该文件为步骤4的备份文件,其内容参考如下:

restore_command = '/usr/pgsql-9.5/bin/rds_wal_restore %f %p'

standby_mode = on

recovery_target_timeline = 'latest'

primary_conninfo = 'host=192.168.64.152 port=8635 user=rdsRepl application_name=dbnode2886729816 password=xxxxxx'

4)使用步骤3)获取的primary_conninfo信息重建RDS PG备实例:

pg_basebackup --dbname='host=192.168.64.152 port=8635 user=rdsRepl application_name=dbnode2886729816 password=xxxxxx' --pgdata='/var/chroot/var/lib/pgsql/9.5/data' --format=plain --xlog-method=stream –progress

其中:--dbname取值使用步骤3)的primary_conninfo替换

命令执行完成显示进度100%表示成功,参考:

22561/22561 kB (100%), 1/1 tablespace

10、      使用步骤4的备份配置文件进行恢复配置:

su Ruby

cp /home/Ruby/postgresql.conf /var/chroot/var/lib/pgsql/9.5/data/

cp /home/Ruby/pg_hba.conf /var/chroot/var/lib/pgsql/9.5/data/

cp /home/Ruby/recovery.conf /var/chroot/var/lib/pgsql/9.5/data/

rm -rf /var/chroot/var/lib/pgsql/9.5/data/recovery.done

11、      启动RDS PG备实例

1)切换到Ruby用户

su Ruby

2)启动数据库

service postgresql-9.5 start

3)”ps ux”查看进程状态

[Ruby@pgha-zxw09110913-PostgreSQL-HA-1-2 data]# ps ux

USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

Ruby      12888  0.0  0.0 116464  3368 pts/0    S    07:44   0:00 bash

Ruby      22962  0.7  1.4 1138992 58688 pts/0   S    08:00   0:00 /usr/pgsql-9.5/bin/postmaster -D /var/lib/pgsql/9.5/data

Ruby      22968  0.0  0.0  74616  1348 ?        Ss   08:00   0:00 postgres: logger process

Ruby      22969  0.0  0.0 1139032 2336 ?        Ss   08:00   0:00 postgres: startup process   recovering 000000010000000000000053

Ruby      22973  0.0  0.0 1138992 1496 ?        Ss   08:00   0:00 postgres: checkpointer process

Ruby      22974  0.0  0.0 1138992 1736 ?        Ss   08:00   0:00 postgres: writer process

Ruby      22976  0.0  0.0  74612  1576 ?        Ss   08:00   0:00 postgres: stats collector process

Ruby      22977  1.7  0.1 1146212 4380 ?        Ss   08:00   0:00 postgres: wal receiver process   streaming 0/53000060

其中“postgres: wal receiver process   streaming 0/53000060”为当前备库同步xlog进度

4)切换到RDS PG主实例,”ps ux”查看进程状态:

[Ruby@pgha-zxw09110913-PostgreSQL-HA-1-1 ~]# ps ux

USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

Ruby      15892  0.0  1.4 1138992 58704 ?       S    06:30   0:00 /usr/pgsql-9.5/bin/postmaster -D /var/lib/pgsql/9.5/data

Ruby      15898  0.0  0.0  74612  1568 ?        Ss   06:30   0:00 postgres: logger process

Ruby      15900  0.0  0.6 1139248 26960 ?       Ss   06:30   0:00 postgres: checkpointer process

Ruby      15901  0.0  0.2 1139184 9900 ?        Ss   06:30   0:00 postgres: writer process

Ruby      15902  0.0  0.4 1138992 18072 ?       Ss   06:30   0:00 postgres: wal writer process

Ruby      15903  0.0  0.0 1139564 2640 ?        Ss   06:30   0:00 postgres: autovacuum launcher process

Ruby      15904  0.0  0.0  74612  1572 ?        Ss   06:30   0:00 postgres: archiver process   last was 000000010000000000000052

Ruby      15905  0.0  0.0  74612  1716 ?        Ss   06:30   0:00 postgres: stats collector process

Ruby      46480  0.0  0.0  12848  2996 pts/1    S    07:10   0:00 bash

Ruby      85126  0.0  0.0      0     0 ?        Zs   08:01   0:00 [sh]

Ruby      85204  0.2  0.1 1140024 4112 ?        Ss   08:01   0:00 postgres: wal sender process rdsRepl 192.168.64.21(31393) streaming 0/53000060

Ruby      85601  0.0  0.0  35872  1512 pts/1    R+   08:01   0:00 ps ux

其中“postgres: wal sender process rdsRepl 192.168.64.21(31393) streaming 0/53000060”为主数据库发送的xlog进度

5)RDS PG主实例执行”ll /var/chroot/var/lib/pgsql/9.5/data/pg_xlog/”查看xlog生成进度,如果RDS PG备库同步xlog进度,主库发送xlog进度与主库上的xlog生成进度基本一致,且多次查看,xlog进程位置又变化,则说明主备关系正常。

12、              分别登录RDS PG主、备实例启动实例Haagent监控:

cd /rds/mgntAgent/v1.6.0

python monitorSwitch.py

回车后,根据需要输入以下参数:

{"action":"on","level":"instance"}

然后,继续回车,出现以下提示则表示执行成功:

[result]success

其中1.6.0为引擎管理版本号,根据所用引擎管理版本决定

13、      登录RDS dataStore节点启动迁移目标RDS PG实例的监控:

其中,实例名称分别为RDS PG HA实例的主备实例。

大功告成!我家的“小象”已成功托付给专业保姆——华为云保管,从此妈妈再也不用担心我家“小象”的吃喝拉撒睡问题了!!!

技术提供:Vigor2017

PostgreSQL 数据迁移

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【动图详解】通过 User-Agent 识别爬虫的原理、实践与对应的绕过方法(这是个动图)
下一篇:Excel如何批量修改数据标签(excel工作表标签批量修改)
相关文章