背景:
由於現上的rds數據庫需要在2021年1月1日之前,從oracle 11.2.0.4升級到19c,現在需要我測試升級后業務兼容不,所以,需要我把准生產linux 11.2.0.4的oracle升級到19c
文章參考資料來自support文檔 ID 2548962.1,Doc ID 2577572.1
oracle升級到19C有直接和間接升級,11.2.0.4以下的版本需要先升級到11.2.0.4然后再升級到19c;11.2.0.4以上版本可以直接升級。而我的版本是11.2.0.4,所以升級成非CDB的數據庫。
19c升級步驟
升級環境
服務器os linux7.5 內存256G cpu 32核
oracle 版本 11.2.0.4 數據量240G
oracle 19c軟件靜默安裝時間約5-10分鍾
oracle 11.2.0.4升級到19c升級時間 約60分鍾
1.備份
這個可以邏輯的或RMAN的備份
2.安裝19軟件的步驟
把新建的ORACLE_HOME目錄(我的是/u01/app/oracle/product/19c/dbhome_1)建好,解壓下載的19軟件(修改解壓文件的權限)
oracle用戶:
mkdir -p /u01/app/oracle/product/19c/dbhome_1 (root用戶需要修改權限)
cd /u01/app/oracle/product/19c/dbhome_1/
靜默安裝的話:
設置好
新的ORACLE_HOME,ORACLE_BASE
對應的參數按照實際需要進行修改
./runInstaller -ignorePrereq -waitforcompletion -silent \
-responseFile ${ORACLE_HOME}/install/response/db_install.rsp \
oracle.install.option=INSTALL_DB_SWONLY \
ORACLE_HOSTNAME=${ORACLE_HOSTNAME} \
UNIX_GROUP_NAME=oinstall \
INVENTORY_LOCATION=${ORA_INVENTORY} \
SELECTED_LANGUAGES=en,en_GB \
ORACLE_HOME=${ORACLE_HOME} \
ORACLE_BASE=${ORACLE_BASE} \
oracle.install.db.InstallEdition=EE \
oracle.install.db.OSDBA_GROUP=dba \
oracle.install.db.OSBACKUPDBA_GROUP=dba \
oracle.install.db.OSDGDBA_GROUP=dba \
oracle.install.db.OSKMDBA_GROUP=dba \
oracle.install.db.OSRACDBA_GROUP=dba \
SECURITY_UPDATES_VIA_MYORACLESUPPORT=false \
DECLINE_SECURITY_UPDATES=true
圖形界面安裝:
./runInstaller -ignoreInternalDriverError
3.進行升級前檢查
3.1清理數據庫
清空回收站
檢查 SYS 及 SYSTEM 用戶的失效對象
檢查 SYS 及 SYSTEM 用戶下的重復對象
檢查失效的、必需的、廢棄的組件
3.2 檢查所有的物化視圖
檢查所有的物化視圖的狀態,刷新所有沒有刷新的物化視圖。
檢查物化視圖日志的大小,如果物化視圖日志的行數非零,那么刷新物化視圖。
檢查 direct loader 日志以及 PMOP 日志(分區維護操作日志),如果 direct loader log 或者 PMOP 日志非空,那么刷新日志顯示的物化視圖。升級數據庫前,必須確保所有的物化視圖都已經刷新完畢。
執行下面的 SQL 查詢:
3.3Schema-Only 的用戶以及升級密碼狀態為 EXPIRED 的用戶
在開始升級之前,請確定是否要對密碼處於EXPIRED狀態且其帳戶處於LOCKED狀態的默認Oracle數據庫帳戶使用密碼身份驗證。
在升級到 Oracle Database 19c 之后,默認的 Oracle 賬號(沒有設置密碼並且處於 EXPIRED 和 LOCKED 狀態)會被置為 NO AUTHENTICATION 狀態。
由於此新功能,這些默認賬號會變為 schema-only 帳戶,並無法使用密碼驗證。此功能的好處是管理員不再需要定期修改這些Oracle默認賬號的密碼。
此功能還可以降低未授權者使用默認密碼侵入這些帳戶的安全風險。
3.4復制 Transparent Encryption Oracle 錢包
如果使用了帶 Oracle 錢包的 Transparent Data Encryption (TDE),那么拷貝 thesqlnet.ora 和 wallet 文件到新的Oracle home。在升級前需要手工拷貝 sqlnet.ora 和 wallet 文件。
- 以授權用戶身份登錄。
- 手工拷貝 sqlnet.ora,wallet 文件以及 ewallet.p12,到新的 Oracle home。
打開數據庫 wallet。
例如:
SQL> ALTER SYSTEM SET ENCRYPTION WALLET OPEN
3.5理解密碼大小寫敏感
從 Oracle Database 12c release 2 (12.2) 開始,默認的基於密碼驗證的協議排除了大小寫不敏感的 10g 版本的密碼。默認的SQLNET.ORA文件中參數SQLNET.ALLOWED_LOGON_VERSION_SERVER被設置成了 12 (排他模式)。
為了安全起見,Oracle建議使用大小寫敏感的密碼驗證。這是默認的設置。但是在升級數據庫的時候可以短暫的關閉大小寫敏感的密碼驗證。在升級后,可以再決定是否啟用大小寫敏感的密碼驗證。
在升級前,Oracle建議您檢查是否新的密碼驗證會影響您的應用。可以做下面的檢查:
- 檢查是否有用戶使用了 10g 大小寫不敏感的密碼驗證方式。
- 檢查是否使用了尚未安裝 CPUOct2012 補丁的11.2.0.3或者更早版本的客戶端,或者應用了這個補丁但尚未啟用大小寫敏感的密碼版本。
- 確認您並未設置SEC_CASE_SENSITIVE_LOGON成FALSE。設置SEC_CASE_SENSITIVE_LOGON為FALSE就無法啟用大小寫敏感的密碼版本了(11G和12C的密碼版本)
3.6對只讀表空間升級
以 -T 參數使用 Parallel Upgrade Utility 可以在升級時把用戶表空間置為只讀。 因為數據庫可以讀取之前版本創建的數據文件 header, 所以在升級時我們不需要做額外的操作。當升級完成后,表空間被置為讀寫時,文件 header 會自動被更新。如果升級失敗,無法把表空間重新 online,那么檢查升級日志。日志中包含把表空間重新 online 的語句。可以在數據庫中或者每個pdb里手工執行來 online 表空間。
在升級日志文件中找到表空間相關的命令
如果升級失敗可以檢查升級的日志 (Oracle_base/cfgtoologs/dbua), 並且手工執行日志中的命令來 online 表空間。可以檢查如下日志:
Non-CDB 升級: catupgrd0.log
PDB 數據庫: catupgrdpdbname0.log, 這里 pdbname 是要升級的 pdb 的名字。
在每個日志文件的開始部分,可以找到把表空間置為只讀的命令:
Tablespace altered.
而在每個日志文件的結尾部分,可以找到把表空間置為讀寫的SQL命令:
Tablespace altered.
出於安全考慮,不同的 Windows 賬戶配置為 Oracle home 不允許共享同一個 Oracle Base。
步驟 4: Preupgrade 步驟
在源庫執行 Preupgrade 腳本
升級前在 11.2 數據庫上執行 OLS preprocess 腳本:
如果要升級的數據庫安裝有 Oracle Label Security,那么賦予SYS以DV_PATCH_ADMIN的角色
升級前在 11.2 數據庫上執行 OLS preprocess 腳本:
1. 從 19c 的 Oracle Home 下拷貝以下腳本到源庫的 Oracle Home(11.2) 下。
ORACLE_HOME/rdbms/admin/emremove.sql
ORACLE_HOME/olap/admin/catnoamd.sql
2. 啟動 SQL*Plus 並以 DVOWNER 登錄到要升級的數據庫。
3. 執行下面的SQL:
4. 使用 SYS as SYSDBA 登陸數據庫:
5. 執行 Data Vault preprocess 腳本:
ORACLE_HOME/rdbms/admin/emremove.sql
ORACLE_HOME/olap/admin/catnoamd.sql
6. 執行完畢后,以 DVOWNER 登陸數據庫
7. 執行下面的SQL:
對於Database Vault,賦予SYS以DV_PATCH_ADMIN的角色
如果啟用了Database Vault,那么也需要做對應的檢查,檢查步驟需要執行下面的SQL腳本 - olspreupgrade.sql, emremove.sql, catnoamd.sql
以 DVOWNER 登陸要升級的數據庫
執行下面的SQL:
使用 emremove.sql 手工刪除 DB control
關閉 DB control
使用 sysdba 登陸
SQL>SET SERVEROUTPUT ON
SQL>@emremove.sql >> Script located in new 12c ORACLE_HOME/rdbms/admin
從系統中手工刪除ORACLE_HOME/HOSTNAME_SID/ 和 ORACLE_HOME/oc4j/j2ee/OC4J_DBConsole_HOSTNAME_SID 目錄
如果是 windows 系統則刪除 DB Console 的系統服務 OracleDBConsoleSID
確保升級前所有的文件都沒有處於備份模式
執行下面的語句:
清空回收站
要清空回收站,執行下面的語句:
注意: 升級前務必清空回收站來避免 ORA-00600 錯誤並且減少升級時間。
性能方面
保存性能相關指標
檢查網絡性能
收集優化器統計信息
收集統計信息可以減少停機時間,Oracle建議使用 DBMS_STATS.GATHER_DICTIONARY_STATS 來收集這些統計信息,比如:
檢查時區設置
源庫的 time zone 文件版本應該小於或者等於目標庫的 time zone 文件版本。如果源庫的 time zone 文件版本更高,那么需要升級目標庫的 time zone 文件版本來對應源庫的 time zone 文件。
關於升級 Oracle OLAP Data Security Policies
在 11g 數據庫上定義的 Data security roles 不能自動轉換成 ORAS。所以在升級前,需要刪除所有在 11g 數據庫上定義的 data security roles。升級后可以使用新版本的 Analytic Workspace Manager 重新定義 data security roles。
如果從 11g 升級到 12c 之前未刪除 data security roles,那么所有的 data security policies 以及 data security role 都會在新版本上失效。
步驟
5.升級具體步驟
19c linux7需要安裝的yum包:
yum install -y bc yum install -y binutils yum install -y compat-libcap1 yum install -y compat-libstdc++-33 #yum install -y dtrace-modules #yum install -y dtrace-modules-headers #yum install -y dtrace-modules-provider-headers yum install -y dtrace-utils yum install -y elfutils-libelf yum install -y elfutils-libelf-devel yum install -y fontconfig-devel yum install -y glibc yum install -y glibc-devel yum install -y ksh yum install -y libaio yum install -y libaio-devel yum install -y libdtrace-ctf-devel yum install -y libXrender yum install -y libXrender-devel yum install -y libX11 yum install -y libXau yum install -y libXi yum install -y libXtst yum install -y libgcc yum install -y librdmacm-devel yum install -y libstdc++ yum install -y libstdc++-devel yum install -y libxcb yum install -y make yum install -y net-tools # Clusterware yum install -y nfs-utils # ACFS yum install -y python # ACFS yum install -y python-configshell # ACFS yum install -y python-rtslib # ACFS yum install -y python-six # ACFS yum install -y targetcli # ACFS yum install -y smartmontools yum install -y sysstat # Added by me. yum install -y unixODBC
linux 8需要安裝的包:
dnf install -y bc dnf install -y binutils #dnf install -y compat-libcap1 dnf install -y compat-libstdc++-33 #dnf install -y dtrace-modules #dnf install -y dtrace-modules-headers #dnf install -y dtrace-modules-provider-headers #dnf install -y dtrace-utils dnf install -y elfutils-libelf dnf install -y elfutils-libelf-devel dnf install -y fontconfig-devel dnf install -y glibc dnf install -y glibc-devel dnf install -y ksh dnf install -y libaio dnf install -y libaio-devel #dnf install -y libdtrace-ctf-devel dnf install -y libXrender dnf install -y libXrender-devel dnf install -y libX11 dnf install -y libXau dnf install -y libXi dnf install -y libXtst dnf install -y libgcc dnf install -y librdmacm-devel dnf install -y libstdc++ dnf install -y libstdc++-devel dnf install -y libxcb dnf install -y make dnf install -y net-tools # Clusterware dnf install -y nfs-utils # ACFS dnf install -y python # ACFS dnf install -y python-configshell # ACFS dnf install -y python-rtslib # ACFS dnf install -y python-six # ACFS dnf install -y targetcli # ACFS dnf install -y smartmontools dnf install -y sysstat # Added by me. dnf install -y unixODBC # New for OL8 dnf install -y libnsl dnf install -y libnsl.i686 dnf install -y libnsl2 dnf install -y libnsl2.i686
啟動預檢查:
export ORACLE_HOME=/u01/app/oracle/product/11.2.0.4
/u01/app/oracle/product/11.2.0/dbhome_1/jdk/bin/java -jar /u01/app/oracle/product/19c/dbhome_1/rdbms/admin/preupgrade.jar FILE TEXT DIR /u01/app/oracle/precheck
查看生成的
/u01/app/oracle/precheck下的日志
如果有問題的,執行 postupgrade_fixups.sql
安裝19軟件--這一步已經安裝了。
db_recovery_file_dest string /u01/app/oracle/fast_recovery_area
db_recovery_file_dest_size big integer 80G 這個是、我是設置的很大。
5.1關閉數據庫
PURGE DBA_RECYCLEBIN;
lsnrctl stop;
SHUTDOWN IMMEDIATE;
為升級新的Oracle Home做准備
- 從要升級的數據庫 Home 拷貝配置文件到新的版本的Oracle Home中。
- 如果您有一個 password 文件,那么把它從舊的 Oracle home 拷貝到新的 Oracle home。推薦重建 password 文件以利用 orapwd 的新功能,如果有的話。
- 從參數文件中刪除所有廢棄的參數。在新的版本的數據庫里有一些參數已經被廢棄。從要啟動新版本的數據庫的參數文件中刪除所有被廢棄的參數,否則會在啟動時產生錯誤。同時,修改那些在新版本里格式已經被改變的參數。
- 如果要升級的是集群數據庫,那么需要在升級前修改參數 CLUSTER_DATABASE 為 FALSE。
設置環境變量指向目標 ORACLE_HOME
新的ORACLE_HOME為
export ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_BASE=/u01/app/oracle --我的還是之前那個base目錄
從舊的Oracle home下拷貝 SPFILE.ORA 或者 INIT.ORA到目標Oracle home,PURGE DBA_RECYCLEBIN然后把
使用目標 ORACLE_HOME(設置 ORACLE_HOME 為目標 ORACLE_HOME)啟動數據庫到 upgrade 模式(后續需要把sqlnet.ora,tnsnames.ora,listerner.ora復制到新的目錄)
cp /u01/app/oracle/product/11.2.0/dbhome_1/dbs/spfiletest19c.ora /u01/app/oracle/product/19c/dbhome_1/dbs/
cp /u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapwtest19c /u01/app/oracle/product/19c/dbhome_1/dbs/
startup upgrade;
cd $ORACLE_HOME/bin
./dbupgrade
耐心等待約1個小時結束如下:
執行 Post-Upgrade Status 工具, utlusts.sql 並且檢查升級的日志。在新的版本下執行 Post-Upgrade Status 工具。
$ sqlplus "/as sysdba"
SQL> STARTUP
SQL> @?/rdbms/admin/utlusts.sql
注意: 之前版本的 utluNNNs.sql 在 19c 上被替換為 utlusts.sql
注意: 如果執行 utlusts.sql 時碰到錯誤 "ORA-06502: PL/SQL: numeric or value error: character string buffer too small" ,那么執行
$ sqlplus "/as sysdba"
SQL> STARTUP
SQL> @?/rdbms/admin/utlusts.sql
如果使用了Oracle Clusterware,設置了 CLUSTER_DATABASE=TRUE 那么你必須升級數據庫對應的 Oracle Clusterware keys。在19c上運行 srvctl 來做這件事,比如:
檢查升級狀態
執行 dbupgdiag.sql 並檢查日志。可以從 Note 556610.1 下載這個腳本。
編譯失效對象
執行 utlrp.sql (多次) 來使它們生效,直到失效對象的個數不再改變。
SQL> @?/rdbms/admin/utlrp.sql
步驟6: 升級后步驟
在 Linux 和 Unix 上設置環境變量
確保下面的環境變量指向了新的 ORACLE_HOME 對應的目錄:
ORACLE_HOME
PATH
更新 oratab 文件
修改 /etc/oratab 文件對應的條目指向新的 ORACLE_HOME 目錄
修改 /etc/oratab 文件
Post-upgrade fixup 腳本
執行 pre-upgrade 產生的 post-upgrade fixup 腳本
后續把tns,監聽文件,以及sqlnet.ora拷貝到到指定的新目錄中,入股是11G升到19C,需要在sqlnet.ora中加入:
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8
執行 Post-Upgrade Status 工具, utlusts.sql 並且檢查升級的日志。在新的版本下執行 Post-Upgrade Status 工具。
$ sqlplus "/as sysdba"
SQL> STARTUP
SQL> @?ORACLE_HOME/rdbms/admin/utlusts.sql
注意: 之前版本的 utluNNNs.sql 在 19c 上被替換為 utlusts.sql
注意: 如果執行 utlusts.sql 時碰到錯誤 "ORA-06502: PL/SQL: numeric or value error: character string buffer too small" ,那么執行
$ sqlplus "/as sysdba"
SQL> STARTUP
SQL> @?/rdbms/admin/utlusts.sql
如果使用了Oracle Clusterware,設置了 CLUSTER_DATABASE=TRUE 那么你必須升級數據庫對應的 Oracle Clusterware keys。在19c上運行 srvctl 來做這件事,比如:
$ORACLE_HOME/bin/srvctl upgrade database -db name -o ORACLE_HOME
檢查升級狀態
執行 dbupgdiag.sql 並檢查日志。可以從 Note 556610.1 下載這個腳本。
編譯失效對象
執行 utlrp.sql (多次) 來使它們生效,直到失效對象的個數不再改變。
$ sqlplus "/ AS SYSDBA"
SQL> @?/rdbms/admin/utlrp.sql
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8
SQLNET.ALLOWED_LOGON_VERSION_SERVER:控制可以連接到12c數據庫的客戶端版本(client -->12c server )
SQLNET.ALLOWED_LOGON_VERSION_CLIENT:控制12c數據庫可以連到哪些版本的數據庫(12c server -->其它版本dbserver),例如:控制通過DB LINK可連接到哪些版本的oracle庫。
查看升級的組件:
set lin 200 pages 200
col COMP_NAME for a60
select substr(comp_id,1,15) comp_id,substr(comp_name,1,30)
comp_name,substr(version,1,10) version,status
from dba_registry order by modified;
select * from dba_registry_history;
后續還需要、修改時區以及兼容版本參數:
$ORACLE_HOME/rdbms/admin/utltz_countstar.sql
alter system set compatible='19.0.0' scope=spfile; 並進行重啟。