华为云rds-PostgreSQL增强版提供兼容oracle功能,目前已经做到兼容oracle 90%的语法,在使用PostgreSQL增强版替换oracle的过程中,可能遇到一些问题,这里总结一下,并给出解决方案。

1.1JDBC驱动

基于oracle数据库的应用本身使用oracle的JDBC驱动,换成postgresql增强版需要将JDBC驱动换成postgresql的驱动

1.2事务处理

Oracle数据库,在同一个事务中的多个语句,如某个语句执行出错,该语句不影响其他语句的执行,如事务提交,则执行成功语句会持久化到DB中。PG数据库,在同一个事务中的多个语句,如某个SQL语句执行出错,则就算在其后执行commit,事务也会回滚。如在该出错语句之后执行其他DML语句,则会报错。因此Oracle捕获异常后是重做异常sql,而PG是先回滚事务,然后重做整个事务。

1.3查询结果预期有序一定要加order by

oracle数据库在数据量少,查询结果集小,并且数据没有更新时,结果集顺序相对稳定,但是不能绝对保证顺序,当结果集、数据量增大、数据频繁更新时,结果集一定会紊乱,PostgreSQL同理,在一定情况下PG这个情况更容易出现,因此查询结果有顺序的预期一定要加order by

1.4数据库对象大小写

oracle数据字典默认大写,PG数据字典默认小写,因此创建和引用对象时不加引号,如果涉及特殊字符,PG创建数据库对象时要小写,这样才不区分SQL的大小写

例如:oracle

SQL>   drop table test;

create   table "TEST"(ID varchar(20));

insert   into test(id) values('a');

insert   into "TEST"(id) values('b');

Table   dropped.

例如:postgresqltest=>   drop table test;

DROP TABLE

test=> create   table "TEST"(ID varchar(20));

CREATE   TABLE

test=>   insert into test(id) values('a');

ERROR:  relation "test" does not exist

LINE 1:   insert into test(id) values('a');

^

test=>   insert into "TEST"(id) values('b');

INSERT 0 1

1.5列(别)名为关键字

Oracle和PG的数据字典关键字集合是有差异、有交集的。Oracle中比如text这样的关键字可以直接作为列的别名,比如:select xx text from t,目前我们已经做了很多关键字直接作为别名的兼容,但是目前还是没有完全支持,因此建议写sql或者改问题过程中逐步加as,比如select xx as text from t

1.6sequence范围不一致

修改sequence maxvalue的值

PG范围为:1到9223372036854775807

oracle范围为:1到9.99...9 x 10125

1.7同义词

PG中没有同义词,自动创建为视图,转换过来的视图名称与存在的表名相同,需要修改视图名称。

1.8float类型精度

oracle支持float(126),PG最大支持到float(53),单在一般情况下PG的精度已经够用了,开发中遇到此类问题可以直接修改。

1.9primary等关键字不能用做列名

oracle支持primary作为列名,PG中要用primary作为列名的话需要加上双引号,例如:create   table t1(“primary” int);

建议最好不用用primary等关键字做为列名,可以修改为primary_key就没有问题了。

1.10不能modify带有view的列

Oracle可以直接modify带有view的列,PG中必须删除view才可以modify表,建议用户先删除view再modify表,最后重建view

1.11在view上创建primary key

Oracle可以在view上直接创建primary key等约束,PG中不能在view上创建约束,建议用户直接在表上创建约束。

1.12Data类型差值不一致问题

Oracle执行以下语句返回结果SQL>   select to_date('2019-06-06 11:41:07','yyyy-MM-dd HH24:mi:ss')-to_date('   2018-06-06 11:06:08','yyyy-MM-dd HH24:mi:ss') from dual;

TO_DATE('2019-06-0611:41:07','YYYY-MM-DDHH24:MI:SS')-TO_DATE('2018-06-0611:06:08

--------------------------------------------------------------------------------

365.024294

PG执行以下语句返回结果:postgres=#   select to_date('2019-06-06 11:41:07','yyyy-MM-dd HH24:mi:ss')-to_date('   2018-06-06 11:06:08','yyyy-MM-dd HH24:mi:ss') from dual;

?column?

-------------------

365 days 00:34:59

(1 row)

PG解决方案,在结果上加上一个0,让数据不做转换postgres=#   select to_date('2019-06-06 11:41:07','yyyy-MM-dd HH24:mi:ss')-to_date('   2018-06-06 11:06:08','yyyy-MM-dd HH24:mi:ss') + 0from   dual;

?column?

-------------------

365.024293981481

(1 row)

1.13使用pg_dump导出的线下库,在导入到PG线上库时报错“must member of role eas850pgnew”

原因分析:用户线下导出库是用用户eas850pgnew,查看了导出dump出的脚本,每个对象在创建完后都会有alter table xxx owner to eas850pgnew。正是这句报的错,因为用户使用了root账户创建了database,并导入到owner为root的database中,所有表默认owner都是root,而root不是超级权限,在执行alter table xxx owner to eas850pgnew时报错。

解决方法:

a.使用root创建数据库test

create database test;

b.连接上test库创建新用户eas850pgnew

create role eas850pgnew createdb createrole login password 'Perftest1!'

c.使用新用户eas850pgnew创建目标数据库eas850pgnew_ora

crete database eas850pgnew_ora;

d.使用pg_admin通过用户eas850pgnew导入库到目标库eas850pgnew_ora中

1.14时间格式不一致问题

可以按照用户使用的时间格式来设置nls_timestamp_format或则nls_date_format参数

1.15PG增强版不能在postgres库中创建role问题

a.连接数据库postgres,创建一个test库

b.连接test库,在test库中执行创建用户操作

1.16更改数据库中所有对象的owner

从oracle中迁移过来的数据库默认owner是root,需要将owner修改为用户自己新建的用户,修改方法如下:假设要将root下的test库中所有对象owner从root改为用户post

c.用post账户登录test库执行:grant post to root;

d.用root账户登录test库执行:reassign owned by root to post;

1.17PG增强版中定长字符串长度不够会补充空格

例如:char(10)类型的列,在插入数据后,长度不够会补充空格,再如,以下存储过程中用到了定长字符串,在增强版上不能返回正确的值

CREATE OR   REPLACE FUNCTION dateadd(difftype character varying, incrementvalue numeric,   inputdate timestamp with time zone)

RETURNS timestamp without time zone AS

$BODY$

DECLARE

YEAR_CONST Char(15) := 'year';

MONTH_CONST Char(15) := 'month';

WEEK_CONST Char(15) := 'week';

DAY_CONST Char(15) := 'day';

HOUR_CONST Char(15) := 'hour';

MIN_CONST Char(15) :='minute';

SECOND_CONST Char(15) :='second';

dateTemp timestamp;

intervals interval;

BEGIN

if inputdate is null then return null ;   end if;

IF lower($1) = lower(YEAR_CONST) THEN

select cast(cast(incrementvalue as   character varying) || ' year' as interval) into intervals;

ELSEIF lower($1) = lower(MONTH_CONST)   THEN

select cast(cast(incrementvalue as   character varying) || ' month' as interval) into intervals;

ELSEIF lower($1) = lower(WEEK_CONST)   THEN

select cast(cast(incrementvalue as   character varying) || ' week' as interval) into intervals;

ELSEIF lower($1) = lower(DAY_CONST)   THEN

select cast(cast(incrementvalue as   character varying) || ' day' as interval) into intervals;

ELSEIF lower($1) = lower(HOUR_CONST)   THEN

select cast(cast(incrementvalue as   character varying) || ' hour' as interval) into intervals;

ELSEIF lower($1) = lower(MIN_CONST)   THEN

select cast(cast(incrementvalue as   character varying) || ' minute' as interval) into intervals;

ELSEIF lower($1) = lower(SECOND_CONST)   THEN

select cast(cast(incrementvalue as   character varying) || ' second' as interval) into intervals;

END IF;

dateTemp:= inputdate + intervals;

RETURN dateTemp;

END;

$BODY$

LANGUAGE   PLPGSQL;

在PG增强版上执行会返回NULL,原因是char(10)=’year’其实会在year后面补充6个空格,直到长度为10,所以在PG增强版上可以使用变长字符串来解决这个问题,如下:CREATE OR   REPLACE FUNCTION dateadd(difftype character varying, incrementvalue numeric,   inputdate timestamp with time zone)

RETURNS timestamp without time zone AS

$BODY$

DECLARE

YEAR_CONST varchar(15) := 'year';

MONTH_CONST varchar(15) := 'month';

WEEK_CONST varchar(15) := 'week';

DAY_CONST varchar(15) := 'day';

HOUR_CONST varchar(15) := 'hour';

MIN_CONST varchar(15) :='minute';

SECOND_CONST varchar(15) :='second';

dateTemp timestamp;

intervals interval;

BEGIN

if inputdate is null then return null ;   end if;

IF lower($1) = lower(YEAR_CONST) THEN

select cast(cast(incrementvalue as   character varying) || ' year' as interval) into intervals;

ELSEIF lower($1) = lower(MONTH_CONST)   THEN

select cast(cast(incrementvalue as   character varying) || ' month' as interval) into intervals;

ELSEIF lower($1) = lower(WEEK_CONST)   THEN

select cast(cast(incrementvalue as   character varying) || ' week' as interval) into intervals;

ELSEIF lower($1) = lower(DAY_CONST)   THEN

select cast(cast(incrementvalue as   character varying) || ' day' as interval) into intervals;

ELSEIF lower($1) = lower(HOUR_CONST)   THEN

select cast(cast(incrementvalue as   character varying) || ' hour' as interval) into intervals;

ELSEIF lower($1) = lower(MIN_CONST)   THEN

select cast(cast(incrementvalue as   character varying) || ' minute' as interval) into intervals;

ELSEIF lower($1) = lower(SECOND_CONST)   THEN

select cast(cast(incrementvalue as   character varying) || ' second' as interval) into intervals;

END IF;

dateTemp:= inputdate + intervals;

RETURN dateTemp;

END;

$BODY$

LANGUAGE   PLPGSQL;

1.18Date类型相减返回值为interval类型的问题

例如:PG增强版下执行以下语句:glow=>   SELECT CAST('2019-06-02' AS DATE) - CAST('2019-06-01' AS DATE);

?column?

----------

1 day

(1 row)

可以看到,执行结果是一个interval类型,而在PG社区版上执行结果是一个数字glow=>   SELECT CAST('2019-06-02' AS DATE) - CAST('2019-06-01' AS DATE);

?column?

----------

1

(1 row)

如果想要在PG增强版上得到和PG社区版一样的结果,可以做如下修改:

方案1:+ 0glow=>   select cast('2019-08-08' as date) - cast('2019-08-01' as date) +0;

?column?

----------

7

(1 row)

方案2:date加上双引号glow=>   select cast('2019-08-08' as "date") - cast('2019-08-01' as   "date");

?column?

----------

7

(1 row)

1.19加密方式password_encryption=scram-sha-256导致用户无法连接

目前默认的加密方式为scram-sha-256,这种加密方式会导致部分用户客户端无法连接到服务器的问题(客户端不支持这种加密方式),一般会报如下错误:An error   occurred while establishing the connection:

Long Message:

不支援10验证类型。请核对您已经组态pg_hba.conf文件包含客户端的IP位址或网路区段,以及驱动程序所支援的验证架构模式已被支援。

Details:

Type: org.postgresql.util.PSQLException

解决方法:后台修改password_encryption=md5,然后在控制台上修改rds的root密码,密码设置可以和原来一样。

为什么要修改密码呢?

答:因为加密方式从scram-sha-256变为md5后,原来的密码用md5方式无法解开,所以需要修改密码,修改密码的过程即重新对密码进行md5加密过程。

1.20PG增强版安装插件的方式

为了安全考虑,目前不允许roor以外的用户安装插件,并且在安装插件的时候不能使用社区版的create extension ‘插件名字’的方式,我们提供了插件安装接口

Root无权限直接用create extension安装插件glow=> create   extension postgis;

ERROR:  permission denied to create extension   "postgis"

HINT:  Must be superuser to create this extension.

使用control_extension()来安装卸载插件glow=> select   control_extension('create','postgis');

control_extension

------------------------------

create postgis successfully.

(1 row)

glow=> select control_extension('drop','postgis');

control_extension

----------------------------

drop postgis successfully.

(1 row)

装oracle报temp无权限,华为云rds-PostgreSQL增强版替换Oracle常见问题以及解决方案相关推荐

  1. 华为云数据库PostgreSQL 大揭秘

    各位开发者.企业老板们,一个好消息悄然来临:即日起,1元就可以畅享4核8G的华为云数据库PostgreSQL服务1个月,快来开启专属你的PG上云之旅吧~ PostgreSQL是一种典型的开源关系型数据 ...

  2. 不想业务被中断?快来解锁华为云RDS for MySQL新特性

    本文分享自华为云社区<不想业务被中断?快来解锁华为云RDS for MySQL新特性>,作者:GaussDB 数据库. 相信很多用户在实际业务中都会碰到用户会话被中断这样的痛点,这时候其应 ...

  3. 如何从PostgreSQL源码分析哪些操作需要超级用户权限 - 阿里云rds superuser提供了哪些权限...

    标签 PostgreSQL , 超级用户 , superuser 背景 在数据库中哪些操作需要超级用户的权限才能执行? 这个问题翻文档可能翻不全面,或者是已经比较难以完成的任务. 但是从源码里面是比较 ...

  4. 【华为云技术分享】40%性能提升,华为云推出PostgreSQL 12 商用版

    摘要:日前,华为云数据库正式推出了RDS for PostgreSQL 12版本,并开始商用.本文将从华为云RDS for PostgreSQL 12的4大特性和架构图等多方面来解读华为云Postgr ...

  5. android华为登录云服务,华为云服务登录网页版

    华为云服务登录网页版是一款专为华为手机用户打造的相册管理安全储存软件,拥有一键快速恢复删除照片,安全下载查看图片,实时云端同步保存,赶紧下载体验一下吧. 华为云服务登录网页版特色 [轻松查找照片] 智 ...

  6. 华为云数据库 PostgreSQL 支持 10.3 ,高性能,新体验

    日前,华为云数据库 PostgreSQL 正式支持 PostgreSQL10.3.这是继支持PostgreSQL 10 版本.性能显著提升后的又一次优化,无论是从功能特性还是用户体验角度,无疑都为用户 ...

  7. Zabbix技术分享——如何使用zabbix监控华为云RDS

    在数字化大背景下,数据是重要的生产资料,这些数据存放在哪里,如何保障数据安全是所有企业都要考虑的事情.华为云RDS凭借安全可靠,可根据业务规模动态扩容的特性,受到越来越多中小企业的青睐,对华为云RDS ...

  8. 华为云RDS数据库测评:性能超出预期,双11优惠还在继续

    一.前言 作为一名电商行业公司的员工,深刻体会到系统大压力.高并发下保证服务的正常使用是多么严峻的挑战.双11这段时间,因为激增的使用量让我们的数据库服务严重吃紧,压力特别的大,甚至还出现了交易漏单, ...

  9. PgSQL · 应用案例 · 阿里云 RDS PostgreSQL 高并发特性 vs 社区版本

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 背景 进程模型数据库,需要为每个会话指派独立的进程与之服务,在连接数非常多,且大都是活跃连接时,进程调度浪费或引入的开 ...

最新文章

  1. sharp扫地机器人讲话_扫地机机器人,智能扫地机器人推荐
  2. c语言循环结构程序设计视频,第13讲:循环结构程序设计1
  3. 经典C语言程序100例之四三
  4. 今天开始参加ORACLE PERFORMANCE TUNING 原厂培训.
  5. log4j2.xml
  6. lagrange插值(完成)
  7. ifix如何设画面大小_天涯明月刀手游研发揭秘:如何做出有“豪华感”的国风MMO大世界?...
  8. mysql set语句_MySQL Prepared语句简介
  9. 多头注意力代码解读(非常好的一个版本)
  10. python 打包 太大 精简_极简 Python 打包指南
  11. 海龟交易法则06_掌握优势
  12. 积木机器人拼装图恐龙图纸_‎机器人积木模型--恐龙积木拼装对战游戏 v App Storu...
  13. Dreamweaver网页设计与制作100例:用DIV+CSS技术设计的书法主题网站(web前端网页制作课作业)
  14. 最新emoji表情代码大全_由一个 emoji 引发的思考
  15. java元组_Java中元组的使用
  16. flv转mp4视频格式转码教程
  17. 程序员制作epub电子书
  18. 【卷积神经网络】感受野
  19. 聚合物-化学键-聚合物PEG-Hyd-PDLLA /PLA-PHis-hyd-PEG/PEG-PUSeSe-PEG
  20. Spring In Action 4 学习笔记(一)Spring概览

热门文章

  1. minecraftjava下载地址_请问谁有我的世界1.14Java版的下载地址啊?
  2. Linux配置163源
  3. Instant的使用
  4. iOS上架app store详细教材
  5. android驱动开发基础
  6. SPL MTC MK2新一代监听控制器已发布
  7. sqllocaldb 2016安装
  8. 网络文件服务器手机版,hfs网络文件服务器(个人HTTP文件服务器)
  9. 计算机启动有一个硬件安装驱动,怎么解决电脑开机的时候总是弹出找到新的硬件向导的问题...
  10. Derby安装与环境配置