- A+
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归档目的地由于网络闪断或者其他原因不可用时,会自动切换到
通俗点的解释就是: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是完全相同的,这样管 理起来会方便很多。
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/controlfileonline redo log:
[oracle@edsir4p1-CPROD4 ~]$ mkdir -p /u01/app/oracle/oradata/PROD4/onlinearchive 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]$ . oraenvORACLE_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 sysdbaSQL> 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_sttnsping结果全部显示为ok,说明tnsname配置成功。
使用rman开启duplicate创建备库
[oracle@edsir4p1-CPROD4 ~]$ export ORACLE_SID=PROD42、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/oracle3、在备库修改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.luyuan.io)】未经允许不得以任何方式转载,违者必将追究法律责任
- 我的微信
- 这是我的微信扫一扫
- 我的电报
- 这是我的电报扫一扫