从 Oracle 21c 开始,可以在升级期间使用 Oracle Autoupgrade Tool 将非 CDB 数据库直接转换为 PDB。
这是一项重要的增强功能,因为 Oracle 21c 不再支持非 CDB 架构,这意味着升级到 21c 时必须进行转换。
让我们测试一下这个新功能是否真的有效以及需要考虑什么。
自动升级实用程序完成的工作
- 检查和准备源非 CDB 数据库
- 在 Source Release 中将非 CDB 转换为 PDB
- 将 PDB 升级到目标版本
- 如果数据库在集群配置中运行,集群资源也会自动调整。
升级期间对源和目标数据库进行自动转换的要求
- 必须在使用 AutoUpgrade 执行升级之前创建目标 CDB。
- 从非 CDB 创建的 PDB 必须继续使用源非 CDB 名称。您不能更改数据库的名称。
- 为源和目标配置了相同的 Oracle 数据库选项集。
- 源和目标 CDB 的字节序格式是相同的。
- 源和目标 CDB 具有兼容的字符集和国家字符集。
- 必须支持源非 CDB Oracle 数据库版本和操作系统平台才能直接升级到目标 CDB 版本。
- 为源 CDB 和目标 CDB 启用操作系统身份验证
后备方案
升级开始后没有回滚到非 CDB Oracle 数据库的选项。因此,请在开始之前创建非 CDB 的完整备份,以便在出现任何问题时可以恢复数据库!
测试环境和设置

更新 autoupgrade.jar
从 Oracle 19c 开始, autoupgrade.jar 是 oracle 二进制文件的一部分,位于 $ ORACLE_HOME/rdbms/admin 下。由于自动升级工具正在不断开发中,因此建议您始终下载并安装最新版本。最新版本可以从 Oracle Support 下载(文档 ID 2485457.1)。
#Copy downloaded autoupgrade.jar to target database home
cp /tmp/autoupgrade.jar /u01/app/oracle/product/21.0.0/dbhome_1/rdbms/admin
创建日志目录和配置文件自动
升级工具与配置文件一起使用。在此文件中,您可以定义升级所需的所有参数。首先,我为升级日志文件创建一些目录,然后为升级创建配置文件。
#create directories for the upgrade
mkdir /u01/app/oracle/autoupgrade
mkdir /u01/app/oracle/autoupgrade/noncdb1_to_cdb1
#create config file
cat /u01/app/oracle/autoupgrade/noncdb1_to_cdb1/config.txt
global.autoupg_log_dir=/u01/app/oracle/autoupgrade
upg1.sid=noncdb1
upg1.source_home=/u01/app/oracle/product/19.0.0/dbhome_1
upg1.log_dir=/u01/app/oracle/autoupgrade/noncdb_to_pdb/
upg1.target_home=/u01/app/oracle/product/21.0.0/dbhome_1
upg1.target_base=/u01/app/oracle
upg1.target_version=21.3.0
# That is the new parameter introduced with 21c to define the target cdb for the new pdb
upg1.target_cdb=cdb01
执行升级前任务
必须始终在目标 ORACLE_HOME 中启动自动升级,否则,您会收到错误消息。首先,我仅在分析模式下开始升级。在这种模式下,只会执行升级前的任务,如果一切准备就绪并且满足升级的所有要求,最后您会得到一个摘要。
java -jar $ORACLE_HOME/rdbms/admin/autoupgrade.jar -config config.txt -mode analyze
您将自动连接到 autoupgrade cli,您可以在其中检查升级活动的进度并列出一些工作详细信息(如果需要)
upg> lsj
+----+-------+---------+---------+-------+--------------+--------+----------------------------+
|Job#|DB_NAME| STAGE|OPERATION| STATUS| START_TIME| UPDATED| MESSAGE|
+----+-------+---------+---------+-------+--------------+--------+----------------------------+
| 100|noncdb1|PRECHECKS|PREPARING|RUNNING|21/08/19 21:37|21:37:03|Loading database information|
+----+-------+---------+---------+-------+--------------+--------+----------------------------+
Total jobs 1
upg> /
+----+-------+---------+---------+-------+--------------+--------+----------------+
|Job#|DB_NAME| STAGE|OPERATION| STATUS| START_TIME| UPDATED| MESSAGE|
+----+-------+---------+---------+-------+--------------+--------+----------------+
| 100|noncdb1|PRECHECKS|PREPARING|RUNNING|21/08/19 21:37|21:38:26|Remaining 83/104|
+----+-------+---------+---------+-------+--------------+--------+----------------+
Total jobs 1
最后,您将获得一份工作总结以及一份文本和 html 格式的报告
upg> Job 100 completed
------------------- Final Summary --------------------
Number of databases [ 1 ]
Jobs finished [1]
Jobs failed [0]
Jobs pending [0]
------------- JOBS FINISHED WITH ERROR -------------
Job 100 for noncdb1
Please check the summary report at:
/u01/app/oracle/autoupgrade/cfgtoollogs/upgrade/auto/status/status.html
/u01/app/oracle/autoupgrade/cfgtoollogs/upgrade/auto/status/status.log
让我们看一下总结报告,到目前为止看起来还不错。
==========================================
Autoupgrade Summary Report
==========================================
[Date] Thu Aug 19 22:26:13 CEST 2021
[Number of Jobs] 1
==========================================
[Job ID] 101
==========================================
[DB Name] noncdb1
[Version Before Upgrade] 19.3.0.0.0
[Version After Upgrade] 21.3.0.0.0
------------------------------------------
[Stage Name] PRECHECKS
[Status] SUCCESS
[Start Time] 2021-08-19 22:24:06
[Duration] 0:02:07
[Log Directory] /u01/app/oracle/autoupgrade/noncdb_to_pdb/noncdb1/101/prechecks
[Detail] /u01/app/oracle/autoupgrade/noncdb_to_pdb/noncdb1/101/prechecks/noncdb1_preupgrade.log
Precheck passed and no manual intervention needed
------------------------------------------
如果报告的状态为 FAILD,您可以查看 _preupgrade.log 以获取更多信息。在我的环境中,详细日志文件位于
/u01/app/oracle/autoupgrade/noncdb_to_pdb/noncdb1/100/prechecks/noncdb1_preupgrade.log
开始真正的升级和转换
所以从这里没有办法回到旧的非 cdb 数据库。因此,在部署模式下开始升级之前,请检查您是否有完整备份。部署模式将再次执行预检查,然后执行升级和转换,最后执行编译无效对象或在集群中注册新 pdb 等后期任务。
java -jar $ORACLE_HOME/rdbms/admin/autoupgrade.jar -config config.txt -mode deploy
就像在分析模式中一样,您可以在 cli 中检查升级状态。自动升级中最重要的 cli 命令是:

检查和一些调整
如果一切正常,最后您将在 html 和正常日志文件中提供一份关于升级的总结报告。该报告显示升级期间完成的任务、使用的时间和日志目录,提供有关作业的一些详细信息。
此外,Oracle Grid Infrastructure 资源在自动升级期间自动更改。旧 noncdb1 数据库的资源已从集群中删除,并添加了 pdb 的新资源
最后,您可能会做一些维护工作。在我的测试实验室中,数据库文件存储在 ASM 中。所以因为autoupgrade是用nocopy方式执行pdb插件操作的,所以pdb会使用noncdb的源文件。在这种情况下,文件路径中仍然有旧的 db 名称。
SQL> select file#, name from v$datafile;
FILE# NAME
---------- ------------------------------------------------------------------------------------------------------------------------------------------------------
1 +DATA/CDB01/DATAFILE/system.261.1081002215
2 +DATA/CDB01/C9E99EACD6BE6700E0530A01A8C0DEDD/DATAFILE/system.262.1081002217
3 +DATA/CDB01/DATAFILE/sysaux.263.1081002219
4 +DATA/CDB01/C9E99EACD6BE6700E0530A01A8C0DEDD/DATAFILE/sysaux.264.1081002221
5 +DATA/CDB01/DATAFILE/undotbs1.265.1081002223
6 +DATA/CDB01/C9E99EACD6BE6700E0530A01A8C0DEDD/DATAFILE/undotbs1.266.1081002223
7 +DATA/CDB01/DATAFILE/users.269.1081002235
12 +DATA/NONCDB1/DATAFILE/system.286.1081018771
13 +DATA/NONCDB1/DATAFILE/sysaux.276.1081018781
14 +DATA/NONCDB1/DATAFILE/undotbs1.277.1081018789
15 +DATA/NONCDB1/DATAFILE/users.278.1081018795
要解决此问题,您可以执行数据文件的在线移动,oracle 会将文件名更改为_//DATAFILE/。
_是的,我知道这是企业版的一项功能,也许您的数据库仅在 SE 或 SE2 上运行。对于这种情况,您可以在配置文件中设置参数TARGET_PDB_COPY_OPTION 以进行自动升级。这也适用于 SE 客户,并将在插件操作期间复制非 cdb 数据文件。一如既往,迈克·迪特里希 (Mike Dietrich) 发表了一篇关于此选项以及如何使用它的精彩帖子
SQL> alter session set container=noncdb1;
Session altered.
SQL> alter database move datafile 12 to '+DATA';
Database altered.
SQL> alter database move datafile 13 to '+DATA';
Database altered.
SQL> alter database move datafile 14 to '+DATA';
Database altered.
SQL> alter database move datafile 15 to '+DATA';
Database altered.
SQL> alter session set container=cdb$root;
Session altered.
SQL> select file#, name from v$datafile;
FILE# NAME
---------- ------------------------------------------------------------------------------------------------------------------------------------------------------
1 +DATA/CDB01/DATAFILE/system.261.1081002215
2 +DATA/CDB01/C9E99EACD6BE6700E0530A01A8C0DEDD/DATAFILE/system.262.1081002217
3 +DATA/CDB01/DATAFILE/sysaux.263.1081002219
4 +DATA/CDB01/C9E99EACD6BE6700E0530A01A8C0DEDD/DATAFILE/sysaux.264.1081002221
5 +DATA/CDB01/DATAFILE/undotbs1.265.1081002223
6 +DATA/CDB01/C9E99EACD6BE6700E0530A01A8C0DEDD/DATAFILE/undotbs1.266.1081002223
7 +DATA/CDB01/DATAFILE/users.269.1081002235
12 +DATA/CDB01/C9EBB833AB831A02E0530A01A8C090C5/DATAFILE/system.272.1081342185
13 +DATA/CDB01/C9EBB833AB831A02E0530A01A8C090C5/DATAFILE/sysaux.286.1081342195
14 +DATA/CDB01/C9EBB833AB831A02E0530A01A8C090C5/DATAFILE/undotbs1.276.1081342201
15 +DATA/CDB01/C9EBB833AB831A02E0530A01A8C090C5/DATAFILE/users.277.108134220
在我的测试中,升级后无法定义目标 pdb 名称。目前,pdb 的名称将与 noncdb 数据库的名称相同。这不是什么大问题,我们现在可以更改 pdb 名称。我会将名称从 noncdb1 更改为 pdb1。
SQL> alter pluggable database noncdb1 close immediate;
Pluggable database altered.
SQL> alter pluggable database noncdb1 open restricted;
Pluggable database altered.
SQL> alter pluggable database noncdb1 rename global_name to pdb1;
Pluggable database altered.
SQL> alter pluggable database pdb1 close immediate;
Pluggable database altered.
SQL> alter pluggable database pdb1 open;
Pluggable database altered.
SQL> alter pluggable database pdb1 save state;
结论
正如您所看到的,自动升级工具在每个版本中都运行得越来越好。这是一个很大的变化,现在 21c 不再支持 noncdb 架构,但是很好,您不必手动创建 pdb 或执行某些插件操作。每个升级项目都是不同的,理解这一点非常重要,该工具只能帮助您自动化升级数据库的大部分任务。在升级到新版本之前,最重要的三件事是测试、测试和测试。这仍然是 dba 和开发人员的工作。
文章来源:https://blog.dbi-services.com/auto-upgrade-of-non-cdb-to-pdb-with-autoupgrade-jar-in-oracle-21c/





