oracle11g单机环境搭建DG

  • A+
所属分类:技术

chatGPT账号
oracle11g单机环境搭建DG

知点

oracle11g单机环境搭建DG

环境准备

主备库环境配置:

primary db standby db
IP 192.168.33.137 192.168.33.138
hostname edsir1p8.us.oracle.com edsir4p1.us.oracle.com
db_name PROD4 PROD4
db_unique_name PROD4_pd PROD4_st
service_names PROD4,p1 PROD4_st

 

注:搭建DG的主备库要求必须使用相同的db_name

必须使用不同的db_unique_name,DG就是根据db_unique_name来区分主备库的。

尽量选择使用相同的service_names,对于dg的配置可以相同也可以不同,但是如果后 续进行switchover,备库切换为主库,如果采用相同的service_names,可以不用修改应        用或者重新配置监听,直接切换到备库上。

主库端配置

开启主库归档模式

DG主备库之间传递的就是redo data(包括online redo log和archivelog),所以必须开启主库的归档模式才能搭建DG。

开启主库归档的步骤:

1、确认数据库当前log_mode

SQL> archive log list;

2、如果当前是非归档模式,必须开归档

open状态:

SQL> alter system set log_archive_dest_1='location=+ARCH' scope=spfile;

SQL> shutdown immediate

SQL> startup mount

SQL> alter database archivelog;

SQL> alter database open;

3、确认主库是否成功开启归档

SQL> archive log list;

开启db的强制写日志模式

1、查询数据库是否是logging模式

SQL> select force_logging from v$database;

如果查询结果为:NO 必须修改db为 force logging模式。

因为DG的主备库同步是靠传递redo data来实现的,如果主库为nologging或者部分数据文件或表是nologging模式,那么对nologging对象的操作是不记录在redo data中的,这样主备库就无法实现同步了。所以必须修改db为logging模式。

2、设置db为force logging模式

SQL> alter database force logging;

3、确认修改是否生效

SQL> select force_logging from v$database;

配置监听和tnsname

正常情况下primary db应该是已经正常配置了监听,无需重复配置,只需查看监听状态,确认能通过监听连接到实例上就ok

1、查看监听状态

[oracle@edsir1p8-PROD4 ~]$ lsnrctl status

监听状态显示:

service name:PROD4.us.oracle.com

Instance "PROD4", status UNKNOWN, has 1 handler(s) for this service

监听的服务下有对应的instance,静态注册

2、配置tnsname

修改tnsnames.ora文件添加prod4_pd、prod4_st的tnsname

vi  /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora

 

添加prod4_pd:

PROD4_PD =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = edsir1p8.us.oracle.com)(PORT = 1521))

)

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = PROD4.us.oracle.com)

)

)

注:SERVICE_NAME 的值正常情况下应该等于数据库中service_names参数的值,但是如果主机上有域名,监听中会自动添加域名到service_names后面,最后成新的service name。所以在配置SERVICE_NAME的值时要依监听中实际注册的service name为准。本实例中监听注册的service name为PROD4.us.oracle.com,所以SERVICE_NAME = PROD4.us.oracle.com

 

添加prod4_st:

PROD4_ST =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = edsir4p1.us.oracle.com)(PORT = 1521))

)

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = PROD4_st)

)

)

3、现在还不能进行tnsping测试tnsname配置是否正确,必须要等到standby db端配置了监听,并且监听中注册了PROD4实例后才能测试tnsname是否配置正确。

先测试prod4_pd:

[oracle@edsir1p8-PROD4 admin]$ tnsping prod4_pd

测试结果显示ok

添加data guard 参数

1、从spfile生成pfile

SQL> create pfile='/home/oracle/prod4dg.ora' from spfile;

2、修改pfile添加DG配置参数

vi  /home/oracle/prod4dg.ora

添加如下配置参数:

*.db_name='PROD4'

*.db_unique_name='PROD4_pd'

--注:db_unique_name严格区分大小写

*.log_archive_config='dg_config=(PROD4_pd,PROD4_st)'

--注:dg_config参数指定的是DG环境中的db_unique_name

*.log_archive_dest_1='location=+ARCH valid_for=(all_logfiles,all_roles)

db_unique_name=PROD4_pd'

--注:valid_for参数的含义是当本数据库处于all_roles即任何角色时到往本地路径                       log_archive_dest_1下归档all_logfiles(online redo log和standby redo log)

*.log_archive_dest_2='service=prod4_st reopen=120 lgwr async valid_for=

(online_logfiles,primary_role) db_unique_name=PROD4_st'

--注:valid_for参数的含义是当数据库为primary_role主库角色时往远程路径                                 log_archive_dest_2下归档online_logfiles(online redo log)

其中的service=prod4_st,指定归档传输走的监听,所以此处指定的是tnsname

lgwr:指定redo data传输使用的传输方式,lgwr async的组合表示redo data使用                       lgwr进程采用异步传输的方式同步到db_unique_name 为PROD4_st 的standby db

*.log_archive_dest_state_1=enable

*.log_archive_dest_state_2=enable

--注:启用归档目的地,该参数对应的值有三个,分别如下:

 

enable:启用归档目的地

defer:禁用归档目的地

ALTERNATE:作为备用归档目的地

备用归档目的地的用法如下:

log_archive_dest _3='SERVICE=path1 NOREOPEN ALTERNATE=LOG_ARCHIVE_DEST_4'

log_archive_dest _4='SERVICE=path2 NOREOPEN OPTIONAL'

log_archive_dest_state_3=ENABLE

log_archive_dest_state_4=ALTERNATE

当log_archive_dest _3归档目的地由于网络闪断或者其他原因不可用时,会自动切换到

log_archive_dest _4归档目的地。

通俗点的解释就是:3不行4就上

        

*.standby_file_management='auto'

--注:该参数的意思是standby db的文件管理方式是auto,而非manual。设置该参数值           为auto主要目的是:主库如果添加、删除表空间或者数据文件时,会自动在备库                            相应的添加、删除表空间或者数据文件。

如果该值设置为manual,那么如果主库添加、删除数据文件时,需要手工的在备                      库做同样的操作来实现主备库的同步。

*.fal_server='prod4_st'

--注:指定故障转移的目标端。即出现故障时往tnsname=prod4_st指定的目标端切。

通常不会设置故障转移的自动切换,都是dba按照自己的意愿,往最适合接管                          primary db的standby db上去切。

*.fal_client='prod4_pd';

--注:指定发送故障的客户端,即本地db

 

具体参数文件参考:11gdg/primaryDB_spfile.txt

用新pfile重启主库

SQL> shutdown immediate

SQL> create spfile from pfile='/home/oracle/prod4dg.ora'

SQL> startup

创建standby redo log文件

添加standby redo log文件的目的是在后续执行rman duplicate时可以直接从主库复制standby redo log,而不用再在standby db端创建standby redo log。直接从主库复制的好处有如下几条:

1、保证主库和备库有相同的standby redo log,即省了在备库端创建的麻烦由能保证主               备库完全相同,这样在switchover时可以直接切换,无需做任何更改。

2、如果主库有多套dg备库,所有的dg备考的standby redo log是完全相同的,这样管            理起来会方便很多。

 

创建standby redo log的原则:

1、必须比online redo log多至少一组

2、最好和online redo log的文件大小相同,可以比online redo log大,但是绝不能比online redo        log小

3、standby redo log的文件存放路径最好和online redo log放在相同的路径下,这样在备库参数文件中配置参数log_file_name_convert时会方便很多。

 

创建standby redo log的步骤:

1、SQL> alter database add standby logfile '+FLASHBACK/prod4/onlinelog/stdbyredo01.log' size                       50m;

2、SQL> alter database add standby logfile '+FLASHBACK/prod4/onlinelog/stdbyredo02.log' size

50m;

3、SQL> alter database add standby logfile '+FLASHBACK/prod4/onlinelog/stdbyredo03.log' size

50m;

4、SQL> alter database add standby logfile '+FLASHBACK/prod4/onlinelog/stdbyredo04.log' size

50m;

5、SQL> alter database add standby logfile '+FLASHBACK/prod4/onlinelog/stdbyredo05.log' size

50m;

注:本地主库有4组online redo log,所以创建5组 standby redo log,并且standby redo log文件存放路径和online redo log存放路径相同。

备库端配置

创建相关目录结构

1、创建主库中audit_file_dest参数指定的目录

mkdir -p /u01/app/oracle/admin/PROD4/adump

注:该目录可以在DG搭建完成后,需要在备库开审计功能时再创建也不迟。

2、创建standby db 数据库文件存放目录

数据文件:

[oracle@edsir4p1-CPROD4 ~]$ mkdir -p /u01/app/oracle/oradata/PROD4/database

控制文件:

[oracle@edsir4p1-CPROD4 ~]$ mkdir -p /u01/app/oracle/oradata/PROD4/controlfile

online redo log:

[oracle@edsir4p1-CPROD4 ~]$ mkdir -p /u01/app/oracle/oradata/PROD4/online

archive log:

[oracle@edsir4p1-CPROD4 ~]$ mkdir -p /u01/app/oracle/oradata/PROD4/arch

创建standby的口令文件

[oracle@edsir4p1-CPROD4 ~]$ orapwd file='/u01/app/oracle/product/11.2.0/dbhome_1/orapwPROD4 password=oracle

截图如下:

设置sys用户的密码为oracle

注:实际上执行该操作的目的只有一个,就是初次使用rman登录的验证。

在执行duplicate的过程中,实际上会把主库的口令文件复制到备库,覆盖掉该步操作    创建的口令文件,这样才能在主备库实现口令文件的验证同步,如果口令文件不完全一     样,必须在备库手动修改口令文件保证和主库完全相同,否则在redo transport service        传递归档日志的过程中有可能会因为备库端口令验证不通过,导致无法往备库传递归档。

创建standby的初始化参数

[oracle@edsir4p1-CPROD4 ~]$ cd /home/oracle

[oracle@edsir4p1-CPROD4 ~]$ vi initdgprod4.ora

添加如下内容:

*.db_name='PROD4'

--注:主备库必须使用相同的db_name

*.control_files='/u01/app/oracle/oradata/PROD4/controlfile/control01.ctl','/u01/app/oracle/oradata/PROD4/controlfile/control02.ctl','/u01/app/oracle/oradata/PROD4/controlfile/control03.ctl'

--注:指定控制文件存放路径

*.db_unique_name='PROD4_st'

--注:必须指定和主库不同的db_unique_name,主备库的区分就是通过db_unique_name来区分的。

*.log_archive_config='dg_config=(PROD4_pd,PROD4_st)'

--注:指定DG环境中的db_unique_name

*.log_archive_dest_1='location=/u01/app/oracle/oradata/PROD4/arch valid_for=(all_logfiles,all_roles) db_unique_name=PROD4_st'

--注:指定本地归档日志。当该db处于all_roles时往本地路径log_archive_dest_1下归档--all_logfiles

*.log_archive_dest_2='service=prod4_pd reopen=120 lgwr async valid_for=(online_logfiles,primary_role) db_unique_name=PROD4_pd'

--注:指定当该db处于primary_role角色时才会往远程目的地log_archive_dest_2归档--online_logfiles类型的日志文件。归档传递方式采用lgwr进程异步传输,归档的目的db有-- db_unique_name=PROD4_pd参数指定。

*.log_archive_dest_state_1='enable'

*.log_archive_dest_state_2='enable'

*.standby_file_management='auto'

*.fal_server='prod4_pd'

*.fal_client='prod4_st'

*.log_file_name_convert='+FLASHBACK/prod4/onlinelog','/u01/app/oracle/oradata/PROD4/online'

--注:主库和备库的日志文件存放路径不同,必须添加该参数指定主库往备考duplicate时的--redo log 文件存放路径。

*.db_file_name_convert='+DATA/prod4/datafile','/u01/app/oracle/oradata/PROD4/database'

--注:主库和备库的数据文件存放路径不同,必须添加该参数指定主库往备考duplicate时的

--datafile 文件存放路径

 

具体参数文件参考:11gdg/standbyDB_spfile.txt

用pfile 将standby 启动到nomount状态

1、切到正确的$ORACLE_HOME目录,目的是使用$ORACLE_HOME/bin目录下的sqlplus和rman

[oracle@edsir4p1-PROD4 dbs]$ . oraenv

ORACLE_SID = [PROD4] ? PROD1

The Oracle base for ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1 is /u01/app/oracle

2、设置ORACLE_SID

[oracle@edsir4p1-PROD1 bin]$ export ORACLE_SID=PROD4

[oracle@edsir4p1-PROD1 bin]$ sqlplus / as sysdba

SQL> startup nomount pfile='/home/oracle/initdgprod4.ora'

备库端配置监听和tnsname

1、standby端配置监听

监听的配置可以的不依赖数据库,可以在没有任何db的情况下配置监听,监听就是配置在os上的一个开启的端口,或者说服务端,随时等待用户进程的访问,和该服务器上是否有db没有任何关系。

配置监听:

[oracle@edsir4p1-PROD1 bin]$ netmgr

添加对PROD4实例的静态注册:

配置完成保存配置:

启动监听:

[oracle@edsir4p1-PROD1 bin]$ lsnrctl start

查看监听的启动状态,是否正常启动并且静态注册了PROD4实例:

[oracle@edsir4p1-PROD1 bin]$ lsnrctl status

截图如下:

截图结果显示注册状态为UNKNOWN的实例PROD4即为静态注册上来的实例。

注:该截图是DG搭建成功后的截图,不准确。实际上在nomount状态动态注册上来的实例状态都应该是blocked(阻塞)而非ready。

因为在nomount和mount状态数据库实例为未打开状态,不对外提供服务,不允许通过监听远程连接到该数据库实例。blocked状态的意思就是不允许外界通过监听远程连接到该数据库实例,只允许本地通过操作系统验证的方式以sys用户登录数据库:sqlplus / as sysdba。

 

所以在nomount和mount状态,注册到监听上的实例是blocked状态是正常的,没什么大惊小怪的!!!

blocked状态说明只允许本地通过操作系统验证的方式以sys用户登录数据库:sqlplus / as sysdba

2、配置tnsname

在standby端vi tnsnames.ora文件添加如下部分:

prod4_pd部分:

PROD4_PD =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = edsir1p8.us.oracle.com)(PORT = 1521))

)

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = PROD4.us.oracle.com)

)

)

prod4_st部分:

PROD4_ST =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = edsir4p1.us.oracle.com)(PORT = 1521))

)

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = PROD4_st)

)

)

3、测试主库和备库端tnsname配置是否正确

测试主库端:

[oracle@edsir1p8-PROD4 admin]$ tnsping prod4_pd

[oracle@edsir1p8-PROD4 admin]$ tnsping prod4_st

测试备库端:

[oracle@edsir4p1-CPROD4 ~]$ tnsping prod4_pd

[oracle@edsir4p1-CPROD4 ~]$ tnsping prod4_st

tnsping结果全部显示为ok,说明tnsname配置成功。

 

使用rman开启duplicate创建备库

1、设置ORACLE_SID

[oracle@edsir4p1-CPROD4 ~]$ export ORACLE_SID=PROD4

2、rman同时登录主库和备库

[oracle@edsir4p1-PROD4 ~]$ rman target sys/oracle@prod4_pd auxiliary sys/oracle@prod4_st nocatalog

注:截图是DG搭建完成后的截图,实际的显示结果应该是备库为not mount 状态 。

注:如果使用的是非catalog库管理的备份方式,在rman 连接时,加上nocatalog关键字,不然会报如下错误:

DBGSQL:    TARGET> begin :fhdbi := dbms_rcvcat.getDbid; end;

DBGSQL:        sqlcode = 6550

DBGSQL:         B :fhdbi = 32767

RMAN-00571: ===========================================================

RMAN-00569: =============== ERROR MESSAGESTACK FOLLOWS ===============

RMAN-00571:===========================================================

RMAN-03002: failure of Duplicate Db commandat 10/28/2011 17:53:04

RMAN-05501: aborting duplication of targetdatabase

RMAN-03015: error occurred in stored scriptMemory Script

ORA-06550: line 1, column 17:

PLS-00201: identifier'DBMS_RCVCAT.GETDBID' must be declared

ORA-06550: line 1, column 7:

PL/SQL: Statement ignored

3、执行duplicate创建备库

RMAN> duplicate target database for standby from active database dorecover;

注:在执行duplicate的时候,如果源库和目标库database目录相同,那么在duplicate 时,需要加上nofilenamecheck,否则不加该选项,默认是需要文件名检查的。

duplicate命令实际上就是封装了rman的restore和recover命令。先完成restore再执行recover

执行duplicate命令的过程中从主库复制了:口令文件orapwPROD4、控制文件、数据文件、online redo log、standby redo log

 

在执行duplicate的过程中可能会报如下错误:

报错一:SQL STATMENT: alter system archive log current; FAILED

报错二:temp tablespace or temp datafile create failed

以上两个报错的原因都是因为temporary tablespace 复制失败。

reason:临时数据文件的存放路径没有在备库的参数文件中指定,导致无法复制临时表空间的数据文件。

solution:修改主库删除临时表空间的数据文件,添加新的数据文件到备库的pfile文件中db_file_name_convert参数指定的路径下。

具体步骤:

=============================================================================

在主库执行:

1、先确认数据库的默认临时表空间。

SQL> select * from database_properties where property_name='DEFAULT_TEMP_TABLESPACE';

2、添加与原来临时数据文件相同大小的临时数据文件

SQL> select file#,ts#,bytes/1024/1024 ,name from v$tempfile;

SQL> alter tablespace temp add tempfile '+DATA/prod4/datafile/temp02.dbf' size 300m;

3、删除原来的临时数据文件

SQL> alter tablespace temp drop tempfile '+DATA/prod4/datafile/temp01.dbf';

4、确认所有的临时数据文件的存放路径都在备库的pfile文件中db_file_name_convert参数指定的路径下。

SQL> select file#,ts#,bytes/1024/1024 ,name from v$tempfile;

在备库执行:
5、重新执行duplicate命令,报错解决。

RMAN> duplicate target database for standby from active database dorecover;

===============================================================================

创建和主库相同配置的spfile文件

pfile里面都是我们设置的一些基本参数。 但是备库有冗余的作用,所以这里还是建议用主库的pfile copy过来,然后修改相关参数后,在创建spfile。这样即使切换了,对DB的影响也不大。

1、在主库创建pfile

SQL> create pfile='/home/oracle/initdgprod4.ora' from spfile;

2、scp到备库

[oracle@edsir1p8-PROD4 ~]$ cd /home/oracle

[oracle@edsir1p8-PROD4 ~]$ scp initdgprod4.ora 192.168.33.138:/home/oracle

3、在备库修改initdgprod4.ora文件中的相关参数,调整到standby合适的设置

删除掉主库的相关参数,并添加原来备库pfile中的所有的初始化参数。

4、关闭备库,用新的pfile启动备库到nomount状态

SQL> shutdown immediate

SQL> startup nomount pfile='/home/oracle/initdgprod4.ora'

启动成功说明参数文件的修改正确。

5、关闭备库,用spfile重新启动备库

SQL> shutdown immediate

SQL> create spfile from pfile='/home/oracle/initdgprod4.ora'

SQL> startup nomount

SQL> alter database mount

SQL> alter database open;

启动redo apply和实时查询

开启redo apply并且是real_time query,即主备库实时同步。

在备库执行如下指令:

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

该指令的作用是启动mrp进程,开启redo real_time apply

该指令执行完成后,可以查看mrp进程是否成功启动。

[oracle@edsir4p1-PROD4 ~]$ ps -ef | grep mrp

测试主备库是否能实时同步

主库创建表:

SQL> create table testdg(id number,name varchar2(30));

备库查询表结构:

SQL> desc testdg

 

至此,完成DG的搭建。

本文由 知点 首发于【知点网http://www.zhidnet.com)】未经允许不得以任何方式转载,违者必将追究法律责任

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的电报
  • 这是我的电报扫一扫
  • weinxin
chatGPT账号
知点

发表评论

您必须登录才能发表评论!