目录
1、概述
关于12c 升级 19c,这篇文章写的已经很好 12c升级19c 细节我不再重复,以下记录我实验升级过程中的步骤和遇到问题。
12c的升级19c,简单地说,就是在运行12c的机器上安装19c(此时机器上同时安装了12c和19c),升级程序对12c数据库相关文件进行处理,关闭12c,用19c加载之前的12c数据库相关文件,这个过程有很多繁琐的操作,因此我们使用自动化工具autoupgrade.jar。
autoupgrade.jar使用Java运行,下载地址参考 New version of AutoUpgrade (21.2),不是每个Oracle数据库版本都有相对应autoupgrade.jar版本,而是一个最新的autoupgrade.jar版本,可用于所有Oracle数据库的升级,上面的地址是到Oracle官网下载,需要Oracle账号和”Support Identifier”,要购买Oracle服务,也可以在这里:百度盘 下载,提取码:d2sk。
在上文的参考文章中,对12c需要打补丁,不同小版本的12c需要不同的补丁版本,补丁包的下载也需要Oracle账号和”Support Identifier”,下载地址:My Oracle Support ,也可以在这里 百度盘下载,提取码:d2sk,不过这个补丁包是针对12.2.0.1的,12.1.0.2不能使用。
自己摸索12.1.0.2不打补丁,用autoupgrade.jar直接升级19c是可以的。不过中间遇到失败:
这个问题是有invalid对象(WMSYS.OWM_VSCRIPT_PKG),autoupgrade.jar没能处理,调用invalid对象时就出错了,可以用这个SQL查询系统的无效对象(sqlplus / as sysdba):
SELECT owner, object_type, object_name, status FROM dba_objects
WHERE status = 'INVALID'
ORDER BY owner, object_type, object_name;
解决WMSYS无效对象的方法是在12.1.0.2上卸载workspace manager,再安装:
sqlplus / as sysdba
@owmuinst.plb
@owminst.plb
再查询WMSYS的无效对象就没有了。然后在按照下面步骤升级19c就成功了。
自己亲自尝试,12.1.0.2 和 12.2.0.1 用autoupgrade.jar直接升级19c都是可以的,并且补丁可能也是不需要打的。下文的步骤,对12.1.0.2 和 12.2.0.1都是适用的。
2、12c备份
RMAN冷备全库
rman target /
list backup
# 12c 停库,在mount状态全库备份
shutdown immediate
startup mount
# 不要自动备份control file
set nocfau;
# 注意,要先备份数据库,然后备份控制文件,因为数据库的备份路径记录在控制文件中。
# 备份数据库
backup database format '/mnt/disk01/rman_backup_dir2/db_%d_%T_%U.bak';# 备份控制文件
backup current controlfile format '/mnt/disk01/rman_backup_dir2/ctl_%d_%T_%U.bak';
3、12c打补丁(可选)
12c关库,解压缩补丁文件:
unzip p28553832_12201190115OCWJAN2019RU_Linux-x86-64.zip
在12c的环境下(即$ORACLE_HOME和$PATH指向12c的安装目录)执行:
在28553832/28553832/目录下:
$ORACLE_HOME/OPatch/opatch apply
# 12c的家目录下有个可执行程序opath,使用它打补丁,输入就是补丁目录下的文件
# 查看打补丁结果
$ORACLE_HOME/OPatch/opatch lsinv
4、安装19c
在运行12c的机器上安装19c,注意,12c和19c安装在同一台机器上,但是安装在不同的目录下,创建安装19c的目录:
mkdir -p /u01/app/oracle/product/19.3.0/dbhome_1
将下载的19c安装包解压到刚才创建的目录,这一步很重要,这个目录就是19c的ORACLE_HOME:
unzip LINUX.X64_193000_db_home.zip -d /u01/app/oracle/product/19.3.0/dbhome_1
安装过程可参考我的另一篇博客:安装Oracle19c
上面的安装,默认使用安装12c的oracle用户,所以ORACLE_HOME和PATH仍是指向12c的安装路径,不过这没有关系,安装19c的时候并不会用到ORACLE_HOME和PATH。安装完19c后,有的操作需要ORACLE_HOME和PATH指向19c的安装路径。
注意,安装完19c后,不需要创建19c的数据库实例。
5、升级
创建autoupgrade配置文件如下:
global.autoupg_log_dir=/mnt/disk01/oracle/cfgtoollogs/autoup
upg1.start_time=NOW
upg1.source_home=/u01/app/oracle/product/12.2.0.1/dbhome_1
upg1.target_home=/u01/app/oracle/product/19.3.0/dbhome_1
upg1.sid=paas
upg1.log_dir=/u01/app/oracle/cfgtoollogs/autoup
upg1.upgrade_node=localhost
upg1.target_version=19
12c开库,保证配置和开启闪回和归档日志
alter database flashback on;
archive log list;
在19c的$ORACLE_HOME环境下执行升级,查看Java版本,如果Linux环境的Java版本不是1.8,就用19c自带的JDK,19c自带JDK的路径是:$ORACLE_HOME/jdk/bin/java
export ORACLE_BASE=/mnt/disk01/oracle
export ORACLE_HOME=$ORACLE_BASE/product/19.3.0/dbhome_1
export ORACLE_SID=paas
export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
$ORACLE_HOME/jdk/bin/java -version
1)升级第一步:analyze
这一步是检查12c是否具备升级条件,如果不具备,会提示如何处理(注意,此时12c必须是open状态,19c是shutdown)。
java -jar autoupgrade.jar -config config.cfg -mode analyze -clear_recovery_data
这个-clear_recovery_data是可选的,如果有失败,再次升级这个选项就有必要了,不过这个选项放在哪里也不会影响。
这会打开一个命令行终端,同时,有任务(job)在后台执行,命令status,可查看任务状态:
analyze 过程比较快,job执行完退出终端:
查看分析日志,内容如下应该是没问题的:/u01/app/oracle/cfgtoollogs/autoup/cfgtoollogs/upgrade/auto/status/status.log
2)升级第二步:deploy
执行下面的deploy命令,正式开始升级(注意,此时12c必须是open状态,19c是shutdown):
java -jar autoupgrade.jar -config config.cfg -mode deploy -clear_recovery_data
这个-clear_recovery_data是可选的,如果有失败,再次升级这个选项就有必要了,不过这个选项放在哪里也不会影响。
命令执行后,会打开一个终端,升级时间较长,可以在这个终端里查看升级状态,使用命令status
升级任务的job id 为101的,下面命令查看详细信息:
upg> status -job 101
成功执行完deploy:
查看/mnt/disk01/oracle/cfgtoollogs/autoupd/cfgtoollogs/upgrade/auto/status/status.log
和/mnt/disk01/oracle/cfgtoollogs/autoupd/paas/101/dbupgrade/upg_summary.log
如下:
全都是UPGRADED,表示升级成功了:
这是我尝试过多次后成功的,之前analyze这一步是成功的,但是deploy在90% data patch时失败,打印:
verify_queryable_inventory returned ORA-20001: Latest xml inventory is not loaded into table
Error: prereq checks failed!
从网上搜索半天,执行 select * from OPATCH_XML_INV; 提示 file name check failed qopiprep.bat,根据 KUP-04027 的提示猜测,我安装12c和19c时用的路径是软链接,可能和这有关,抱着试试看的心态,重新安装12c和19c不再使用软链接路径,重新给12c灌数据,走了一遍升级流程,结果这次成功了!
注意,安装Oracle时,安装的路径不要用软连接,ORACLE_HOME的路径也不要有软链接!
3)检查是否升级成功
以19c的环境登录:
这就表示没有错误,升级成功,尝试重启数据库,重启listener,尝试以之前12c中的普通用户登录,查看表:
(autoupgrade应该已经自动拷贝了密码文件、spfile、listener.ora、tnsnames.ora)
sqlplus paasapp/Paas1015@172.32.148.156:1521/paas
升级完后自动启动了19c,数据库使用的就是之前12c的,如果再以12c的环境连接数据库就不行了。
查看注册组件:
select comp_id,status from dba_registry;
6、升级失败的回退
如果因为某种原因升级失败了怎么办?或者想重新升级怎么办?
参考这篇文章:https://mikedietrichde.com/2020/04/08/troubleshooting-restoring-and-restarting-autoupgrade/
首先将19c以upgrade模式启动:
SQL> startup upgrade
如果启动失败报找不到初始参数文件:
autoupgrade程序会在日志目录的paas/temp/创建参数文件:
[oracle@qinh156 upgrade12to19]$ ls /mnt/disk01/oracle/cfgtoollogs/autoupd/paas/temp/ -lrt
total 48
-rwx------ 1 oracle oinstall 0 Oct 20 16:20 paas.restart
-rwx------ 1 oracle oinstall 1909 Oct 20 16:59 paas_autocompile20221020165920paas.sql
-rwx------ 1 oracle oinstall 896 Oct 27 11:26 before_upgrade_pfile_paas.ora
-rwx------ 1 oracle oinstall 896 Oct 27 11:26 after_upgrade_pfile_paas.ora
-rwx------ 1 oracle oinstall 922 Oct 27 11:31 during_upgrade_pfile_paas.ora
-rwx------ 1 oracle oinstall 6275 Oct 27 12:09 ctx_move_text_file_list_paas
-rwx------ 1 oracle oinstall 1909 Oct 27 12:53 paas_autocompile20221027125357paas.sql
-rwx------ 1 oracle oinstall 7488 Oct 27 13:02 122010_paas_tz_upg.log
-rwx------ 1 oracle oinstall 338 Oct 27 13:03 listener.ora_paas_122010_193000_.backup
-rwx------ 1 oracle oinstall 455 Oct 27 13:03 tnsnames.ora
-rwx------ 1 oracle oinstall 205 Oct 27 13:03 sqlnet.ora_paas_122010_193000_.backup
拷贝 after_upgrade_pfile_paas.ora 再启动
cp /mnt/disk01/oracle/cfgtoollogs/autoupd/paas/temp/after_upgrade_pfile_paas.ora /mnt/disk01/oracle/product/19.3.0/dbhome_1/dbs/
sqlplus / as sysdba
SQL> startup upgrade pfile=/mnt/disk01/oracle/cfgtoollogs/autoupd/paas/temp/after_upgrade_pfile_paas.ora
ORACLE instance started.Total System Global Area 3103781608 bytes
Fixed Size 8901352 bytes
Variable Size 637534208 bytes
Database Buffers 2449473536 bytes
Redo Buffers 7872512 bytes
Database mounted.
查看是否创建了Guaranteed Restore Point(GRP),默认被升级的12c是开启归档日志和flashback的,这样autoupgrade会创建GRP。如果创建了,就用它恢复到升级前的状态,然后重新在做upgrade,如果没创建就从失败的点恢复升级。查看GRP:
SQL> column name format a35
SQL> column guarantee_flashback_database format a30
SQL> select name, guarantee_flashback_database from v$restore_point;NAME GUARANTEE_FLASHBACK_DATABASE
-------------------------------- ------------------------------
AUTOUPGRADE_221145114461854_DB12 YES
用GRP回退,进入autoupgrade命令行:
java -jar autoupgrade.jar -config /mnt/disk01/upgrade12to19/config.cfg -mode deploy
然后从头开始升级,这次用-clear_recovery_data,生成新job号:
java -jar autoupgrade.jar -config /mnt/disk01/upgrade12to19/config.cfg -mode analyze -clear_recovery_data
然后
java -jar autoupgrade.jar -config /mnt/disk01/upgrade12to19/config.cfg -mode deploy -clear_recovery_data
如果没有GRP,可能是12c没开flashback,或者被删除了,那只有两个办法了,一是用RMAN备份恢复12c数据库(RMAN全库冷备和还原),二是用autoupgrade在升级失败处,解决问题,然后尝试继续升级:
# 先以upgrade模式启动19c步骤如上,然后:
java -jar autoupgrade.jar -config /mnt/disk01/upgrade12to19/config.cfg -mode deploy
upg>resume -job 101
7、升级完成后的工作
升级时需要使用 fast_recovery_area 管理归档和闪回,查看一下db_recovery_file_dest_size是不是够大,因为当db_recovery_file_dest 目录下的数据量接近于 db_recovery_file_dest_size 时,就会报归档日志错误,此时要清理归档日志,或将db_recovery_file_dest_size设置的更大,修改 db_recovery_file_dest和db_recovery_file_dest_size 不需要重启数据库。
alter system set db_recovery_file_dest_size = 500G scope=both;
Configuring the Fast Recovery Area (oracle.com)
注意,如果fast_recovery_area快满了,impdp时会卡住。
然后要清理一下归档日志,也不要全清了,清空当天之前的就行:
delete archivelog until time 'sysdate-1';
RMAN删备份(可以过一段时间后)。
修改升级后的库的compatible参数为19.3.0.0(经过充分测试后)
ALTER SYSTEM SET COMPATIBLE = '19.3.0' SCOPE=SPFILE;
重启数据库。
参考
https://mikedietrichde.com/2020/07/31/upgrade-fails-with-ora-20001-during-datapatch-run/
Oracle Upgrade 12c至19c - chchcharlie、 - 博客园 (cnblogs.com)
Introduction to Upgrading Oracle Database
Oracle 11gR2 KUP-04027 file name check failed: string (oraexcel.com)
Upgrading Oracle Database Manually Using Parallel Upgrade Utility