当前位置:   article > 正文

Oracle 11g 升级到 19c 需要关注的几个问题_11g到19c 不兼容的函数

11g到19c 不兼容的函数

de488a6c65e9009d41f8b39f810ab52a.gif

作者 | JiekeXu

来源 |公众号 JiekeXu DBA之路(ID: JiekeXu_IT)

如需转载请联系授权 | (个人微信 ID:JiekeXu_DBA)

大家好,我是 JiekeXu,很高兴又和大家见面了,今天和大家一起来看看 Oracle 11g 升级到 19c 需要关注的几个问题,欢迎点击上方蓝字“JiekeXu DBA之路”关注我的公众号,标星或置顶,更多干货第一时间到达!

今天是 2023 年新年后第一天上班,开工大吉!不过估计也有很多人也还没有上班,年前写的这篇文章没想到居然有三十多人收藏,索性在这里也发一下吧。在过去的一年里感觉都是在搞数据库升级的事,可到年底了最终核心库升级的事儿因为各种原因也没有进行,反而推迟到了今年二月份,那么就大概总结一下 Oracle 11g 升级到 19c 需要关注的几个问题,如果您有其他不同意见或建议欢迎私聊补充,非常感谢。

dd22767c64952d7b639ae71ddb16e3ec.png

172d257f933733fdb63df5045abcd2b0.png

好了,进入到今天的主题 Oracle 11g 升级到 19c 需要关注的几个问题:

0、Oracle 迁移升级的方式及优劣比较

1、Oracle 19c 主要的新特性

  • Data Guard 备库 DML 自动重定向

  • Varchar2 可以支持最大 32767 字节大小

  • Oracle 的混合分区表支持

  • 多实例并行重做日志应用增强

  • Multitenant Environment 多租户系统

  • In-Memory Option 内存列式存储

  • 自动创建索引(仅一体机有此功能)

  • 实时统计信息收集(仅一体机有此功能)

  • SQL 隔离(仅一体机有此功能)

更多新特性请查看:

https://apex.oracle.com/database-features/

60417483fa29f0394384a3d3154579c6.png

2、客户端连接问题

bb06e55d7ced64a87cc687f44d2bd612.png

使用原有的 PLSQL、Dbeaver 等去连接数据库时,由于软件驱动问题,可能会存在连接报错。

“登陆失败,登陆信息不正确”或“ORA-28040:没有匹配的验证协议”

解决方案:使用新版本的客户端连接或者做如下调整
在 Oracle 19C 服务器端 Oracle 用户下:

  1. cd $ORACLE_HOME/network/admin目录下 新建文件sqlnet.ora
  2. vi sqlnet.ora
  3. SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
  4. SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8

然后使用正确的 IP 和用户名密码连接 Oracle 19c RAC .如果还报用户密码错误,需要再次修改原密码后再尝试连接登录。

3、JDBC 驱动连接问题

原来的驱动程序有可能不支持 19c,建议使用新版本的驱动。

14ddbdb4532544b5e25fc32842dcc758.png

JDBC 下载链接:

https://www.oracle.com/database/technologies/appdev/jdbc-downloads.html

bf18516fc3bb2c7caf08c59ce7eb0402.png

Oracle JDBC FAQ

https://www.oracle.com/technetwork/database/enterprise-edition/jdbc-faq-090281.html

84a53f3b5500ffedf52ef5286a3eec80.png

4、PLSQL、函数、存储过程问题

详细信息参考官方文档

https://docs.oracle.com/en/database/oracle/oracle-database/19/upgrd/loe.html

如下所示,可能有一些 SQL 在原有 11g 环境运行正常,但在 19c 环境下会出错。

bb24078c4b038d7de30cc65b50ce521b.png

此类问题则为 PLSQL、函数、存储过程等的语法问题,需要开发人员重构代码解决。例如:LISTAGG 聚合函数现在支持通过使用新的 DISTINCT 关键字来消除重复项。LISTAGG 聚合函数根据 ORDER BY 表达式对查询中每个组的行进行排序,然后将值连接成单个字符串。在串联成单个字符串之前,可以使用 new DISTINCT 关键字从指定的表达式中删除重复值。这样就无需在使用聚合 LISTAGG 函数之前创建复杂的查询处理来查找不同的值。使用“DISTINCT”选项删除 LISTAGG 函数中的重复值。

另外,如果在 11g 中使用了 wm_concat 函数,19c 中已经没有这个函数了,开发人员需要修改 SQL 语法或者新建这个函数也可以。

wm_concat 函数创建
1.创建 type 头
  1. CREATE OR REPLACE TYPE WM_CONCAT_IMPL AS OBJECT
  2. -- AUTHID CURRENT_USER AS OBJECT
  3. (
  4. CURR_STR VARCHAR2(32767),
  5. STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT WM_CONCAT_IMPL) RETURN NUMBER,
  6. MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT WM_CONCAT_IMPL,
  7. P1 IN VARCHAR2) RETURN NUMBER,
  8. MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN WM_CONCAT_IMPL,
  9. RETURNVALUE OUT VARCHAR2,
  10. FLAGS IN NUMBER)
  11. RETURN NUMBER,
  12. MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT WM_CONCAT_IMPL,
  13. SCTX2 IN WM_CONCAT_IMPL) RETURN NUMBER
  14. );
  15. /
2.创建 type 体
  1. CREATE OR REPLACE TYPE BODY WM_CONCAT_IMPL
  2. IS
  3. STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT WM_CONCAT_IMPL)
  4. RETURN NUMBER
  5. IS
  6. BEGIN
  7. SCTX := WM_CONCAT_IMPL(NULL) ;
  8. RETURN ODCICONST.SUCCESS;
  9. END;
  10. MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT WM_CONCAT_IMPL,
  11. P1 IN VARCHAR2)
  12. RETURN NUMBER
  13. IS
  14. BEGIN
  15. IF(CURR_STR IS NOT NULL) THEN
  16. CURR_STR := CURR_STR || ',' || P1;
  17. ELSE
  18. CURR_STR := P1;
  19. END IF;
  20. RETURN ODCICONST.SUCCESS;
  21. END;
  22. MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN WM_CONCAT_IMPL,
  23. RETURNVALUE OUT VARCHAR2,
  24. FLAGS IN NUMBER)
  25. RETURN NUMBER
  26. IS
  27. BEGIN
  28. RETURNVALUE := CURR_STR ;
  29. RETURN ODCICONST.SUCCESS;
  30. END;
  31. MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT WM_CONCAT_IMPL,
  32. SCTX2 IN WM_CONCAT_IMPL)
  33. RETURN NUMBER
  34. IS
  35. BEGIN
  36. IF(SCTX2.CURR_STR IS NOT NULL) THEN
  37. SELF.CURR_STR := SELF.CURR_STR || ',' || SCTX2.CURR_STR ;
  38. END IF;
  39. RETURN ODCICONST.SUCCESS;
  40. END;
  41. END;
  42. /
3.创建函数
  1. CREATE OR REPLACE FUNCTION "WM_CONCAT"(P1 VARCHAR2)
  2. RETURN VARCHAR2 AGGREGATE USING WM_CONCAT_IMPL ;
  3. /
4.授权及创建同义词
  1. select 'grant execute on wm_concat to '|| USERNAME||';' from dba_users where account_status='OPEN' and DEFAULT_TABLESPACE not in ('SYSTEM','USERS');
  2. grant execute on edw.wm_concat to prod;
  3. grant execute on edw.wm_concat to prod_cc;
  4. create public synonym wm_concat for prod.wm_concat;

下图列出一些已知的常用函数,需要开发人员检查是否使用到如下对象是否使用,如使用需要寻找对应替代方案。

259c19bd6fe93ef59358fd6bf07047ba.png
c7fb32e4e9cb97c323d20f196d6a2544.png
d9296f636cb495ba5c098f39e47982e8.png
a713e2928eef01cb5b1b8d6b41b74300.png
520c3246b55939df5ed954da874418d7.png
567ecd99d42561f52b8c350a119ed262.png
8fbde2fb16d044d44137667469b93441.png
8a890fad142492c83382ff64ed83d790.png
24033556de3bbf060a8d6910217899e2.png

5、开发需要关注自建的存储过程、函数的兼容问题

统计用户对象的个数和类型
  1. 对象总数
  2. select d.owner,count(1) from dba_objects d
  3. where d.owner in ('PROD','PROD_CC','PROD_OP','PROD_CB','PROD_OS')
  4. and d.owner not in ('PUBLIC')
  5. and not exists (select 1 from dba_recyclebin b
  6. where b.object_name=d.object_name
  7. and d.owner = b.owner)
  8. group by d.owner
  9. order by count(1) desc;
  10. 查找使用自建函数的 SQL
  11. select distinct sql_id, sql_text, module
  12. from V$SQL,
  13. (select object_name
  14. from DBA_OBJECTS O
  15. where owner = 'PROD'
  16. and object_type in ('FUNCTION', 'PACKAGE'))
  17. where (instr(upper(sql_text), object_name) > 0)
  18. and plsql_exec_time > 0
  19. and regexp_like(upper(sql_fulltext), '^[SELECT]')
  20. and parsing_schema_name = 'PROD';
  21. 对象类型汇总
  22. select d.owner,d.object_type,count(1) from dba_objects d where d.owner in ('PROD','PROD_CC','PROD_OP','PROD_CB','PROD_OS') and d.owner not in ('PUBLIC') and not exists (select 1 from dba_recyclebin b where b.object_name=d.object_name and d.owner = b.owner) group by d.owner,d.object_type order by count(1) desc;
  23. OWNER OBJECT_TYPE COUNT(1)
  24. ------------------------------ ------------------- ----------
  25. PROD INDEX 7352
  26. PROD_CC INDEX 7125
  27. PROD_OP INDEX 4566
  28. PROD SEQUENCE 1151
  29. PROD TABLE 1144
  30. PROD_CC SEQUENCE 1115
  31. PROD_CC TABLE 1106
  32. PROD_OP SEQUENCE 676
  33. PROD_OP TABLE 668
  34. PROD LOB 126
  35. PROD_CC LOB 118
  36. PROD_OP LOB 55
  37. PROD FUNCTION 18
  38. PROD_CC FUNCTION 17
  39. PROD_CB INDEX 15
  40. PROD PROCEDURE 3
  41. PROD_CB TABLE 3
  42. PROD_CC PROCEDURE 2
  43. PROD_CB SEQUENCE 2
  44. PROD TRIGGER 1
  45. PROD TYPE 1
  46. PROD_OP FUNCTION 1
  47. 22 rows selected.
  48. 检查业务用户自建对象
  49. select OWNER,OBJECT_TYPE,OBJECT_NAME from dba_objects d
  50. where d.owner in ('PROD','PROD_CC','PROD_OP','PROD_CB','PROD_OS')
  51. and OBJECT_TYPE not in ('INDEX','SEQUENCE','LOB','TABLE')
  52. order by 2,1;
  53. 检查无效索引
  54. select owner,index_name,status from dba_indexes
  55. where status='UNUSABLE' order by 1,2;
  56. select i.owner,i.index_name,p.partition_name,p.status
  57. from dba_ind_partitions p,dba_indexes i
  58. where p.index_name=i.index_name and p.status='UNUSABLE' order by 1,2,3;
  59. select i.owner,i.index_name,s.subpartition_name,s.status
  60. from dba_ind_subpartitions s,dba_indexes i
  61. where s.index_name=i.index_name and s.status='UNUSABLE'
  62. order by 1,2,3;
  63. 确认系统用户是否包含业务对象
  64. --检查SYS和SYSTEM的重复对象,返回如下行则正常。
  65. set line 345
  66. col OBJECT_NAME for a40
  67. select owner,object_name,object_type from dba_objects
  68. where (object_name,object_type) in
  69. (select object_name,object_type from dba_objects where owner='SYS')
  70. and owner='SYSTEM';
  71. OWNER OBJECT_NAME OBJECT_TYPE
  72. ------------------------------ ---------------------------------------- -------------------
  73. SYSTEM AQ$_SCHEDULES TABLE
  74. SYSTEM AQ$_SCHEDULES_PRIMARY INDEX
  75. SYSTEM DBMS_REPCAT_AUTH PACKAGE BODY
  76. SYSTEM DBMS_REPCAT_AUTH PACKAGE
  77. select owner,segment_name,segment_type,tablespace_name
  78. from dba_segments
  79. where tablespace_name in('SYSTEM','SYSAUX')
  80. and owner in ('PROD','PROD_CC','PROD_OP','PROD_CB','PROD_OS');
6、SQL 执行计划变差问题

升级后可能会有些 SQL 语句性能变差,这块需要 DBA 介入,重新收集统计信息、固定执行计划或者使用 SPA(SQL 性能分析 SQL Performance Analyzer) 等技术检查,官方文档:Oracle Database Testing Guide 19c

https://docs.oracle.com/en/database/oracle/oracle-database/19/ratug/index.html

a6337f720181933a2abf11838a4e8a3f.png

7、Oracle19c 不再支持的功能

官方资料

60c1ffb757451e6ce27215a1da1929db.png
476f7af9b0154d49249e915375d49ed9.png

8、Oracle 19c 不再支持的参数

DBA 需要关注的几个参数
0739d3221342dd707df57069ee4d095b.png

9、最后,要说的一句话:测试、测试、测试,一定要测试验证。
10、如果还有其他问题欢迎补充,谢谢。

3adc696aa5617d84e3eb2034aeb4b49c.png
全文完,希望可以帮到正在阅读的你,如果觉得此文对你有帮助,可以分享给你身边的朋友,同事,你关心谁就分享给谁,一起学习共同进步~~~

欢迎关注我的公众号【JiekeXu DBA之路】,第一时间一起学习新知识!

————————————————————————————
公众号:JiekeXu DBA之路
CSDN :https://blog.csdn.net/JiekeXu
墨天轮:https://www.modb.pro/u/4347
腾讯云:https://cloud.tencent.com/developer/user/5645107
————————————————————————————

f8f8f06ca051b04a6e9f196d49b4d31d.gif

Oracle 表碎片检查及整理方案

OGG|Oracle GoldenGate 基础

2022 年公众号历史文章合集整理

2021 年公众号历史文章合集整理

2020 年公众号历史文章合集整理

Oracle 19c RAC 遇到的几个问题

OGG|Oracle 数据迁移后比对一致性

利用 OGG 迁移 Oracle11g 到 19C

OGG|Oracle GoldenGate 微服务架构

Oracle 查询表空间使用率超慢问题一则

国产数据库|TiDB 5.4 单机快速安装初体验

Oracle ADG 备库停启维护流程及增量恢复

Linux 环境搭建 MySQL8.0.28 主从同步环境

be9bbbe27dcca54c5427d65463d0c43e.png

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号