线下PG迁移到阿里云RDS PG - 兼容性、性能评估、迁移

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
简介:

标签

PostgreSQL , 迁移 , 阿里云RDS PG


背景

用户如果需要将线下的PG数据库迁移到阿里云RDS PG,应该评估哪些东西,如何迁移?

1 规格、性能评估

主要评估线下PG实例所在主机的性能指标

1、CPU主频

2、CPU核数

3、磁盘使用容量

4、网络带宽

5、磁盘读写IOPS

6、磁盘读写带宽

这些指标应该尽量与阿里云RDS PG对齐。

如果线下PG开启了异步提交时,对应的阿里云RDS PG IOPS可能需要更多(与每秒提交的写事务相关)。

2 兼容性评估

1、数据库版本

如果版本不一致,请参考PostgreSQL 版本的 release notes,看看有哪些不兼容的地方,一般不兼容的地方,PG会在release notes里面给出migration 方法。

2、插件

用户需要的插件,在RDS PG中是否存在,如果在RDS PG中没有,那么两种选择1. 提工单看是否可以加上插件,2. 看看业务上是否可以修正,去掉这个插件的依赖。

3、插件版本

线下PG与RDS PG的插件版本不一样时,建议根据插件的RELEASE NOTES,判断是否需要修改业务?

4、业务需要的数据库用户权限

(超级用户、OR 普通用户,。。。)

RDS PG给的最大权限是rds_superuser,权限介于数据库的superuser 与 普通用户之间。

5、本土化参数

这个主要与数据库有关,建库时,使用的是C还是其他本地化collation。collation决定了排序、货币格式等。

创建数据库时可以指定,如果模板库不是你要的,那么你需要用template0来创建。

postgres=# create database db1 with template=template0 encoding='SQL_ASCII' LC_COLLATE='C' LC_CTYPE='C' ;  
CREATE DATABASE  

https://www.postgresql.org/docs/10/static/charset.html

postgres=# \l+  
                                                                   List of databases  
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges   |  Size   | Tablespace |                Description                   
-----------+----------+----------+------------+------------+-----------------------+---------+------------+--------------------------------------------  
 postgres  | postgres | UTF8     | en_US.UTF8 | en_US.UTF8 |                       | 127 GB  | pg_default | default administrative connection database  
 template0 | postgres | UTF8     | en_US.UTF8 | en_US.UTF8 | =c/postgres          +| 7561 kB | pg_default | unmodifiable empty database  
           |          |          |            |            | postgres=CTc/postgres |         |            |   
 template1 | postgres | UTF8     | en_US.UTF8 | en_US.UTF8 | =c/postgres          +| 7561 kB | pg_default | default template for new databases  
           |          |          |            |            | postgres=CTc/postgres |         |            |   
(3 rows)  

同时对于wchar的模糊查询,也需要用collate 非 C设置。

《PostgreSQL 模糊查询最佳实践 - (含单字、双字、多字模糊查询方法)》

6、数据库字符集

如果线上线下字符集不一致,需要字符集转换。建议使用一致的字符集。创建数据库时可以指定。

postgres=# \l+  
                                                                   List of databases  
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges   |  Size   | Tablespace |                Description                   
-----------+----------+----------+------------+------------+-----------------------+---------+------------+--------------------------------------------  
 postgres  | postgres | UTF8     | en_US.UTF8 | en_US.UTF8 |                       | 127 GB  | pg_default | default administrative connection database  
 template0 | postgres | UTF8     | en_US.UTF8 | en_US.UTF8 | =c/postgres          +| 7561 kB | pg_default | unmodifiable empty database  
           |          |          |            |            | postgres=CTc/postgres |         |            |   
 template1 | postgres | UTF8     | en_US.UTF8 | en_US.UTF8 | =c/postgres          +| 7561 kB | pg_default | default template for new databases  
           |          |          |            |            | postgres=CTc/postgres |         |            |   
(3 rows)  
postgres=# create database db1 with template=template0 encoding='SQL_ASCII' LC_COLLATE='C' LC_CTYPE='C' ;  
CREATE DATABASE  

7、CLIENT相关的参数

这些参数决定了一些使用上的风格,建议迁移前后做一下对比,保证兼容。

比如bytea_output,可以选择为十六进制输出,也可以选择为转义输出格式。

#------------------------------------------------------------------------------  
# CLIENT CONNECTION DEFAULTS  
#------------------------------------------------------------------------------  
  
# - Statement Behavior -  
  
#search_path = '"$user", public'        # schema names  
#row_security = on  
#default_tablespace = ''                # a tablespace name, '' uses the default  
#temp_tablespaces = ''                  # a list of tablespace names, '' uses  
                                        # only default tablespace  
#check_function_bodies = on  
#default_transaction_isolation = 'read committed'  
#default_transaction_read_only = off  
#default_transaction_deferrable = off  
#session_replication_role = 'origin'  
#statement_timeout = 0                  # in milliseconds, 0 is disabled  
#lock_timeout = 0                       # in milliseconds, 0 is disabled  
#idle_in_transaction_session_timeout = 0        # in milliseconds, 0 is disabled  
#vacuum_freeze_min_age = 50000000  
#vacuum_freeze_table_age = 150000000  
#vacuum_multixact_freeze_min_age = 5000000  
#vacuum_multixact_freeze_table_age = 150000000  
#bytea_output = 'hex'                   # hex, escape  
#xmlbinary = 'base64'  
#xmloption = 'content'  
#gin_fuzzy_search_limit = 0  
#gin_pending_list_limit = 4MB  
  
# - Locale and Formatting -  
  
datestyle = 'iso, mdy'  
#intervalstyle = 'postgres'  
timezone = 'PRC'  
#timezone_abbreviations = 'Default'     # Select the set of available time zone  
                                        # abbreviations.  Currently, there are  
                                        #   Default  
                                        #   Australia (historical usage)  
                                        #   India  
                                        # You can create your own file in  
                                        # share/timezonesets/.  
#extra_float_digits = 0                 # min -15, max 3  
#client_encoding = sql_ascii            # actually, defaults to database  
                                        # encoding  
  
# These settings are initialized by initdb, but they can be changed.  
lc_messages = 'en_US.UTF8'                      # locale for system error message  
                                        # strings  
lc_monetary = 'en_US.UTF8'                      # locale for monetary formatting  
lc_numeric = 'en_US.UTF8'                       # locale for number formatting  
lc_time = 'en_US.UTF8'                          # locale for time formatting  
  
# default configuration for text search  
default_text_search_config = 'pg_catalog.english'  
# - Shared Library Preloading -  
  
#shared_preload_libraries = ''  # (change requires restart)  
#local_preload_libraries = ''  
#session_preload_libraries = ''  
  
# - Other Defaults -  
  
#dynamic_library_path = '$libdir'  
  
#jit = on                               # allow JIT compilation  
#jit_provider = 'llvmjit'               # JIT implementation to use  
#------------------------------------------------------------------------------  
# VERSION AND PLATFORM COMPATIBILITY  
#------------------------------------------------------------------------------  
  
# - Previous PostgreSQL Versions -  
  
#array_nulls = on  
#backslash_quote = safe_encoding        # on, off, or safe_encoding  
#default_with_oids = off  
#escape_string_warning = on  
#lo_compat_privileges = off  
#operator_precedence_warning = off  
#quote_all_identifiers = off  
#standard_conforming_strings = on  
#synchronize_seqscans = on  
  
# - Other Platforms and Clients -  
  
#transform_null_equals = off  
#------------------------------------------------------------------------------  
# CUSTOMIZED OPTIONS  
#------------------------------------------------------------------------------  
  
# Add settings for extensions here  

3 迁移

大致步骤如下

1、测试迁移,全量数据迁移

2、全链路测试

3、清除数据,正式迁移数据

4、比对数据一致性

增量迁移可以考虑阿里云的工具,如rds_dbsync, DTS服务,或者采用pglogical。

https://help.aliyun.com/document_detail/26624.html

参考

https://www.postgresql.org/docs/10/static/charset.html

《PostgreSQL 模糊查询最佳实践 - (含单字、双字、多字模糊查询方法)》

《[未完待续] PostgreSQL pglogical 逻辑复制实现跨版本升级》

《MySQL准实时同步到PostgreSQL, Greenplum的方案之一 - rds_dbsync》

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4月前
|
弹性计算 关系型数据库 数据库
手把手带你从自建 MySQL 迁移到云数据库,一步就能脱胎换骨
阿里云瑶池数据库来开课啦!自建数据库迁移至云数据库 RDS原来只要一步操作就能搞定!点击阅读原文完成实验就可获得一本日历哦~
|
2月前
|
容灾 关系型数据库 数据库
阿里云RDS服务巴黎奥运会赛事系统,助力云上奥运稳定运行
2024年巴黎奥运会,阿里云作为官方云服务合作伙伴,提供了稳定的技术支持。云数据库RDS通过备份恢复、实时监控、容灾切换等产品能力,确保了赛事系统的平稳运行。
 阿里云RDS服务巴黎奥运会赛事系统,助力云上奥运稳定运行
|
2月前
|
运维 关系型数据库 Java
DataKit6.0将MySQL8.0迁移至openGauss6.0
DataKit6.0将MySQL8.0迁移至openGauss6.0
|
3月前
|
存储 SQL 关系型数据库
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
MySQL如何进行分库分表、数据迁移?从相关概念、使用场景、拆分方式、分表字段选择、数据一致性校验等角度阐述MySQL数据库的分库分表方案。
528 15
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
|
2月前
|
SQL 分布式计算 关系型数据库
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
96 3
|
2月前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
110 0
|
3天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
13 3
|
3天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
20 3
|
3天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE 'log_%';`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
23 2
|
17天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
119 15