测试版-逻辑standby创建

本文详细介绍了如何通过创建物理备用数据库并转换为逻辑备用数据库的方法来实现Oracle数据库的高可用性配置。包括设置主数据库参数、生成LogMiner字典、调整初始化参数等多个步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、创建物理standby
详见《测试版-物理standby创建》文档。
最方便的创建逻辑standby的方式就是先创建一个物理standby,然后再将其转换成逻辑standby,因此第一步就是先创建一个物理standby。
注意,在将其转换为逻辑standby前,可以随时启动和应用redo,但是如果你决定将其转换为逻辑standby,就必须先停止该物理standby的redo应用,
以避免提前应用含LogMiner字典的redo数据,造成转换为逻辑standby后,sql应用时logMiner字典数据不足而影响到逻辑standby与primary的正常同步。
SQL>alter database recover managed standby database cancel;

2、设置primary数据库

在前面创建standby时曾经设置过无数个初始化参数用于primary与物理standby的角色切换,同样对于逻辑standby的角色切换,那些参数同样好使。
不过注意,如果希望primary数据库能够正常切换为逻辑standby角色的话,那么你还需要设置相应的log_archive_dest_N,并且valid_for属性,
需要更改成:(STANDBY_LOGFILES,STANDBY_ROLE)。
编辑primary库的pfile文件如下:
service_name=test
db_unique_name=lsnode1
log_archive_dest_1='LOCATION=/oracle/oradata/test/arch valid_for=(all_logfiles,all_roles) db_unique_name=lsnode1'
LOG_ARCHIVE_DEST_2='SERVICE=lsnode2 VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=lsnode2'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
fal_server=lsnode2
fal_client=lsnode1
standby_file_management=auto
log_archive_dest_3='LOCATION=/oracle/oradata/test/arch1 valid_for=(STANDBY_LOGFILES,STANDBY_ROLE) db_unique_name=lsnode1'
LOG_ARCHIVE_DEST_STATE_3=ENABLE
PARALLEL_MAX_SERVERS=9
UNDO_RETENTION=3600
设置完之后关闭数据库并重新启动,即:
$ sqlplus / as sysdba
SQL>shutdown immediate
SQL>startup
然后需要生成LogMiner字典信息,通过执行下列语句生成(务必执行):
SQL> EXECUTE DBMS_LOGSTDBY.BUILD;

该过程专门用于生成记录的元数据信息到redo log,这样改动才会被传输到逻辑standby,然后才会被逻辑standby进行SQL应用。
提示:

1)该过程会自动启用primary数据库的补充日志(supplemental logging)功能(如果未启用的话)。
2)该过程执行需要等待当前所有事务完成,因此如果当前有较长的事务运行,可能该过程执行也需要多花一些等待时间。
3)该过程是通过闪回查询的方式来获取数据字典的一致性,因此oracle初始化参数UNDO_RETENTION值需要设置的足够大。

3、转换物理standby为逻辑standby

执行下列语句,转换物理standby为逻辑standby:
SQL> alter database recover to logical standby test;(执行这一步的时候有可能报错,可以先关闭数据库然后启动到mount状态再执行)

关于db_name(注意哟,这可不是db_unique_name,不同于物理standby,逻辑standby是一个全新的数据库,因此建议你指定一个唯一的,
与primary不同的数据库名),如果当前使用spfile,则数据库会自动修改其中的相关信息,如果使用的pfile,在下次执行shutdown的时
候oracle会提示你去修改db_name初始化参数的值。

提示:执行该语句前务必确保已经暂停了redo应用,另外转换是单向的,即只能由物理standby向逻辑standby转换,而不能由逻辑standby
转成物理standby。这并不仅仅是因为dbname发生了修改,更主要的原因是逻辑standby仅是数据与primary一致,其它如存储结构,
scn等基于dbid都不一相同。

另外,该语句执行过程中,需要应用全部的LogMiner字典相关的redo数据。这部分操作完全依赖于primary数据库DBMS_LOGSTDBY.BUILD的执行
以及传输到standby后有多少数据需要被应用。如果primary数据库执行DBMS_LOGSTDBY.BUILD失败,则转换操作也不会有结果,这时候你恐怕不得不先
cancel掉它,解决primary数据库的问题之后再尝试执行转换。
个人测试:这里我测试的时候就没按官方文档走,直接还是设置成和主库的db_name一样的名。

4、重建逻辑standby的密码文件

主要是由于转换操作修改了数据库名,因此密码文件也需要重建,这个操作我们做的比较多,这里就不详述了。
$ cd $ORACLE_HOME/dbs
$ orapwd file=orapwtest password=oracle entries=10
注意:在测试中,有一次后期报1130错误,就是主备库的密码文件不一样造成的。所以在此设置的时候,最好创建主库的密码文件,然后再拷贝到备库的相应位置。
5.重启数据库
SQL> SHUTDOWN;
SQL> STARTUP MOUNT;

6、调整逻辑standby初始化参数

之所以要调整初始化参数,一方面是由于此处我们的逻辑standby是从物理standby转换来的,某些参数并不适合甚至可能造成错误,
比如log_archive_dest_n参数的设置。另一方面,由于逻辑standby会有读写操作,因此需要读写本地online redologs及并产生archivelogs,
务必需要注意本地的archivelogs路径不要与应用接收自primary数据库的redo数据生成的archivelogs路径冲突。当然归根结底是因为逻辑standby
是从物理standby转换而来,因此standby的初始化参数就需要第二次调整(第一次是创建物理standby),这里为什么要选择从物理standby转换呢?
很简单,因为前面测试过程中创建了两个standby,所以我觉着直接转换一个当成逻辑standby,操作更省事儿:)
当然我相信,看完这个系列,如果你对于创建的流程能够非常清晰,完全可以跳过先创建物理standby的过程,直接创建逻辑standby。
关于修改初始化参数的方式有多种,通过alter system set也可以,或者先生成pfile修改相关参数,然后再根据修改过的pfile生成spfile也可以。
service_name=test
db_unique_name=lsnode2
log_archive_dest_1='LOCATION=/oracle/oradata/test/arch valid_for=(all_logfiles,all_roles) db_unique_name=lsnode2'
LOG_ARCHIVE_DEST_2='SERVICE=lsnode1 VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=lsnode1'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
fal_server=lsnode1
fal_client=lsnode2
standby_file_management=auto
log_archive_dest_3='LOCATION=/oracle/oradata/test/arch1 valid_for=(STANDBY_LOGFILES,STANDBY_ROLE) db_unique_name=lsnode2'
LOG_ARCHIVE_DEST_STATE_3=ENABLE
PARALLEL_MAX_SERVERS=9
UNDO_RETENTION=3600

6、打开逻辑standby

由于逻辑standby与primary数据库事务并不一致,因此第一次打开时必须指定resetlogs选择,如下:
SQL> alter database open resetlogs;

然后可以通过执行下列sql命令应用redo数据:
SQL> alter database start logical standby apply immediate;
ORA-16239: IMMEDIATE option not available without standby redo logs
出现这种错误的主要原因是primary没有为standby创建standby resetlogs文件。
可以执行如下命令:
SQL> alter database start logical standby apply;

如果想停止逻辑standby的sql应用,可以通过下列命令:
SQL> alter database stop logical standby apply immediate;
SQL> alter database stop logical standby apply;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值