今天是 2022 年的最后一個工作日了,很多人都在進行年終總結,很多 APP 也都出現了年終總結,感覺年終總結這四個字最近比較火,可對于我來說,年終總結好像沒什么可寫的,這一年感覺都是在搞數據庫升級的事,可到年底了最終核心庫升級的事兒因為各種原因也沒有進行,反而推遲到了二月份,那么就大概總結一下 Oracle 11g 升級到 19c 需要關注的幾個問題,如果您有其他不同問題歡迎補充。


好了,進入到今天的主題 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 PROD.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 PROD.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 PROD."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 prod.wm_concat to prod;
grant execute on prod.wm_concat to prod_cc;
grant execute on prod.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
墨天輪:http://www.sunline.cc/u/4347
騰訊云:https://cloud.tencent.com/developer/user/5645107
————————————————————————————





