随笔-42  评论-12  文章-0  trackbacks-0
本文描述如何创建一个逻辑备用数据库,包括以下主题:
创建逻辑备用数据库的准备工作
创建逻辑备用数据库
更多的准备
1、创建逻辑备用数据库的准备工作
在你创建备用数据库之前,你需要首先确保主数据库的配置是正确的。
1.1确定对于表的数据类型和存储参数的支持
在建立逻辑备用数据库之前,确保逻辑备用数据库可以维护你主数据中的数据类型和表。
下列表显示了逻辑备用数据库支持的何不支持的多种数据库对象
Supported Datatypes and Storage Attributes for Tables
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 (including both fixed-width and variable-width character sets)
NCLOB
BLOB
LONG
LONG RAW
BINARY_FLOAT
BINARY_DOUBLE
Index-organized tables (without overflows and without LOB columns)
Unsupported Datatypes
BFILE
ROWID
UROWID
user-defined types
object types REFs
varrays
nested tables
XMLType
不支持的表,序列,视图
多数传输的的方案被sql apply跳过
带有不支持的数据类型的表
使用表压缩的表
要确定哪些方案会被跳过,查询DBA_LOGSTDBY_SKIP视图
要确定是否主库包含部支持的对象,查询DBA_LOGSTDBY_UNSUPPORTED视图
在你创建逻辑备用数据库前验证主库不支持的数据库对象是很重要的。因为对于不支持的对象的修改不会传播到逻辑备用数据库。而且,也不会返回错误消息。
例如,在主库使用下面的查询列出主数据库表中逻辑数据库不支持的表的方案名和表名:
SQL> SELECT DISTINCT OWNER,TABLE_NAME FROM DBA_LOGSTDBY_UNSUPPORTED
2> ORDER BY OWNER,TABLE_NAME;
OWNER TABLE_NAME
----------- --------------------------
HR COUNTRIES
OE ORDERS
OE CUSTOMERS
OE WAREHOUSES
查询列名和数据类型
SQL> SELECT COLUMN_NAME,DATA_TYPE FROM DBA_LOGSTDBY_UNSUPPORTED
2> WHERE OWNER='OE' AND TABLE_NAME = 'CUSTOMERS';
COLUMN_NAME DATA_TYPE
------------------------------- -------------------
CUST_ADDRESS CUST_ADDRESS_TYP
PHONE_NUMBERS PHONE_LIST_TYP
CUST_GEO_LOCATION SDO_GEOMETRY
如果主数据库包含不支持的表,当应用日志数据时,日志应用服务自动排除这些表
1.1.1在逻辑备用数据库跳过的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
1.1.2支持的类型和操作
不修改系统元数据或者用户数据的Oracle PL/SQL支持包可以安全的被主数据库使用,例如DBMS_OUTPUT, DBMS_RANDOM, DBMS_PIPE, DBMS_DESCRIBE, DBMS_OBFUSCATION_TOOLKIT, DBMS_TRACE, DBMS_METADATA,不修改系统元数据,修改用户数据的Oracle PL/SQL包,只要修改的数据是支持的数据类型的,可以被sql apply 支持,例如DBMS_LOB, DBMS_SQL, DBMS_TRANSACTION。
修改系统元数据的Oracle PL/SQL包,因为sql apply 不支持元数据的修改,所以这些改动对于逻辑备用数据库是不可见的。例如DBMS_JAVA, DBMS_REGISTRY, DBMS_ALERT, DBMS_SPACE_ADMIN, DBMS_REFRESH, DBMS_SCHEDULER, DBMS_AQ
对于DBMS_JOB,提供了特殊的支持。在逻辑备用数据库,作业是暂停的,并且不能直接创建。但是,在主库提交的作业会被复制到备库,在switchover或者failover之后,新主库的作业会自动开始运行。
1.2确保主库中的表行能被唯一标志
因为ROWID在主库和从库中可能不一致,所以必须使用一个不同的机制来匹配主库更新的行与它在从库中对应的行。你可以使用以下方法来匹配对应行:
主键
唯一索引
oracle建议你给主库的表增加主键和唯一性约束,确保sql apply可以有效地对逻辑备用数据库应用修改。
完成以下步骤:
第一步,在主库中找到没有唯一标志的表。
查询DBA_LOGSTDBY_NOT_UNIQUE视图来显示表中没有主键或者表中的唯一索引中存在有非空列的表:
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);
由于supplemental logging,以上查询显示的一些表也可以被支持。
BAD_COLUMN列的值可以是Y或N
Y,表示一个表列被使用大数据类型定义,例如CLOB或BLOB。sql apply尝试维护这些表,但是你必须要保证表中除这列外的其他列的单值性。就是说,注意,如果一个表中有两行除了LOB列外,其他的值完全相同,这样表的改动就不能被逻辑备用数据库应用,sql apply会停止。
N,表示表中包含足够的列信息,需要用来在逻辑备用数据库中维护表的
第二步,增加一个非激活依赖约束
如果你的应用可以保证表中行的唯一性,你可以创建一个非激活依赖的主键约束:
SQL> ALTER TABLE mytab ADD PRIMARY KEY (id, name) RELY DISABLE;
RELY约束告诉系统假定行是唯一的。
2、创建逻辑备用数据库
2.1创建一个物理备用数据库
首先创建一个物理备用数据库,然后把它转换成一个逻辑备用数据库:
第一步,创建物理备用数据库。
第二步,确保物理备用数据库追上主数据库
在你完成启动物理备用数据库和重做应用之后,允许恢复进行到备用数据库与主数据库一致的状态,包括所有数据库结构的改变,例如增加或删除数据文件。
2.2准备主数据库使它支持逻辑备用数据库
2.2.1确保激活追加日志的功能
在主数据库,追加日志的功能必须被激活来支持逻辑备用数据库。因为oracle数据库只记录被修改的列,并不总能够唯一确定修改的行,所以额外的信息需要被放入重做日志数据流中。额外的信息帮助sql apply来维护逻辑备用数据库中的表。
第一步,确定追加日志功能是否被激活
SQL> SELECT SUPPLEMENTAL_LOG_DATA_PK AS PK_LOG,
2> SUPPLEMENTAL_LOG_DATA_UI AS UI_LOG
3> FROM V$DATABASE;
PK_LOG UI_LOG
------ ------
NO NO
第二步,激活追加日志功能
在主数据库,使用如下语句增加主键和唯一索引信息到归档重做日志文件中:
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE INDEX) COLUMNS;
第三步,验证追加日志功能激活
SQL> SELECT SUPPLEMENTAL_LOG_DATA_PK AS PK_LOG,
2> SUPPLEMENTAL_LOG_DATA_UI AS UI_LOG
3> FROM V$DATABASE;
PK_LOG UI_LOG
------ ------
YES YES
注意,如果在一个有物理备用数据库的Data Guard配置中,你在主数据库激活追加日志功能,之后你必须在每一个物理备用数据库执行ALTER DATABASE ADD SUPPLEMENTAL LOG DATA 这个语句,来确保将来的switchover能够正确工作。
2.2.2为角色转换准备主数据库
主数据库:逻辑备用角色初始化参数
LOG_ARCHIVE_DEST_1=
'LOCATION=/arch1/chicago/
VALID_FOR=(ONLINE_LOGFILES,ALL_ROLES)
DB_UNIQUE_NAME=chicago'
LOG_ARCHIVE_DEST_2=
'SERVICE=boston
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
DB_UNIQUE_NAME=boston'
LOG_ARCHIVE_DEST_3=
'LOCATION=/arch2/chicago/
VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE)
DB_UNIQUE_NAME=chicago'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
LOG_ARCHIVE_DEST_STATE_3=ENABLE
UNDO_RETENTION=3600
2.3转换物理备用数据库为逻辑备用数据库
2.3.1确保追加日志功能激活
在逻辑备用数据库完成上文的步骤
2.3.2准备一个初始化参数文件
第一步,为逻辑备用数据库设置初始化参数
你需要修改LOG_ARCHIVE_DEST_n参数,增加PARALLEL_MAX_SERVERS参数。
你需要修改LOG_ARCHIVE_DEST_n参数,是因为与物理备用数据库不一样,逻辑备用数据库是打开状态的数据库,需要生成重做数据,有多种日志文件(联机重做日志文件,归档重做日志文件以及备用重做日志文件)
例如:逻辑备用数据库修改的初始化参数
LOG_ARCHIVE_DEST_1=
'LOCATION=/arch1/boston/
VALID_FOR=(ONLINE_LOGFILES,ALL_ROLES)
DB_UNIQUE_NAME=boston'
LOG_ARCHIVE_DEST_2=
'SERVICE=chicago
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
DB_UNIQUE_NAME=chicago'
LOG_ARCHIVE_DEST_3=
'LOCATION=/arch2/boston/
VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE)
DB_UNIQUE_NAME=boston'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
LOG_ARCHIVE_DEST_STATE_3=ENABLE
PARALLEL_MAX_SERVERS=9
UNDO_RETENTION=3600
PARALLEL_MAX_SERVERS参数:不要设置小于5的值;要得到最佳结果,最小把它设置为9;
第二步,关闭逻辑备用数据库
SQL> SHUTDOWN IMMEDIATE;
2.3.3创建控制文件
第一步,创建控制文件
SQL> ALTER DATABASE CREATE LOGICAL STANDBY CONTROLFILE AS '/tmp/boston.ctl';
第二步,复制控制文件到逻辑备用数据库
cp /tmp/boston.ctl /arch1/boston/control1.ctl
cp /tmp/boston.ctl /arch2/boston/control2.ctl
2.4启动逻辑备用数据库
第一步,启动装载逻辑备用数据库
SQL> STARTUP MOUNT PFILE=initboston.ora;
第二步,准备sql apply
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE;
第三步,激活逻辑备用数据库
SQL> ALTER DATABASE ACTIVATE STANDBY DATABASE;
第四步,重建逻辑备用数据库的数据库名
运行oracle DBNEWID (nid)工具来改变逻辑备用数据库的数据库名,修改名字防止主库副本与最初主库之间的交互。
在你运行这个工具前,必须关闭和装载数据库
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT PFILE=initboston.ora;
现在在备用数据库运行DBNEWID工具来改变数据库名并且关闭它:
nid TARGET=SYS/password@boston DBNAME=boston
Connected to database chicago (DBID=1456557175)
Control Files in database:
/arch1/boston/control1.ctl
Change database ID and database name chicago to boston? (Y/[N]) => y
Proceeding with operation
Changing database ID from 1456557175 to 416458362
Changing database name from chicago to boston
Control File /arch1/boston/control1.ctl - modified
Datafile /arch1/boston/system01.dbf - dbid changed, wrote new name
Datafile /arch1/boston/undotbs01.dbf -dbid changed, wrote new name
.
.
.
Control File /arch1/boston/control1.ctl-dbid changed, wrote new name
Database name changed to boston.
Modify parameter file and generate a new password file before restarting.
Database ID for database boston change to 416458362.
All previous backups and archive logs for this database are unusable.
Database has been shut down, open database with RESETLOGS option.
Successfully changed database name and ID.
DBNEWID - Completed successfully.
当运行Oracle DBNEWID (nid)之后你必须重建密码文件。
第五步,在参数文件中修改逻辑备用数据库名。
修改DB_NAME初始化参数文件
创建spfile
SQL> CREATE SPFILE FROM PFILE=initboston.ora;
重新启动逻辑备用数据库
SQL> STARTUP MOUNT;
SQL> ALTER DATABASE OPEN RESETLOGS;
第六步,改变逻辑备用数据库的全局名。
SQL> ALTER DATABASE RENAME GLOBAL_NAME TO boston;
第七步,创建一个新的临时文件
SQL> SELECT TABLESPACE_NAME FROM DBA_TABLESPACES
2> WHERE CONTENTS = 'TEMPORARY';
TABLESPACE_NAME
--------------------------------
TEMP1
TEMP2
SQL> ALTER TABLESPACE TEMP1 ADD TEMPFILE
2> '/arch1/boston/temp01.dbf'
3> SIZE 40M REUSE;
第八步,启动sql apply
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY;
2.5检验备用数据库的工作
第一步,检验归档重做日志文件已登记。
SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YY HH24:MI:SS';
Session altered.
SQL> COLUMN DICT_BEGIN FORMAT A10
SQL> COLUMN DICT_END FORMAT A8
SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME, DICT_BEGIN, DICT_END
2> FROM DBA_LOGSTDBY_LOG ORDER BY SEQUENCE#;
SEQUENCE# FIRST_TIME NEXT_TIME DIC DIC
---------- ------------------ ------------------ --- ---
24 23-JUL-02 18:19:05 23-JUL-02 18:19:48 YES YES
25 23-JUL-02 18:19:48 23-JUL-02 18:19:51 NO NO
26 23-JUL-02 18:19:51 23-JUL-02 18:19:54 NO NO
27 23-JUL-02 18:19:54 23-JUL-02 18:19:59 NO NO
28 23-JUL-02 18:19:59 23-JUL-02 18:20:03 NO NO
29 23-JUL-02 18:20:03 23-JUL-02 18:20:13 NO NO
30 23-JUL-02 18:20:13 23-JUL-02 18:20:18 NO NO
31 23-JUL-02 18:20:18 23-JUL-02 18:20:21 NO NO
8 rows selected.
第二步,发送重做数据到备用数据库
在主库:
SQL> ALTER SYSTEM ARCHIVE LOG CURRENT;
System altered.
SQL> ALTER SYSTEM ARCHIVE LOG CURRENT;
System altered.
第三步,再次查询DBA_LOGSTDBY_LOG视图
SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YY HH24:MI:SS';
Session altered.
SQL> COLUMN DICT_BEGIN FORMAT A10
SQL> COLUMN DICT_END FORMAT A8
SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME, DICT_BEGIN, DICT_END
2 FROM DBA_LOGSTDBY_LOG ORDER BY SEQUENCE#;
SEQUENCE# FIRST_TIME NEXT_TIME DIC DIC
---------- ------------------ ------------------ --- ---
24 23-JUL-02 18:19:05 23-JUL-02 18:19:48 YES YES
25 23-JUL-02 18:19:48 23-JUL-02 18:19:51 NO NO
26 23-JUL-02 18:19:51 23-JUL-02 18:19:54 NO NO
27 23-JUL-02 18:19:54 23-JUL-02 18:19:59 NO NO
28 23-JUL-02 18:19:59 23-JUL-02 18:20:03 NO NO
29 23-JUL-02 18:20:03 23-JUL-02 18:20:13 NO NO
30 23-JUL-02 18:20:13 23-JUL-02 18:20:18 NO NO
31 23-JUL-02 18:20:18 23-JUL-02 18:20:21 NO NO
32 23-JUL-02 18:20:21 23-JUL-02 18:32:11 NO NO
33 23-JUL-02 18:32:11 23-JUL-02 18:32:19 NO NO
10 rows selected.
第四步,验证重做数据是否被正确应用
在逻辑备用数据库,查询V$LOGSTDBY_STATS视图,例如:
SQL> COLUMN NAME FORMAT A30
SQL> COLUMN VALUE FORMAT A30
SQL> SELECT NAME, VALUE FROM V$LOGSTDBY_STATS WHERE NAME = 'coordinator state';
NAME VALUE
------------------------------ ------------------------------
coordinator state INITIALIZING
了解协调进程的状态非常重要,因为它是指示其他逻辑备用进程的LSP后台进程。
第五步,查看V$LOGSTDBY视图来观察当前sql apply的行为
初始化阶段V$LOGSTDBY的输出:
SQL> COLUMN STATUS FORMAT A50
SQL> COLUMN TYPE FORMAT A12
SQL> SELECT TYPE, HIGH_SCN, STATUS FROM V$LOGSTDBY;
TYPE HIGH_SCN STATUS
------------ ---------- --------------------------------------------------
COORDINATOR ORA-16115: loading Log Miner dictionary data
READER ORA-16127: stalled waiting for additional transact
ions to be applied
BUILDER ORA-16117: processing
PREPARER ORA-16116: no work available
SQL> SELECT TYPE, HIGH_SCN, STATUS FROM V$LOGSTDBY;
TYPE HIGH_SCN STATUS
------------ ---------- --------------------------------------------------
COORDINATOR ORA-16126: loading table or sequence object number
READER ORA-16116: no work available
BUILDER ORA-16116: no work available
PREPARER ORA-16116: no work available
应用阶段的V$LOGSTDBY的输出:
SQL> COLUMN NAME FORMAT A30
SQL> COLUMN VALUE FORMAT A30
SQL> SELECT NAME, VALUE FROM V$LOGSTDBY_STATS WHERE NAME = 'coordinator state';
NAME VALUE
------------------------------ ------------------------------
coordinator state APPLYING
SQL> COLUMN STATUS FORMAT A50
SQL> COLUMN TYPE FORMAT A12
SQL> SELECT TYPE, HIGH_SCN, STATUS FROM V$LOGSTDBY;
TYPE HIGH_SCN STATUS
------------ ---------- --------------------------------------------------
COORDINATOR ORA-16117: processing
READER ORA-16127: stalled waiting for additional transact
ions to be applied
BUILDER 191896 ORA-16116: no work available
PREPARER 191902 ORA-16117: processing
ANALYZER 191820 ORA-16120: dependencies being computed for transac
tion at SCN 0x0000.0002ed4e
APPLIER 191209 ORA-16124: transaction 1 16 1598 is waiting on ano
ther transaction
APPLIER 191205 ORA-16116: no work available
APPLIER 191206 ORA-16124: transaction 1 5 1603 is waiting on anot
her transaction
APPLIER 191213 ORA-16117: processing
APPLIER 191212 ORA-16124: transaction 1 20 1601 is waiting on ano
ther transaction
APPLIER 191216 ORA-16124: transaction 1 4 1602 is waiting on anot
her transaction
11 rows selected.
第六步,检查sql apply的整个处理过程。
SQL> SELECT APPLIED_SCN, NEWEST_SCN FROM DBA_LOGSTDBY_PROGRESS;
APPLIED_SCN NEWEST_SCN
----------- ----------
180702 180702
如果备用重做日志文件没有配置,APPLIED_SCN 和NEWEST_SCN列的值是相等的,表明在归档重做日志文件中所有可用数据都被应用了。这些值可以与DBA_LOGSTDBY_LOG视图中的FIRST_CHANGE#列的值比较,查看有多少日志文件信息被应用,多少剩余。
3、更多准备
升级数据保护模式
配置备用重做日志
激活闪回数据库功能




posted on 2007-12-11 17:23 tianjuchuan 阅读(1385) 评论(0)  编辑 收藏 引用 所属分类: dataguard
只有注册用户登录后才能发表评论。