1.逻辑备用数据库介绍 逻辑备用数据库使用主数据库的拷贝创建出来,但是创建出来以后,该备用数据库的物理结构就与主数据库不同了。逻辑备用数据库通过应用SQL语句进行更新。这样就允许用户在任何时候都可以在备用数据库上运行查询和报表了。
因为逻辑备用数据库使用SQL语句进行与主数据库的同步,所以逻辑备用数据库必须打开。而且,在逻辑备用数据库上,还可以创建其他的索引和物化视图来提高效率。不过逻辑备用数据库在数据类型、表的类型和DDL以及DML上有些限制。
逻辑备用数据库的优点:
a、更加有效利用了备用数据库的硬件资源
b、减小了主数据库的负载,例如将非实时性的查询转移到备用数据库等
c、可以作为主数据库的备份
2.创建逻辑备用数据库前对主数据库的准备 在创建逻辑备用数据库的过程中,必须确保在主数据库上做配置所用的用户帐号具有以下数据库角色:
a、logstdby_administrator角色,用来使用逻辑备用功能
b、select_catalog_role角色,能够访问所有数据字典视图。
下面详细说明了创建一个逻辑备用数据库前,必须在主数据库上进行的准备工作。
2.1 启用forced logging
将主数据库设置为force logging模式:
SQLalter database force logging;
2.2 启用归档,并在本地定义一个归档路径
确保主数据库设置成归档模式,启用自动归档,并且必须有一个本地的归档路径。
SQL alter system set log_archive_dest_1
="location=D:oradata
mantgtarchive mandatory"
scope=both;
2.3 确认log_parallelism初始化参数
在主数据库上,使用show parameter的命令显示当前log_parallelism初始化参数的值。逻辑备用数据库要求你将该初始化参数设置为1,同时这也是该参数的缺省值。如果该参数已经是1了,则跳到2.4步骤。否则,设置log_parallelism=1,如下:
SQLalter system set log_parallelism=1 scope=spfile;
设置完以后,需要重启数据库以使设置生效。
2.4 确定所能支持的数据类型和表类型
在建立逻辑备用数据库前,确保在当前主数据库中的数据类型和表类型都是逻辑备用数据库所能支持的。
逻辑备用数据库所支持的数据类型有:char、nchar、varchar2和varchar、nvarchar2、number、date、timestamp、timestamp with time zone、timestamp with local time zone、interval year to month、interval year to second、raw、clob、blob
逻辑备用数据库不支持的数据类型有:nclob、long、long raw、bfile、rowid、urowid、user-defined types、object types refs、varrays、nested tables
逻辑备用数据库不支持的表、sequences和视图有:用户在sys schema里定义的表和sequences、那些含有不支持的数据类型的表、使用了segment compression的表、索引组织表(index-organized tables)
确定主数据库是否含有不支持的对象,查看dba_logstdby_unsupported视图,该视图列出了逻辑备用数据库所不支持的对象:
SQL select distinct owner,
table_name from dba_logstdby_unsupported
order by owner,table_name;
如果主数据库含有不支持的对象,则日志应用服务在逻辑备用数据库上运用重做日志会自动剔除那些不支持的对象。
如果以下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。
那些在主数据库上修改元数据的pl/sql存储过程也不会在逻辑备用数据库上运行。比如在主数据库上运行了dbms_mview_refresh,但是传到备用数据库后并不会被应用。唯一的例外是dbms_job包,job元数据会应用到逻辑备用数据库上,但是jobs本身不会执行。
2.5 确认主数据库里表的行都可以唯一标识
由于在逻辑备用数据库里rowid可能不等于主数据库里的rowid,所以必须采取一些机制来保证在主数据库里所更新的行能够对应到备用数据库里相应的行。
可以采用以下对应方法:主键或唯一索引。
在主数据库里,无论合适与否,每个表都添加主键或唯一索引。这样就能确保应用SQL操作时可以有效的更新逻辑备用数据库里的数据了。
采用以下的方法来确保日志应用服务可以唯一的标识表里的行。
2.5.1 在主数据库里找到那些没有唯一标识的表
查询dba_logstdbby_not_unique视图,来确定主数据库里那些还没有主键或唯一索引的表。
SQL select owner,table_name,
bad_column from dba_logstdby_not_unique
where table_name not in(select table_name from
dba_logstdby_unsupported);
该语句找出的表仍然能够支持,因为supplemental logging在重做日志里添加了唯一标识行的信息。主键或唯一索引的存在与否,能够影响追加的日志(supplemental logging):
a、如果表有主键或唯一索引,则在supplemental logging的时候,向重做日志添加的信息是最少的。
b、如果表没有主键或唯一索引,supplemental logging会自动在重做日志里记录所有字段的值。
2.5.2 添加一个disabled的主键类型的rely的限制(disabled primary key rely constraint)
如果应用程序确保表里的行是唯一标识的,你可以在表上创建一个disabled主键类型的rely的限制:
SQLalter table mytab
add primary key(id,name) rely disable;
rely constraint告诉系统确保了所有的行都是唯一的。如果rely constraint所指定的列没有唯一,则在逻辑备用数据库应用SQL时将会失败。最好添加主键或唯一索引,这样在逻辑备用数据库应用SQL语句时也会速度快些。
2.6 确保启用追加的日志(supplemental logging)
在创建逻辑备用数据库前,在主数据库上,必须启用supplemental logging。因为oracle只会对那些修改的列生成日志,这对唯一标识那些被修改的行时并不总是足够的,额外的信息(supplemental)必须被加到重做日志里。这些被加到联机日志里的supplemental信息能够帮助日志应用服务正确的标识逻辑备用数据库里的表和表里的行。
确定在主数据库上,supplemental logging是否被启用,可以查询v$database,如下:
SQL select supplemental_log_data_pk,supplemental_log_data_ui from v$database;
如果为NO,则说明supplemental logging没有被启用。如果被启用,则转到2.7,否则如果没有被启用,则采用下面的方法来启用。
2.6.1 启用supplemental logging
在主数据库上,执行下面语句以便将主键和唯一索引信息添加到归档日志里:
SQL alter database add supplemental log data(primary key,unique index) columns;
该语句在主数据库中向重做日志添加了唯一标识行的信息,从而日志应用服务可以在备用数据库里正确的标识相同的行了。
2.6.2 切换到一个新的重做日志
在主数据库上,执行以下语句:
SQL alter system archive log current;
通过切换到一个新的日志文件,这样,你就可以保证当前重做日志既不含有supplemental日志数据也不含有nonsupplemental日志数据。逻辑备用数据库不能使用那些既含有supplemental日志数据又含有nonsupplemental日志数据的重做日志。
2.6.3 确保启用supplemental logging
SQL select supplemental_log_data_pk as primaryKey,supplemental_log_data_ui as uniqueIndex from v$database;
如果都为yes则说明启动了。
如果在一个已经含有物理备用数据库的data guard配置中启用了supplemental logging的话,那么必须在每个物理备用数据库中分别执行alter database add supplemental log data,以便将来在switchover的时候能够正常工作。
2.7 创建一个可替代的表空间
如果希望在主数据库和逻辑备用数据库之间进行switchover,你必须在主数据库上创建一个替代表空间,并且将逻辑备用数据库里system表转移到这个替代表空间里。
逻辑备用数据库使用一组在sys和system schema下的表。这些表缺省创建在system表空间下。这些表可能会增长非常快。通过预先准备一个单独的表空间,然后将这些逻辑备用系统表转移到这个单独的表空间下,从而避免了这些表将整个system表空间都填满的情况出现。
在逻辑备用数据库创建时,会向这些逻辑备用系统表填数据。这样,应该在创建逻辑备用数据库前,就将这些表转移到独立的表空间里去。
创建表空间:
SQL create tablespace logmnrts datafile "D:oradata
mantgtlogmnrts.dbf" size 25m autoextend on maxsize unlimited;
转移表:
SQL execute dbms_logmnr_d.set_tablespace("logmnrts");
如果在备用数据库里的初始化参数standby_file_management设置为true,则前面创建表空间的命令会自动应用到备用数据库上。否则如果没有设置为true,则需要手工在备用数据库上执行。
3.创建逻辑备用数据库 3.1 确认主数据库的数据文件和联机日志文件
在主数据库上,查询v$datafile列出所有的逻辑备用数据库所需要的数据文件:
SQL select name from v$datafile;NAME------------------------------------------------D:ORADATARMANTGTSYSTEM01.DBFD:ORADATARMANTGTUSERS02.DBFD:ORADATARMANTGTUSERS01.DBFD:ORADATARMANTGTUNDO02.DBF
在主数据库上,查询v$logfile列出所有的逻辑备用数据库所需要的日志文件:
SQL select group#,type,member from v$logfile; GROUP# TYPE MEMBER---------- ------- ------------------------------ 1 ONLINE D:ORADATARMANTGTREDO01.LOG 2 ONLINE D:ORADATARMANTGTREDO02.LOG 3 ONLINE D:ORADATARMANTGTREDO03.LOG
3.2 对主数据库生成一份拷贝
在主数据库上,进行以下步骤,以生成一份主数据库文件的冷拷贝备份。
第一步 关闭主数据库
SQL shutdown;
第二步 拷贝数据文件到临时目录
使用操作系统命令将3.1所找出来的数据文件拷贝到一个临时目录。拷贝到临时目录是因为主数据库后面还会再次被关闭。
第三步 重启主数据库
SQL startup
第四步 为备用数据库创建一个控制文件的备份拷贝在主数据库上,为备用数据库创建一个控制文件的备份:
SQL alter database backup controlfile to"D:oradatadataguard_logic_tmplogicdg.ctl";
第五步 在主数据库上启用限制登录(restrict session)模式
在主数据库上,启用限制登录模式,这样就不允许其他用户登录进行DDL或DML操作。
SQL alter system enable restricted session;
第六步 创建logminer目录
为了创建逻辑备用数据库,你必须为逻辑备用数据库手工创建目录结构。在主数据库上,采用以下命令创建logminer目录:
SQL execute dbms_logstdby.build;
第七步 在主数据库上禁用限制登录(restrict session)模式
SQL alter system disable restricted session;
第八步 确定最后归档的日志文件
为了获得创建逻辑备用数据库的起点,查询v$archived_log视图,确定最后的归档日志,并且在后面创建的过程中,输入该归档日志的名字。
SQL alter system archive log current;SQL select name from v$archived_log where (sequence#=(select max(sequence#) from v$archived_log where dictionary_begin="YES" and standby_dest="NO"));NAME----------------------------------------------------------------------------D:ORADATARMANTGTARCHIVEARC00315.001
3.3 为备用数据库准备一个初始化参数文件
在主数据库上通过spfile创建一个传统的文本格式的初始化参数文件。该文本格式的初始化参数文件可以拷贝到备用数据库所在的系统并且可以被手工修改。
SQL create pfile="D:oradatadataguard_logic_tmpinitLogic.ora" from spfile;
在后面的3.11的时候,还需要修改该文件的参数以对应备用数据库,然后还要将其转换为spfile。
3.4 从主数据库所在系统向备用数据库所在系统拷贝文件
在主数据库所在的系统上,使用操作系统命令拷贝以下二进制文件到备用数据库所在的系统。
a、备份的数据文件(在4.2.2处创建)
b、备份的日志文件(在4.2.2处创建)
c、初始化参数文件(在4.2.3处创建)
3.5 为备用数据库设置初始化参数
尽管从主数据库处拷贝的初始化参数文件里的参数设置大部分都适用于逻辑备用数据库,但是有些还是需要修改。
下面的例子显示了为逻辑备用数据库所作的初始化参数修改。被修改的部分用黑体表示。
1*.aq_tm_processes=1 2*.background_dump_dest="C:oracle92ora92adminlogicdgdump" 3*.compatible="9.2.0.0.0" 4*.control_files="D:oradatalogicdgLOGICDG.CTL" 5*.core_dump_dest="C:oracle92ora92adminlogicdgcdump" 6*.standby_archive_dest="D:oradatalogicdgstandby" 7*.parallel_max_servers=9 8*.db_block_size=8192 9*.db_cache_size=2516582410*.db_domain=""11*.db_file_multiblock_read_count=1612*.db_name="rmantgt"13*.dispatchers="(PROTOCOL=TCP) (SERVICE=ora920XDB)"14*.fast_start_mttr_target=30015*.global_names=TRUE16*.hash_join_enabled=TRUE17*.instance_name="logicdg"18*.java_pool_size=3355443219*.job_queue_processes=1020*.large_pool_size=838860821*.log_archive_dest=""22*.log_archive_dest_1="location=D:oradatalogicdgarchive mandatory"23*.log_archive_start=TRUE24*.log_parallelism=125*.open_cursors=30026*.pga_aggregate_target=2516582427*.processes=15028*.query_rewrite_enabled="FALSE"29*.remote_login_passwordfile="EXCLUSIVE"30*.shared_pool_size=5033164831*.sort_area_size=52428832*.star_transformation_enabled="FALSE"33*.timed_statistics=TRUE34*.undo_management="AUTO"35*.undo_retention=1080036*.undo_tablespace="UNDOTBS2"37*.user_dump_dest="C:oracle92ora92adminlogicdgudump"38#如果主数据库和备用数据库在同一台机器上,就需要做以下参数配置39*.lock_name_space=logicdg
这里,对上面的设置做一个简单解释:
a、db_name:不需要修改,与主数据库保持一致。
b、compatible:不需要修改,与主数据库保持一致。
c、control_files:说明了备用数据库的控制文件所在的路径。
d、log_archive_start:不需要修改,与主数据库保持一致。
e、standby_archive_dest:说明了主数据库向备用数据库传递归档日志的路径。需要主数据库上配置归档路径为备用数据库,这样,主数据库在归档时,会将归档日志文件发送到备用数据库上该参数指定的位置。
f、log_archive_dest_1:说明备用数据库的归档日志所存放的路径。一旦出现switchover,那么该备用数据库成为主数据库,则该参数指定了联机日志文件的归档路径。
g、log_parallelism:不需要修改,与主数据库保持一致。
h、instance_name:如果主数据库和备用数据库在同一台机器上的话,就需要定义该参数并且与主数据库不同。
i、lock_name_space:指定备用数据库所在的实例名称。该参数与instance_name相同。
记住,可能还需要修改一些参数,比如background_dump_dest、user_dump_dest等。
3.6 创建一个windows服务
如果备用数据库所在机器为windows系统,则需要使用oradim创建windows服务。
C:oradim -new -sid logicdg -startmode manual
3.7 为主数据库和备用数据库配置监听
在主数据库和备用数据库上,分别为彼此配置监听器。如果使用了data guard broker,则必须使用TCP/IP协议配置监听器。
如果数据库在安装oracle介质的时候就自动创建了数据库的话,则不用配置。
3.8 在备用数据库所在系统启用死亡连接检测
通过在sqlnet.ora文件里设置sqlnet.expire_time参数来检测死亡连接。比如
sqlnet.expire_time=2
3.9 创建Oracle Net连接名
在主数据库和备用数据库里,分别创建连接到主数据库和备用数据库的tnsnames名称。
3.10 启动并mount备用数据库
在备用数据库上,启动并mount备用数据库。
注意,如果是windows系统,则还需要创建密码文件。
C:orapwd file=C:oracle92ora92DATABASEPWDlogicdg.ORA password=hanson entries=5SQLstartup mount pfile=C:oracle92ora92adminlogicdgpfileinitLogic.ora
3.11 在逻辑备用数据库上重命名数据文件
在逻辑备用数据库上,需要将从主数据库拷贝来的数据文件所在的路径重新命名,因为要告诉控制文件,现在的数据文件所在的路径已经与主数据库中的路径不一致了,需要更改为当前最新的路径。
C:orapwd file=C:oracle92ora92DATABASEPWDlogicdg.ORA password=hanson entries=5SQLstartup mount pfile=C:oracle92ora92adminlogicdgpfileinitLogic.ora
3.12 在逻辑备用数据库上重命名联机日志文件
SQL select member from v$logfile;MEMBER----------------------------------------------------------------------------D:ORADATARMANTGTREDO01.LOGD:ORADATARMANTGTREDO02.LOGD:ORADATARMANTGTREDO03.LOGSQL alter database rename file "D:ORADATARMANTGTREDO01.LOG"to "D:oradatalogicdg
edo01.log";Database altered.SQL alter database rename file "D:ORADATARMANTGTREDO02.LOG"to "D:oradatalogicdg
edo02.log";Database altered.SQL alter database rename file "D:ORADATARMANTGTREDO03.LOG"to "D:oradatalogicdg
edo03.log";Database altered.SQL select member from v$logfile;MEMBER----------------------------------------------------------------------------D:ORADATALOGICDGREDO01.LOGD:ORADATALOGICDGREDO02.LOGD:ORADATALOGICDGREDO03.LOG
3.13 打开database guard
为了防止其他用户在逻辑备用数据库上进行DML操作,在逻辑备用数据库上打开database guard。
SQLalter database guard all;
由于使用的控制文件比数据文件要新,所以直接open时会报错,需要进行恢复。
SQLrecover database using backup controlfile until cancel;
然后,直接输入cancel结束恢复。
SQLalter database open resetlogs;
3.14 重新设置逻辑备用数据库名
通过运行oracle的DBNEWID(nid)实用程序,来改变逻辑备用数据库的名称。改变逻辑备用数据库的名称可以防止该逻辑备用数据库与主数据库之间进行交互作用。在运行nid的时候,必须关闭数据库,并启动到mount状态:
然后,现在可以运行nid来改变数据库名了:
C:nid target=sys/hanson@dataguard dbname=logicdgDBNEWID: Release 9.2.0.1.0 - ProductionCopyright (c) 1995, 2002, Oracle Corporation. All rights reserved.Connected to database RMANTGT (DBID=2455129425)Control Files in database: D:ORADATALOGICDGLOGICDG.CTLChange database ID and database name RMANTGT to LOGICDG? (Y/[N]) = yProceeding with operationChanging database ID from 2455129425 to 2205596403Changing database name from RMANTGT to LOGICDG Control File D:ORADATALOGICDGLOGICDG.CTL - modified Datafile D:ORADATALOGICDGSYSTEM01.DBF - dbid changed, wrote new name Datafile D:ORADATALOGICDGLOGMNRTS.DBF - dbid changed, wrote new name Datafile D:ORADATALOGICDGUSERS01.DBF - dbid changed, wrote new name Datafile D:ORADATALOGICDGUNDO02.DBF - dbid changed, wrote new name Control File D:ORADATALOGICDGLOGICDG.CTL - dbid changed, wrote new nameDatabase name changed to LOGICDG.Modify parameter file and generate a new password file before restarting.Database ID for database LOGICDG changed to 2205596403.All previous backups and archived redo logs for this database are unusable.Shut down database and open with RESETLOGS option.Succesfully changed database name and ID.DBNEWID - Completed succesfully.
3.15 在初始化参数文件中修改数据库名
第一步 修改初始化参数文件中的db_name为logicdg。
第二步 关闭逻辑备用数据库
SQLshutdown immediate;
第三步 根据pfile创建spfile
SQL create spfile from pfile="C:oracle92ora92adminlogicdgpfileinitLogic.ora";
第四步 重启逻辑备用数据库
SQLstartup mount;SQLalter database open resetlogs;
3.16 为逻辑备用数据库创建一个新的临时表空间
临时数据文件不需要从主数据库拷贝到逻辑备用数据库上。
第一步 确定当前临时数据文件
在逻辑备用数据库上,执行如下SQL:
SQLselect * from v$tempfile;
如果没有记录,则跳到第三步。
第二步 在逻辑备用数据库上删除临时数据文件
SQLalter database tempfile "tempfilename" drop;
第三步 在逻辑备用数据库上,添加一个新的临时数据文件
1、确定临时表空间
SQLselect tablespace_name from dba_tablespaces where contents="TEMPORARY";
2、添加一个临时文件
SQLalter tablespace temp add tempfile "D:ORADATALOGICDGemp01.dbf" size 50m reuse;
注意,这里的temp表空间空间必须足够,否则逻辑备用数据库在运用主数据库传来的归档日志时会出错。
3.17 注册归档的日志,并启动SQL应用操作
注册最新的归档日志文件,并应用重做日志里的数据。
第一步 注册最新的归档日志文件
将3.2的第八步查到的归档日志文件注册到逻辑备用数据库。
SQL alter database register logical logfile "D:oradatalogicdgARC00290.001";
第二步 在逻辑备用数据库里开始应用重做日志
SQL alter database start logical standby apply initial;
只有在逻辑备用数据库第一次启动应用重做日志时,指定initial选项。以后启动SQL应用按照以下方法:
SQLalter database stop logical standby apply;SQLalter database start logical standby apply;
3.18 使主数据库向备用数据库进行归档
必须在主数据库上设置,以使得主数据库能够向备用数据库归档。
第一步 设置定义归档的初始化参数
在主数据库的log_archive_dest_n和log_archive_dest_state_n参数重设置主数据库向备用数据库的归档。
下面的例子显示了如何设置这些参数:
第一步 设置远程归档参数
SQL alter system set log_archive_dest_2="service=dataguard mandatory" scope=both;SQL alter system set log_archive_dest_state_2=enable scope=both;
第二步 启动远程归档
SQL alter system archive log current;
4.确认逻辑备用数据库正常工作 一旦你创建了逻辑备用数据库,并启动了日志转移服务,可能你需要确定一下主数据库的修改已经成功转移到备用数据库上了。为了查看归档的日志文件已经被备用数据库所接收,首先,需要确定在备用数据库下存在归档的日志文件。在主数据库上归档少量的日志文件,然后检查备用数据库。
第一步 确定归档日志文件在备用数据库上已经注册了
SQLselect sequence#,first_time,next_time,dict_begin,dict_end from dba_logstdby_log order by sequence#;
第二步 在主数据库上归档一些日志
SQLalter system archive log current;
第三步 再次查询dba_logstdby_log视图
SQLselect sequence#,first_time,next_time,dict_begin,dict_end from dba_logstdby_log order by sequence#;
查看是否有新的归档日志记录。如果有,就说明成功注册到备用数据库了。这些日志现在可以开始被应用了。
第四步 确定重做日志的已经被正确应用了在逻辑备用数据库上,查询dba_logstdby_status视图确定重做数据已经被正确应用了。
SQLselect name,value from v$logstdby_stats where name="coordinator state";
如果结果是initializing,则说明日志应用服务已经准备好应用SQL操作了,但是从重做日志来的数据还没有应用到逻辑备用数据库上。
逻辑备用数据库如果有很多表,那么初始化的过程会需要几个小时,但是,一旦初始化结束,后面的应用重做日志会快很多。
第五步 查询v$logstdby视图,确定当前SQL应用活动
SQLselect type,high_scn,status from v$logstdby;
一旦在逻辑备用数据库上,coordinator进程开始应用重做日志,v$logstdby视图通过在status显示applying状态表明正在应用重做日志。high_scn会不断增加。
第六步 检查日志应用服务的进行到的程度
SQLselect applied_scn,newest_scn from dba_logstdby_progress;
如果applied_scn与newest_scn相同,这就意味着所有重做日志里的可用数据都被应用了。这些值可以与dba_logstdby_log视图里的first_change#的值做比较,来得知有多少日志信息已经被应用了以及有多少没应用。
(e129)