本文概述了使用 AutoUpgrade 在同一台服务器上将非 CDB 数据库升级到 Oracle 21c。升级可能非常复杂,因此您必须始终阅读升级手册,并在考虑升级生产环境之前进行彻底的测试。
目录导读
假设
本文假设您的源数据库是支持直接升级到 21c 的版本。
19c, 18c, 12.2
Oracle 21c 不支持非 CDB 架构,因此在将非 CDB 数据库升级到 21c 时,我们有两种选择。
- 将现有的非 CDB 数据库转换为当前版本数据库中的 PDB,然后进行多租户升级。
- 将非 CDB 转换为新版本数据库中的 PDB。新的 PDB 将在打开后进行升级。
在此示例中,我们将使用 AutoUpgrade 从 19c 非 CDB 升级到 21c。所有受支持版本的过程都非常相似。
在开始之前备份所有内容很重要!其中一些步骤具有破坏性,如果出现问题,您别无选择,只能从备份中恢复并重新开始。
请记住,本文不能替代阅读升级文档。每次升级都有可能不同,具体取决于安装的选项。
先决条件
通过运行 21c 预安装包,确保您具备所有操作系统先决条件。更新剩余的包也可能是有意义的。
yum install -y oracle-database-preinstall-21c
yum update -y
安装 21c 软件
您可以在此处(OL7、OL8)更详细地了解安装过程,但对于本示例,我们将保持简短。以下命令将执行 21c 软件的静默安装。
export ORACLE_HOME=$ORACLE_BASE/product/21.0.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=cdb1
export SOFTWARE_DIR=/u01/software
export ORA_INVENTORY=/u01/app/oraInventory
mkdir -p ${ORACLE_HOME}
cd $ORACLE_HOME
/bin/unzip -oq ${SOFTWARE_DIR}/LINUX.X64_213000_db_home.zip
./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
出现提示时运行根脚本。
As a root user, execute the following script(s):
1. /u01/app/oracle/product/21.0.0/dbhome_1/root.sh
此时,您还应该修补新的 Oracle 主目录,但在这种情况下,我们将放弃该步骤以保持简单。
创建 21c 容器数据库
我们需要创建一个容器数据库 (CDB) 作为生成的 PDB 的目的地。下面的示例创建一个名为“cdb1”的 CDB,没有 PDB。
#dbca -silent -deleteDatabase -sourceDB cdb1 -sysDBAUserName sys -sysDBAPassword SysPassword1
dbca -silent -createDatabase \
-templateName General_Purpose.dbc \
-gdbname cdb1 -sid cdb1 -responseFile NO_VALUE \
-characterSet AL32UTF8 \
-sysPassword SysPassword1 \
-systemPassword SysPassword1 \
-createAsContainerDatabase true \
-numberOfPDBs 0 \
-databaseType MULTIPURPOSE \
-memoryMgmtType auto_sga \
-totalMemory 1536 \
-storageType FS \
-datafileDestination "/u02/oracle/" \
-redoLogFileSize 50 \
-emConfiguration NONE \
-ignorePreReqs
Prepare for db operation
10% complete
Copying database files
40% complete
Creating and starting Oracle instance
42% complete
46% complete
52% complete
56% complete
60% complete
Completing Database Creation
66% complete
69% complete
70% complete
Executing Post Configuration Actions
100% complete
Database creation complete. For details check the logfiles at:
/u01/app/oracle/cfgtoollogs/dbca/cdb1.
Database Information:
Global Database Name:cdb1
System Identifier(SID):cdb1
Look at the log file "/u01/app/oracle/cfgtoollogs/dbca/cdb1/cdb13.log" for further details.
$
我们启用了快速恢复区、Oracle Managed Files (OMF) 和归档日志模式。
sqlplus / as sysdba <<EOF
alter system set db_recovery_file_dest_size=40g;
alter system set db_recovery_file_dest='/u01/app/oracle/fast_recovery_area';
alter system set db_create_file_dest = '/u02/oradata';
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;
exit;
EOF
您将需要调整实例参数以确保容器能够满足最终 PDB 的需求,但对于本示例,我们将忽略这一点。
运行自动升级分析
从MOS 2485457.1下载最新的“autoupgrade.jar”文件。如果您没有 MOS 访问权限,您可能会错过下一步。
cd $ORACLE_BASE/product/21.0.0/dbhome_1/rdbms/admin mv autoupgrade.jar autoupgrade.jar.`date +"%Y"-"%m"-"%d"` cp /tmp/autoupgrade.jar .
在运行“autoupgrade.jar”命令之前,请确保您使用的是原始 Oracle 主目录。
export ORACLE_SID=mydb export ORAENV_ASK=NO . oraenv export ORAENV_ASK=YES export ORACLE_HOME=$ORACLE_BASE/product/19.0.0/dbhome_1
为非 CDB 到 PDB 的升级生成示例文件。
$ORACLE_BASE/product/21.0.0/dbhome_1/jdk/bin/java \ -jar $ORACLE_BASE/product/21.0.0/dbhome_1/rdbms/admin/autoupgrade.jar \ -create_sample_file config /tmp/config.txt noncdbtopdb
编辑生成的“/tmp/config.txt”文件,设置所需升级的详细信息。在这种情况下,我们使用了以下参数。
upg1.log_dir=/u01/app/oracle/cfgtoollogs/autoupgrade/mydb upg1.sid=mydb upg1.source_home=/u01/app/oracle/product/19.0.0/dbhome_1 upg1.target_cdb=cdb1 upg1.target_home=/u01/app/oracle/product/21.0.0/dbhome_1 upg1.target_pdb_name=mydb #upg1.target_pdb_copy_option=file_name_convert=('emp', 'emppdb') upg1.start_time=NOW # Optional. 10 Minutes from now upg1.upgrade_node=localhost # Optional. To find out the name of your node, run the hostname utility. Default is 'localhost' upg1.run_utlrp=yes # Optional. Whether or not to run utlrp after upgrade upg1.timezone_upg=yes # Optional. Whether or not to run the timezone upgrade upg1.target_version=21 # Oracle version of the target ORACLE_HOME. Only required when the target Oracle database version is 12.2
在分析模式下运行升级以查看升级是否存在任何预期问题。
$ORACLE_BASE/product/21.0.0/dbhome_1/jdk/bin/java \
-jar $ORACLE_BASE/product/21.0.0/dbhome_1/rdbms/admin/autoupgrade.jar \
-config /tmp/config.txt -mode analyze
AutoUpgrade tool launched with default options
Processing config file ...
+--------------------------------+
| Starting AutoUpgrade execution |
+--------------------------------+
1 databases will be analyzed
Type 'help' to list console commands
upg> Job 101 completed
------------------- Final Summary --------------------
Number of databases [ 1 ]
Jobs finished [1]
Jobs failed [0]
Jobs pending [0]
Please check the summary report at:
/u01/app/oracle/cfgtoollogs/autoupgrade/cfgtoollogs/upgrade/auto/status/status.html
/u01/app/oracle/cfgtoollogs/autoupgrade/cfgtoollogs/upgrade/auto/status/status.log
输出文件列出了分析的状态,以及升级之前所需的任何手动干预。“status.log”文件的输出如下所示。详细信息部分提供了一个文件,其中包含升级过程中步骤的详细信息。如果您看过“preupgrade.jar”的输出,它看起来会很熟悉。如果主日志文件中有任何必需的手动操作,详细文件应提供更多信息。
==========================================
Autoupgrade Summary Report
==========================================
[Date] Sun Aug 22 07:41:07 UTC 2021
[Number of Jobs] 1
==========================================
[Job ID] 101
==========================================
[DB Name] mydb
[Version Before Upgrade] 19.12.0.0.0
[Version After Upgrade] 21.3.0.0.0
------------------------------------------
[Stage Name] PRECHECKS
[Status] SUCCESS
[Start Time] 2021-08-22 07:40:55
[Duration] 0:00:12
[Log Directory] /u01/app/oracle/cfgtoollogs/autoupgrade/mydb/mydb/101/prechecks
[Detail] /u01/app/oracle/cfgtoollogs/autoupgrade/mydb/mydb/101/prechecks/mydb_preupgrade.log
Precheck passed and no manual intervention needed
------------------------------------------
日志目录包含许多文件,包括详细报告的 HTML 格式。它与日志文件的信息相同,但有些人我更喜欢阅读这种格式。
完成任何所需的手动修复后,再次运行分析,您应该会看到一个干净的分析报告。
运行自动升级部署
我们现在准备使用以下命令运行数据库升级。升级需要一些时间,因此您将停留在“upg”提示下,直到完成。
==========================================
Autoupgrade Summary Report
==========================================
[Date] Sun Aug 22 07:41:07 UTC 2021
[Number of Jobs] 1
==========================================
[Job ID] 101
==========================================
[DB Name] mydb
[Version Before Upgrade] 19.12.0.0.0
[Version After Upgrade] 21.3.0.0.0
------------------------------------------
[Stage Name] PRECHECKS
[Status] SUCCESS
[Start Time] 2021-08-22 07:40:55
[Duration] 0:00:12
[Log Directory] /u01/app/oracle/cfgtoollogs/autoupgrade/mydb/mydb/101/prechecks
[Detail] /u01/app/oracle/cfgtoollogs/autoupgrade/mydb/mydb/101/prechecks/mydb_preupgrade.log
Precheck passed and no manual intervention needed
------------------------------------------
使用“help”命令查看命令行选项。我们可以使用以下命令列出当前作业并检查作业状态。
upg> lsj
+----+-------+---------+---------+-------+--------------+--------+----------------+
|Job#|DB_NAME| STAGE|OPERATION| STATUS| START_TIME| UPDATED| MESSAGE|
+----+-------+---------+---------+-------+--------------+--------+----------------+
| 102| mydb|DBUPGRADE|EXECUTING|RUNNING|21/08/22 07:44|07:49:08|22%Upgraded MYDB|
+----+-------+---------+---------+-------+--------------+--------+----------------+
Total jobs 1
upg> status -job 102
Progress
-----------------------------------
Start time: 21/08/22 07:44
Elapsed (min): 6
End time: N/A
Last update: 2021-08-22T07:49:08.827
Stage: DBUPGRADE
Operation: EXECUTING
Status: RUNNING
Pending stages: 7
Stage summary:
SETUP <1 min
GRP <1 min
PREUPGRADE <1 min
PRECHECKS <1 min
PREFIXUPS <1 min
DRAIN 1 min
DBUPGRADE 4 min (IN PROGRESS)
Job Logs Locations
-----------------------------------
Logs Base: /u01/app/oracle/cfgtoollogs/autoupgrade/mydb/mydb
Job logs: /u01/app/oracle/cfgtoollogs/autoupgrade/mydb/mydb/102
Stage logs: /u01/app/oracle/cfgtoollogs/autoupgrade/mydb/mydb/102/dbupgrade
TimeZone: /u01/app/oracle/cfgtoollogs/autoupgrade/mydb/mydb/temp
Additional information
-----------------------------------
Details:
[Upgrading] is [22%] completed for [mydb-mydb]
+---------+-------------+
|CONTAINER| PERCENTAGE|
+---------+-------------+
| MYDB|UPGRADE [22%]|
+---------+-------------+
Error Details:
None
upg>
以下是升级过程中的一些示例输出。
upg> lsj
+----+-------+---------+---------+-------+--------------+--------+----------------------------+
|Job#|DB_NAME| STAGE|OPERATION| STATUS| START_TIME| UPDATED| MESSAGE|
+----+-------+---------+---------+-------+--------------+--------+----------------------------+
| 102| mydb|PREFIXUPS|EXECUTING|RUNNING|21/08/22 07:44|07:44:28|Loading database information|
+----+-------+---------+---------+-------+--------------+--------+----------------------------+
Total jobs 1
upg> lsj
+----+-------+-----+---------+-------+--------------+--------+------------------+
|Job#|DB_NAME|STAGE|OPERATION| STATUS| START_TIME| UPDATED| MESSAGE|
+----+-------+-----+---------+-------+--------------+--------+------------------+
| 102| mydb|DRAIN|EXECUTING|RUNNING|21/08/22 07:44|07:45:31|Executing describe|
+----+-------+-----+---------+-------+--------------+--------+------------------+
Total jobs 1
upg> lsj
+----+-------+---------+---------+-------+--------------+--------+-------+
|Job#|DB_NAME| STAGE|OPERATION| STATUS| START_TIME| UPDATED|MESSAGE|
+----+-------+---------+---------+-------+--------------+--------+-------+
| 102| mydb|DBUPGRADE|EXECUTING|RUNNING|21/08/22 07:44|07:46:03|Running|
+----+-------+---------+---------+-------+--------------+--------+-------+
Total jobs 1
upg> lsj
+----+-------+---------+---------+-------+--------------+--------+----------------+
|Job#|DB_NAME| STAGE|OPERATION| STATUS| START_TIME| UPDATED| MESSAGE|
+----+-------+---------+---------+-------+--------------+--------+----------------+
| 102| mydb|DBUPGRADE|EXECUTING|RUNNING|21/08/22 07:44|07:55:09|52%Upgraded MYDB|
+----+-------+---------+---------+-------+--------------+--------+----------------+
Total jobs 1
upg> lsj
+----+-------+-------------+---------+-------+--------------+--------+-------------------+
|Job#|DB_NAME| STAGE|OPERATION| STATUS| START_TIME| UPDATED| MESSAGE|
+----+-------+-------------+---------+-------+--------------+--------+-------------------+
| 102| mydb|NONCDBTOPDBXY|EXECUTING|RUNNING|21/08/22 07:44|08:02:46|noncdb_to_pdb - 64%|
+----+-------+-------------+---------+-------+--------------+--------+-------------------+
Total jobs 1
upg> lsj
+----+-------+----------+---------+-------+--------------+--------+-------------+
|Job#|DB_NAME| STAGE|OPERATION| STATUS| START_TIME| UPDATED| MESSAGE|
+----+-------+----------+---------+-------+--------------+--------+-------------+
| 102| mydb|POSTFIXUPS|EXECUTING|RUNNING|21/08/22 07:44|08:09:53|Remaining 2/4|
+----+-------+----------+---------+-------+--------------+--------+-------------+
Total jobs 1
upg>
作业完成后,将显示摘要消息。
upg> Job 102 completed
------------------- Final Summary --------------------
Number of databases [ 1 ]
Jobs finished [1]
Jobs failed [0]
Jobs pending [0]
Please check the summary report at:
/u01/app/oracle/cfgtoollogs/autoupgrade/cfgtoollogs/upgrade/auto/status/status.html
/u01/app/oracle/cfgtoollogs/autoupgrade/cfgtoollogs/upgrade/auto/status/status.log
“status.log”包含有关升级过程的顶级信息。
==========================================
Autoupgrade Summary Report
==========================================
[Date] Sun Aug 22 08:11:31 UTC 2021
[Number of Jobs] 1
==========================================
[Job ID] 102
==========================================
[DB Name] mydb
[Version Before Upgrade] 19.12.0.0.0
[Version After Upgrade] 21.3.0.0.0
------------------------------------------
[Stage Name] GRP
[Status] SUCCESS
[Start Time] 2021-08-22 07:44:09
[Duration] 0:00:01
[Detail] Please drop the following GRPs after Autoupgrade completes:
AUTOUPGRADE_9212_MYDB1912000
------------------------------------------
[Stage Name] PREUPGRADE
[Status] SUCCESS
[Start Time] 2021-08-22 07:44:11
[Duration] 0:00:00
[Log Directory] /u01/app/oracle/cfgtoollogs/autoupgrade/mydb/mydb/102/preupgrade
------------------------------------------
[Stage Name] PRECHECKS
[Status] SUCCESS
[Start Time] 2021-08-22 07:44:11
[Duration] 0:00:16
[Log Directory] /u01/app/oracle/cfgtoollogs/autoupgrade/mydb/mydb/102/prechecks
[Detail] /u01/app/oracle/cfgtoollogs/autoupgrade/mydb/mydb/102/prechecks/mydb_preupgrade.log
Precheck passed and no manual intervention needed
------------------------------------------
[Stage Name] PREFIXUPS
[Status] SUCCESS
[Start Time] 2021-08-22 07:44:27
[Duration] 0:00:15
[Log Directory] /u01/app/oracle/cfgtoollogs/autoupgrade/mydb/mydb/102/prefixups
------------------------------------------
[Stage Name] DRAIN
[Status] SUCCESS
[Start Time] 2021-08-22 07:44:42
[Duration] 0:01:19
[Log Directory] /u01/app/oracle/cfgtoollogs/autoupgrade/mydb/mydb/102/drain
------------------------------------------
[Stage Name] DBUPGRADE
[Status] SUCCESS
[Start Time] 2021-08-22 07:46:02
[Duration] 0:15:14
[Log Directory] /u01/app/oracle/cfgtoollogs/autoupgrade/mydb/mydb/102/dbupgrade
------------------------------------------
[Stage Name] NONCDBTOPDBXY
[Status] SUCCESS
[Start Time] 2021-08-22 08:01:16
[Duration] 0:08:25
------------------------------------------
[Stage Name] POSTCHECKS
[Status] SUCCESS
[Start Time] 2021-08-22 08:09:42
[Duration] 0:00:09
[Log Directory] /u01/app/oracle/cfgtoollogs/autoupgrade/mydb/mydb/102/postchecks
[Detail] /u01/app/oracle/cfgtoollogs/autoupgrade/mydb/mydb/102/postchecks/mydb_postupgrade.log
------------------------------------------
[Stage Name] POSTFIXUPS
[Status] SUCCESS
[Start Time] 2021-08-22 08:09:51
[Duration] 0:01:40
[Log Directory] /u01/app/oracle/cfgtoollogs/autoupgrade/mydb/mydb/102/postfixups
------------------------------------------
[Stage Name] POSTUPGRADE
[Status] SUCCESS
[Start Time] 2021-08-22 08:11:31
[Duration] 0:00:00
[Log Directory] /u01/app/oracle/cfgtoollogs/autoupgrade/mydb/mydb/102/postupgrade
------------------------------------------
[Stage Name] SYSUPDATES
[Status] SUCCESS
[Start Time] 2021-08-22 08:11:31
[Duration] 0:00:00
[Log Directory] /u01/app/oracle/cfgtoollogs/autoupgrade/mydb/mydb/102/sysupdates
------------------------------------------
Upgrade Summary: /u01/app/oracle/cfgtoollogs/autoupgrade/mydb/mydb/102/dbupgrade/upg_summary.log
查看“upg_summary.log”文件,如果有任何问题,请查看相关的日志文件。在这一点上,我进行了关机和启动,以确保一切都在正确的模式下运行。
export ORACLE_HOME=$ORACLE_BASE/product/21.0.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=cdb1
sqlplus / as sysdba <<EOF
alter pluggable database mydb save state;
shutdown immediate;
startup;
show pdbs
exit;
EOF
最后的步骤
根据需要编辑“/etc/oratab”文件和任何环境文件。
如果您使用 APEX 或 ORDS,您可能想要验证它们(validate APEX,validate ORDS)。
附录
如果要重新运行示例,可以使用以下命令重建数据库。
重建 CDB1 多租户数据库。
export ORACLE_HOME=/u01/app/oracle/product/21.0.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=cdb1
#dbca -silent -deleteDatabase -sourceDB cdb1 -sysDBAUserName sys -sysDBAPassword SysPassword1
dbca -silent -createDatabase \
-templateName General_Purpose.dbc \
-gdbname cdb1 -sid cdb1 -responseFile NO_VALUE \
-characterSet AL32UTF8 \
-sysPassword SysPassword1 \
-systemPassword SysPassword1 \
-createAsContainerDatabase true \
-numberOfPDBs 0 \
-databaseType MULTIPURPOSE \
-memoryMgmtType auto_sga \
-totalMemory 1536 \
-storageType FS \
-datafileDestination "/u02/oradata/" \
-redoLogFileSize 50 \
-emConfiguration NONE \
-ignorePreReqs
sqlplus / as sysdba <<EOF
alter system set db_recovery_file_dest_size=40g;
alter system set db_recovery_file_dest='/u01/app/oracle/fast_recovery_area';
alter system set db_create_file_dest = '/u02/oradata';
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;
exit;
EOF
重建 MYDB 非 CDB 数据库。
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=mydb
#dbca -silent -deleteDatabase -sourceDB mydb -sysDBAUserName sys -sysDBAPassword SysPassword1
dbca -silent -createDatabase \
-templateName General_Purpose.dbc \
-gdbname mydb -sid mydb -responseFile NO_VALUE \
-characterSet AL32UTF8 \
-sysPassword SysPassword1 \
-systemPassword SysPassword1 \
-createAsContainerDatabase false \
-databaseType MULTIPURPOSE \
-memoryMgmtType auto_sga \
-totalMemory 1536 \
-storageType FS \
-datafileDestination "/u02/oradata/" \
-redoLogFileSize 50 \
-emConfiguration NONE \
-ignorePreReqs
sqlplus / as sysdba <<EOF
alter system set db_recovery_file_dest_size=40g;
alter system set db_recovery_file_dest='/u01/app/oracle/fast_recovery_area';
alter system set db_create_file_dest = '/u02/oradata';
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;
exit;
EOF




