您的位置:首页 > 数据库 > Oracle

浅谈对ORACLE DATA GUARD的理解

2016-01-11 18:48 681 查看
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 主机 网络连接字符串

--主库 lmqq lmqq 192.168.1.213 lmqqpri

--备库 lmqq lmqq2 192.168.1.214 lmqqsta

--主备库的网络设置

/*

1)主库的监听器设置

LISTENER =

(DESCRIPTION_LIST =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.213)(PORT = 1521))

)

)

SID_LIST_LISTENER =

(SID_LIST =

(SID_DESC =

(GLOBAL_DBNAME = lmqq)

(ORACLE_HOME = /u01/oracle/product)

(SID_NAME = lmqq)

)

)

2)备库的监听器设置

LISTENER =

(DESCRIPTION_LIST =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.214)(PORT = 1521))

)

)

SID_LIST_LISTENER =

(SID_LIST =

(SID_DESC =

(GLOBAL_DBNAME = lmqq)

(ORACLE_HOME = /u01/oracle/product)

(SID_NAME = lmqq)

)

)

3)主备库tnsnames.ora的设置

lmqqpri =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST =192.168.1.213)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(sid =lmqq)

)

)

lmqqsta =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST =192.168.1.214)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(sid =lmqq)

)

)

SID_LIST_LISTENER =

(SID_LIST =

(SID_DESC =

(GLOBAL_DBNAME = lmqq)

(ORACLE_HOME = /u01/oracle/product)

(SID_NAME = lmqq)

)

)

*/

-----------------------------------------------------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=(lmqq,lmqq2)';

--配置log_archive_dest_1写入本地目录:

alter system set log_archive_dest_1='location=/arc/lmqq valid_for=(all_logfiles,all_roles) db_unique_name=lmqq';

alter system set log_archive_dest_state_1=enable;

--配置log_archive_dest_2写入远程目录,因为这时候还没有备库,暂时设为defer,此处使用LGWR进程推送日志

alter system set log_archive_dest_state_2=defer;

alter system set log_archive_dest_2='service=lmqqsta LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=lmqq2';

--下面这些参数是可选的,只有当主库切换成备库时有效,但强烈建议配置,否则以后主备库切换会失败。

alter system set fal_server=lmqq2;

alter system set fal_client=lmqq;

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/orapwlmqq

################## scp $ORACLE_HOME/dbs/initlmqq.ora oracle@ipaddr:$ORACLE_HOME/dbs

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

--2.要注意的一点是备库的版本要和主库的一样。(注意:这里的版本包括小版本也要一样,比如主库是11.2.0.1,备库时11.2.0.3就不行)

--1)创建备库的参数文件 备库的参数文件可以根据主库的参数文件适当修改即可,在之前我们已经生成了主库的pfile,所有我们只要把它拷贝到备库,然后修改以下参数:

shutdown immediate;

startup pfile='$ORACLE_HOME/dbs/initlmqq.ora';

show parameter spfile;

--创建备库spfile

create spfile from pfile;

shutdown immediate;

startup;

alter system set db_unique_name='lmqq2' scope=spfile;

shutdown immediate;

startup;

alter system set fal_client='lmqq2';

alter system set fal_server='lmqq';

alter system set log_archive_dest_1='location=/arc/lmqq valid_for=(all_logfiles,all_roles) db_unique_name=lmqq2';

alter system set log_archive_dest_2='service=lmqqpri LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=lmqq';

--2)在备库上创建和主库一模一样的目录结构需要创建的目录有日志文件、控制文件、数据文件、归档日志、audit目录等。

--3)测试主备库是否互通 因为之前在主备库上都已经有了密码文件,所有可以使用sys用户远程登录来测试:

--主库:

sqlplus sys@lmqqsta as sysdba

--备库:

sqlplus sys@lmqqpri as sysdba

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

--1)创建主库备份 备份全库和归档日志: 备份成功后,手动把备份文件拷贝至备库主机(scp,ftp等)。

################## rman target /

backup full format='/u01/db_lmqq_%U' database include current controlfile for standby plus archivelog format='/u01/arc_lmqq_%U';

--2)在备库执行恢复 在执行恢复之前,一定要保证三点:

--1,备份文件在备库的目录一定要和主库的一样;

--2,备库存放数据文件等相应的目录都已存在。

--3,备库处于nomount状态

################## rman target sys/@lmqqpri AUXILIARY /

duplicate target database for standby dorecover nofilenamecheck;

--上面的语句执行完毕后,会在相应目录下生成数据文件、日志文件、audit,数据库处于mount状态。

--3)在主 备 库上分别创建standby redo log Oracle规定standby redo log

ALTER DATABASE ADD STANDBY LOGFILE GROUP 10 ('/u01/standby_redo10.log') size 100M;

ALTER DATABASE ADD STANDBY LOGFILE GROUP 11 ('/u01/standby_redo11.log') size 100M;

ALTER DATABASE ADD STANDBY LOGFILE GROUP 12 ('/u01/standby_redo12.log') size 100M;

--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 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/standbylog';

alter database set standby database to maximize availability;

--现在一切都已准备就绪,可以在备库启动日志应用:

alter database recover managed standby database using current logfile disconnect from session;

--下面验证主备库间是否可以同步,首先查看备库当前的归档日志:

SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;

select max(sequence#) from v$archived_log;

ALTER SYSTEM SWITCH LOGFILE;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: