DG搭建之windos上搭建物理standby
注:以下全部sql如果执行有误,请注意分号(;),转发文档请注明作者和出处。
一、DG环境
1、系统:primary和standby都是windows64 操作系统(如果有读者用的是linux操作系统,以下操作亦可用,只是后面需要建立一些文件夹);
2、oracle版本:11.2.0.1.0,64bit
3、primary参数:(1)db_name:primary (2)db_unique_name:primary(3)sid:primary(4)由于没有db_domain,所以instance_name,service_name和global_dbname都为primary;
4、standby参数:(1)db_name:primary (2)db_unique_name:standby (3)sid:standby(4)由于没有db_domain,所以instance_name,service_name和global_dbname都为 primary;
5、主库IP:192.169.105.67 从库IP:192.169.99.105
6、需要注意的地方:
(1)primary和standby数据库的db_name一定要一样,有很多人认为, 既然是要做dg,那么,我两个库自己建立自己的,到时候只要实时传输数据即可,其实不然, dg的建立主从库db_name必须一样;
(2)primary和standby数据库的db_unique_name一定要不一样,因为区别primary和standby就是根据db_unique_name这个参数,这个参数配置只能通过建好库之后重新修改参数文件,想要在建库的时候直接填写是不能的;
(3)保证primary和standby库sys密码相同,最好在建库的时候,设置密码的时候都用一个密码;
(4)建议主从库数据库的安装路径,数据文件位置,文件夹位置保持一致,后面就会好设置,当然不一样也可以,可以在后面的参数设置中将替换的路径设置好。
二、正式搭建DG
1、配置主从库listener(监听)和tnsnames(网络服务名)
(1)主库的listener配置,以下为配置文本:
注意:请注意我标红的配置,对于DG来说,一定要配置静态监听,在这里,考虑到某些读者可能不太理解静态监听和动态监听的区别,不过没关系,你只要知道
SID_LIST_LISTENER是静态监听,LISTENER是动态监听就可以了,按照我的配置即可;当然,我可以顺便说一下为什么要配置静态监听,因为在后面所有的东西配置完以后,需要将主库某些文件拷贝到从库中,我要用到rman,从库处于nomount状态,在nomount状态下,直接rman target会报一个错,这个错的意思是识别不了服务,但是只有我库处于mount后,pmon动态注册服务之后才不会报这个错,但是我的从库又不允许mount,这是矛盾的,故需要静态注册服务,到时候从库处于nomount就可以进行rman了。
(2)从库的listener配置,以下为配置文本:
(3)主库tnsnames配置
(4)从库tnsnames配置,直接将主库的tnsnames复制过去即可;
(5)tnsping一下,看看主从库是否可以通信,在主库和从库tnsping都可以,这里我在主库tnsping从库:如图:
看到OK就证明是可以通信的。
2、主库独有的配置
(1)主库必须处于归档状态
1、查看主库是否归档
SQL>archive log list;
如果主数据库未处于归档模式,可通过如下命令将数据库置于归档模式:
SQL>shutdown immediate;
SQL>startup mount;
SQL>alter database archivelog;
SQL>alter database open;
(2)查看并设置强制归档
SQL>alter database force logging;
查看一下是否已经强制归档:SQL>select force_logging from v$database;如果显示YES则证明设置强制归档成功。
(3)添加主库standby联机日志,在这里我添加了3组
SQL>alter database add standby logfile group 4 'D:\app\Administrator\oradata\primary\redo04.log' size 50m;
SQL>alter database add standby logfile group 5 'D:\app\Administrator\oradata\primary\redo05.log' size 50m;
SQL>alter database add standby logfile group 6 'D:\app\Administrator\oradata\primary\redo06.log' size 50m;
(4)需要注意的是,同一个DG配置中所有数据库必须都拥有独立的密钥文件,并且必须保证同一个DG配置中。所有数据库服务器的sys用户拥有相同密码,以保证redo数据的顺利传输。因为redo传输服务是通过认证的网络会话来传输redo数据,而会话使用包含在密钥文件中的sys用户密码来认证。
3、主从库的参数配置
(1)主库参数配置,主要配置以下几点
1、SQL>create pfile='d:/pfile.ora' from spfile;
2、 生成文本之后,增加或者修改以下参数;
*.db_unique_name='primary' --*.db_unique_name='主库唯一名'
*.log_archive_config='dg_config=(primary,standby)' --*.log_archive_config='dg_config=(主库唯一名,从库唯一名)
*.log_archive_dest_1='location=D:\app\Administrator\flash_recovery_area\primary\ARCHIVELOG VALID_FOR=(ONLINE_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=primary' --*.log_archive_dest_1='location=本地归档路径 VALID_FOR=(ONLINE_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=主库唯一名',也就是说,不管是主库还是从库,都把online放到本地归档路径里面去
*.log_archive_dest_2='service=standby_dg valid_for=(online_logfiles,primary_role) db_unique_name=standby' --*.log_archive_dest_2='service=从库的tnsnames valid_for=(online_logfiles,primary_role) db_unique_name=从库唯一名',当角色是主库的时候,将通过从库的tnsnames发送online_redolog
*.log_archive_dest_state_1=enable --是否允许redo传输服务传输redo数据到指定的路径,在这里我设置的enable,该参数共拥有4个属性值,功能各不相同,读者可自行查看官方文档
*.log_archive_dest_state_2=enable
*.standby_file_management='auto' --如果primary数据库数据文件发生修改(如新建、重命名等)则按照本参数的设置在standby数据库中作相应修改。设为auto表示自动管理,设为manual表示需要手工管理
3、 参数设置好之后,用此静态参数文件替换动态参数文件;
(1)SQL>shutdown immediate;
(2)关掉数据库之后,手动删除掉动态参数文件,我的主库动态参数文件位置为:D:\app\Administrator\product\11.2.0\dbhome_1\database\SPFILEPRIMARY.ORA,删除之后,重建动态参数文件;
(3)SQL>create spfile='D:\app\Administrator\product\11.2.0\dbhome_1\database\SPFILEPRIMARY.ORA' from pfile='d:\pfile.ora';
(4)SQL>startup;
(2)从库参数配置,请注意配置以下几点
1、SQL>create pfile='d:/pfile.ora' from spfile;
2、 生成文本之后,增加或者修改以下参数;
*.db_unique_name='standby'
*.log_archive_config='dg_config=(primary,standby)'
*.log_archive_dest_1='location=D:\app\Administrator\flash_recovery_area\primary\ARCHIVELOG valid_for=(all_logfiles,all_roles) db_unique_name=standby'--这个意思在上面解释主库参数的时候已经解释过了,不过要特别注意的一点是,因为从库没有开启归档,所以是不存在ARCHIVELOG 这个文件夹的,所以必须在这个路径下手工将这个文件夹建好,不然会报错。
*.log_archive_dest_state_1='enable'
*.log_file_name_convert='D:\app\Administrator\oradata\primary','D:\app\Administrator\oradata\primary'--*.log_file_name_convert='主库中日志文件的路径','从库中日志文件的路径'
*.db_file_name_convert='D:\ORADATA','D:\ORADATA'--*.db_file_name_convert='主库中数据文件的路径','从库中数据文件的路径'
*.standby_file_management='auto'
3、 参数设置好之后,用此静态参数文件替换动态参数文件;
(1)SQL>shutdown immediate;
(2)关掉数据库之后,手动删除掉动态参数文件,我的从库动态参数文件位置为:D:\app\Administrator\product\11.2.0\dbhome_1\database\SPFILESTANDBY.ORA,删除之后,重建动态参数文件;
(3)SQL>create spfile='D:\app\Administrator\product\11.2.0\dbhome_1\database\SPFILESTANDBY.ORA' from pfile='d:\pfile.ora';
(4)SQL>alter database nomount;
(5)接下来另外开一个命令窗口,在操作系统界面下进行rman。
三、rman duplicate 复制数据库,主要是复制主库相关数据到从库,这一步是在从库上操作的
(1)rman target sys/sys@primary_dg auxiliary sys/sys@standby_dg nocatalog
(2)rman> duplicate target database for standby from active database nofilenamecheck; --如果从库的数据库的位置和主库的位置一样的话就要添加nofilenamecheck文件名不检查
(3)接下来就静静的等待复制成功。
注意:一、第一步会经常出错,报无法识别服务的错误,解决办法是配置静态监听; 二:第二步也会经常出错,报从库控制文件里面的数据库名错误,解决办法是,将主从数据库的DB_NAME改为一样的。
四、调试数据库
值得一提的是,这个时候从库已经处于mount 状态了,同时从库的归档已经自动打开。
以下操作均在在从库上操作。
(1)SQL>alter database open;
(2)SQL>select process,client_process,sequence#,status from v$managed_standby ;--查看从库后台进程
(3)此时后台进程显示如下:
(4)SQL>alter database recover managed standby database disconnect from session;--启动MRP服务
(5)再次检查以下后台进程看看
SQL>select process,client_process,sequence#,status from v$managed_standby ;
(6)此时后台进程显示如下:
出现MRP0这个进程,证明开启MRP服务成功。
五、在主库修改数据看是否可以传输到从库
(1)以某个用户身份登录主库,新建立一个表dg_test
SQL>create table dg_test(id varchar2(20),name varchar2(20));
(2)插入测试数据
SQL>insert into dg_test values ('1','张三');
SQL>insert into dg_test values ('2','李四');
SQL>commit;
(3)SQL>alter system switch logfile; --主库写盘才会触发MRP进程
(4)在从库上同样以这个用户的身份登录,查看下这个表
如图可见,数据已经同步成功。