Windows 10 环境下oracle 11g r2 dg配置详解
(2)在主库将 primary 切换到 physical standby 12
(3)在备库,switchover 到 primary: 12
如果我们不清楚为什么是归档模式,那我们就应该也不会清楚 dataguard 是
用来做什么的。透过很多修饰的官方语言,我们需要明确 DG(dataguard 简称,
后同)实际上的作用就是用来高可用。而实现原理就是从主库获取数据到从库,
在主库发生异常的时候,从库接管主库,完成身份的变化。可以一个主库,最多
9 个从库。同时分为逻辑 standby 和物理 standby 这里我们讨论的是物理 standby.
一旦创建并配置成 standby 后,dg 负责传输 primary 数据库 redo data 到
standby 数据库,standby 数据库通过应用接收到的 redo data 保持与 primary 数
据库的事务一致。
这下清楚了吧,需要保证主从库一致,需要传输 archive log 和 redo log 到从库,
如果不是归档模式无法保证主从库的数据一致。
主从库硬件最好一致。oracle 数据库版本需要一致,在 Windows 用超级用户
登陆安装。
安装路径一致(如 D:\App\Administrator),数据文件存放位置一致(如
E:\OracleDB\Orcl),归档日志文件在(E:\OracleDB\Flash\Orcl\ARCHIVELOG)
文件夹下,联机日志文件默认。(从库只需要安装数据库软件,数据从主库传输
后完成,也可以安装与主库一致,包括实例。)
配置环境数据库用户必须有 sysdba 权限
下面配置环境:
主库 ip : 192.168.1.11 数据库实例名:orcl db_unique_name: primary
从库 ip : 192.168.1.12 数据库实例名:orcl db_unique_name: standby
Ø 在主库启动数据库到 mount 模式,开启归档模式与 force logging
flashback。
Cmd 下 sqlplus “/as sysdba” 之后执行以下命令
shutdown immediate
startup mount
alter database archivelog;
alter database force logging;
alter database flashback on;
Ø 创建 standby log files(备用日志文件)
从库使用 standby log files 来保存从主库接收到的重做日志。既然主要是从库
在使用,那为什么需要在主库上也建立 standby log files?原因主要由两个:
1) 主库可能转换为备库,而备库是需要有 standby log files 的
2) 如果主库建立了 standby log files 那备库会自动建立。
建立 standby 如要注意以下几点:
1) standby log files 的大小和 redo log files 一样。查询 redo log files 文件
大小(默认 50M,3 个):
select group#,bytes/1024/1024 as M from v$log ;
2) 一般而言, standby redo 日志文件组数要比 primary 数据库的
online redo 日志文件组数至少多一个。 standby redo 日志组数量基于
primary 数据库的线程数(这里的线程数可以理解为 rac 结构中的
rac 节点数) 有一个推荐的公式可以做参考:(每线程的日志组数+1)*
最大线程数。
假设现在节点是 1 个,则=(3+1)*1=4
如果是双节点 则=(3+1)*2=8
这里我们创建 4 个 standby logfile:
另:不建议组号 group#紧挨着 redo,因为后续 redo 有可能调整,
这里我们从建立从 21 到 24 的 standby logfile
alter database add standby logfile group 21 'E:\OracleDB\Orcl\redo021.log' size 50M;
alter database add standby logfile group 22 'E:\OracleDB\Orcl\redo022.log' size 50M;
alter database add standby logfile group 23 'E:\OracleDB\Orcl\redo023.log' size 50M;
alter database add standby logfile group 24 'E:\OracleDB\Orcl\redo024.log' size 50M;
注意:系统默认 REDO 文件太小,个数也不够,一般都要做改动,比如大小 512M,
个数 6 个,这样就先做好 REDO,的改变之后,再做 standby。
Ø 修改系统参数 spfile 文件(13 个参数)
- alter system set db_unique_name='primary' scope=spfile;
2) Alter system set log_archive_config='DG_CONFIG=(primary,standby)'
scope=spfile;
3) alter system set log_archive_dest_1='location=E:\OracleDB\flash\Orcl\ARCHIVELOG VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=primary' scope=spfile;
4) Alter system set log_archive_dest_2='SERVICE=standby LGWR ASYNC
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLES) DB_UNIQUE_NAME=
standby' scope=spfile;
5) Alter system set log_archive_dest_state_1 ='enable' scope=spfile;
6) Alter system set log_archive_dest_state_2='enable' scope=spfile;
7) Alter system set fal_server='standby' scope=spfile;
8) Alter system set fal_client='primary' scope=spfile;
9) Alter system set archive_lag_target=1800 scope=spfile;
10) Alter system set log_archive_format='%t_%s_%r.arc' scope=spfile;
11) Alter system set standby_file_management=auto scope=spfile;
12) Alter system set db_file_name_convert='standby','primary' scope=spfile;
13) Alter system set log_file_name_convert='standby','primary' scope=spfile;
Ø 创建 pfile 参考文件
Alter database open;
Shutdown immediate;
Startup
Create pfile from spfile;
Pfile 在默认路径下 D:\app\Administrator\product\11.2.0\dbhome_1\database\
INITorcl.ORA.
Ø 创建备库的控制文件(此步骤可以不要):
alter database create standby controlfile as 'D:\oracle\control01.ctl';
Ps:蓝色字体部分配置重启oracle 会报错,需要到配置文件中修改该段配置,配置文件地址:G:\app\Administrator\product\11.2.0\dbhome_1\database
,startup启动命令用: startup pfile = 'G:\app\Administrator\product\11.2.0\dbhome_1\database\INITorcl.ORA';
Ø 创建密码文件
一般密码文件存放在 D:\app\Administrator\product\11.2.0\dbhome_1\database\
文件名为:PWDorcl.ORA. 如果未能找到,则需要手动创建,命令为:
在 cmd 命令下输入 Orapwd file=D:\app\Administrator\product\11.2.0\dbhome_1\database\PWDorcl.ora passoword=123 entries=5 (其中 123 为 sys
的密码)
Ø 配置主库网络监听
在 ORACLE_HOME\NETWORK\ADMIN 下
Listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = D:\app\graceli\product\11.2.0\dbhome_1) (PROGRAM = extproc)
(ENVS =
"EXTPROC_DLLS=ONLY:D:\app\graceli\product\11.2.0\dbhome_1\bin\oraclr11.dll")
)
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = D:\app\graceli\product\11.2.0\dbhome_1)
(SID_NAME = orcl)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL =TCP) (HOST = 192.168.1.11)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
ADR_BASE_LISTENER = D:\app\graceli
注意:如果服务器多网卡,两台服务期间用直连线直连,IP 地址 192.168.1.11 改
为对应的计算机名。
Tnsnames.ora
# tnsnames.ora Network Configuration File:
D:\app\graceli\product\11.2.0\dbhome_1\tnsnames.ora
# Generated by Oracle configuration tools.PRIMARY =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.108)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
STANDBY =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.110)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
ORACLR_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
(CONNECT_DATA =
(SID = CLRExtProc)
(PRESENTATION = RO)
)
)ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.236)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
注意:如果服务器多网卡,两台服务期间用直连线直连,IP 地址 192.168.1.11 改
为直连的 IP。
红色字体为添加的部分。
测试监听,重启监听,用网络名连接测试监听是否正常。
Cmd 命令下
Lsnrctl stop
Lsnrctl start
重启数据库 sqlplus 登陆下
Shutdown immediate
Startup
测试监听 cmd 命令下
Tnsping primary
Sqlplus sys/[email protected] as sysdba (123 为 sys 密码)
如果不能连接,检查防火墙。
主机配置完成。
Ø 文件拷贝与目录建立
在备库建立与主库一致 的文件夹
将主库 D:\App\Administrator 目录下的 admin、cfgtoollogs、diag ,oradata目录及
E:\OracleDB\ 下的 flash 目录以及密码文件拷贝到备库相同的路径下。
建立一个与主库位置一样的 standby redo 文件所在的文件夹(也就是
E:\OracleDB\Orcl\),否则数据拷贝的时候没有文件夹拷贝不过去,这部分文件
用系统拷贝,不需要人工拷贝。
将主库的 listener.ora 和 tnsnames.ora 拷贝到备库相同的路径下。修改 listener.ora (G:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN 目录中)
中的 IP 为备库的 IP
Ø 在备库新建实例(如备库实例跟随数据库安装,跳过这步)
在备库上注册 oracle 实例到服务中,cmd命令如下:
Oradim -new -sid orcl (orcl 为实例名)
Ø 在备库上启动监听
Lsnrctl start
Ø 备库参数文件修改与启动备库
拷贝主库创建的 pfile 参数文件 INITorcl.ora 拷贝到备库的 d:\app 目录下,做
以下修改。
*.db_file_name_convert='primary','standby'
*.db_unique_name='standby'
*.fal_client='standby'
*.fal_server='primary'
*.log_archive_dest_1='location=E:\OracleDB\flash\Orcl\ARCHIVELOG VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=standby'
*.log_archive_dest_2='SERVICE=primary LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLES) DB_UNIQUE_NAME=primary'
用参数文件启动备库
Startup nomount pfile='D:\app\INITorcl.ora'
在备库需要创建flash_recovery_area文件夹
Ø 用 RMAN 建立备份
在主库 startup
Cmd 下> rman target sys/oracle (oracle 为 sys 用户的密码)
需要在目录下新建tmp文件夹
RMAN>backup full database format='E:\OracleDB\tmp\FOR_STANDBY_%u%p%s.RMN' include current controlfile for standby;
将当前 archivelog 归档
RMAN>sql 'alter system archive log current';
将 Rman 的备份集拷贝到 standby 库相同的路径。
Ø 复制数据库
在主库
RMAN>connect auxiliary sys/oracle@standby (其中 oracle为备库 sys 的密码)
RMAN>duplicate target database for standby nofilenamecheck;
Alter database mount standby database; (可以省略,rman复制的时候已经将备库设置为mount状态了)Ø 备库启动 Standby
Alter database recover managed standby database disconnect from session(开启实时同步?);
至此 DG 搭建完成。
备库除了shutdown状态之外,都可以同步数据
Alter system switch logfile;切换到归档日志,修改数据之后手动修改
4.验证是否搭建成功
4.1主、备库执行查询命令
状态查询命令:Select name,sequence#,applied,completion_time from v$archived_log order by completion_time desc,sequence# desc;
select sequence#,appliedfrom v$archived_logorder by sequence#asc;
两边sequence#序号一致,说明已经同步
下面在主库切换活动日志,然后查询日志同步情况
Alter system switch logfile;(通过此命令将redo日志切换到归档日志,过一会辅助数据库同步数据,通过状态查询命令查看?)
Select switchover_status from v$database;
TO STANDBY 表示可以切换,如果是其它的需要根据情况处理后再切
换。
(2)在主库将 primary 切换到 physical standby
主库执行以下命令
Alter database commit to switchover to physical standby with session shutdown;
Shutdown immediate
Startup nomount
Alter database mount standby database;
Alter database recover managed standby database disconnect from session;
(3)在备库,switchover 到 primary:
Alter database commit to switchover to primary;
Shutdown immediate
Startup
Alter system switch logfile;
在新主库和新备库执行如下命令:
Select name,sequence#,applied,completion_time from
v$archived_log order by completion_time desc,sequence# desc;
在新主库执行:alter system switch logfile;
两边 sequence#一致,说明已经同步,dataguard 切换成功
可以将备库打开通过软件连接,在主库修改数据,查看备库数据是否同步判断是否切换成功
6.相关错误解决和说明:
ORA-12505: TNS: 监听程序当前无法识别连接描述符中所给出的 SID (DBD ERROR: OCIServerAttach)
相关报错文档说明:https://www.cnblogs.com/wjshan0808/archive/2013/04/13/3017627.html
7.相关名称说明:
搭建DG时,突然想起oracle这些为数众多的name,以下是概念整理,仅代表个人观点
DB_NAME:
①是数据库名,长度不能超过8个字符,记录在datafile、redolog和control file中
②在DataGuard环境中DB_NAME相同而DB_UNIQUE_NAME不同
③在RAC环境中,各个节点的DB_NAME 都相同,但是INSTANCE_NAME不同
④DB_NAME还在动态注册监听的时候起作用,无论是否定义了SERVICE_NAME,PMON进程都会使用DB_NAME动态注册监听
DBID:
①DBID可以看做是DB_NAME在数据库内部的表示,它是在数据库创建的时候用DB_NAME结合算法计算出来的
②它存在于datafile和control file中,用来表示数据文件的归属,所以DBID是唯一的,对于不同的数据库,DB_NAME可以是相同的,但是DBID一定是唯一的,例如在DataGuard中,主备库的DB_NAME相同,但是DBID一定不同(看过一个很形象的例子,就是可以有同名的人,但是身份证号码一定不同)
DB_UNIQUE_NAME:
①在DataGuard中,主备库拥有相同的DB_NAME,为了区别,就必须有不同的DB_UNIQUE_NAME
②DB_UNIQUE_NAME在DG中会影响动态注册的SERVICE_NAME,即如果采用的是动态注册,则注册的SERVICE_NAME为DB_UNIQUE_NAME,但是实例还是INSTANCE_NAME,即SID
INSTANCE_NAME:
①数据库实例的名称,INSTANCE_NAME默认值是SID,一般情况下和数据库名称(DB_NAME)相同,也可不同
②initSID.ora 和orapwSID 文件要与INSTANCE_NAME保持一致
③INSTANCE_NAME会影响进程的名称
SID:
①是操作系统中的环境变量,和ORACLE_HOME,ORACLE_BASE用法相同
②在操作系统中要想得到实例名,就必须使用ORACLE_SID。且ORACLE_SID必须与INSTANCE_NAME的值一致
SERVICE_NAME:
①数据库和客户端相连是使用的服务名
②在DataGuard中,如果采用动态注册,建议在主备库使用相同的service_names
③在DataGuard中,如果采用静态注册,建议在主备库上的listener中输入相同的服务名(service_name)
④如果采监听采用了静态注册,那么SERVICE_NAME就等于Listener.ora 文件中的GLOBAL_DATABASE_NAME的值
GLOBAL_DATABASE_NAME:
①GLOBAL_DATABASE_NAME 是listener配置的对外网络连接名称,可以是任意值
②在客户端配置监听的tnsnames.ora 文件中的service_name 与这个GLOBAL_DBNAME 保持一致就可以了
③配置静态监听注册时,需要输入SID和GLOBAL_NAME
8.相关概念说明:
主备切换:这一般是数据库的安全策略,对于一些安全性要求比较高的系统,数据库通常是由主服务器和备份服务器组成,主备同时运行,主服务器有数据改动后,立刻会同步到备份服务器。所以在日常运维工作中,为了防患于未然,经常会进行主备切换,就是把生产对接的服务器从主数据库切换到备份库上,使用备份库运行一段时间,看看备份库运行是否正常,数据是否正确等。
参考文档:http://www.docin.com/p-453570668.html