Oracle 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 用户下:

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,建议使用新版本的驱动。

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 头
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;

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

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

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 性能分析 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

### 回答1: Oracle 11g 升级19c 需要按照一定的步骤和注意事项进行,以保证升级的顺利和数据的安全。 1. 备份当前 11g 数据库。 2. 检查当前 11g 数据库的版本和操作系统是否符合 19c 的要求。 3. 升级数据库到 12cR2 版本,如果没有升级到 12cR2,则需要升级到 12cR2 版本。 4. 使用 Database Upgrade Assistant (DBUA) 工具进行升级,或者手动执行升级脚本。 5. 检查升级后的数据库是否正常运行,并进行必要的数据库调整。 注意:升级是一个关键的过程,请确保在升级前有充分的测试和准备,以及有足够的备份。 ### 回答2: Oracle 11g升级19c是一项重要的数据库升级任务。以下是一些关于此升级过程的基本信息: 首先,升级19c需要确保你的系统满足相关的系统要求。这包括硬件要求、操作系统要求以及软件要求。确保在升级过程中没有任何的系统兼容性问题是非常重要的。 其次,为了准备升级,你需要备份你的11g数据库,以便在升级中发生问题时可以恢复到之前的状态。备份包括数据文件、控制文件和约束文件。此外,还应该进行全面的测试,以确保备份的可用性和恢复的可行性。 然后,你需要下载并安装19c的软件。在下载前,你需要检查你的Oracle支持合同是否包含了19c软件的许可。下载完成后,解压缩软件并按照安装指南进行安装。在安装过程中可以选择不同的升级选项,比如使用数据库升级向导、手动升级或使用Oracle升级工具。 一旦软件安装完成,你需要运行数据库升级向导来执行实际的升级过程。这个向导将引导你完成升级的每一步,包括检查和解决任何潜在的问题、备份控制文件和数据文件、更新Oracle字典、执行升级脚本等。 最后,在升级完成后,你需要进行全面的测试,以确保新版本的数据库正常工作。检查应用程序的兼容性,并进行必要的更改。如果有问题,你可以使用备份来恢复到11g版本,并进一步调查和解决问题。 总的来说,将Oracle 11g升级19c是一项复杂的任务,需要认真做好升级前的准备工作,并且在升级过程中小心谨慎。通过遵循Oracle官方提供的文档和最佳实践,你可以成功地升级你的数据库,从而获得更好的性能、功能和安全性。 ### 回答3: Oracle 11g是一个被广泛使用的数据库版本,但随着技术的不断进步,升级到更高版本的数据库是必不可少的。升级Oracle 19c有很多好处,以下是一些主要的原因。 首先,Oracle 19c具有更好的性能和扩展性。它引入了一些新的功能和优化,例如自动索引优化和自动调优,这可以提高数据库的性能并减少管理员的工作量。此外,19c还具有更好的并发能力,可以处理更多的并发请求,提高应用程序的响应速度。 其次,升级Oracle 19c还可以获得更好的安全性和稳定性。19c引入了一些新的安全功能,如数据红action脱敏、增强的数据保护等,可以提高数据库的安全级别。此外,19c还对存储和备份进行了优化,确保数据的完整性和可靠性。 另外,升级19c还可以享受到更好的管理工具和支持。19c提供了新的管理和监控工具,如数据库管理台(Database Management Console)和自动错误诊断工具(ADDM),这些工具可以更好地帮助管理员进行数据库维护和故障排除。此外,Oracle官方也提供了更多的支持和更新,以确保数据库的稳定和可靠运行。 最后,升级19c也可以保持与最新的技术和趋势的接轨。19c是目前Oracle发布的最新版本,可以支持最新的应用程序和框架。通过升级19c,可以保证数据库与最新的技术和趋势保持同步,并获得更好的兼容性和协作能力。 综上所述,升级Oracle 19c是一个值得推荐的选择。它可以提供更好的性能、安全性、稳定性和可管理性,同时也可以保持与最新技术的接轨。无论是从业务需求还是技术发展的角度考虑,升级19c都是一个明智的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值