Oracle快照备用数据库测试最佳实践
2026-06-05
Oracle 11g 的 Data Guard 不仅通过 Active Data Guard 提供了实时查询这一卓越功能,还带来了一项额外惊喜——快照备用数据库(Snapshot Standby Database)功能。该功能允许将备用数据库切换至“读写”模式,从而构建一个可用于测试的环境;此类测试若直接在生产主数据库上执行则可能带来不便,例如模拟线上部署及其他相关任务。当在读写模式下完成各项任务后,可轻松将快照备用数据库的角色切换回常规备用数据库角色,并恢复与主数据库的同步。处于快照备用数据库状态时,该数据库仍可接收主数据库的日志,但无法将这些变更应用到自身数据库中。
Oracle 快照备用数据库测试最佳实践
1. 停止重做应用进程
如果备用数据库当前正在进行重做应用操作,则必须首先将其停止。
sys@ora11gdg> alter database recover managed standby database cancel; Database altered.
2. 检查备用数据库当前状态,确保其处于 MOUNTED 状态。
sys@ora11gdg> select database_role,open_mode from v$database; DATABASE_ROLE OPEN_MODE PHYSICAL STANDBY MOUNTED
此时,备用数据库作为物理备用数据库运行,并处于 MOUNTED 模式。
3. 确保已指定闪回恢复区。
温馨提示: 启用快照备用数据库功能,并不要求在主数据库和备用数据库上都启用闪回数据库功能。该功能与是否启用闪回数据库功能无关。
sys@ora11gdg> show parameter db_recovery_file_dest NAME TYPE VALUE db_recovery_file_dest string /u01/app/oracle/flash_recovery_area db_recovery_file_dest_size big integer 3852M
确认主数据库上未启用闪回功能。
sys@ora11g> select FLASHBACK_ON from v$database; FLASHBACK_ON NO
确认备用数据库上未启用闪回功能。
sys@ora11gdg> select FLASHBACK_ON from v$database; FLASHBACK_ON NO
4. 通过执行一条简单直接的 SQL 命令,将备用数据库调整为快照备用(Snapshot Standby)状态。
sys@ora11gdg> alter database convert to snapshot standby; Database altered. sys@ora11gdg> select database_role,open_mode from v$database; DATABASE_ROLE OPEN_MODE SNAPSHOT STANDBY MOUNTED
5. 将备用数据库置于读写状态,以供外部访问。
sys@ora11gdg> alter database open; Database altered. sys@ora11gdg> select database_role,open_mode from v$database; DATABASE_ROLE OPEN_MODE SNAPSHOT STANDBY READ WRITE
一个全新的读写型数据库展现在我们面前。
6. 分析切换过程中的日志信息。
Oracle 11g 主数据库告警日志:
Mon Mar 19 18:46:28 2012 LNS: Attempting destination LOG_ARCHIVE_DEST_2 network reconnect (3135) LNS: Destination LOG_ARCHIVE_DEST_2 network reconnect abandoned Errors in file /u01/app/oracle/diag/rdbms/ora11g/ora11g/trace/ora11g_nsa2_27302.trc: ORA-03135: connection lost contact Error 3135 for archive log file 2 to 'ora11gdg' Errors in file /u01/app/oracle/diag/rdbms/ora11g/ora11g/trace/ora11g_nsa2_27302.trc: ORA-03135: connection lost contact LNS: Failed to archive log 2 thread 1 sequence 50 (3135) Errors in file /u01/app/oracle/diag/rdbms/ora11g/ora11g/trace/ora11g_nsa2_27302.trc: ORA-03135: connection lost contact
Oracle 11g 备用数据库告警日志:
Mon Mar 19 18:46:26 2012 alter database convert to snapshot standby Starting background process RVWR Mon Mar 19 18:46:26 2012 RVWR started with pid=26, OS id=8824 Allocated 3981204 bytes in shared pool for flashback generation buffer Created guaranteed restore point SNAPSHOT_STANDBY_REQUIRED_03/19/2012 18:46:26 krsv_proc_kill: Killing 3 processes (all RFS) Begin: Standby Redo Logfile archival End: Standby Redo Logfile archival RESETLOGS after complete recovery through change 1472476 Resetting resetlogs activation ID 4174194338 (0xf8cd26a2) Online log /u01/app/oracle/oradata/ora11gdg/redo01.log: Thread 1 Group 1 was previously cleared Online log /u01/app/oracle/oradata/ora11gdg/redo02.log: Thread 1 Group 2 was previously cleared Online log /u01/app/oracle/oradata/ora11gdg/redo03.log: Thread 1 Group 3 was previously cleared Standby became primary SCN: 1472474 Mon Mar 19 18:46:29 2012 Setting recovery target incarnation to 5 CONVERT TO SNAPSHOT STANDBY: Complete - Database mounted as snapshot standby Completed: alter database convert to snapshot standby
关键信息行显示:“已创建保证还原点 SNAPSHOT_STANDBY_REQUIRED_03/19/2012 18:46:26。”这表明我们转换为快照的准确时刻,从而为后续回退操作提供支持。
7. 测试快照备用数据库接收主数据库日志的情况
即使主数据库发生日志切换,备用数据库仍会持续接收日志,只是暂不应用这些日志。
1) 在主数据库上执行日志切换。
sys@ora11g> alter system switch logfile; System altered.
2)主数据库记录的告警日志内容
Oracle 11g 主数据库告警日志:
Mon Mar 19 18:52:00 2012 Thread 1 cannot allocate new log, sequence 52 Private strand flush not complete Current log# 3 seq# 51 mem# 0: /u01/app/oracle/oradata/ora11g/redo03.log Mon Mar 19 18:52:00 2012 ARC3: Standby redo logfile selected for thread 1 sequence 50 for destination LOG_ARCHIVE_DEST_2 Thread 1 advanced to log sequence 52 (LGWR switch) Current log# 1 seq# 52 mem# 0: /u01/app/oracle/oradata/ora11g/redo01.log Mon Mar 19 18:52:03 2012 Archived Log entry 91 added for thread 1 sequence 51 ID 0xf8cd26a2 dest 1: Mon Mar 19 18:52:03 2012 LNS: Standby redo logfile selected for thread 1 sequence 51 for destination LOG_ARCHIVE_DEST_2 LNS: Standby redo logfile selected for thread 1 sequence 52 for destination LOG_ARCHIVE_DEST_2
Oracle 11g 备用数据库告警日志:
Mon Mar 19 18:52:00 2012 RFS[5]: Assigned to RFS process 9174 RFS[5]: Identified database type as 'snapshot standby': Client is ARCH pid 27296 Mon Mar 19 18:52:00 2012 RFS[6]: Assigned to RFS process 9176 RFS[6]: Identified database type as 'snapshot standby': Client is ARCH pid 27300 RFS[6]: Selected log 4 for thread 1 sequence 50 dbid -120744030 branch 778023141 Mon Mar 19 18:52:00 2012 Archived Log entry 47 added for thread 1 sequence 50 ID 0xf8cd26a2 dest 1: Mon Mar 19 18:52:03 2012 RFS[7]: Assigned to RFS process 9180 RFS[7]: Identified database type as 'snapshot standby': Client is LGWR ASYNC pid 27302 RFS[7]: Selected log 4 for thread 1 sequence 51 dbid -120744030 branch 778023141 Mon Mar 19 18:52:04 2012 Archived Log entry 48 added for thread 1 sequence 51 ID 0xf8cd26a2 dest 1: RFS[7]: Selected log 4 for thread 1 sequence 52 dbid -120744030 branch 778023141
3)检查主数据库和备用数据库归档目录中日志文件的内容
(1)主数据库的归档日志文件:
ora11g@secdb /home/oracle/arch/ora11g$ ls -ltr total 879M ...omitted... -rw-r----- 1 oracle oinstall 1.1M Mar 19 18:51 1_50_778023141.arc -rw-r----- 1 oracle oinstall 363K Mar 19 18:52 1_51_778023141.arc
(2)归档备用数据库的日志文件:
ora11g@secdb /home/oracle/arch/ora11gdg$ ls -ltr total 847M ...omitted... -rw-r----- 1 oracle oinstall 1.1M Mar 19 18:52 1_50_778023141.arc -rw-r----- 1 oracle oinstall 363K Mar 19 18:52 1_51_778023141.arc
如所观察,备用数据库已成功接收来自主数据库发送的日志文件。
8. 在快照备用数据库中创建用户、表并初始化数据。
sys@ora11gdg> create user ocmu identified by ocmu;
User created.
secooler@ora11gdg> grant dba to ocmu;
Grant succeeded.
secooler@ora11gdg> conn ocmu/ocmu
Connected.
ocmu@ora11gdg> create table t (x varchar2(8));
Table created.
ocmu@ora11gdg> insert into t values ('Secooler');
1 row created.
ocmu@ora11gdg> commit;
Commit complete.
ocmu@ora11gdg> select * from t;
X
Secooler此时,备用数据库处于可修改、可调整的状态,即符合预期的“读写”(READ WRITE)模式。
需要特别注意的是,快照备用数据库功能的实现从根本上依赖于闪回数据原理。因此,此处应避免执行任何可能妨碍数据库闪回的操作。否则,快照备用数据库将无法恢复到之前的备用恢复状态。
9. 将快照备用数据库还原为物理备用数据库
1)重启备用数据库至 MOUNTED 状态。
ocmu@ora11gdg> conn / as sysdba Connected. sys@ora11gdg> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. sys@ora11gdg> startup mount ORACLE instance started. Total System Global Area 313860096 bytes Fixed Size 1336232 bytes Variable Size 268438616 bytes Database Buffers 37748736 bytes Redo Buffers 6336512 bytes Database mounted. sys@ora11gdg> select database_role,open_mode from v$database; DATABASE_ROLE OPEN_MODE SNAPSHOT STANDBY MOUNTED
2) 执行命令以恢复物理备用数据库的原始身份。
sys@ora11gdg> alter database convert to physical standby; Database altered.
3) 备用数据库的告警日志详细记录了此切换过程。
Mon Mar 19 19:30:24 2012 alter database convert to physical standby ALTER DATABASE CONVERT TO PHYSICAL STANDBY (ora11gdg) Flashback Restore Start Flashback Restore Complete Stopping background process RVWR Deleted Oracle managed file /u01/app/oracle/flash_recovery_area/ORA11GDG/flashback/o1_mf_7pg3n2jc_.flb Deleted Oracle managed file /u01/app/oracle/flash_recovery_area/ORA11GDG/flashback/o1_mf_7pg52yst_.flb Guaranteed restore point dropped Clearing standby activation ID 4174523254 (0xf8d22b76) The primary database controlfile was created using the 'MAXLOGFILES 30' clause. There is space for up to 27 standby redo logfiles Use the following SQL commands on the standby database to create standby redo logfiles that match the primary database: ALTER DATABASE ADD STANDBY LOGFILE 'srl1.f' SIZE 52428800; ALTER DATABASE ADD STANDBY LOGFILE 'srl2.f' SIZE 52428800; ALTER DATABASE ADD STANDBY LOGFILE 'srl3.f' SIZE 52428800; ALTER DATABASE ADD STANDBY LOGFILE 'srl4.f' SIZE 52428800; Completed: alter database convert to physical standby
从告警日志可推断,所采用的恢复方法使用了“闪回数据库”功能。这意味着即使备用数据库未处于闪回数据库模式,仍可借助闪回数据库功能完成备用数据库的角色转换。
4)以自动恢复日志模式重启备用数据库。
(1)此时,数据库处于未装载(NOMOUNTED)状态,需要重新启动。
请注意,这需要重启数据库,而不是使用 ALTER 命令,否则将遇到以下错误信息:
sys@ora11gdg> alter database mount; alter database mount l ERROR at line 1: ORA-00750: database has been previously mounted and dismounted sys@ora11gdg> shutdown immediate; ORA-01507: database not mounted ORACLE instance shut down. sys@ora11gdg> startup mount; ORACLE instance started. Total System Global Area 313860096 bytes Fixed Size 1336232 bytes Variable Size 268438616 bytes Database Buffers 37748736 bytes Redo Buffers 6336512 bytes Database mounted. sys@ora11gdg> alter database recover managed standby database disconnect; Database altered.
(2)通过检查备用数据库的告警日志,可以清晰地观察到恢复过程。
Mon Mar 19 19:43:48 2012 Managed Standby Recovery not using Real Time Apply Parallel Media Recovery started with 4 slaves Waiting for all non-current ORLs to be archived... All non-current ORLs have been archived. Clearing online redo logfile 1 /u01/app/oracle/oradata/ora11gdg/redo01.log Clearing online log 1 of thread 1 sequence number 1 Completed: alter database recover managed standby database disconnect Clearing online redo logfile 1 complete Clearing online redo logfile 2 /u01/app/oracle/oradata/ora11gdg/redo02.log Clearing online log 2 of thread 1 sequence number 2 Clearing online redo logfile 2 complete Media Recovery Log /home/oracle/arch/ora11gdg/1_49_778023141.arc Media Recovery Log /home/oracle/arch/ora11gdg/1_50_778023141.arc Media Recovery Log /home/oracle/arch/ora11gdg/1_51_778023141.arc Media Recovery Log /home/oracle/arch/ora11gdg/1_52_778023141.arc Media Recovery Log /home/oracle/arch/ora11gdg/1_53_778023141.arc Media Recovery Log /home/oracle/arch/ora11gdg/1_54_778023141.arc Media Recovery Waiting for thread 1 sequence 55
(3)通过检查动态性能视图 V$ARCHIVED_LOG 来监控日志应用状态。
sys@ora11gdg> select sequence#, first_time, next_time, applied from v$archived_log order by sequence#; SEQUENCE# FIRST_TIME NEXT_TIME APPLIED ...omitted... 49 20120319 18:32:32 20120319 18:38:03 YES 50 20120319 18:38:03 20120319 18:51:00 YES 51 20120319 18:51:00 20120319 18:52:03 YES 52 20120319 18:52:03 20120319 19:09:57 YES 53 20120319 19:09:57 20120319 19:10:15 YES 54 20120319 19:10:15 20120319 19:10:25 YES 52 rows selected.
10. 启用备用数据库进入只读(READ ONLY)状态,以验证此前在快照备用数据库上执行的操作已被回滚。
sys@ora11gdg> alter database recover managed standby database cancel; Database altered. sys@ora11gdg> alter database open read only; Database altered. sys@ora11gdg> select database_role,open_mode from v$database; DATABASE_ROLE OPEN_MODE PHYSICAL STANDBY READ ONLY sys@ora11gdg> select username from dba_users where username = 'OCMU'; no rows selected
结论已确认:此前创建的测试用户“OCMU”不存在。
使用专业解决方案保护您的 Oracle 数据库
Oracle 快照备用数据库对测试用途非常有用。然而,为了进一步保护您的数据库环境,建议使用专业的备份与灾难恢复解决方案来备份您的 Oracle 数据库。

Vinchin 备份与恢复 提供强大功能,可自动、灵活且高效地保护虚拟机和物理服务器中的数据库。它支持多种数据库的保护,包括Oracle DB、MySQL、SQL Server、Postgres Pro 和 MariaDB,具备数据库压缩、集中式任务管理、智能备份策略、热备份以及针对 SQL Server/Oracle 的高级支持。此外,它还支持强大的勒索软件防护 功能,以及跨 10 多个虚拟化平台的虚拟机到虚拟机(V2V)迁移。
Vinchin 备份与恢复软件已被数千家企业选用,您也可以立即开始使用这一功能强大的系统,享受为期15天的全功能免费试用!此外,您还可联系我们,留下您的具体需求,我们将根据您的IT环境为您量身定制解决方案。
下载免费试用版
适用于多种数据备份
* 15天全功能免费安全下载
结论
“快照备用数据库”这一显著特性,使备用数据库能够临时转变为可读写的独立数据库,从而极大拓展了备用数据库的应用场景。借助该备用数据库的特殊功能,您可以安全地测试并复现那些在生产环境中模拟和复现存在风险的问题。测试完成后,即可将数据库恢复为物理备用数据库身份,并继续执行日志恢复。