Oracle 11g 升级到 19c 需要关注的几个问题

小小小小柚子 秀才 2023-01-04 09:31:24

今天是 2022 年的最后一个工作日了,很多人都在进行年终总结,很多 APP 也都出现了年终总结,感觉年终总结这四个字最近比较火,可对于我来说,年终总结好像没什么可写的,这一年感觉都是在搞数据库升级的事,可到年底了最终核心库升级的事儿因为各种原因也没有进行,反而推迟到了二月份,那么就大概总结一下 Oracle 11g 升级到 19c 需要关注的几个问题,如果您有其他不同问题欢迎补充。

 

1、Oracle 19c 主要的新特性

  • Data Guard 备库DML自动重定向
  • Varchar2 可以支持最大 32767 字节大小
  • Oracle的混合分区表支持
  • 多实例并行重做日志应用增强
  • Multitenant Environment 多租户系统
  • In-Memory Option 内存列式存储
  • 自动创建索引(仅一体机有此功能)
  • 实时统计信息收集(仅一体机有此功能)
  • SQL隔离(仅一体机有此功能)

更多新特性请查看:

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

 

 

2、客户端连接问题

 

 

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

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

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

cd $ORACLE_HOME/network/admin目录下 新建文件sqlnet.ora

vi sqlnet.ora

SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8

然后使用正确的 IP 和用户名密码连接 Oracle 19c RAC .

3、JDBC 驱动连接问题

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

 

 

JDBC 下载链接:

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

 

Oracle JDBC FAQ

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

 

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

详细信息参考官方文档

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

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

 

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

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

wm_concat 函数创建

1.创建 type 头

CREATE OR REPLACE TYPE WM_CONCAT_IMPL AS OBJECT
-- AUTHID CURRENT_USER AS OBJECT  
(  
CURR_STR VARCHAR2(32767),   
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT WM_CONCAT_IMPL) RETURN NUMBER,  
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT WM_CONCAT_IMPL,  
P1 IN VARCHAR2) RETURN NUMBER,  
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN WM_CONCAT_IMPL,  
RETURNVALUE OUT VARCHAR2,  
FLAGS IN NUMBER)  
RETURN NUMBER,  
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT WM_CONCAT_IMPL,  
SCTX2 IN WM_CONCAT_IMPL) RETURN NUMBER  
);
/  

2.创建 type 体

CREATE OR REPLACE TYPE BODY WM_CONCAT_IMPL
IS  
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT WM_CONCAT_IMPL)  
RETURN NUMBER  
IS  
BEGIN  
SCTX := WM_CONCAT_IMPL(NULL) ;  
RETURN ODCICONST.SUCCESS;  
END;  
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT WM_CONCAT_IMPL,  
P1 IN VARCHAR2)  
RETURN NUMBER  
IS  
BEGIN  
IF(CURR_STR IS NOT NULL) THEN  
CURR_STR := CURR_STR || ',' || P1;  
ELSE  
CURR_STR := P1;  
END IF;  
RETURN ODCICONST.SUCCESS;  
END;  
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN WM_CONCAT_IMPL,  
RETURNVALUE OUT VARCHAR2,  
FLAGS IN NUMBER)  
RETURN NUMBER  
IS  
BEGIN  
RETURNVALUE := CURR_STR ;  
RETURN ODCICONST.SUCCESS;  
END;  
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT WM_CONCAT_IMPL,  
SCTX2 IN WM_CONCAT_IMPL)  
RETURN NUMBER  
IS  
BEGIN  
IF(SCTX2.CURR_STR IS NOT NULL) THEN  
SELF.CURR_STR := SELF.CURR_STR || ',' || SCTX2.CURR_STR ;  
END IF;  
RETURN ODCICONST.SUCCESS;  
END;  
END;
/  

3.创建函数

CREATE OR REPLACE FUNCTION "WM_CONCAT"(P1 VARCHAR2)
RETURN VARCHAR2 AGGREGATE USING WM_CONCAT_IMPL ;
/

4.授权及创建同义词

select 'grant execute on wm_concat to '|| USERNAME||';' from dba_users where account_status='OPEN' and DEFAULT_TABLESPACE not in ('SYSTEM','USERS'); 

grant execute on edw.wm_concat to prod;
grant execute on edw.wm_concat to prod_cc;
create public synonym wm_concat for prod.wm_concat;

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

 

 

 

 

 

 

 

 

 

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

统计用户对象的个数和类型

对象总数

select d.owner,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 
order by count(1) desc;

查找使用自建函数的 SQL

select distinct sql_id, sql_text, module
from V$SQL,
(select object_name
from DBA_OBJECTS O
where owner = 'PROD'
and object_type in ('FUNCTION', 'PACKAGE'))
where (instr(upper(sql_text), object_name) > 0)
and plsql_exec_time > 0
and regexp_like(upper(sql_fulltext), '^[SELECT]')
and parsing_schema_name = 'PROD'; 

对象类型汇总

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;

OWNER                          OBJECT_TYPE           COUNT(1)
------------------------------ ------------------- ----------
PROD                         INDEX                     7352
PROD_CC                      INDEX                     7125
PROD_OP                      INDEX                     4566
PROD                         SEQUENCE                  1151
PROD                         TABLE                     1144
PROD_CC                      SEQUENCE                  1115
PROD_CC                      TABLE                     1106
PROD_OP                      SEQUENCE                   676
PROD_OP                      TABLE                      668
PROD                         LOB                        126
PROD_CC                      LOB                        118
PROD_OP                      LOB                         55
PROD                         FUNCTION                    18
PROD_CC                      FUNCTION                    17
PROD_CB                      INDEX                       15
PROD                         PROCEDURE                    3
PROD_CB                      TABLE                        3
PROD_CC                      PROCEDURE                    2
PROD_CB                      SEQUENCE                     2
PROD                         TRIGGER                      1
PROD                         TYPE                         1
PROD_OP                      FUNCTION                     1

22 rows selected.

检查业务用户自建对象

select OWNER,OBJECT_TYPE,OBJECT_NAME from dba_objects d 
where d.owner in ('PROD','PROD_CC','PROD_OP','PROD_CB','PROD_OS') 
and OBJECT_TYPE not in ('INDEX','SEQUENCE','LOB','TABLE') 
order by 2,1;

检查无效索引

select owner,index_name,status from dba_indexes 
where status='UNUSABLE' order by 1,2;

select i.owner,i.index_name,p.partition_name,p.status 
from dba_ind_partitions p,dba_indexes i
where p.index_name=i.index_name and p.status='UNUSABLE' order by 1,2,3;

select i.owner,i.index_name,s.subpartition_name,s.status 
from dba_ind_subpartitions s,dba_indexes i 
where s.index_name=i.index_name and s.status='UNUSABLE' 
order by 1,2,3;

确认系统用户是否包含业务对象

--检查SYS和SYSTEM的重复对象,返回如下行则正常。
set line 345
col OBJECT_NAME for a40
select owner,object_name,object_type from dba_objects 
where (object_name,object_type) in 
(select object_name,object_type from dba_objects where owner='SYS') 
and owner='SYSTEM';

OWNER                          OBJECT_NAME                              OBJECT_TYPE
------------------------------ ---------------------------------------- -------------------
SYSTEM                         AQ$_SCHEDULES                     TABLE
SYSTEM                         AQ$_SCHEDULES_PRIMARY             INDEX
SYSTEM                         DBMS_REPCAT_AUTH                 PACKAGE BODY
SYSTEM                         DBMS_REPCAT_AUTH                 PACKAGE

select owner,segment_name,segment_type,tablespace_name 
from dba_segments 
where tablespace_name in('SYSTEM','SYSAUX') 
and owner in ('PROD','PROD_CC','PROD_OP','PROD_CB','PROD_OS'); 

6、SQL 执行计划变差问题

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

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

7、Oracle19c 不再支持的功能

 

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

DBA 需要关注的几个参数

 

9、最后,要说的一句话:测试、测试、测试,一定要测试验证。
10、如果还有其他问题欢迎补充,谢谢。
全文完,希望可以帮到正在阅读的你,如果觉得此文对你有帮助,可以分享给你身边的朋友,同事,你关心谁就分享给谁,一起学习共同进步~~~

欢迎关注我的公众号【JiekeXu DBA之路】,第一时间一起学习新知识!
————————————————————————————
公众号:JiekeXu DBA之路
CSDN :https://blog.csdn.net/JiekeXu
墨天轮:https://www.modb.pro/u/4347
腾讯云:https://cloud.tencent.com/developer/user/5645107
————————————————————————————

...全文
1877 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

79,606

社区成员

发帖
与我相关
我的任务
社区描述
汇集数据库的爱好者和关注者,大家共同学习、探索、分享数据库前沿知识和技术,像松鼠一样剥开科学的坚果;交流Gauss及其他数据库的使用心得和经验,互助解决问题,共建数据库技术交流圈。
数据库数据仓库 企业社区 北京·海淀区
社区管理员
  • Gauss松鼠会
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

欢迎大家同时关注Gauss松鼠会专家酷哥。

https://www.zhihu.com/people/ku-ge-78-98

试试用AI创作助手写篇文章吧