执行 alter database recover to logical standby 前必须确保数据库处于 mount 状态,否则报 ora-19953;需 shutdown immediate 后 startup mount exclusive,且 db_unique_name 必须与主库一致。

执行 ALTER DATABASE RECOVER TO LOGICAL STANDBY 前必须确保数据库处于 MOUNT 状态
这是最常被跳过的硬性前提。如果备库当前是 OPEN(哪怕是只读),该命令会直接报 ORA-19953: database should not be open,尤其在 Oracle 10g/11g 中无法绕过。这个错误不是配置问题,而是状态校验失败。
常见误操作包括:刚取消 MRP 后直接 STARTUP 就执行转换命令,或误以为“已关闭”就等于“已 mount”。正确流程是:
SHUTDOWN IMMEDIATE-
STARTUP MOUNT EXCLUSIVE(注意必须加EXCLUSIVE,共享模式不支持逻辑备库转换) - 再执行
ALTER DATABASE RECOVER TO LOGICAL STANDBY <db_unique_name></db_unique_name>
其中 <db_unique_name></db_unique_name> 必须与主库 DB_UNIQUE_NAME 参数一致,大小写敏感;若填错,后续 OPEN RESETLOGS 会失败并提示控制文件不匹配。
DBMS_LOGSTDBY.BUILD 必须在主库执行,且需提前建好 LogMiner 表空间
逻辑备库依赖 LogMiner 字典解析重做日志。如果主库没执行 DBMS_LOGSTDBY.BUILD,或执行时底层表空间不存在,逻辑备库启动 SQL Apply 后会卡在“等待字典”状态,V$LOGSTDBY_PROGRESS 显示 dictionary build not started 或长时间停滞在低 SCN。
实操要点:
- 先创建专用表空间:
CREATE TABLESPACE logmnrtbs DATAFILE '/path/to/logmnr.dbf' SIZE 100M AUTOEXTEND ON NEXT 5M MAXSIZE 2G; - 指定该表空间:
EXEC DBMS_LOGMNR_D.SET_TABLESPACE('logmnrtbs'); - 再执行:
EXEC DBMS_LOGSTDBY.BUILD; - 执行后立即
ALTER SYSTEM ARCHIVE LOG CURRENT;,确保含字典的归档日志尽快传到备库
注意:11g 默认不自动启用 supplemental logging,建议额外执行 ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;,否则部分 DML(如无主键更新)可能无法被正确重放。
转换后首次 OPEN RESETLOGS 失败,大概率是未清理临时文件或内部 schema 冲突
物理备库转逻辑备库后,ALTER DATABASE OPEN RESETLOGS 报错常见于两类场景:
-
ORA-01248类文件缺失:因物理备库的TEMPFILE路径在逻辑备库中不可用,需手动重建。执行:ALTER DATABASE TEMPFILE '/old/temp01.dbf' DROP INCLUDING DATAFILES;,再新建临时表空间 -
ORA-16224或日志中出现internal schema conflict:说明主库存在被DBA_LOGSTDBY_SKIP自动屏蔽的系统 Schema(如AUD$,LOGMNR),但备库控制文件里残留了这些对象的元数据。需在转换前确认:SELECT owner FROM dba_logstdby_skip WHERE statement_opt = 'INTERNAL SCHEMA';,若有结果,应在主库显式跳过:EXEC DBMS_LOGSTDBY.SKIP('SCHEMA_DDL', 'SYS', 'AUD$');
这类问题不会在转换命令时报错,而是在 OPEN RESETLOGS 阶段暴露,排查窗口窄、日志线索少,务必前置检查。
启动 SQL Apply 前,必须验证主库所有表都有主键或唯一约束
逻辑备库通过主键定位行进行 DML 重放。一旦遇到无主键、无唯一约束的表,DBA_LOGSTDBY_NOT_UNIQUE 视图就会记录,SQL Apply 启动后会跳过该表更新,且不报错——数据静默不同步。
执行以下查询确认:
SELECT owner, table_name, bad_column FROM dba_logstdby_not_unique;
若返回结果,必须在主库上为对应表添加主键或唯一约束(不能仅在备库加)。注意:BAD_COLUMN 列显示的是导致不唯一的列名,常为 ROWID 或 LOB 列,这类表往往还需额外处理(如禁用 LOB caching)。
另外,DBA_LOGSTDBY_UNSUPPORTED 中列出的对象(如含嵌套表、BFILE 的表)无法被逻辑备库同步,必须从业务侧规避或改用其他复制方案——这点容易被忽略,直到应用层发现数据缺失才回溯。











