ORACLE DATA GUARD 搭建

朴灿烈づ我的快乐病毒、 2022-08-19 11:18 416阅读 0赞

ORACLE DATA GURAD核心的原理是改变向量,简单的理解就是oracle在主库上做的事,在拿到备库上在做一次,DG可分为物理DG和逻辑DG。

物理DG是基于block的,相当于介质恢复,11G的物理备库是可以以read only模式打开的,可以做一些大型的查询,报表之类的工作,已分散主库的压力。但在11G之前的物理DG,备库只能启动到mount状态。物理DG的实时应用alter database recover managed standby database using current logfile disconnect from session.对于这点应该也是有一个前提的,就是日志的推送必须为LGWR模式,如果是ARCH进程模式的话,理论上同步的是做不到实时的,未验证,因为通过ARCH进程推送日志应用的话,应该只有在归档的时候才会到备库应用日志,频繁度肯定没有LGWR来的高。

逻辑DG是基于SQL statement的,通过LOGMINER扣出来redo里的sql在备库在执行。逻辑DG必须由物理DG改变应用方式来实现

-————————————————————————————————————-以下为11G搭建案例
--在不停主库的情况下创建物理备库
--主备库的信息如下:
--角色 db_name db_unique_name 主机 网络连接字符串
--主库 qxdb qxdb 192.168.85.77 qxdbpri
--备库 qxdb qxdb2 192.168.85.73 qxdbsta

--4. 主备库的网络设置
/*
1)主库的监听器设置

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.85.77)(PORT = 42401))
)
)

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = qxdb)
(ORACLE_HOME = /u01/oracle/product)
(SID_NAME = qxdb)
)
)

2)备库的监听器设置

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.85.73)(PORT = 42401))
)
)

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = qxdb)
(ORACLE_HOME = /u01/oracle/product)
(SID_NAME = qxdb)
)
)

3)主备库tnsnames.ora的设置

qxdbpri =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST =192.168.85.77)(PORT = 42401))
(CONNECT_DATA =
(SERVER = DEDICATED)
(sid =qxdb)
)
)

qxdbsta =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST =192.168.85.73)(PORT = 42401))
(CONNECT_DATA =
(SERVER = DEDICATED)
(sid =qxdb)
)
)

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = qxdb)
(ORACLE_HOME = /u01/oracle/product)
(SID_NAME = qxdb)
)
)

*/

-——————————————————————————1.主库的准备工作

--1)确认主库已开启归档和force logging DG要求主库一定要开启归档和force logging,可以通过以下语句查询:
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;
select log_mode,force_logging from v$database;
--从上面我们发现主库已经开启了归档,但没有开启force logging,可以通过以下语句开启:
alter database force logging;
--确认参数remote_login_passwordfile为EXCLUSIVE(默认值):
show parameter remote_login_passwordfile

--2)配置主库参数 首先,查看主库的db_name和db_unique_name:
show parameter db_name;
show parameter db_unique_name;
alter system set log_archive_config=’DG_CONFIG=(qxdb,qxdb2)’;
--配置log_archive_dest_1写入本地目录:
alter system set log_archive_dest_1=’location=/arc/qxdb valid_for=(all_logfiles,all_roles) db_unique_name=qxdb’;
alter system set log_archive_dest_state_1=enable;
--配置log_archive_dest_2写入远程目录,因为这时候还没有备库,暂时设为defer,此处使用LGWR进程sync(同步)推送日志,使用asnyc的话,主库日志切换快的情况下,备库可能会丢失文件
alter system set log_archive_dest_state_2=defer;
alter system set log_archive_dest_2=’service=qxdbsta LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=qxdb2’;
--下面这些参数是可选的,只有当主库切换成备库时有效,但强烈建议配置,否则以后主备库切换会失败。
alter system set fal_server=qxdb2;
alter system set fal_client=qxdb;
alter system set standby_file_management=auto;
alter system set log_archive_format=’%t_%s_%r.arc’ scope=spfile;
shutdown immediate;
startup;
create pfile from spfile;
--通过v$pwfile_users再次确认sys用户在密码文件中:
select * from v$pwfile_users;
--将pfile传送到备库 并且创建主库密码文件 主备库间需要通过密码文件互相通讯,我们先在主库端创建密码文件,之后再把它同步到备库中:
################## orapwd file=$ORACLE_HOME/dbs/orapwqxdb
################## scp -P portid $ORACLE_HOME/dbs/initqxdb.ora oracle@ipaddr:$ORACLE_HOME/dbs

-——————————————————————————2.备库的准备工作

--2.要注意的一点是备库的版本要和主库的一样
--1)创建备库的参数文件 备库的参数文件可以根据主库的参数文件适当修改即可,在之前我们已经生成了主库的pfile,所有我们只要把它拷贝到备库,然后修改以下参数:
shutdown immediate;
startup mount pfile=’$ORACLE_HOME/dbs/initqxdb.ora’;
show parameter spfile;
--创建备库spfile
create spfile from pfile;
shutdown immediate;
startup mount;
alter system set db_unique_name=’qxdb2’ scope=spfile;
shutdown immediate;
startup mount;
alter system set fal_client=’qxdb2’;
alter system set fal_server=’qxdb’;
alter system set log_archive_dest_1=’location=/arc/qxdb valid_for=(all_logfiles,all_roles) db_unique_name=qxdb2’;
alter system set log_archive_dest_2=’service=qxdbpri LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=qxdb’;
shutdown immediate;
startup nomount;

--2)在备库上创建和主库一模一样的目录结构需要创建的目录有日志文件、控制文件、数据文件、归档日志、audit目录等。
--3)测试主备库是否互通 因为之前在主备库上都已经有了密码文件,所有可以使用sys用户远程登录来测试:
--主库:
sqlplus sys@qxdbsta as sysdba
--备库:
sqlplus sys@qxdbpri as sysdba

--3.复制主库至备库 我们可以通过rman的duplicate命令,在主库不停机的情况下,创建备库。这里有个前提条件,就是备库的目录结构和主库一模一样。

--1)创建主库备份 备份全库和归档日志: 备份成功后,手动把备份文件拷贝至备库主机(scp,ftp等)。
################## rman target /
backup full format=’/u01/db_qxdb_%U’ database include current controlfile for standby plus archivelog format=’/u01/arc_qxdb_%U’;

--2)在备库执行恢复 在执行恢复之前,一定要保证三点:
--1,备份文件在备库的目录一定要和主库的一样;
--2,备库存放数据文件等相应的目录都已存在。
--3,备库处于nomount状态
################## rman target sys/@qxdbpri auxiliary /
duplicate target database for standby dorecover nofilenamecheck;
--上面的语句执行完毕后,会在相应目录下生成数据文件、日志文件、audit,数据库处于mount状态。

--3)在主 备 库上分别创建standby redo log (rman备库恢复后,备库的联机日志在闪回恢复区,且一个组只有一个文件,可规范化一下)
ALTER DATABASE ADD STANDBY LOGFILE GROUP 11 (‘/u01/oracle/qxdb/standby_redo11.log’) size 600M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 12 (‘/u01/oracle/qxdb/standby_redo12.log’) size 600M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 13 (‘/u01/oracle/qxdb/standby_redo13.log’) size 600M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 14 (‘/u01/oracle/qxdb/standby_redo14.log’) size 600M;

--4)重建备库的online redo log
alter system set standby_file_management=manual;
alter system set LOG_FILE_NAME_CONVERT=’/u01/‘,’/u01/‘ scope=spfile;
shutdown immediate;
startup;
alter database clear logfile group 1;
alter database clear logfile group 2;
alter database clear logfile group 3;
alter database clear logfile group 4;

alter system reset LOG_FILE_NAME_CONVERT;
shutdown immediate;
startup;
alter system set standby_file_management=auto;
--5. 备库启动redo apply 因为之前我们把log_archive_dest_state_2设为defer,
--现在需要在 主 备 库中把它设为enable 并修改standbylog目录,改为最大可用模式
alter system set log_archive_dest_state_2=enable;
alter system set standby_archive_dest=’/arc/qxdb/standbylog’;
alter database set standby database to maximize availability;
--在备库启动日志应用:
alter database recover managed standby database using current logfile disconnect from session;
--取消日志应用
alter database recover managed standby database cancel;

--验证日志是否推送到备库(切换日志验证),两边的最大日志序列理论上是一样(有特殊情况下会出现不一样),如果一样,表示日志推成功
select max(sequence#) from v$archived_log a;
--推送成功,并不意味日志在备库就成功应用了,查看日志应用状态,一般applied_seq#会比max_seq小1。
SELECT * FROM (select sequence# from v$archived_log a where A.STANDBY_DEST=’YES’ and a.dest_id = 2 and a.applied = ‘YES’ ORDER BY A.FIRST_TIME DESC) WHERE ROWNUM = 1;
select a.protection_mode,a.applied_seq# ,a.status,a.error from v$archive_dest_status a where a.dest_id = 2;
--当主库日志切换后,看看备库scn有没有改变。
select to_char(current_scn) from v$database;
--对比seq# ,状态是不是 WAIT_FOR_LOG,如果不是,可能没有执行应用命令。
select process,sequence#,status from v$managed_standby;
--以下视图可以看到dg搭建时的详细设置
select * from v$archive_dest a where a.dest_id = 2;

-—-v$archive_gap 很重要,备库日志断档,目前情况下没有遇到这个视图查询到数据的!reference的解释如下
V$ARCHIVE_GAP displays information about archive gaps on a standby database. This
view can be used to find out the current archive gap that is blocking recovery for the
current recovery incarnation
一般这个视图如果查询到数据的话,需要人工干预注册日志(大多数情况下是不需要的,哪怕是在备库恢复,甚至不需要recover(理论应该是不能超过control信息保留时间跨度))
ALTER DATABASE REGISTER PHYSICAL LOGFILE ‘*.arc’;

发表评论

表情:
评论列表 (有 0 条评论,416人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Oracle Data Guard配置手记[转]

    经过多次实践,参阅网上N多文章……最后还是配不成,可能本人悟性太低,无法体会高手的笔记。最终还是在前辈的帮助下完成。特用最平实的手法记录下来,以便如吾辈菜鸟能 看得懂。 运