建立逻辑备库之前,应该先建立物理备库
(1)--确定逻辑备库所支持的方案,注意,sys、system用户不支持,所以在sys、system用户等方案中建立的对象无法传递到逻辑备库。
select username from dba_users where username not in (select owner from dba_logstdby_skip);
USERNAME
------------------------------
TTS
RMAN
TEST
HR
PERFSTAT
SCOTT
TSMSYS
(2)--确定不支持的对象,逻辑备库对一些类型不支持,如用户自定义类型,xml object、bfile等
select owner || '.' || table_name table_name, data_type,attributes from dba_logstdby_unsupported;
TABLE_NAME DATA_TYPE ATTRIBUTES
-------------------------------------------------------------
HR.PARTNO NUMBER Object Table
(3)--确定支持的对象中哪些无法被唯一标识,需要替这些对象加上主键或者unique约束。
select owner,table_name from dba_logstdby_not_unique
where table_name not in (select table_name from dba_logstdby_unsupported);
OWNER TABLE_NAME
------------------------------ ------------------------------
SCOTT BONUS
SCOTT SALGRADE
HR PARTS
HR COUNTRIES
HR PRODUCT
SCOTT TT1
HR TEST1
HR TEST
SCOTT CUSTOMERS
HR DIGITS
SCOTT TEST1
SCOTT SALES
为这些表加上主键或者唯一约束,因为逻辑备库的物理结构和主库不同,所以不能根据rowid定义备库的行,只能根据主键或者唯一约束来定位。
alter table scott.bonus add primary key(ename);
。。。
(3) 在主库和备库上均打开补充日志
alter database add supplemental log data(primary key,unique index)columns;
select supplemental_log_data_pk pk_log,supplemental_log_data_ui ui_log from v$database;
PK_ UI_
--- ---
YES YES
(4) 在主库上创建logical standby controlfile
alter database create logical standby controlfile as '/opt/oracle/bak/control01.ctl' reuse;
(5)关闭备库,拷贝上面创建的控制文件,覆盖备库的控制文件
shutdown immediate;
cp /opt/oracle/bak/control01.ctl /opt/oracle/oradata/standby/
(6)启动备库到mount状态,应用日志
startup mount;
alter database recover managed standby database disconnect from session;
(7) 启动逻辑备库
alter database activate standby database;
若出现ORA-16228:
Insufficient recovery for logical standby
Cause: Insufficient amount of recovery was run for logical standby instantiation.
Action: Continue to recover the database using ALTER DATABASE RECOVER MANAGED STANDBY DATABASE.
继续执行 alterdatabase recovermanaged standby database;
然后再执行 alter database activate standby database;
(8)重新启动备库到mount状态,修改逻辑备库的数据库名,修改完后备库自动关闭
shutdown immediate
startup mount
nid target=sys/oracle@standby dbname=standby --修改控制文件和数据文件中的数据库名
orapwd file=$ORACLE_HOME/dbs/pwdstandby.ora password=oracle --创建对应于新数据库名的密码文件
--修改参数文件中的db_name
create pfile from spfile;
vim pfile
修改db_name='standby'
create spfile from pfile;
(9)启动改名后的备库
startup mount;
alter database open resetlogs;
(10)检查有没有临时文件,如果没有,为临时表空间添加临时文件
select * from v$tempfile;
alter tablespace temp add tempfile '/opt/oracle/oradata/standby/temp01.dbf' size 50M;
(11)应用日志
alter database start logical standby apply;
--关闭日志用如下命令:alter database stop logical standby apply;
(12)查看日志应用情况
select sequence#,applied from dba_logstdby_log;
select value from v$logstdby_stats where name='coordinator state'; --如果没有返回行,证明日志应用没有打开。
(13)在主库做修改提交,切换日志,到备库查询,判断是否已经应用修改。