“小象”主人的福音——PG数据库到RDS PG数据库全库在线迁移操作指导
据“新花社”最新报道:自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
-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] <defunct>
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
- 点赞
- 收藏
- 关注作者
评论(0)