如何创建logical standby?
1.试验环境 SQL> select * from v$version;
BANNER ------------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod PL/SQL Release 10.2.0.1.0 - Production CORE 10.2.0.1.0 Production TNS for 32-bit Windows: Version 10.2.0.1.0 - Production NLSRTL Version 10.2.0.1.0 - Production
主库名:ning 备库名:test
2.数据类型支持情况 支持的数据类型 CHAR NCHAR VARCHAR2 and VARCHAR NVARCHAR2 NUMBER DATE TIMESTAMP TIMESTAMP WITH TIMEZONE TIMESTAMP WITH LOCAL TIMEZONE INTERVAL YEAR TO MONTH INTERVAL DAY TO SECOND RAW CLOB and NCLOB BLOB LONG LONG RAW BINARY_FLOAT BINARY_DOUBLE
不支持的数据类型 BFILE ROWID, UROWID User-defined types Collections (including VARRAYS and nested tables) XML type Encrypted columns Multimedia data types (including Spatial, Image, and Context)
3.存储类型支持
支持的存储类型 堆表 索引组织表 簇表
不支持的存储类型 压缩段
4.PL/SQL包支持
支持的PL/SQL包 不修改系统元数据的包 不会产生redo的包
比如:DBMS_OUTPUT, DBMS_RANDOM,DBMS_PIPE, DBMS_DESCRIBE, DBMS_OBFUSCATION_TOOLKIT,
DBMS_TRACE, 和DBMS_METADATA.
不支持的PL/SQL包 修改系统元数据的包 DBMS_JAVA, DBMS_REGISTRY,DBMS_ALERT, DBMS_SPACE_ADMIN, DBMS_REFRESH, DBMS_REDEFINITION,
DBMS_SCHEDULER, 和DBMS_AQ
例外情况,dbms_job包是被支持的,在主库添加的job会复制到备库,但不会自动运行。
5.不支持的数据库对象
不支持的schema SQL> SELECT OWNER FROM DBA_LOGSTDBY_SKIP WHERE STATEMENT_OPT = 'INTERNAL SCHEMA';
OWNER ---------- SYSTEM SYS DIP OUTLN WMSYS DBSNMP
已选择6行。
不支持的表: 压缩表 使用了不支持的数据类型的表 列被加密过的表
下面的sql可以查询出不支持的数据库对象 SQL>SELECT DISTINCT OWNER,TABLE_NAME FROM DBA_LOGSTDBY_UNSUPPORTED ORDER BY
OWNER,TABLE_NAME;
未选定行
6.忽略的SQL语句 一般情况下,在主库执行的sql语句都会在备库执行,但以下除外: ALTER DATABASE ALTER SESSION ALTER MATERIALIZED VIEW ALTER MATERIALIZED VIEW LOG ALTER SYSTEM CREATE CONTROL FILE CREATE DATABASE CREATE DATABASE LINK CREATE PFILE FROM SPFILE CREATE SCHEMA AUTHORIZATION CREATE MATERIALIZED VIEW CREATE MATERIALIZED VIEW LOG CREATE SPFILE FROM PFILE DROP DATABASE LINK DROP MATERIALIZED VIEW DROP MATERIALIZED VIEW LOG EXPLAIN LOCK TABLE SET CONSTRAINTS SET ROLE SET TRANSACTION
7.确保表都有唯一性约束 由于逻辑库的rowid和主库不一致。数据就需要唯一性标识: 如果有主键,则使用主键 如果没有主键,但有NOT NULL的唯一性约束,则使用该唯一性约束 如果两者都没有,则使用整个数据行
所有,为了更好的性能,确保每个table都有主键
查找没有主键或唯一性约束的表 SQL> select owner,table_name 2 from dba_logstdby_not_unique 3 where (owner,table_name) not in 4 (select distinct owner,table_name from dba_logstdby_unsupported) 5 and bad_column='Y';
未选定行
如果上面的查询发现有不符合条件的table,可以为其添加主键。如果应用能确保表中的数据是唯一的,
为了不影响性能,也可以使用rely constraints,关于rely,constraints,请参考Data Warehouse Guide文档笔记(三):RELY constraints
alter table test add constraints primary key(id) rely disable;
8.创建physical standby 具体过程可参考:
Oracle10G Physical Standby Database笔记
利用rman创建standby(一)
利用rman创建standby(二)
9.停止physical standby的恢复进程
SQL> alter database recover managed standby database cancel;
数据库已更改。
10.在主库redo中生成数据字典信息
logical standby使用了logminer技术,需要生成数据字典信息。 SQL> exec dbms_logstdby.build
PL/SQL 过程已成功完成。
执行该过程需要等到所有活动事务结束。所以,如果有条件的话,最好重启主库到restrict模式后再执行
。另外,还要利用flashback查询来获得一致性数据,所有请将undo_retention设置得足够大。
11.为备库生成spfile SQL> create spfile from pfile;
文件已创建。
SQL> shutdown immediate; ORA-01109: 数据库未打开
已经卸载数据库。 ORACLE 例程已经关闭。 SQL> startup nomount ORACLE 例程已经启动。
Total System Global Area 142606336 bytes Fixed Size 1247732 bytes Variable Size 83887628 bytes Database Buffers 50331648 bytes Redo Buffers 7139328 bytes SQL> alter database mount standby database;
数据库已更改。
12.将physical standby转换成logical standby
SQL> alter database recover to logical standby test;
数据库已更改。
该操作同时会将参数db_name设置为test
13.打开logical standby
SQL> alter database open resetlogs;
数据库已更改。
14.启用日志应用
SQL> alter database start logical standby apply;
数据库已更改。
在alert日志中可以发现相关的恢复进程启用成功的信息。
15.验证 在主库上 SQL> insert into ning.test values(2,'a');
已创建 1 行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系统已更改。
等待一段时间后,从逻辑备库上查询,得到结果 SQL> select * from ning.test;
ID NAME ---------- ------------------------------------------------------------ 2 a
说明逻辑备库已经运行正常。至此,逻辑备库创建成功。
16.Logical standby相关视图
v$logstdby v$logstdby_process v$logstdby_state v$logstdby_stats v$logstdby_transcation dba_logstdby_events dba_logstdby_history dba_logstdby_log dba_logstdby_not_unique dba_logstdby_parameters
17.启用实时日志应用(real-time apply) oracle10g加入了实时应用的新特性,需要使用lgwr来传送日志才能使用。
a.首先在备库添加standby redo logfile SQL> alter database add standby logfile group 4 ('e:/oracle/ora10/oradata/test/standby 04.redo') size 10m; Database altered. SQL> alter database add standby logfile group 5 ('e:/oracle/ora10/oradata/test/standby 05.redo') size 10m; Database altered. SQL> alter database add standby logfile group 6 ('e:/oracle/ora10/oradata/test/standby 06.redo') size 10m; Database altered. SQL> alter database add standby logfile group 7 ('e:/oracle/ora10/oradata/test/standby 07.redo') size 10m; Database altered.
b.在主库将日志传送方式改为lgwr alter system set log_archive_dest_2='service=test lgwr async db_unique_name=test'
c.停止日志应用 SQL> alter database stop logical standby apply;
数据库已更改。
d.启用real-time apply SQL> alter database start logical standby apply immediate;
数据库已更改。
e.在主库插入记录并commit SQL> insert into ning.test values(3,'b');
已创建 1 行。
SQL> commit;
提交完成。
f.马上在备库就可以查到对应的数据了 SQL> select * from ning.test;
ID NAME ---------- ------------------------------------------------------------ 2 a 3 b