Chinaunix首页 | 论坛 | 博客
  • 博客访问: 507609
  • 博文数量: 150
  • 博客积分: 6021
  • 博客等级: 准将
  • 技术积分: 1201
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-27 20:07
文章分类

全部博文(150)

文章存档

2012年(1)

2011年(27)

2010年(122)

我的朋友

分类: Oracle

2010-07-28 18:23:43

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据库不支持的类型包括:

NCLOBLONGLONG RAW BFILE ROWIDUROWID,以及用户自定义的类型,包括对象类型,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'的?
 

以上查询会返回用户名、表名以及通过YN来标识的字段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是系统知道对idname两个字段记录日志以定位这张表的记录。但是在选择非激活依赖的约束(这个约束会创建一个主键)的字段时要特别小心。如果选择的字段无法为这张表创建一个主键信息,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) COLUMNS;

 
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数据库使用很多定义在SYSSYSTEM中的表。默认情况下,这些表是创建在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_NAMEINSTANCE_NAME.



创建密钥文件


===========================================================

步骤:

(以上步骤其实可以不用!除了进行转换的准备和提高效率)


primary>

sql>ALTER SYSTEM SET LOG_ARCHIVE_DEST_3=
 'LOCATION=/u01/oradata/sean/arch VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE) DB_UNIQUE_NAME=jsspre' SCOPE=BOTH
sql>ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_3=ENABLE SCOPE=BOTH
sql>ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=/u01/oradata/sean/std VALID_FOR=(ONLINE_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=jsspre' scope=both;


sql>execute dbms_logstdby.build;


ldg>

ldg>show parameter db_name

ldg>alter database recover to logical standby jsspdg;

ldg>host rm /u01/oracle/dbs/orapwsean

ldg>host orapwd file=/u01/oracle/dbs/orapwsean password=verysafe entries=30

这一步一定不要忘!

ldg>shutdown immediate

ldg>startup mount

ldg>show parameter db_name;

ldg>select database_role from v$database;


ldg>alter system set log_archive_dest_1='LOCATION=/u01/oradata/sean/archive VALID_FOR=(ONLINE_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=jsspdg' scope=both;


ldg>alter system set log_archive_dest_3='LOCATION=/u01/oradata/sean/std VALID_FOR=(standby_logfiles,standby_role) DB_UNIQUE_NAME=jsspdg' scope=both;


ldg>alter database open resetlogs;

是否重启lsnrctl?不用重启,可以运行!


ldg>alter database start logical standby apply;

要启用实时应用建议先创建standby redologs创建方法

ldg>alter database stop logical standby apply;


ldg>alter database start logical standby apply immediate;



验证环境


运行完稍等一会儿就显示出来了!要有耐心!


转换过程

==========================================================



primary>

 select switchover_status from v$database;

primary>

 alter database prepare to switchover to logical standby;

primary>

select switchover_status from v$database;


ldg>

alter database prepare to switchover to primary;

ldg>

select switchover_status from v$database;

primary>

select switchover_status from v$database;

若不是TO LOGICAL STANDBY的话,DBA就要考虑取消此次转换,检查原因,然后再重新操作了

取消语句

primary>alter database prepare to switchover cancel;

需要分别在primary端和逻辑standby端执行


如果操作没有问题就可以正式转换

primary>alter database commit to switchover to logical standby;

ldg>

select switchover_status from v$database;

ldg>

alter database commit to switchover to primary;

primary>

alter database start logical standby apply immediate;


如果不成功,请stop再start一遍


环境测试







阅读(1341) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~