《2019年金融保险系统逃离Oracle的正确姿势.pdf》由会员分享,可在线阅读,更多相关《2019年金融保险系统逃离Oracle的正确姿势.pdf(74页珍藏版)》请在三个皮匠报告上搜索。
1、金融保险系统逃离Oracle的正确姿势让应用先跑起来技术选型让应用跑的更好、更快让应用跑的更稳定、更安全技术选型架构对比-高可用模式ADGADGOracle ADGStreamStreamPostgreSQL Stream架构对比-分片模式Oracle ShardingPostgreSQL(XC/XL)Shard DirectorADGGTMCoordinatorStreamShard Catalog架构对比-集群模式Oracle RAC模式PostgreSQLInstance 1Instance 2hbADG架构对比-读写分离模式OraclePostgreSQL 读写分离模式pgpoolSt
2、reamStream读、写读 PostgreSQL(PG)与Oracle确实很像,包括架构、数据安全等 PG提供了丰富的可选择架构,满足各种不同的场景 PG有效遵从SQL标准,这让应用迁移难度降低 有丰富的可选择组件,极易扩展 PG的代码组织的很规范让应用先跑起来能不能让应用正确的跑起来,这是事关生存的问题填“坑”指南字符集数据类型SQL语法操作符SQL行为DBLINK空串()与NULL同义词包及存储过程常用函数1、字符集问题 PG服务端不支持GBK 建议使用UTF8 不推荐使用EUC_CN 例如:“瑄”在EUC_CN下就无法编码 2、多行注释问题 上述注释在Oracle中是合法的 在PG中是
3、非法的/*some comments/*other comments/*/-合法的PostgreSQL注释格式:-This is a standard SQL comment/*multiline comment*with nesting:/*nested comment*/*/可以使用PLY(Python-Lex-Yacc)将注释自动改写掉3、NUMERIC类型问题 上述声明在Oracle中是合法的 但在PG中是非法的 PG不支持不支持负值的scale 也不支持不支持scale大于precisiona NUMBER(6,-2)a NUMBER(2,3)precision scale 负值sc
4、ale的解决方法:使用触发器,在触发器中调用round函数 SELECT round(123.6,-2);round-100(1 row)scale大于precision的解决方法:NUMBER(2,3)=NUMERIC(3,3)增加CHECK(col SELECT cast(123456789.9 as VARCHAR2(8)from dual;SELECT cast(123456789.9 as VARCHAR2(8)from dual*ERROR at line 1:ORA-25137:Data value out of rangeOracle#SELECT 123456789.9:va
5、rchar(8);varchar -12345678(1 row)PG中会被截断而不报错5、CHAR类型问题 DESC tcName Null?Type-A CHAR(4)INSERT INTO tc VALUES(1);SELECT length(a)FROM tc;LENGTH(A)-4 SELECT count(*)FROM tc WHERE a=1 ;COUNT(*)-1 SELECT length(1 )FROM dual;LENGTH(1)-4#dS tcTable public.tcColumn|Type|Collation|Nullable|Default-+-+-+-+-a|
6、character(4)|#INSERT INTO tc VALUES(1);#SELECT length(a)FROM tc;length-1#SELECT count(*)FROM tc WHERE a=1 ;count-1#SELECT length(1 );length-46、SEQUENCE最大值问题 PG的SEQUENCE最大值:9223372036854775807(bigint)而Oracle中的SEQUENCE最大值可达28位十进制值 一般情况下PG的SEQUENCE是足够的 但可能也存在一些特殊情况:LISCODE.SEQ_YBTBATTRANS_ID 1000000000