作者: fuyuncat
来源: www.HelloDBA.com
1 准备工作
1.1 第一步:确定主数据库中是否包含逻辑standby数据库不支持的数据类型和表。
以下是逻辑
standby
数据库支持的类型:
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
逻辑standby
数
据库不支持的类型包括:
NCLOB
,LONG
,LONG RAW
,BFILE
,ROWID
和UROWID
,以及用户自定义的类型,包括对象类型,REF类型,varray和嵌套表。如果存在表含有这些类型的字段,当逻辑standby数据库对这张表应用DML操作时就会报错。
逻辑standby
数
据库不支持的表和序列:
SYS用户的表
和
序列;
含有不支持数据类型的表;
建有函数索引的表;
建有物化视图的表;
全局临时表(Global Temporary Table)。
可以通
过
查询视图
DBA_LOGSTDBY_UNSUPPORTED来确定主数据库中是否含有不支持的对象:
SQL> SELECT * FROM DBA_LOGSTDBY_UNSUPPORTED;
如果主数据库
中
含有不支持的对象,日志实施服务进程(
Log Apply Service)在向standby数据库实施redo log时会自动排除这些对象。
1.2 第二步:确定主数据库中表的所有数据记录是否都能被唯一定位
为了维护
standby
数据库,SQL实施操作进程必须能够为一定位到主数据库上更新的每一条记录。为了能使主数据库上的变化数据能高效和正确的实施到standby数据库上,Oracle建议对每张表都建立主键。
大多数表都必须
有
了主键或者没有空值的唯一约束,否则,补充日志(
supplemental logging 在第四步会激活)会自动收集定位在主数据库上更新的记录的信息。通过补充日志,那些能够唯一定位记录的信息会加到归档redo日志中的每一个更新事务中,这样,日志实施服务进程就能维护standby数据库了。
可以通过以
下
步骤来确保
SQL实施操作进程能唯一定位表的记录:
1、 查询视
图
DBA_LOGSTDBY_NOT_UNIQUE来定位哪些表没有主键货无空值的唯一约束:
SQL> SELECT OWNER, TABLE_NAME, BAD_COLUMN FROM DBA_LOGSTDBY_NOT_UNIQUE;
以上查询会返回用户名、表名以及通过Y和N来标识的字段BAD_COLUMN:
·
如果BAD_COLUMN
的值为Y,表示这张表的字段使用一个极大的数据类型,如LONG。如果有两条这样的记录存在表中(除LOB字段外),这张表就无法被正确维护。
· 值为N表示表含有足够的信息来维护standby数据库上的表(但是却没有主键或无空值约束)。然而,如果你增加了主键,日志传输服务进程(Log Transport Service)和SQL实施操作进程将会更高效。
2、 在必要的情
况
下增加主键以提高效率
为了维护standby数据库上的表,补充日志功能会自动为redo日志中的每一个更新表操作增加字段数据,具体如下:
· 如果表已经有主键或者无空值的唯一索引,向redo日志中添加的信息将最少。
· 如果表没有主键或无空值的唯一索引,补充日志功能会通过向redo日志中的所有行都添加相应的值为它增加唯一健值。然而,这个自动增加的键值会增加写入到redo日志中的信息。
3、 在必要的情
况
下,在表上创建非激活依赖的约束。
如果表在视图
DBA_LOGSTDBY_NOT_UNIQUE
中可以查到,它又是一张会被频繁更新的表。可以通过创建一个非激活依赖的约束在表上来避免通过主键维护表,以提高redo日志的性能。一个非激活依赖的约束可以为SQL实施操作进程提供更多的信息,而不会增加在主数据库上的索引成本。下面的语句显示了如何建立一个非激活依赖的约束:
SQL> ALTER TABLE mytab ADD PRIMARY KEY (id, name) RELY DISABLE;
关键字RELY是系统知道对id和name两个字段记录日志以定位这张表的记录。但是在选择非激活依赖的约束(这个约束会创建一个主键)的字段时要特别小心。如果选择的字段无法为这张表创建一个主键信息,SQL实施操作进程将无法在standby数据库上是使这些日志。
1.3 第三步:确保主数据库是运行在归档模式下。
确保主数据库是运行在归档模式并且归档已经激活,可以通archive log list命令确认归档是否激活:
SQL> ARCHIVE LOG LIST;
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination /oracle/dbs/arch
Oldest online log sequence 0
Current log sequence 1
No Archive Mode表示当前不是归档模式。
如果数据库
没有运行在归档模式下,可以通过以下步骤修改到归档模式。
1、 关闭数据库,以MOUNT方式启动
SQL> SHUTDOWN
SQL> STARTUP MOUNT
2、 打开归档模式,打
开
数据库
SQL> ALTER DATABASE ARCHIVELOG;
SQL> ALTER DATABASE OPEN;
3、 检查是否已经
在
归档模式下:
SQL> ARCHIVE LOG LIST;
Database log mode Archive Mode
Automatic archival Disabled
Archive destination /oracle/dbs/arch
Oldest online log sequence 0
Next log sequence to archive 1
Current log sequence 1
1.4 第四步:在主数据库上激活补充日志进程
补
充信息帮助
SQL
实施操作进程在standby数据库上能正确的维护表。可以通过查询视图V$DATABASE检查补充日志进程是否激活:
SQL> SELECT SUPPLEMENTAL_LOG_DATA_PK, SUPPLEMENTAL_LOG_DATA_UI FROM V$DATABASE;
SUP SUP
--- ---
NO NO
如果没
有激活
,
通过执行以下语句向归档
redo日志添加主键和唯一索引信息,然后切换redo日志:
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE INDEX) COLUMN
S;
Database altered.
SQL> ALTER SYSTEM SWITCH LOGFILE;
System altered.
SQL> SELECT SUPPLEMENTAL_LOG_DATA_PK, SUPPLEMENTAL_LOG_DATA_UI FROM V$DATABASE;
SUP SUP
--- ---
YES YES
注意:在创建逻辑standby数据之前,一定要激活补充日志进程。因为逻辑standby数据库无法使用既包含补充日志数据又包含非补充日志数据的归档redo日志。
此外,如果你在主数据库上激活补充日志进程之前已经创建了物理standby数据库,就必须在所有物理standby数据库上做同样的操作。
除了补充日
志
进
程
外,还必须保证参数
LOG_PARALLELISM的值设为1:
SQL> ALTER SYSTEM SET LOG_PARALLELISM=1 SCOPE=BOTH;
1.5 第五步:如果打算进行热备,就需要启动资源管理器
要启动资源管理
器
,需要定义参数
RESOURCE_MANAGER_PLAN使用资源计划,并重启数据库。
如果没有资源
计
划,可以使用
SYSTEM_PLAN属性:
SQL> ALTER SYSTEM SET RESOURCE_MANAGER_PLAN=SYSTEM_PLAN SCOPE=BOTH;
SQL> SHUTDOWN
SQL> STARTUP
1.6 第六步:在主数据库上为standby数据库的系统表创建备选表空间
如果打算在
祝
节点进行切换操作,这一步就是必须的。
逻辑
standby
数据库使用很多定义在SYS和SYSTEM中的表。默认情况下,这些表是创建在SYSTEM表空间上。
注意:这些表中的某些表可能很快就会变得很大。为了防止这些标占满整个SYSTEM表空间,你必须建这些表转移到一个分开的表空间上去。在这些表被创建逻辑standby数据库时频繁使用之前转移这些表。
在主
数
据库上,使用CREATE TABLESPACE语句为standby数据库创建新的表空间,并使用存储过程DBMS_LOGMNR_D.SET_TABLESPACE将这些表转移到新的表空间上去。
SQL> CREATE TABLESPACE logmnrts$ DATAFILE 'C:"ORACLE"ORADATA"EDGAR"LOGMNRTS.DBF' SIZE 25 M AUTOEXTEND ON MAXSIZE UNLIMITED;
SQL> EXECUTE DBMS_LOGMNR_D.SET_TABLESPACE('logmnrts$');
2 创建逻辑standby数据库
2.1 第一步:检查主数据库上的数据文件
确认需
要创建道
逻
辑
standby数据库上的文件:
SQL> SELECT NAME FROM V$DATAFILE;
NAME
---------------------------------------------------
C:"ORACLE"ORADATA"EDGAR"SYSTEM01.DBF
C:"ORACLE"ORADATA"EDGAR"UNDOTBS01.DBF
C:"ORACLE"ORADATA"EDGAR"EXAMPLE01.DBF
C:"ORACLE"ORADATA"EDGAR"INDX01.DBF
C:"ORACLE"ORADATA"EDGAR"TOOLS01.DBF
C:"ORACLE"ORADATA"EDGAR"USERS01.DBF
C:"ORACLE"ORADATA"EDGAR"XDB01.DBF
C:"ORACLE"ORADATA"EDGAR"USERDATA"RMAN_TS.DBF
C:"ORACLE"ORADATA"EDGAR"TESTTM2.DBF
C:"ORACLE"ORADATA"EDGAR"USERDATA"ASSMIDX.DBF
C:"ORACLE"ORADATA"EDGAR"USERDATA"BAK_TEST.DBF
C:"ORACLE"ORADATA"EDGAR"LOGMNRTS.DBF
C:"ORACLE"ORADATA"EDGAR"USERDATA"TEST_TEMP.DBF
C:"ORACLE"ORADATA"EDGAR"USERDATA"ASSMDEMO.DBF
2.2 第二步:对主数据库做一个拷贝
采用冷备方式
下
按照以下步骤对主数据库做拷贝:
1、 关闭主
数
据库
SQL> SHUTDOWN IMMEDIATE;
2、 将第一
步
中查询出来的数据文件考到一个临时目录去
C:"> xcopy C:"ORACLE"ORADATA"EDGAR"* C:"ORACLE"ORADATA"TEMP"
3、 以
mount
模式启动主数据库
SQL> STARTUP MOUNT;
4、 创建
控
制文件的备份
SQL> ALTER DATABASE BACKUP CONTROLFILE TO 'C:"oracle"oradata"edgar"backup"ctlbckup01.ctl';
5、 查
询
出主数据库中的
SCN
SQL> SELECT CHECKPOINT_CHANGE# FROM V$DATABASE;
CHECKPOINT_CHANGE#
------------------
2696167892
6、 打开主
数
据库,并切换日志文件
SQL> ALTER DATABASE OPEN;
SQL> ALTER SYSTEM SWITCH LOGFILE;
7、 通过操
作
系统拷贝工具讲以下文件拷贝到
standby节点上去
· 将前面拷贝到临时目录中的文件拷贝到standby节点相应目录中去。
·
将数据库初始化文件和密码文件拷贝到standby节点相应目录中去
。
·
将上
一
步中日志切换操作产生的归档日志文件拷贝到
standby节点的归档日志目录中去。要保持归档日志格式一致。
8、 进入
下
一步:给
standby节点修改初始化参数文件
采用热备方式下按照以下步骤对主数据库做拷贝:
1、 分别将
每
个表空间修改成备份模式:
SQL> ALTER TABLESPACE SYSTEM BEGIN BACKUP;
2、 将表空
间
的数据文件拷贝到
standby节点的相应目录
3、 关闭表
空
间的备份模式:
SQL> ALTER TABLESPACE SYSTEM END BACKUP;
4、 创建控
制
文件的备份。
SQL> ALTER DATABASE BACKUP CONTROLFILE TO 'C:"oracle"oradata"edgar"backup"ctlbckup01.ctl';
5、 拷贝
控
制文件的备份、数据库初始化文件和密码文件到
standby节点上的相应目录。
6、 保持
主
数据库为静止状态,以便为建立
standby数据库获取到一个起始点。获取到SCN,并记录下来。
SQL> ALTER SYSTEM QUIESCE;
SQL> SELECT CHECKPOINT_CHANGE# FROM V$DATABASE;
CHECKPOINT_CHANGE#
------------------
443582
SQL> ALTER SYSTEM UNQUIESCE;
SQL> ALTER SYSTEM SWITCH LOGFILE;
除了所有数据文件需要拷贝外,还需要将热备过程中产生的归档日志拷贝到standby节点相应目录。
7、 进入下一步
:
给
standby节点修改初始化参数文件
2.3 第三步:修改standby数据库的初始化参数文件
如果采用的是
spfile
,可以先用以下语句创建出pfile文件:
SQL> create pfile='C:"oracle"admin"edgarstd"pfile"initedgarstd.ora' from spfile;
需要修改数据库的初
始
化参数中的一下参数:
1、 修改控制文件的
目
录,对应到
standby数据库的控制文件;
2、 修改或增加参数
STANDBY_ARCHIVE_DEST
,设置为standby数据库对应的归档日志目录。并保持参数LOG_ARCHIVE_FORMAT与主数据库一致。
3、 修改相应的数据
库
信息参数,如
DB_NAME、INSTANCE_NAME.