在Oracle 19c 数据库中升级和配置文件脚本

简而言之:将 Oracle 数据库升级到任何版本时,我建议:

  • glogin.sql从目标 Oracle Home(sqlplus/admin子文件夹)中删除该文件。
  • login.sql从当前目录中删除(如果存在)。
  • 取消设置SQLPATH环境变量。

如果您想了解更多细节,请继续阅读。这篇博文是由我前几天看到的一条推文开始的。我依稀记得我在 Oracle 之外(在现实世界中)的日子里,我使用的升级运行手册有类似的步骤。

先假设一下

如果你不这样做会发生什么?自动升级可能会失败:

-------------------------------------------------
Errors in database [CDB1]
Stage     [DBUPGRADE]
Operation [STOPPED]
Status    [ERROR]
Info    [
Error: UPG-1400
UPGRADE FAILED [CDB1]
Cause: Database upgrade failed with errors
For further details, see the log file located at /home/oracle/upg_logs/CDB1/CDB1/100/autoupgrade_20200804_user.log]

命令行升级可能会失败,原因是:

Unexpected error encountered in catctlMain; Error Stack Below; exiting
Died at /u01/app/oracle/product/19/rdbms/admin/catctl.pl line 9188.
 at /u01/app/oracle/product/19/rdbms/admin/catctl.pl line 9188.
    main::catctlDie("\x{a}Unexpected error encountered in catconInit; exiting\x{a} No chil"...) called at /u01/app/oracle/product/19/rdbms/admin/catctl.pl line 37
27
    main::catctlDBLogon("/u01/app/oracle/product/19/rdbms/admin", "/home/oracle/upg_logs/CDB1/CDB1/100/dbupgrade", "catupgrd20200804112601", "CDB\$ROOT", 0, 4) ca
lled at /u01/app/oracle/product/19/rdbms/admin/catctl.pl line 3782
    main::catctlLogon() called at /u01/app/oracle/product/19/rdbms/admin/catctl.pl line 1422
    main::catctlMain() called at /u01/app/oracle/product/19/rdbms/admin/catctl.pl line 1370
    eval {...} called at /u01/app/oracle/product/19/rdbms/admin/catctl.pl line 1368
 
------------------------------------------------------
CATCTL FATAL ERROR
------------------------------------------------------

并且数据库升级助手可能会像这样失败:
image.png

当您进一步挖掘日志时,您会发现ORA-04023: Object SYS.STANDARD could not be validated or authorized.

请注意,我写道可能会发生错误。那是因为这完全取决于您输入的内容glogin.sqllogin.sql. 有些事情可能会奏效——但有些肯定不会。经常使用的一件事是SET SERVEROUT ON肯定会破坏升级。

为什么

glogin.sql正式命名为站点配置文件脚本并login.sql命名为用户配置文件脚本。如文档中所述,它们在您每次启动SQL*Plus时都会执行,并且可以包含您在SQL*Plus 中键入的任何内容。您在 SQL*Plus 中使用的许多命令都在使用数据库中的功能。SET SERVEROUT ON以使用数据库包为例DBMS_OUTPUT

升级数据库时,它会以UPGRADE模式启动,这会极大地改变数据库的行为。此外,升级需要更改数据库中的许多功能。它通过调用 SQL*Plus 来执行脚本来做到这一点——而且它必须执行许多脚本。简而言之,它类似于:

sqlplus / as sysdba @upgrade.sql

如果您在升级期间定义配置文件脚本,您实际上是在升级脚本之前注入要执行的代码。如果您的配置文件脚本尝试使用暂时不起作用的功能,则会发生错误。某些脚本设置为退出,SQLERROR这将中断升级。其他人则忽略该错误,以便稍后在检查日志文件中是否有意外错误消息时失败。

想象一下,当升级尝试替换软件包DBMS_OUTPUT并且同时有一个配置文件脚本设置SET SERVEROUT ON.我们正在尝试使用被替换的相同功能。

如何操作

你可以使用这个小例子来避免这个问题:

export TARGET_ORACLE_HOME=/u01/app/oracle/product/19
mv $TARGET_ORACLE_HOME/sqlplus/admin/glogin.sql $TARGET_ORACLE_HOME/sqlplus/admin/glogin.sql.backup
mv login.sql login.sql.backup
export SQLPATH=
# Now start the upgrade using the preferred method
java -jar autoupgrade.jar ....
# Or
cd $TARGET_ORACLE_HOME/bin
dbupgrade
# Or
$TARGET_ORACLE_HOME/bin/dbua

现在怎么办

如果你glogin.sql离题了,你可能会得到一个错误:

image.png

其他选项(命令行或 DBUA)根本没有检查。

我们正在努力使我们的文档更清楚地说明这个问题,所以期待很快就会看到更新。


数据运维技术 » 在Oracle 19c 数据库中升级和配置文件脚本