逻辑备用数据库使用主数据库的拷贝创建出来,但是创建出来以后,该备用数据库的物理结构就与主数据库不同了。逻辑备用数据库通过应用SQL语句进行更新。这样就允许用户在任何时候都可以在备用数据库上运行查询和报表了。
因为逻辑备用数据库使用SQL语句进行与主数据库的同步,所以逻辑备用数据库必须打开。而且,在逻辑备用数据库上,还可以创建其他的索引和物化视图来提高效率。不过逻辑备用数据库在数据类型、表的类型和DDL以及DML上有些限制。
逻辑备用数据库的优点:
a、更加有效利用了备用数据库的硬件资源
b、减小了主数据库的负载,例如将非实时性的查询转移到备用数据库等
c、可以作为主数据库的备份 2.创建逻辑备用数据库前对主数据库的准备 在创建逻辑备用数据库的过程中,必须确保在主数据库上做配置所用的用户帐号具有以下数据库角色:
a、logstdby_administrator角色,用来使用逻辑备用功能
b、select_catalog_role角色,能够访问所有数据字典视图。 下面详细说明了创建一个逻辑备用数据库前,必须在主数据库上进行的准备工作。 2.1 启用forced logging 将主数据库设置为force logging模式: SQL>alter database force logging; 2.2 启用归档,并在本地定义一个归档路径 确保主数据库设置成归档模式,启用自动归档,并且必须有一个本地的归档路径。
SQL> alter system set log_archive_dest_1
='location=D:\oradata\rmantgt\archive mandatory'
scope=both; 2.3 确认log_parallelism初始化参数 在主数据库上,使用show parameter的命令显示当前log_parallelism初始化参数的值。逻辑备用数据库要求你将该初始化参数设置为1,同时这也是该参数的缺省值。如果该参数已经是1了,则跳到2.4步骤。否则,设置log_parallelism=1,如下: SQL>alter 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;
采用以下的方法来确保日志应用服务可以唯一的标识表里的行。 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的限制:
SQL>alter 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\rmantgt\
logmnrts.dbf' size 25m autoextend on maxsize unlimited; 转移表: SQL> execute dbms_logmnr_d.set_tablespace('logmnrts'); 如果在备用数据库里的初始化参数standby_file_management设置为true,则前面创建表空间的命令会自动应用到备用数据库上。否则如果没有设置为true,则需要手工在备用数据库上执行。
b、减小了主数据库的负载,例如将非实时性的查询转移到备用数据库等
c、可以作为主数据库的备份 2.创建逻辑备用数据库前对主数据库的准备 在创建逻辑备用数据库的过程中,必须确保在主数据库上做配置所用的用户帐号具有以下数据库角色:
a、logstdby_administrator角色,用来使用逻辑备用功能
b、select_catalog_role角色,能够访问所有数据字典视图。 下面详细说明了创建一个逻辑备用数据库前,必须在主数据库上进行的准备工作。 2.1 启用forced logging 将主数据库设置为force logging模式: SQL>alter database force logging; 2.2 启用归档,并在本地定义一个归档路径 确保主数据库设置成归档模式,启用自动归档,并且必须有一个本地的归档路径。
SQL> alter system set log_archive_dest_1
='location=D:\oradata\rmantgt\archive mandatory'
scope=both; 2.3 确认log_parallelism初始化参数 在主数据库上,使用show parameter的命令显示当前log_parallelism初始化参数的值。逻辑备用数据库要求你将该初始化参数设置为1,同时这也是该参数的缺省值。如果该参数已经是1了,则跳到2.4步骤。否则,设置log_parallelism=1,如下: SQL>alter 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的限制:
SQL>alter 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\rmantgt\
logmnrts.dbf' size 25m autoextend on maxsize unlimited; 转移表: SQL> execute dbms_logmnr_d.set_tablespace('logmnrts'); 如果在备用数据库里的初始化参数standby_file_management设置为true,则前面创建表空间的命令会自动应用到备用数据库上。否则如果没有设置为true,则需要手工在备用数据库上执行。