Postgre 是经常被用到的关系型数据库,本文将详细介绍在AWS云端升级Postgre版本的方案

为什么需要升级?

新的数据库版本有新的功能特性,AWS和开源团队对于每个特定的版本提供有限时间的技术支持,超过技术支持时间后,没有技术支持将会造成安全及系统风险,所以为了避免潜在的风险,需要在当前版本停止支持之前升级到比较新的版本.

每个版本对应的官方维护时间 PostgreSQL: Versioning Policy

升级方案选择

升级方案主要分为两类, in place 和 out of place,顾名思义,升级原有数据库或者在新建的数据库上进行升级.

经过一番调研,整理出了以下几种升级的方式:

1.使用AWS DMS,升级到10.18 升级到12.7

优点

1.AWS官方提供的数据迁移工具,具有一定的稳定性

2.迁移方案对于读应用没有downtime

3.不修改原有数据库,容易回滚

缺点

1.需要修改所有连接到数据库的连接地址

2.aws 官方文档显示,不支持升级到最新的13.3版本

2.使用AWS postgre自带升级工具,将当前的10.18版本升级到13.3版本

优点

1.可以升级到最新的13.3版本

2.只需要简单的修改cloudformation或页面操作即可完成修改

缺点

1.需要一段时间的downtime,时间会随着数据库存储数据量的增大而变长

3.手动dump当前10.18版本的数据,restore到13.3最新版本

优点

对于读应用没有downtime

缺点

1.备份时间根据数据量增大

2.手动备份运维

3.需要修改数据库连接配置

因为当前需要升级的数据库还有线上用户正在使用,为了保证线上的用户还能够正常的访问,所以采用了第一种方式进行升级.

DMS数据流转图

DMS(database migration service): 数据迁移服务,是AWS提供的一个免费的帮助用户将数据库迁移上云的工具.

从图中可以看到,DMS包含了一个Replication instance, Replication task, source endpoint, Target endpoint

Source Endpoint用来连接源数据库

Target Endpoint用来连接目标数据库

Instance 用来执行具体的迁移任务

升级过程

1.创建一整套新版本的数据库的基础设施,更新新创建数据库的配置

可以使用cloudformation 或者页面操作完成即可,不在赘述.

2.更改数据库配置

将 PostgreSQL 数据库作为AWS DMSsource - AWS Database Migration Service
将 PostgreSQL 数据库作为 AWS Database Migration Service 的目标 - AWS Database Migration Service

文档中详细列出了原数据库和目标数据库需要进行的配置,建议使用英文的文档,中文的文档大部分为机翻,而且实时性可能不高,不建议阅读.

根据上边的文档,总结了以下的流程

1)修改原始库的默认配置

  • rds.logical_replication=1
  • wal_sender_timeout=0
  • shared_preload_libraries=pglogical

2)配置CDC(change data capture)

CDC保证了旧数据库的修改能够同步在新库中

创建新插件及验证插件是否创建成功

create extension pglogical;
select * FROM pg_catalog.pg_extension

创建copy slot

SELECT * FROM pg_create_logical_replication_slot('copy_slot', 'pglogical');

创建copy node

SELECT pglogical.create_node(node_name := 'node', dsn := 'dsn_name');

创建两个 copy set

select pglogical.create_replication_set('copy_slot', true, false, false, true);

select pglogical.create_replication_set('icopy_slot', false, true, true, false);

3)手动dump原数据库的数据格式

经过验证,如果使用DMS自带的表结构同步功能会存在一些问题,所以需要手动的同步数据库的表结构

pg_dumpall -h hostname_of_db -g -U postgres -f db_roles.sql --no-role-password
pg_dump -h hostname_of_db  -n 'your_namespace' -U postgres -s your_schema > schema.sql

3.DMS相关配置

1)创建DMS instance

这里相当于创建了一个带有DMS迁移服务的EC2实例,在DMS页面上创建即可,创建的时候需要注意,能够访问到源数据库和目标数据库,否则后边的步骤中将会出现连接不到数据库的错误.

2)创建endpoint

需要对于源数据库和目标数据库分别创建一个endpoint.

3)创建task

创建task的步骤中,涉及到的配置项比较多,其中主要的配置项需要注意的有以下几点:

"Target table preparation mode" 由于咱们上边手动导出了数据库结构,并且手动导入了新的数据库,这里选择Do nothing 即可.

"Premigration assessment"  开启验证,在Dev环境进行测试的时候,对于该选项打钩,会将当前数据表结构与新的数据库的兼容性进行比较,生成详细的结论放在S3中,这里需要配置S3相关的访问权限.由于Dev环境已经进行过响应的验证,生产环境中没有重复进行该验证.

"Enable CloudWatch logs" 打开日志记录,建议打开,出现错误的时候,方便进行排查.

4.开启同步任务

配置完以上步骤之后,便可以开始执行任务,执行的过程中,在对应的task任务中会有每一张表执行的具体过程,实际使用的过程中,单表100GB的数据,大概需要10个小时左右能够同步完成.

5.数据验证

1) 检查所有表的行数是否一致

select count(*) from table_name ;

2) 为每张表手动设置SEQUENCE的值

SELECT setval('table_name_id_seq', coalesce(max(id), 0)) FROM table_name;

3) 检查数据库总大小

select pg_size_pretty(pg_database_size('database_name'));

4) 检查每张表的数据量大小

SELECT
table_schema || '.' || table_name
AS table_full_name, pg_size_pretty(pg_total_relation_size('"' ||table_schema || '"."' || table_name || '"')) AS size
FROM
information_schema.tables where table_schema = 'public'
ORDER BYpg_total_relation_size('"' || table_schema || '"."' || table_name || '"')
DESC limit 1000;

5)检查表数量是否一致

select count(*) from information_schema.tables where table_schema = 'public';

5.服务迁移

将依赖当前数据库项目中所有数据库配置修改为新的数据库.

6.最终验证及资源清理

查看依赖数据库的上游的系统状态是否正常.

依次删除 DMS task, DMS endpoint, DMS instance, old DB, 删除old DB的时候需要进行备份,防止出现意外是能够进行回滚.

使用AWS DMS 升级Postgre 10到12相关推荐

  1. macos从10.12.6升级到10.15.7 svn无法使用

    注意:macOS从 10.12.6 升级到 10.15.5后 svn --version 提示: svn: error: Failed to locate 'svn'. svn: error: The ...

  2. macos从10.12.6升级到10.15.7

    我是17年6月在苹果官网购买的2015款 15寸 macbookpro ,没有touchbar,没有指纹,没有type-c.当时购买意愿是听说最后一款不带touch bar的mbp了,我一直觉得tou ...

  3. 使用Apache Hudi + Amazon S3 + Amazon EMR + AWS DMS构建数据湖

    1. 引入 数据湖使组织能够在更短的时间内利用多个源的数据,而不同角色用户可以以不同的方式协作和分析数据,从而实现更好.更快的决策.Amazon Simple Storage Service(amaz ...

  4. windows 2003 下oracle从10.2.0.1升级到10.2.0.4

    方法一: 1. 完全安装10.2.0.1 2. 安装完成后,停止所有的oracle服务,可以通过停止oracle 的window services或者使用以下命令来实现. emctl stop dbc ...

  5. 手动升级oracle,ORACLE 10.2.0.1手动升级到10.2.0.4

    ORACLE 10.2.0.1手动升级到10.2.0.4 1.解压zip包以及查看目录权限 p6810189_10204_Linux-x86-64.zip oracle@single-10g:/u01 ...

  6. Redhat 5.4 Orcle RAC 数据库 从10.2.0.1升级到 10.2.0.4

    之前安装的是两个节点的RAC 平台. 数据库版本是10.2.0.1. 这个实验的目的就是将这个数据库版本从10.2.0.1 升级到 10.2.0.4.  升级包可以从Oracle metalink上进 ...

  7. oracle 10.2.0.1升级到10.2.0.4

    --********************************* -- Oracle 10.2.0.1 升级到 10.2.0.4 --****************************** ...

  8. aix oracle 10.2.0.1 升级 10.2.0.4,AIX Oracle RAC 升级到10.2.0.4.0要特别注意的问题 - 爱肯的专栏 ......

    AIX Oracle RAC 升级到10.2.0.4.0过程有如下报错(直接升级到10.2.0.4不需要应用Patch:6160398): root@bwgl_db2:/u01/app/oracle/ ...

  9. Finereport 9.0升级到10.0工具下载[9-10升级工具]

    QQ192374926 1. 描述 现提供一个独立的辅助升级程序,可以将 9.0 的 Web 工程升级到 10.0 工程,包括 JAR 包.各类配置文件.FineDB 数据表等的兼容升级. 注:支持 ...

最新文章

  1. iphone屏蔽系统更新_iPhone 屏蔽系统更新教程,支持 iOS13 / iOS12 系统
  2. 通过源码详解 Servlet
  3. axis2 java.net.url_axis,axis2调用.net的webservice
  4. 为什么手机游戏手柄没有流行起来?
  5. java 常用类 练习_Java常用类之String类练习
  6. MOSS架构和共享服务(Shared Service)
  7. 用Redis实现分布式锁 与 实现任务队列【转载】
  8. 智能手机的硬件组成部分及结构图
  9. 微信的APP支付开发,服务端和支付端的问题
  10. 博途v15模拟量转换_浅谈西门子S7-1200PLC的模拟量转换,附实例演示
  11. Linux:安装Debian最新10.x操作系统(超详细)
  12. Jmeter测试最大在线用户数
  13. 百人计划 美术 1.1 美术理论基础
  14. Django连接mysql数据库操作
  15. 20代年轻人成韩国最积极的加密货币投资群体
  16. c#中的interface abstract与virtual的介绍与使用
  17. 快速加速计算机的方法,如何让电脑提速50%以上?这三招就够了!
  18. Ensp测试配置两个ip段互通
  19. VisualSVN Server版本库搭建
  20. 很好用的FreeCAD

热门文章

  1. 开机时不输入用户名密码直接登录
  2. Linux 命令 之 【chmod】 修改文件权限~
  3. blogic-io.xml文件中的出力属性和output.javabean文件中的属性需要一一对应
  4. iBaits中,关于insert返回值的问题(注意!!!不必写resultClass= java.lang.Integer,方法的返回值就是int)
  5. 【Shell】按关键字查找某个字符
  6. 动态扩容Linux根目录 (解决/dev/mapper/centos-root 占用了过高问题)
  7. 关于iOS 6 中的一些“xxxxxx” is deprecated 问题的解决办法
  8. springboot集成shiro 前后端分离 统一处理shiro异常
  9. Numpy安装+导入出错的解决方法
  10. pytorch神经网络解决回归问题(非常易懂)