创建逻辑备数据库( Logical Standby Database)

逻辑备数据库使用备redo日志(Standby Redo Logs)来接收从主数据库发送的redo日志,同时也在应用更改到备数据库时写到在线日志(Online Redo Logs)。因此,备数据库经常需要更多的ARCn归档进程来同时归档SRLs和ORLs。另外,由于归档ORLs优先于归档SRLs,在高负载时候可能需要配置更多数量的SRLs。

注:为了执行备redo日志的归档,逻辑备数据库必须运行在归档模式。


1.确认主数据库是否支持逻辑备数据库

1.1. 确认逻辑备数据库不支持的数据类型和存储属性

逻辑备数据库的SQL Apply会自动忽略不支持的在主数据库上的数据类型和表的更改,而且不会有报错日志。

使用以下查询来确定SQL应用不支持的内部模式对象,在这些模式的用户表将不会被复制到逻辑备数据库上,而且不会出现在DBA_LOGSTDBY_UNSUPPORTED视图中。
SQL> select owner from dba_logstdby_skip where statement_opt=‘INTERNAL SCHEMA’;

列出不属于内部模式和由于使用不支持的数据类型而不会被SQL应用的数据库表:
SQL> col owner for a20
SQL> col table_name for a50
SQL> select distinct owner,table_name from dba_logstdby_unsupported order by owner,table_name;

对于上面查询列出的不支持的表,可以使用以下语句查看不支持的列名和数据类型:
SQL> select column_name,data_type from dba_logstdby_unsupported where owner=‘OWNERNAME’ and table_name=‘TABLENAME’;

如果主数据库包含不支持的表,SQL Apply在应用redo数据到逻辑备数据库时会自动排除这些表。


1.2. 确保主数据库的表行可以被唯一区别

在主数据库生成的包含ROWID的redo记录,不能用来区分逻辑备数据库的相应行。因为在逻辑备数据库的物理结构与主数据库不同,即使逻辑备数据库是用主数据库的备份拷贝来创建的。
Oracle使用主键或唯一约束/索引补充日志来逻辑区分逻辑备数据库的修改行。当数据库范围的主键和唯一约束/索引补充日志被启用后,每个UPDATE语句也会在redo日志中记录必要的列值来唯一区别在逻辑备数据库的修改行。
1)如果表定义了主键,那么主键与被修改列一起作为UPDATE语句的部分被记录到日志用于区别修改行。
2)在表不含主键时,最短的非空的唯一约束/索引被修改列一起作为UPDATE语句的部分被记录到日志用于区别修改行。
3)如果没有表不含主键也不没有非空的唯一约束/索引,那么所有的声明最大的长度为4000字节的列都会作为UPDATE语句的部分被记录到日志用于区别修改行。
4)基于函数的索引,即使声明为唯一,也不能用来唯一区别修改行。然而,逻辑备数据库支持复制定义了基于函数的索引的表,只要修改行可以唯一被区分。

Oracle建议增加主键或非空唯一索引到主数据库的表中,尽可能让SQL应用可以有效地应用redo数据更新到逻辑备数据库。

执行以下步骤确认SQL应用可以唯一区别复制到逻辑备数据库的每个表的行。
1) 查询视图DBA_LOGSTDBY_NOT_UNIQUE列出SQL Apply不能唯一区别的表。
SQL> select owner, table_name from dba_logstdby_not_unique
2 where (owner, table_name) not in
3 (select distinct owner, table_name from dba_logstdby_unsupported)
4 and bad_column = ‘Y’;

2) 如果应用程序确认表中的行都是唯一的,那么可以在表中创建一个禁用主键的RELY约束。这样可以避免在主数据库上维护主键的开销。使用ALTER TABLE语句和RELY DISABLE子语句可以为主数据库表创建一个禁用RELY约束。下面的示例在表mytab上创建一个禁用RELY约束,表中的行可以使用id和name列唯一区别。
SQL> ALTER TABLE mytab ADD PRIMARY KEY (id, name) RELY DISABLE;

当指定RELY约束时,系统假定行是唯一的。因为你告诉系统依赖于这些信息,但在每次对表进行更新时不进行确认,必须谨慎地选择用来唯一区别表中的行的禁用RELY约束的列。如果不存在这种唯一性,那么SQL Apply将不能正确维护表。
为了改善SQL Apply的性能,为列增加一个唯一约束/索引来区别逻辑备数据库的行。如果不这样做,SQL Apply在对表执行UPDATE或DELETE语句时会导致全表扫描。


2.创建逻辑备数据库步骤

2.1. 创建物理备数据库

先创建一个物理备数据库(详情参考文章"创建Oracle Data Guard物理备用数据库"),然后将其转换成逻辑备数据库。


2.2. 停止物理备数据库的Redo Apply

在物理备数据库上执行以下语句来停止Redo Apply。
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;


2.3. 准备主数据库以支持逻辑备数据库

2.3.1. 准备主数据库以进行角色转换

注:这个步骤只有计划执行角色转换时才需要执行。

如果计划将主数据库转换为逻辑备数据库的角色,必须更改以下参数,这样在角色转换后就不需要再更改参数:
1)更改LOG_ARCHIVE_DEST_1参数的VALID_FOR属性为来自于在线redo日志的归档redo数据,而不是来自备redo日志。
2)增加主数据库的LOG_ARCHIVE_DEST_3参数,这个参数在主数据库切换为逻辑备数据库时生效。

Primary Database: Logical Standby Role Initialization Parameters
LOG_ARCHIVE_DEST_1=
‘LOCATION=/arch1/chicago/
VALID_FOR=(ONLINE_LOGFILES,ALL_ROLES)
DB_UNIQUE_NAME=chicago’

LOG_ARCHIVE_DEST_2=
‘SERVICE=boston ASYNC
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_3=ENABLE


LOG_ARCHIVE_DEST_n当chicago数据库运行在主角色时当chicago数据库运在逻辑备角色时
LOG_ARCHIVE_DEST_1指定主数据库产生的redo数据从本地在线redo日志文件归档到本地归档redo日志文件/arch1/Chicago/。指定逻辑备数据库产生的redo数据从本地在线redo日志文件归档到本地归档redo日志文件/arch1/Chicago/。
LOG_ARCHIVE_DEST_3忽略指定逻辑备数据库的redo数据从备redo日志文件归档到本地归档redo日志文件/arch2/Chicago/。

2.3.2. 在redo数据中创建一个字典

必须在redo数据中创建一个LogMiner字典,这样SQL Apply的LogMiner组件才能正确地解析redo中的更改。

作为建立LogMiner字典的一部分,补充日志(supplemental logging)将会自动配置来记录主键和唯一约束/索引列。补充日志信息确保每次更新包含足够的信息来逻辑区别被语句修改的每一行。

使用以下语句创建LogMiner字典:
SQL> EXECUTE DBMS_LOGSTDBY.BUILD;

注:在11.2以后的数据库版本中,补充日志信息会被自动传输到现有的物理备数据库。然而,对于早期的数据库版本,或者数据库从以前的版本升级到11.2,当主数据库启用补充日志时必须检查物理备数据库的补充日志是否已启用。如果在物理备数据库中没有启用,在进行正常切换(switchover)或故障切换(failover)前,必须在所有存在的物理备数据库中启用补充日志。在每个物理备数据库中执行以下SQL语句启用补充日志:
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE INDEX) COLUMNS;


2.4.将物理备数据库转换为逻辑备数据库

2.4.1. 转换为逻辑备数据库

注:如果物理备数据库是RAC,则先关闭其他实例,只保留一个实例,然后设置CLUSTER_DATABASE参数为FALSE,再作为单实例启动物理备数据库到独占模式:
SQL> ALTER SYSTEM SET CLUSTER_DATABASE=FALSE SCOPE=SPFILE;
SQL> SHUTDOWN ABORT;
SQL> STARTUP MOUNT EXCLUSIVE;

继续应用Redo数据到物理备数据库直到可以转换为逻辑备数据库:
SQL> ALTER DATABASE RECOVER TO LOGICAL STANDBY db_name;
对于db_name,指定一个与主数据库不同的数据库名称来区别新的逻辑备数据库。如果在执行语句时数据库使用服务器参数文件spfile,那么数据库将会用新的逻辑备数据库的相关信息更新文件spfile。如果没有使用spfile,那么数据库将会显示信息提示在关闭数据库后设置DB_NAME参数。

语句等待应用redo数据直到LogMiner字典在日志文件中找到为止。这将会花费几分钟,取决于需要多长时间将Redo数据中创建字典时产生的redo数据传输到备数据库和多少redo数据需要应用。如果创建字典没有在主数据库成功执行,那么这个命令将无法完成。可以在其他SQL会话中使用“ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL”语句取消这条SQL语句。

注:如果转换为逻辑备数据库时一直挂住无法完成转换,可以用以上语句取消转换,然后再次在主库上执行“EXECUTE DBMS_LOGSTDBY.BUILD;”重新创建LogMiner字典,最后再次执行转换语句。

注意:在11g以前的版本中,在打开逻辑备数据库前需要创建新的密码文件。现在不再需要,在逻辑备数据库中创建新的密码文件会导致redo传输服务不能正常工作。


2.4.2. 调整逻辑备数据库的初始化参数

注:如果启动的是RAC物理备数据库,那么设置CLUSTER_DATABASE参数回TRUE:
SQL> ALTER SYSTEM SET CLUSTER_DATABASE=TRUE SCOPE=SPFILE;

在逻辑备数据库上,关闭实例,然后执行STARTUP MOUNT命令挂载数据库。不要打开数据库,它应该保持对用户访问的关闭状态直到稍后的创建过程。
SQL> SHUTDOWN;
SQL> STARTUP MOUNT;

需要修改LOG_ARCHIVE_DEST_n参数,因为不像物理备数据库,逻辑备数据库是打开的数据库,会产生redo数据和多个日志文件(在线redo日志文件,归档redo日志文档和备redo日志文件)。为下面的参数指定不同的本地目标位置:
1)存储逻辑备数据库产生的redo数据的归档redo日志文件,在下面的示例中,设置了LOG_ARCHIVE_DEST_1=LOCATION=/arch1/boston
2)存储接收主数据库的redo数据的归档redo日志文件,在下面的示例中,设置了LOG_ARCHIVE_DEST_3=LOCATION=/arch2/boston

逻辑备数据库参数示例,不管Boston逻辑备数据库是运行在主还是备数据库角色,参数都是有效的。
LOG_ARCHIVE_DEST_1=
‘LOCATION=/arch1/boston/ VALID_FOR=(ONLINE_LOGFILES,ALL_ROLES)
DB_UNIQUE_NAME=boston’

LOG_ARCHIVE_DEST_2=‘SERVICE=chicago ASYNC 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


LOG_ARCHIVE_DEST_n当boston数据库运行在主角色时当boston数据库运在逻辑备角色时
LOG_ARCHIVE_DEST_1指定主数据库产生的redo数据从本地在线redo日志文件归档到本地归档redo日志文件/arch1/boston/。指定逻辑备数据库产生的redo数据从本地在线redo日志文件归档到本地归档redo日志文件/arch1/boston/。
LOG_ARCHIVE_DEST_2指定传输redo数据到远程逻辑备数据库chicago。忽略
LOG_ARCHIVE_DEST_3忽略指定从主数据库接收的redo数据归档到本地归档redo日志文件/arch2/boston/。

注:当物理备数据库转换为逻辑备数据库后DB_FILE_NAME_CONVERT初始化参数不起作用。如果需要,可以注册skip处理器,给SQL Apply提供DDL替换字符串来执行主数据库文件到备数据文件名称的转换。详情可参考DBMS_LOGSTDBY包关于SKIP存储过程的信息。


2.5. 打开逻辑备数据库

SQL> ALTER DATABASE OPEN RESETLOGS;
因为是第一次打开数据库,数据库的global name会自动调整匹配新的DB_NAME初始化参数。

执行以下语句开始应用redo数据到逻辑备数据库:
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;




来源:《Oracle Data Guard Concepts and Administration, 19c》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值