原文连接:How to Upgrade with Data Guard
原文作者:Daniel Overby Hansen
您可以将数据库upgrade
到新版本,并保持数据保护设置不变。备库可以通过主库的重做隐式升级,升级后不需要重建备库。
过程:
在下文中,我将使用此设置:
您应该提前在主库主机和备库用主机上安装新的Oracle Home。 这两个Oracle Home应用相同的补丁,建议总是应用最新的Release Update。
升级前
这个过程在运行预升级补丁之前就开始了 。 已经开始停机,没有用户登录连接到数据库。
禁用 Data Guard Broker
如果您不使用Data Guard Broker,您可以跳过本章并转到停止 Data Guard一章。连接到代理并禁用快速启动故障转移:
DGMGRL SYS@PROD1> disable fast_start failover
复制
接下来,禁用代理配置:
DGMGRL SYS@PROD1> disable configuration
复制
然后,您可以关闭主服务器中的代理。制作代理配置文件的副本。使用以下 SQL 生成命令以复制文件。
记住执行生成的命令:
PROD1 SQL> alter system set dg_broker_start=false scope=both; PROD1 SQL> select 'host cp ' || value || ' /tmp' as cmd from v$parameter where name like 'dg_broker_config_file%'; PROD1 SQL> --Now, execute the commands PROD1 SQL> host ls /tmp/dr*.dat
复制
最后,对备库做同样的操作:
PROD2 SQL> alter system set dg_broker_start=false scope=both; PROD2 SQL> select 'host cp ' || value || ' /tmp' as cmd from v$parameter where name like 'dg_broker_config_file%'; PROD1 SQL> --Now, execute the commands PROD2 SQL> host ls /tmp/dr*.dat
复制
停止Data Guard
在主库上,将重做日志延迟传输到备库。 严格地说,这不是必需的,但我是本着“安全比后悔好”的原则来做的。 确保验证log_archive_dest_state_2
是备库的实际存档目的地:
PROD1 SQL> show parameter log_archive_dest_2 PROD1 SQL> alter system set log_archive_dest_state_2='defer' scope=both;
复制
接下来,取消对备用数据库的重做应用:
PROD2 SQL> alter database recover managed standby database cancel;
复制
最后,关闭数据库:
PROD2 SQL> shutdown immediate
复制
如果您使用 Grid Infrastructure (GI) 来管理数据库,则应该停止并禁用数据库。严格来说,禁用数据库不是必需的,但同样是一种“安全比后悔好”的方法:
[oracle@bm2]$ $ORACLE_HOME/bin/srvctl stop database -d PROD2 [oracle@bm2]$ $ORACLE_HOME/bin/srvctl disable database -d PROD2
复制
Upgrade
现在可以使用自己喜欢的方法升级主数据库。 完成所有升级后任务,并执行必要的测试以验证新数据库版本。
如果在升级期间发生了一些事情,您想要恢复,您可以闪回数据库(or restore on Standard Edition),并简单地撤消升级前的步骤(通过启用数据库,启动数据库,启动重做应用等)。
请记住,在我们开始接触任何东西之前,备用数据库就被留下了,所以如果所有其他数据库都失败了,只需重新启动备用数据库,然后将您的用户连接到它。
请记住,在我们开始操作任何东西之前,备库是被留下来的,所以如果所有其他操作都失败,只需重新启动备用数据库,并将用户连接到它。
After Upgrade
重启Data Guard
当您对升级感到满意,并且您的测试验证了新的数据库版本时,您就可以继续了。
更新备用主机上的侦听器。请务必更新 listener.ora 条目中的 Oracle Home 信息。请注意,您的 listener.ora 可能存储在非默认位置,因此请使用它lsnrctl status来获取位置。最后,重新加载监听器:
[grid@bm2]$ $GRID_HOME/bin/lsnrctl status [grid@bm2]$ vi $GRID_HOME/network/admin/listener.ora [grid@bm2]$ $GRID_HOME/bin/lsnrctl reload
复制
对于接下来的命令,我将使用相同的提示符,并且配置以下环境变量:
[oracle@bm2]$ export OLD_HOME=/u01/app/oracle/product/18.0.0.0/dbhome_1 [oracle@bm2]$ export NEW_HOME=/u01/app/oracle/product/19.0.0.0/dbhome_1 [oracle@bm2]$ export ORACLE_HOME=$NEW_HOME [oracle@bm2]$ export ORACLE_SID=PROD [oracle@bm2]$ #Set ORACLE_UNQNAME to DB_UNIQUE_NAME [oracle@bm2]$ export ORACLE_UNQNAME=PROD2
复制
接下来,如果备库在默认位置 ($ORACLE_HOME/network/admin) 中使用 TNS_ADMIN,那么请务必将相关的 TNS 别名复制到新的tnsnames.ora 中。主库和备库应该有 TNS 别名。或者,如果同一个 Oracle Home 中没有其他数据库,您可以简单地复制文件:
[oracle@bm2]$ #Back up files [oracle@bm2]$ cp $NEW_HOME/network/admin/sqlnet.ora $NEW_HOME/network/admin/sqlnet.ora.backup [oracle@bm2]$ cp $NEW_HOME/network/admin/tnsnames.ora $NEW_HOME/network/admin/tnsnames.ora.backup [oracle@bm2]$ #Copy from old to new home [oracle@bm2]$ cp $OLD_HOME/network/admin/sqlnet.ora $NEW_HOME/network/admin [oracle@bm2]$ cp $OLD_HOME/network/admin/tnsnames.ora $NEW_HOME/network/admin
复制
现在,您可以编辑/etc/oratab并更新有关 Oracle Home 的信息以匹配新的 Oracle Home:
[oracle@bm2]$ vi /etc/oratab
复制
将 SPFile 和密码文件复制到新的 Oracle 主目录:
[oracle@bm2]$ cp $OLD_HOME/dbs/orapw$ORACLE_SID $ORACLE_HOME/dbs [oracle@bm2]$ cp $OLD_HOME/dbs/spfile$ORACLE_SID.ora $ORACLE_HOME/dbs
复制
如果使用 GI 管理数据库,则必须升级数据库,即更新 Oracle Home 信息,因此 GI 会在正确的 Oracle Home 中启动数据库。接下来,重新启用并启动数据库:
[oracle@bm2]$ $ORACLE_HOME/bin/srvctl upgrade database -db $ORACLE_UNQNAME -oraclehome $ORACLE_HOME [oracle@bm2]$ $ORACLE_HOME/bin/srvctl modify database -db $ORACLE_UNQNAME -startoption MOUNT -role PHYSICAL_STANDBY [oracle@bm2]$ $ORACLE_HOME/bin/srvctl enable database -d $ORACLE_UNQNAME [oracle@bm2]$ $ORACLE_HOME/bin/srvctl start database -d $ORACLE_UNQNAME
复制
或者,如果您不使用 GI,只需启动数据库:
PROD2 SQL> startup mount
复制
重新启用重做日志传输和应用
在主库上重新启用重做日志传输到备库:
PROD1 SQL> alter system set log_archive_dest_state_2='enable' scope=both;
复制
对备库重启redo apply
PROD2 SQL> alter database recover managed standby database disconnect from session;
重新启用 Data Guard Broker
首先,我们需要将代理配置文件复制到新的 Oracle 主目录中。 如果你将你的代理配置文件存储在Oracle Home之外,这可能对你来说没有必要:
[oracle@bm1]$ export ORACLE_HOME=/u01/app/oracle/product/19.0.0.0/dbhome_1 [oracle@bm1]$ export ORACLE_UNQNAME=PROD1 [oracle@bm1]$ cp /tmp/dr1$ORACLE_UNQNAME.dat $ORACLE_HOME/dbs [oracle@bm1]$ cp /tmp/dr2$ORACLE_UNQNAME.dat $ORACLE_HOME/dbs
复制
在备库主机上执行相同操作:
[oracle@bm2]$ export ORACLE_HOME=/u01/app/oracle/product/19.0.0.0/dbhome_1 [oracle@bm2]$ export ORACLE_UNQNAME=PROD2 [oracle@bm2]$ cp /tmp/dr1$ORACLE_UNQNAME.dat $ORACLE_HOME/dbs [oracle@bm2]$ cp /tmp/dr2$ORACLE_UNQNAME.dat $ORACLE_HOME/dbs
复制
现在,可以在主库和备库上重新启动 Data Guard Broker:
PROD1 SQL> alter system set dg_broker_start=true scope=both; PROD2 SQL> alter system set dg_broker_start=true scope=both;
复制
最后,启用代理配置和快速启动故障转移:
DGMGRL SYS@PROD1> show configuration DGMGRL SYS@PROD1> enable configuration DGMGRL SYS@PROD1> enable fast_start failover
复制
Test
使用代理确保一切正常:
DGMGRL SYS@PROD1> show configuration DGMGRL SYS@PROD1> show database prod1 DGMGRL SYS@PROD1> show database prod2
复制
您应该SUCCESS列出两个数据库 升级后使用 Data Guard Broker 验证 Data Guard 设置
让我们尝试进行switchover切换:
DGMGRL SYS@PROD1> switchover to prod2
复制
如果您不使用 Data Guard Broker,则使用常规 SQL 和 SQLPlus 来验证 Data Guard 环境。
结论
升级数据库实际上并不复杂,即使它是数据保护设置的一部分。需要一些额外的工作来处理备库。但好在DR设置在整个过程中都得到了维护。
请留意即将推出的 AutoUpgrade 版本。在撰写本文时,我们的开发人员正在努力简化流程。我们希望数据保护的升级是 100% 自动化的(或尽可能接近自动化)。
延伸阅读
-
Patching, Upgrading, and Downgrading Databases in an Oracle Data Guard Configuration – Oracle Database 19c Data Guard Concepts and Administration
-
Oracle Data Guard Broker Upgrading and Downgrading – Oracle Database 19c Data Guard Broker
-
When you upgrade, disable the Data Guard Broker – Mike Dietrich blog post
-
Oracle Data Guard Command-Line Interface (DGMGRL) Reference – Oracle Database 19c Data Guard Broker