下面的是 Logical Standby Database 的配置步骤 .
( 下面用到的一些文件的位置都是临时性的 , 还得做一定的修改 )
将主数据库置为 FORCE LOGGING 模式 . 在主数据库创建之后做如下操作 :
SQL>ALTER DATABASE FORCE LOGGING;
确认主数据库是归档的并定义好本地归档 . 如下 :
SQL >ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=e:\oracle\oradata\orcl\archive MANDATORY' SCOPE=BOTH;
确认 LOG_PARALLELISM 初始化参数值 ,Logical Standby Database 要求此参数的值为 1, 是个缺省值 . 如果查出来的参数值为 1 则不需要做修改 , 如果不是 1 值则要用 ALTER SYSTEM SET 命令做修改 . 具体操作如下 :
SQL>SHOW PARAMETER LOG_PARAMETER------ 查看参数的当前值
SQL>ALTER SYSTEM SET LOG_PARALLELISM=1 SCOPE=BOTH;
修改完以后要关闭数据库并重新启动此参数才有效 .
SQL>SHUTDOWN IMMEDIATE
SQL>STARTUP
确认支持的数据类型和表 :
在建立 Logical Standby Database 时 , 有些数据类型和表是支持的而有些是不支持的 .
支持的数据类型有 :
CHAR
NCHAR
VARCHAR2
and VARCHAR
NVARCHAR2
NUMBER
DATE
TIMESTAMP
TIMESTAMP WITH TIME ZONE
TIMESTAMP WITH LOCAL TIME ZONE
INTERVAL YEAR TO MONTH
INTERVAL DAY TO SECOND
RAW
CLOB
BLOB
不支持的 数据类型 有 :
NCLOB
LONG
LONG RAW
BFILE
ROWID
UROWID
user-defined types
object types REF
s
varrays
nested tables
不支持的对象类型有 :
User-defined tables and sequences in the SYS
schema
Tables with unsupported datatypes
Tables using data segment compression
Index-organized tables
确认主数据是否包含不支持的对象可以查询数据字典表 DBA_LOGSTDBY_UNSUPPORTED:
SQL>SELECT DISTINCT OWNER,TABLE_NAME FROM DBA_LOGSTDBY_UNSUPPORTED
2> ORDER BY OWNER,TABLE_NAME;
用以下的方式查看上面所得出的表的字段名和数据类型 :
SQL> SELECT COLUMN_NAME,DATA_TYPE FROM DBA_LOGSTDBY_UNSUPPORTED
2> WHERE OWNER='OE' AND TABLE_NAME = 'CUSTOMERS';
Logical Standby Database 会过滤的 SQL 语句为 :
ALTER DATABASE
ALTER SESSION
ALTER SNAPSHOT
ALTER SNAPSHOT LOG
ALTER SYSTEM SWITCH LOG
CREATE CONTROL FILE
CREATE DATABASE
CREATE DATABASE LINK
CREATE PFILE FROM SPFILE
CREATE SCHEMA AUTHORIZATION
CREATE SNAPSHOT
CREATE SNAPSHOT LOG
CREATE SPFILE FROM PFILE
CREATE TABLE AS SELECT FROM A CLUSTER TABLE
DROP DATABASE LINK
DROP SNAPSHOT
DROP SNAPSHOT LOG
EXPLAIN
LOCK TABLE
RENAME
SET CONSTRAINTS
SET ROLE
SET TRANSACTION
确保主数据库中的表行是可以唯一确认的 ( 即有表中有主键 )
找出没有主键的表 :
SQL> SELECT OWNER, TABLE_NAME, BAD_COLUMN FROM DBA_LOGSTDBY_NOT_UNIQUE
2> WHERE TABLE_NAME NOT IN (SELECT TABLE_NAME FROM DBA_LOGSTDBY_UNSUPPORTED);
OWNER TABLE_NAME B
------------------------------ ------------------------------ -
OUTLN OL$HINTS N
OUTLN OL$NODES N
SYSTEM MVIEW$_ADV_BASETABLE N
SYSTEM MVIEW$_ADV_SQLDEPEND N
SYSTEM MVIEW$_ADV_FILTERINSTANCE N
SYSTEM DEF$_ORIGIN N
SYSTEM REPCAT$_SNAPGROUP N
SYSTEM REPCAT$_DDL N
SYSTEM REPCAT$_RESOLUTION_STATISTICS N
SYSTEM REPCAT$_RUNTIME_PARMS Y
SYSTEM MVIEW$_ADV_INDEX N
选择出来看 BAD_COLUMN 字段值 . 如果此值为 N 表示这个表关于没有主键字段列有足够的列信息传到备用数据库中 . 如果此值为 Y 表示信息不够必须对这个表加一个 DISABLE RELY CONSTRAINT 以使关于这个表的 LOG 可以 APPLY 到逻辑备用库中 .
选择出来只有 SYSTEM 用户下的表 REPCAT$_RUNTIME_PARMS 需要做修改 , 然后
SQL>DESC SYSTEM. REPCAT$_RUNTIME_PARMS 查看这个表的结构 . 然后做修改如下 :
SQL> ALTER TABLE SYSTEM. REPCAT$_RUNTIME_PARMS ADD PRIMARY KEY (RUNTIME_PARM_ID,PARAMETER_NAME) RELY DISABLE;
修改完以后再做上面的查询以确认没有表需要再做修改 :
SQL> SELECT OWNER, TABLE_NAME, BAD_COLUMN FROM DBA_LOGSTDBY_NOT_UNIQUE
2> WHERE TABLE_NAME NOT IN (SELECT TABLE_NAME FROM DBA_LOGSTDBY_UNSUPPORTED);
OWNER TABLE_NAME B
------------------------------ ------------------------------ -
OUTLN OL$HINTS N
OUTLN OL$NODES N
SYSTEM MVIEW$_ADV_BASETABLE N
SYSTEM MVIEW$_ADV_SQLDEPEND N
SYSTEM MVIEW$_ADV_FILTERINSTANCE N
SYSTEM DEF$_ORIGIN N
SYSTEM REPCAT$_SNAPGROUP N
SYSTEM REPCAT$_DDL N
SYSTEM REPCAT$_RESOLUTION_STATISTICS N
SYSTEM MVIEW$_ADV_INDEX N
确认主数据库可以补足日志 (Supplemental Logging)
SQL> SELECT SUPPLEMENTAL_LOG_DATA_PK, SUPPLEMENTAL_LOG_DATA_UI FROM V$DATABASE;
SUP SUP
--- ---
NO NO (NO 值表示此时主数据库是不支持补足日志的 )
使主数据库可以补足日志
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE INDEX) COLUMNS;( 这条语句将有关由主数据修改的行唯一信息可以通过日志传到备用数据库中并做 Log Apply)
在主数据库中做新的日志切换 . 因为在上一步做完 Enable Supplemental Logging 之后 . 当前日志可能包含了有补足的日志和没有补足的日志 , 而逻辑备用数据库的 Log Apply 是不支持两者一起的日志的 . 所以在创建逻辑备用数据库之前要确保要从主数据库传到备用数据库的所有日志都只包含补足日志
SQL>ALTER SYSTEM ARCHIVE LOG CURRENT;
确认一下主数据库此时支持补足日志
SQL> SELECT SUPPLEMENTAL_LOG_DATA_PK, SUPPLEMENTAL_LOG_DATA_UI FROM V$DATABASE;
SUP SUP
--- ---
YES YES (YES 值表示此时主数据库是支持补足日志的 )
SUPPLEMENTAL_LOG_DATA_PK: 支持补足日志 , 其信息是 primary key
SUPPLEMENTAL_LOG_DATA_UI: 支持补足日志 , 其信息是 unique index
在主数据库创建一个交替的表空间 . 并用 DBMS_LOGMNR_D.SET_TABLESPACE
将某些表放到这个表空间中
.
因为在逻辑备用数据库中有一些表是属于
SYS
和
SYSTEM
用户的
,
而这些是放在表空间的
.
这些表可能在一段时间后记录猛增
.
为了使
SYSTEM
表空间不会被用满而导致数据库
DOWN
机
,
建立这个交替的表空间来存放这些表
.
SQL>CREATE TABLESPACE logmnrts DATAFILE '/disk1/oracle/dbs/logmnrts.dbf'
2> SIZE 25M AUTOEXTEND ON MAXSIZE 2048M
3>SEGMENT SPACE MANAGEMENT AUTO;
SQL> EXECUTE DBMS_LOGMNR_D.SET_TABLESPACE('logmnrts');
( 上面一步 EXECUTE DBMS_LOGMNR_D.SET_TABLESPACE('logmnrts'); 可以在以后的维护中再做相应的维护 )
** 创建逻辑备用数据库 **
确认主数据库的数据文件和日志文件
在主数据库中通过查询 V$DATAFILE 获得数据文件的位置
SQL> select name from v$datafile;
NAME
-----------------------------------------------------------
E:\ORACLE\ORA92\ORCL\SYSTEM01.DBF
E:\ORACLE\ORA92\ORCL\UNDOTBS01.DBF
E:\ORACLE\ORA92\ORCL\EXAMPLE01.DBF
E:\ORACLE\ORA92\ORCL\INDX01.DBF
E:\ORACLE\ORA92\ORCL\TOOLS01.DBF
E:\ORACLE\ORA92\ORCL\USERS01.DBF
E:\ORACLE\ORA92\ORCL\LOGMNRTS.DBF
E:\ORACLE\ORA92\ORCL\XDB01.DBF
在主数据库中通过查询 V$LOGFILE 获得日志文件的位置
SQL> col member format a35
SQL> select group#,type,member from v$logfile;
GROUP# TYPE MEMBER
---------- ------- -----------------------------------
1 ONLINE E:\ORACLE\ORA92\ORCL\REDO01.LOG
2 ONLINE E:\ORACLE\ORA92\ORCL\REDO02.LOG
3 ONLINE E:\ORACLE\ORA92\ORCL\REDO03.LOG
对主数据库做一次冷备份 ( 全备份 , 拷贝所有需要的文件 : 数据文件 , 控制文件 , 参数文件 ) 具体做法如下 :
关闭数据库 :SQL>SHUTDOWN IMMEDIATE
将前面得到的数据文件拷贝到一个临时的位置 F:\ORACLE
启动数据库到 MOUNT 状态下 :SQL>STARTUP MOUNT
为逻辑备用数据库创建一个备份的控制文件 :
SQL> ALTER DATABASE BACKUP CONTROLFILE TO
2> 'f:\oracle\bkcontrol.ora';
将主数据库放在 restricted session 模式下 ( 在打开数据库时以免用户对数据库进行 DML 和 DDL 操作 ): SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
建立 Logminer 字典 (Logical Standby Database 在分解 REDO LOG 为 SQL 语句时需要 Logminer 工具 , 而这个工具在使用之前需要建立 Logminer 字典 ):
SQL> ALTER DATABASE OPEN;
SQL> EXECUTE DBMS_LOGSTDBY.BUILD;
取消主数据库的 restricted session 模式使用户可以执行 DML 和 DDL 语句 :
SQL> ALTER SYSTEM DISABLE RESTRICTED SESSION;
查看最近的归档日志 ( 在后面的逻辑备用数据库的创建过程中需要用到 )
SQL> ALTER SYSTEM ARCHIVE LOG CURRENT;( 对当前日志做归档 )
SQL> SELECT NAME FROM V$ARCHIVED_LOG
2> WHERE (SEQUENCE#=(SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG
3> WHERE DICTIONARY_BEGIN = 'YES' AND STANDBY_DEST= 'NO'));
NAME
-----------------------------------------------------------------
E:\ORACLE\ORADATA\ORCL\ARCHIVE\1_19.DBF
上面的查询其中 WHERE 子句的 DICTIONARY_BEGIN 指明是要找出新建的字典 , STANDBY_DEST 指明是本地归档目录而不是远程归档 .
为备用数据库创建准备初始化参数 :
SQL> CREATE PFILE='f:\oracle\initstdby.ora' FROM SPFILE;
将前面三步所得到的数据文件 , 控制文件和参数文件从主数据库的服务器拷贝到备用数据库的服务器 .( 拷贝到 f:\oracle 目录 )
在备用数据库服务器修改初始化参数 ( 刚拷贝过来的初始化参数文件 ) <SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: