Oracle2PostgreSQL on ARM 解决方案 · 2019. 9. 24. · Logical Replication (Pub/Sub) PostgreSQL...
Transcript of Oracle2PostgreSQL on ARM 解决方案 · 2019. 9. 24. · Logical Replication (Pub/Sub) PostgreSQL...
目录
1
CONTENS
方案背景
2 PGonARM
3 技术差异
4 迁移流程
Oracle在传统数据中心面临的挑战
➢满足业务的快速发展 - 扩展性
➢适应瞬息万变的市场 - 灵活性
➢应对复杂的安全挑战 - 安全性
➢持续降终端用户成本 - 经济性
➢推进国产化自主可控 - 自主性
周期长
⚫ 采购周期长
⚫ 安装配置复杂
匹配
成本高
⚫ 购置成本高
⚫ 升级成本高
风险高
⚫ 过度依赖原厂
⚫ 国际形式影响
⚫ 闭源
运维杂
⚫ 基础架构
⚫ 运维复杂性高
⚫ 缺乏敏捷
PostgreSQL替换Oracle的优势
➢满足业务的快速发展 - 扩展性
➢适应瞬息万变的市场 - 灵活性
➢应对复杂的安全挑战 - 安全性
➢持续降终端用户成本 - 经济性
➢推进国产化自主可控 - 自主性
开放源码
⚫ 开放源代码
⚫ BSD授权
匹配
功能强大
⚫ 高度兼容Oracle
⚫ 完善的SQL支持
案例丰富
⚫ 各类行业应用
⚫ 各种信息存储
社区活跃
⚫ 版本更新迅速
⚫ BUG修复及时
⚫ 三方资源丰富
PG版本和功能沿革
• 由 Michael Stonebraker 教授在 University of California 发起
1986 2019
PostgreSQL 10Declarative PartitioningParallel QueryLogical Replication (Pub/Sub)
PostgreSQL 8Windows SupportPoint in Time RecoveryTablespacesPostgreSQL 7
Foreign KeysOptimizer ImprovementsSQL92 Join SyntaxSub Query SupportStored Procedures
PostgreSQL 6Datetime, Timespan Data TypesJdbc SupportTriggers
Postgres95SQL SUPPORT
1995 2000
Source : https://www.postgresql.org/docs/current/static/history.html
PostgreSQL 9Replication via Log ShippingPerformance ImprovementsImproved Triggers/Constraints
PostgreSQL 11Increased Performance for PartitioningTransactions in Stored ProceduresEnhanced for Query Parallelism
PostgreSQL 12 BetaIndexing Performance, Functionality, and Management
Inlined WITH queries (Common table expressions)Page Checksums
PG和Oracle高度兼容
• PostgreSQL具有丰富的功能特性和扩展插件,95%+兼容Oracle
1986 20191995 2000Description Oracle Database 18c PostgreSQL 11
ACID Compliant Yes Yes
Backups (Online, Incremental etc) Yes Yes (But complex, No incremental)
Parallel Query, DML, DDL Yes Partial (Work still ongoing)
Stored Logic Yes (PL/SQL, Java) Yes (pq/pgSQL, Python, Java, Perl, TCL, C)
Indexes Yes (Btree, BitMap, Function, Hash, Storage Index)
Yes (Btree, Function, Hash, Block Range, Gist, GiN)
Disaster Recovery Yes (DataGuard) Yes (Streaming Replication)
Partitioning Yes (Range, List, Hash, Function, Interval, Sub Partitioning etc.)
Partial (Range, List, Hash* but no local indexes)
PG和Oracle高度兼容
1986 20191995 2000Description Oracle Database 18c PostgreSQL 11
JSON Support Yes (Text) Yes (Text and Binary)
Key Value Pair Support No Yes (HStore)
Transactional DDL No Yes
Session Based Synchronous Replication No Yes
Boolean Data Type No Yes
• PostgreSQL具有丰富的功能特性和扩展插件,95%+兼容Oracle• 部分功能超过 Oracle 的功能提供
开源的趋势与未来
Source : https://db-engines.com/en/ranking_trend
DB-Engines 的流行度排行榜上,开源数据库的受欢迎程度不断上升。
开源和商业数据库接近平分秋色。
在 DB-Engines 的数据库积分趋势上,PostgreSQL 增长迅速。
而且后劲十足。
目录
1
CONTENS
方案背景
2 PGonARM
3 技术差异
4 迁移流程
ARM生态
华为鲲鹏处理器
PGonARM安装部署
由于最新版本的PostgreSQL并没有官方发布的
二进制安装文件,因此需要从源码开始编译安
装。
官网:www.postgresql.org
下载:www.postgresql.org/ftp/source/v11.3/
步骤一:安装编译源码需要的相关rpm包yum install gcc gcc-c++ readline-devel zlib-devel
步骤二:编译PostgreSQL 11.3源码$ ./configure –prefix=/data/pgsql$ make –j 8 $ su# make install备注:第二步make是极为关键的步骤,这一步不应该显示任何error,在最后显示“All of PostgreSQL successfully made. Ready to install.”字样表示这一步成功完成。
步骤三:指定数据文件路径初始化数据库# mkdir /data/pgsql/data # adduser postgres# passwd postgres# chown postgres /data/pgsql/data # su - postgres$ /data/pgsql/bin/initdb -D /data/pgsql/data在云环境中,通常需要在额外挂载的超高IO云盘上存储数据文件。
步骤四:启动数据库$ /data/pgsql/bin/pg_ctl -D /data/pgsql/data -l logfile start
[postgres@ecs-arm-0005 ~]$ psqlpsql (11.3) Type "help" for help.
postgres=#
PGonARM稳定运行
完全通过PostgreSQL最新版本11.3自带的
189个回归测试。
串行测试模式和并行测试模式都完全通过。
PGonARM性能对比
ARM服务器 X86服务器
操作系统 CentOS 7 CentOS 7
pg版本 11.3 11.3
CPU类型 ARMv8 鲲鹏916 Intel E5-2667 v3 @ 3.20GHz
内存 29GB 32GB
虚拟化 华为云QUEM vmware
• ARM芯片服务器 vs. X86芯片服务器–相同的操作系统CentOS 7
–相同的数据库版本 PostgreSQL 11.3
– X86服务器的CPU主频更高
– X86服务器的内存更大
–都采用虚拟化方案
PGonARM性能对比
性能对比—pgbench 读写响应时间(越低越好) 性能对比—pgbench 读写 TPS(越高越好)
ARM在响应时间和读写TPS指标上的表现均领先于X86。
PGonARM性能对比
性能对比—pgbench 只读响应时间(越低越好) 性能对比—pgbench 只读 TPS(越高越好)
ARM在响应时间和只读TPS指标上的表现均领先于X86。
PGonARM性能对比
性能对比—tpch 22条SQL的查询时间(越低越好)
数据有预热
性能对比—tpch 22条SQL的查询时间(越低越好)
数据无预热注:存储性能影响
较大
数据有预热情况下,两者持平;无预热情况下,ARM的表现领先于X86。
目录
1
CONTENS
方案背景
2 PGonARM
3 技术差异
4 迁移流程
Oracle Vs. PostgreSQL存储空间
1995
• PostgreSQL MVCC 空间使用– VM,Single table,3 indexes
– PostgreSQL 10.3,Oracle Database 18c
函数改写(1)
1995
• Oracle 数据库的部分函数需要进行改写– SQL ANSI覆盖全面,Core SQL 2011(和2008)上的179个功能,PostgreSQL符合至少160。
项目 Oracle PostgreSQL
当前时间 SYSDATE 可使用current_timestamp替换
序列 SEQNAME.NEXTVAL NEXTVAL('SEQNAME')
NVL NVL函数 NVL可以用COALESCE函数替换
类型自动转换 隐式转换 会出现类型不匹配等错误,需要在Java或者sql中进行类型转换
INSTR函数 instr('str1','str2') strpos('str1','str2')
外连接 Oracle可简写为(+) 用LEFT JOIN等语句替换
层次查询 START WITH语句、CONNECT BY语句 用WITH RECURSIVE语句
数据库对象大小写 不区分大小写 创建数据库对象时要小写,这样才不区分SQL的大小写
同义词 Oracle支持同义词 用视图代替
DUAL SELECT 1+1 FROM DUALSELECT 1+1 或者CREATE VIEW dual AS SELECT current_timestamp
ROWNUM ROWNUM关键字限制结果集数量,用于翻页等:SELECT * FROM T LIMIT 5 OFFSET 0生成行号:ROW_NUMBER() OVER()
DECODE等判断函数 DECODE() 用标准的CASE WHEN THEN ELSE END语句替换
TO_CHAR TO_CHAR(COL,FMT)格式化字符串可以为空 TO_CHAR(COL1,'FM999999'),9的个数为字段长度
TO_NUMBER TO_NUMBER(COL,FMT)格式化字符串可以为空 TO_NUMBER(COL1,'999999'),9的个数为字段长度
函数改写(2)
1995项目 Oracle PostgreSQL
BITAND BITAND(A,B) A & BMINUS MINUS语句 以EXCEPT语句来替代BIN_TO_NUM SELECT BIN_TO_NUM(1,0,1,0) AS VALUE1 FROM DUAL SELECT CAST(B'1010' AS INTEGER) AS VALUE1
UPDATE语句列列表
UPDATE accounts SET (contact_last_name, contact_first_name) =
(SELECT last_name, first_name FROM salesmenWHERE salesmen.id = accounts.sales_id);
不支持该语法,需要拆分为多个单独的列
SUBSTR函数如果从第一个开始取子串,可以从0开始,也可以从1开始,如果不是第一个开始,则从1开始计数,可以为负值,从字符串结尾计数,用于取最后几位。
从1开始计数。如果要取最后几位,可以用RIGHT函数解决。
子查询别名 如果FROM后只有一个子查询,该子查询可以没有别名 必须有别名
列(别)名为关键字Oracle中比如name,type这样的关键字可以直接作为列的别名,比如:select xx name from t
需要加as,比如select xx as name from t
当前登录用户 SELECT USER FROM DUAL select current_user
ALL_COL_COMMENTS通过SELECT * FROM ALL_COL_COMMENTS可以获得列注释信息
select s.column_name as COLUMN_NAME,coalesce(col_description(c.oid,ordinal_position) ,s.column_name) as COMMENTSfrom information_schema.columns s,pg_class cwhere s.table_name = 'ac01_si' and s.table_name = c.relnameand s.table_schema = current_schema()PG需要通过col_description获得列注释信息
修改表字段类型
1.如果字段无数据,可直接修改2.如果有数据且新类型和原类型兼容,可以直接修改3.如果不兼容,可通过对原字段改名,然后增加新字段,再通过UPDATE语句对数据进行处理
1.如果新类型和原类型兼容,可直接修改2.如果不兼容,需要使用USING关键字然后提供一个类型转换的表达式
• Oracle 数据库的部分函数需要进行改写– SQL ANSI覆盖全面,Core SQL 2011(和2008)上的179个功能,PostgreSQL符合至少160。
函数改写(3)
1995项目 Oracle PostgreSQL
NULL和'' ORACLE认为''等同于NULL, LENGTH('')为NULL NULL和’’不同, LENGTH('')为0NULL和'' TO_DATE('','YYYYMMDD')为空 TO_DATE('','YYYYMMDD')为0001-01-01 BCNULL和'' TO_NUMBER('',1)为NULL TO_NUMBER('',1),报错
NULL和''INSERT INTO TEST(VALUE3)VALUES('')[Result]VALUE3=NULL (注:VALUE3字段为Number | Varchar )
INSERT INTO TEST(VALUE4)VALUES(‘’)VALUE4=NULL | ‘’(注:VALUE4字段为Number | Varchar )
ADD_MONTHS ADD_MONTHS(DATE,INT)
CREATE FUNCTION add_months(date, int)RETURNS date AS'SELECT ($1 +($2::text||'' month'')::interval)::date'LANGUAGE 'sql'或SQL:SELECT ($1 +($2::text||' month')::interval)
LAST_DAY LAST_DAY(DATE)
CREATE OR REPLACE FUNCTION last_day(date)RETURNS date AS$$SELECT (date_trunc('MONTH', $1) + INTERVAL '1 MONTH - 1 day')::date;
$$ LANGUAGE 'sql';或SQL:SELECT (date_trunc('MONTH', $1) + interval '1 month - 1 day')::date;
MONTHS_BETWEEN MONTHS_BETWEEN(DATE,DATE)
CREATE FUNCTION MONTH_BETWEEN(d1 timestamp,d2 timestamp)RETURNS NUMERIC AS
'SELECT (extract(year from age(d1,d2))*12 + extract(month from age(d1,d2)))::integer'
LANGUAGE 'sql';
• Oracle 数据库的部分函数需要进行改写– SQL ANSI覆盖全面,Core SQL 2011(和2008)上的179个功能,PostgreSQL符合至少160。
语法转换(1)
1995
PostgreSQL中没有外关联+的写法,需要改成标准外关联写法:
SQL> SELECT COUNT(*) FROM T, T1 WHERE T.OBJECT_ID = T1.OBJECT_ID(+);
COUNT(*)----------
97103postgres=# SELECT COUNT(*) FROM T LEFT JOIN T_TAB ON (T.ID = T_TAB.ID);count
-------10
PostgreSQL中没有ROWNUM伪列,如果需要可以使用ROW_NUMBER()分析函数:
SQL> SELECT ID, ROWNUM RN FROM T WHERE OWNER = 'U1';ID RN
---------- ----------95412 195414 2
postgres=# SELECT ID, ROW_NUMBER() OVER(ORDER BY ID) RN FROM T WHERE OWNER = 'public';id | rn----+----1 | 1
PostgreSQL中SYSDATE可以用localtimestamp(0)来代替:
SQL> SELECT SYSDATE FROM DUAL;SYSDATE-------------------2019-06-18 14:42:15
postgres=# select localtimestamp(0);localtimestamp
---------------------2019-06-18 14:42:31
PostgreSQL中必须对子查询明确定义别名:
SQL> SELECT COUNT(*) FROM (SELECT OWNER FROM T);COUNT(*)
----------97103
postgres=# SELECT COUNT(*) FROM (SELECT OWNER FROM T) T;count
-------0
UPDATE M_SPA_INDV_ACCT_INFO_H_NEW T SET T.ISSUE_CERT_ORG_AREA = P.AREACODEFROM ( SELECT DISTINCT P1.FIN_INS_ENCODE,P1.AREACODE FROM MAN_ORG_FIN_MAP P1) P WHERE T.FIN_INS_ENCODE = P.FIN_INS_ENCODE AND (T.ISSUE_CERT_ORG_AREA NOT IN (SELECT SREALAREACODE FROM MAN_AREA_INFO) OR T.ISSUE_CERT_ORG_AREA IS NULL);
语法转换(2)
1995
merge
INTO M_SPA_ACCT_H_NEW T
using
( SELECT DISTINCT AREACODE, FIN_INS_ENCODE
FROM MAN_ORG_FIN_MAP) P
on (T.FIN_INS_ENCODE = P.FIN_INS_ENCODE
AND (T.ISSUE_CERT_ORG_AREA
NOT IN
( SELECT SREALAREACODE
FROM MAN_AREA_INFO )
OR T.ISSUE_CERT_ORG_AREA IS NULL ))
when matched THEN
UPDATE set
T.ISSUE_CERT_ORG_AREA = P.AREACODE;
UPDATE
M_SPA_ACCT_H_NEW T
SET T.ISSUE_CERT_ORG_AREA = P.AREACODE
FROM (
SELECT DISTINCT
P1.FIN_INS_ENCODE,
P1.AREACODE
FROM MAN_ORG_FIN_MAP P1) P
WHERE T.FIN_INS_ENCODE = P.FIN_INS_ENCODE
AND (T.ISSUE_CERT_ORG_AREA
NOT IN
(
SELECT SREALAREACODE FROM MAN_AREA_INFO
) OR T.ISSUE_CERT_ORG_AREA IS NULL);
存储过程修改
1995过程名 迁移完成度 代码改动量 运行效率 备注
PROC_M_SPA_ACCT_H 完成 较大 1分18秒
针对同样可执行的语句在不同数据库上执行结果 不 一 样 的 情 况 , 做SQL等价改写
PROC_GL_SUBJ_BAL 完成 基本无 32秒
PROC_RPT_AC_NVM 完成 很少 11秒
PROC_RPT_ITEM__D 完成 较少 1分08秒针对性能不足做了专门改写优化
• Oracle 数据库中的存储过程等需要修改迁移
目录
1
CONTENS
方案背景
2 PGonARM
3 技术差异
4 迁移流程
O2PG项目流程
本地数据中心
华为云平台迁移
迁移联
合小组
前期系
统调研
新系统
架构规
划
新硬件
性能评
测
迁移方
案制定
迁移方
案测试
应用级
功能测
试与性
能测试
性能分
析与提
升
迁移演
练
迁移实
施
实施后
的监控
及验证
O2PG迁移方法
迁移方式 优点 缺点
ora2pg 支持类型丰富,便捷 需要安装额外的依赖包
fdw 可以用dblink的方式insert 效率低下
ora_miggrator 可以按用户迁移 需要借助ora2pg,支持类型有限
EDB MTK 安装简洁 生成对象DDL脚本形式创建,效率较低
Glodengate 同步数据减少停机时间 需要额外的成本
Oracle PostgreSQLtool
连接源和目标数据库
选择相应的表、Schema 或数据库
使用迁移工具创建表,加载数据并保持同
步
完成迁移后,将应用程序的访问切换到目
标数据库上
O2PG-Ora2pg
Ora2pg是一个开源的工具,可以将Oracle
的数据转换成pg的格式,导入到pg数据库
中。支持表、视图、序列、物化视图和存储
过程等,功能强大。目前最新的版本是v20。
官网:http://ora2pg.darold.net
下载:github.com/darold/ora2pg/releases
配置导出表数据 ora2pg_data.conf ORACLE_HOME /u01/soft/client_1ORACLE_DSN dbi:Oracle:host=60.205.188.120;sid=devdb1;port=1528ORACLE_USER NIR_DEVORACLE_PWD BVQUrDlWlIE3SCHEMA NIR_DEVTYPE COPYPG_NUMERIC_TYPE 0PG_INTEGER_TYPE 1DEFAULT_NUMERIC float#SKIP fkeys pkeys ukeys indexes checksNLS_LANG AMERICAN_AMERICA.UTF8OUTPUT data.sql
配置导出存储过程 ora2pg_procedure.conf ORACLE_HOME /u01/soft/client_1ORACLE_DSN dbi:Oracle:host=60.205.188.120;sid=devdb1;port=1528ORACLE_USER NIR_DEVORACLE_PWD BVQUrDlWlIE3SCHEMA NIR_DEVTYPE PROCEDUREPG_NUMERIC_TYPE 0PG_INTEGER_TYPE 1DEFAULT_NUMERIC floatNLS_LANG AMERICAN_AMERICA.UTF8OUTPUT procedure.sql
[root@enmodb2]# /usr/local/bin/ora2pg -c ora2pg_table.conf[============>] 198/198 tables (100.0%) end of scanning. [============>] 198/198 tables (100.0%) end of table export.
可以依次导出表结构、表、存过等对象,其中存过需要具体验证测试一下。
O2PG-OGG
Oracle GoldenGate软件是一种基于日志的结构化数据复
制备份软件,它通过解析源数据库在线日志或归档日志获
得数据的增量变化,再将这些变化应用到目标数据库,从
而实现源数据库与目标数据库同步。
环境(源端):Oracle 11.2.0.4OGG:11.2.1.0.30
GGSCI (orcl) 1> create subdirs
Creating subdirectories under current directory /home/oracle/ggs
Parameter files /home/oracle/ggs/dirprm: already existsReport files /home/oracle/ggs/dirrpt: createdCheckpoint files /home/oracle/ggs/dirchk: created
GGSCI (orcl) 2> edit param mgr
GGSCI (orcl) 3> start mgr
SQL> connect enmotech/enmotechConnected.SQL> create table orapg (col1 number, col2 varchar2(20));
Table created.
SQL> alter table orapg add primary key (col1);
Table altered.
GGSCI (pstg) 1> create subdirs
Creating subdirectories under current directory /home/oracle/ggs
Parameter files /home/oracle/ggs/dirprm: already existsReport files /home/oracle/ggs/dirrpt: createdCheckpoint files /home/oracle/ggs/dirchk: created
GGSCI (pstg) 2> edit param mgrGGSCI (pstg) 3> start mgr
CREATE TABLE "public".”orapg"("col1" integer NOT NULL,
"col2" varchar(20),CONSTRAINT "PK_Col111" PRIMARY KEY ("col1"))
环境(目标端):PostgreSQL:9
O2PG迁移总结
• 现有Oracle环境调研• 业务对停机窗口要求• 业务连续性要求• 迁移上云总体实施计划• 迁移方案规划设计• 回退方案设计
规划设计
• 系统容量评估• 订阅配置华为云• 软件介质及环境准备• 应用和数据迁移测试• 业务测试和方案完善
实施准备• 数据迁移实施• 数据一致性检查• 迁移后应用测试• 迁移后集成测试• 生产系统迁移、切换
迁移实施
• 迁移后系统监控• 系统持续优化• 知识转移• 项目总结报告
技术支持
阶段 任务 人天 成果
规划设计
调研 4 调研文档
解决方案 6 解决方案
实施准备
应用测试和改写 30 ~100 过程改写
数据迁移测试 10 ~2T 数据迁移
迁移实施
实施迁移 4 4小时数据库迁移
技术支持
优化和服务支持 按需
云和恩墨(北京)信息技术有限公司
感谢聆听