如何创建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
本文地址:http://www.45fan.com/a/question/68987.html