oracle 11g ADG实施手册(亲测,已成功部署多次)
一:实验环境介绍
1、虚拟机系统: Centos 6.8(64位)
2、数据库版本: Oracle 11g R2 11.2.0.3 (64位)
3、IP地址规划:
(1)主数据库:
IP:172.18.1.207
SID:pri(主备机可以相同,可以不相同,一般为instance_name)
db_name:orcl(这个是唯一的,且主备需要一致)即为global database name
db_unique_name:pri(建议主备机不相同,可以更改)
(2)备份数据库:
IP:172.18.1.208
SID:std(主备机可以相同,可以不相同,一般为instance_name)
db_name:orcl(这个是唯一的,且主备需要一致)即为Global Database name
db_unique_name:std(建议主备机不相同,可以更改)
已建好的服务器上述三个参数可以通过SQL>show parameter name找到。
如果db_unique_name是一样的,修改即可
方法一:通过alter system set DB_UNIQUE_NAME='XXX' scope=spfile; 重启生效。可能会出现报错:ORA-02065: illegal option for ALTER SYSTEM,使用方法二即可。
方法二:如
SQL> create pfile='/oracle/p1.ora' from spfile; SQL> shutdown immediate; vim /oracle/p1.ora *.db_unique_name=orcl_m1 SQL>create spfile from pfile='/oracle/p1.ora'; SQL> startup; SQL> show parameter name;--查看即可
4、安装完成后可以通过以下命令查询:
(1)select dbid,name,open_mode,db_unique_name from v$database;
(2)select instance_name from v$instance;
172.18.1.207“
172.18.1.208
5、ORACLE 11g ADG新特性
关于Active database duplication方式:(必看)
在Oracle 10g下,我们可以使用RMAN duplicate 命令创建一个具有不同DBID 的复制库。 到了Oracle 11gR2, RMAN 的duplicate 有2种方法实现:
1. Active database duplication (本文所使用的方式,适用于11gR2之后的版本)
2. Backup-based duplication (传统方式,10g,11g通用)
Active database duplication 通过网络,直接copy target 库到auxiliary 库,然后创建复制库。这种方法就不需要先用RMAN 备份数据库,然后将备份文件发送到auxiliary端。
这个功能的作用是非常大的。 尤其是对T级别的库。 因为对这样的库进行备份,然后将备份集发送到备库,在进行duplicate 的代价是非常大的。 一备份要占用时间,二要占用备份空间,三在网络传送的时候,还需要占用带宽和时间。所以Active database duplicate 很好的解决了以上的问题。 它对大库的迁移非常有用。
如果是从RAC duplicate 到单实例,操作是一样的。 如果是从单实例duplicate 到RAC。 那么先duplicate 到 单实例。 然后将单实例转换成RAC。
二、安装数据库软件前的系统配置(主库和备库端都要做下列操作)
1.基本配置:
最好使用新装的系统(这里以centos 6.8为例),系统要求最低配置1G内存,2Gswap分区,根分区20G以上,装好系统后先配置好yum,IP地址,/etc/sysconfig/network文件中的主机名,以及/etc/hosts文件中的IP地址和主机名的对应关系。
主库IP:172.18.1.207
主库主机名:PRI_ADG
备库IP:172.18.1.208
备库主机名:STD_ADG
2、安装数据库(主机和备机都安装相同的数据库版本,且目录名一致)
######开始搭建Dataguard#######
三、主库
1:将数据库改为强制日志模式(此步骤只在主库上做)
[oracle@pri ~]$ sqlplus / as sysdba
查看当前是否强制日志模式:SYS@pri> select name,log_mode,force_logging from v$database;
修改为日志模式:SYS@pri> alter database force logging;
再次查看是否强制模式:SYS@pri> select name,log_mode,force_logging from v$database;
2:创建密码文件 (此步骤只在主库上做,修改sys密码)
注意:两端分别创建自己的密码文件好像有问题,备库的密码文件需要跟主库一致,否则导致日志传输不到备库,有待验证。
将主库的密码文件直接copy到备库,重命名后使用。
[oracle@pri ~]$ cd $ORACLE_HOME/dbs
[oracle@pri dbs]$ orapwd file=orapwpri password=oracle force=y
这条命令可以手动生成密码文件,force=y的意思是强制覆盖当前已有的密码文件(如果有可以不建立)
将主库的密码文件copy给备库(从orapwpri到orapwstd),并重命名
[oracle@pri dbs]$ scp orapwpri 172.18.1.208:$ORACLE_HOME/dbs/orapwstd
3:创建standby redolog日志组(此步骤只在主库上做)
原则:
(1):standby redolog的文件大小(默认50M)与primary 数据库redolog 文件大小(默认50M)相同
(2):standby redolog日志文件组的个数(默认3个)依照下面的原则进行计算:
Standby redo log组数公式>=(每个instance日志组个数+1)*instance实例个数
假如只有一个实例节点,这个节点有三组redolog,所以Standby redo log组数>=(3+1)*1 =4,所以至少需要创建4组Standby redo log
查看当前线程与日志组的对应关系及日志组的大小:
SYS@pri> select thread#,group#,bytes/1024/1024 from v$log;
如上,我现在的环境有三组redolog,每个日志组的大小都是50M,
所以Standby redo log组数>=(3+1)*1== 4
所以至少需要创建4组Standby redo log,大小均为50M
(thread:线程,只有在多实例数据库才有用的参数,例如RAC环境,单实例不考虑)
查看当前有哪些日志组及其成员:
SYS@pri> col member for a50
SYS@pri> select group#,member from v$logfile;
先在主机端(PRI_ADG),手动创建standby log日志组所需的目录:(创建新目录只是为了便于区分,并非必须)
[oracle@PRI_ADG dbs]$ cd /home/oracle/app/oracle/oradata/
[oracle@PRI_ADG oradata]$ mikdir standbylog
新建4个日志组作为standby redolog日志组,大小与原来的日志组一致:
由于已经存在group1-3,,所以group号只能从4开始:
alter database add standby logfile group 4 '/home/oracle/app/oracle/oradata/standbylog/std_redo04.log' size 50m; alter database add standby logfile group 5 '/home/oracle/app/oracle/oradata/standbylog/std_redo05.log' size 50m; alter database add standby logfile group 6 '/home/oracle/app/oracle/oradata/standbylog/std_redo06.log' size 50m; alter database add standby logfile group 7 '/home/oracle/app/oracle/oradata/standbylog/std_redo07.log' size 50m;
查看standby 日志组的信息:
SYS@pri> select group#,sequence#,status, bytes/1024/1024 from v$standby_log;
查看当前有哪些日志组及其成员:
SYS@pri> set pagesize 100 SYS@pri> col member for a60 SYS@pri> select group#,member from v$logfile order by group#;
4:修改主库的spfile参数文件(此步骤只在主库上做)
(1)查看spfile的路径:
SYS@pri> show parameter spfile;
(2)用spfile创建一个pfile,用于修改:
SYS@pri> create pfile from spfile;
(3)修改主库的pfile:/home/oracle/app/oracle/product/11.2.0/db_1/dbs/initpri.ora
以下内容是需要新增加的:
*.db_unique_name='pri' #DG主库和备库的db_name必须一致,db_unique_name不一致 *.log_archive_config='dg_config=(pri,std)' #pri主数据库SID,std备份数据库SID *.log_archive_dest_1='location=/home/oracle/app/oracle/arch valid_for=(all_logfiles,all_roles) db_unique_name=pri' #主数据库的归档日志路径和SID *.log_archive_dest_2='service=std LGWR ASYNC valid_for=(online_logfiles,primary_role) db_unique_name=std' #备份数据库的SID (1)用于备库切换主库时使用 *.log_archive_dest_state_1=enable *.log_archive_dest_state_2=enable *.log_archive_max_processes=4 *.fal_client='pri' #主数据库的SID----解决归档丢失的问题(2)用于备库切换主库时使用 *.fal_server='std'# 备份数据库的SID,----解决归档丢失的问题(3)用于备库切换主库时使用 *.db_file_name_convert='/home/oracle/app/oracle/oradata/std','/home/oracle/app/oracle/oradata/pri' #备库信息在前,主库信息在后,第一个目录是备份数据库数据文件路径(备份服务器上有此目录),第二个是主数据库数据文件路径 *.log_file_name_convert='/home/oracle/app/oracle/oradata/std','/home/oracle/app/oracle/oradata/pri' #第一个目录是备份数据库数据文件路径(备份服务器上有此目录),第二个是主数据库数据文件路径 *.standby_file_management='auto'
修改完毕,保存退出
手工创建/home/oracle/app/oracle/arch:
[oracle@pri dbs]$ mkdir –p /home/oracle/app/oracle/arch
172.18.1.207(主库)
172.18.1.208(备库)
5:用修改过的pfile重新创建一个spfile,用于重启数据库 (此步骤只在主库上做)
(1)关闭数据库:
SQL> shutdown immediate;
(2)在关闭数据库状态下,用修改过的pfile重新创建一个spfile:
SQL> create spfile from pfile; #此时把数据库改为归档模式:(如果当初建库时选择了启用归档,则此步骤忽略),由于当前数据库已关闭,首先需要把数据库启动到mount状态 SQL> startup mount; SQL> alter database archivelog; 启用归档模式 SQL> alter database open; OPEN数据库 SQL> archive log list; 查看是否启用归档模式 SQL> archive log list;
如上,归档路径已经改为/home/oracle/app/oracle/arch,证明对pfile的修改已生效
(3)查看当前数据库是否使用spfile启动:
SQL> show parameter spfile;
如上,若能看到spfile的路径,则证明数据库是使用spfile启动的,若没有值,则说明是用pfile启动的。
(4)确认数据库已经启用归档模式和强制日志模式:
SYS> select name,log_mode,force_logging from v$database;
6:修改监听文件,添加静态监听 (主库、备库都要做)
[oracle@pri ~]$ cd $ORACLE_HOME/network/admin
[oracle@pri admin]$ vim listener.ora 添加的内容如下红色字体部分:【注;listtener.ora中的GLOBAL_DBNAME 配置,代表静态注册,就是监听lsnrctl status中的Service "orcl"等,也就是址tnsnames.ora中需要配置的SERVICE_NAME,用于外部连接】
# listener.ora Network Configuration File: /home/oracle/app/oracle/product/11.2.0/db_1/network/admin/listener.ora # Generated by Oracle configuration tools. LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.18.1.207)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) ) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = pri) (ORACLE_HOME = /home/oracle/app/oracle/product/11.2.0/db_1) (SID_NAME = pri) ) ) ADR_BASE_LISTENER = /home/oracle/app/oracle
7:编辑网络服务名配置文件tnsnames.ora
[oracle@PRI_ADG admin]$ vim /home/oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/tnsnames.ora # tnsnames.ora Network Configuration File: /home/oracle/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora # Generated by Oracle configuration tools. pri = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.18.1.207)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = pri) ) ) std = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.18.1.208)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = std) ) )
保证主库和备库的tnsnames.ora文件中的内容完全相同,也可以把修改后的文件直接传给备库。
[oracle@ora11g admin]$ scp tnsnames.ora 172.18.1.208:$ORACLE_HOME/network/admin
tnsnames.ora 100% 925 0.9KB/s 00:00
配置完后,确保在任意一端上都能tnsping通对方:
[oracle@PRI_ADG admin]$ tnsping std
[oracle@STD_ADG admin]$ tnsping pri
四、备库
1、在备库端,修改pfile参数文件 (只在备库端做)
首先,在主库端把pfile拷贝给备库端的$ORACLE_HOME/dbs目录下,并重命名:
[oracle@PRI_ADG admin]$ scp $ORACLE_HOME/dbs/initpri.ora 172.18.1.208:$ORACLE_HOME/dbs/initstd.ora
然后在备库端进行修改:
[oracle@STD_ADG dbs]$ vim /home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/initstd.ora
以下为ADG增加的内容 *.db_unique_name='std' *.log_archive_config='dg_config=(std,pri)' *.log_archive_dest_1='location=/home/oracle/app/oracle/arch valid_for=(all_logfiles,all_roles) db_unique_name=std' *.log_archive_dest_2='service=pri LGWR ASYNC valid_for=(online_logfiles,primary_role) db_unique_name=pri' #(1)用于备库切换主库时使用 *.log_archive_dest_state_1=enable *.log_archive_dest_state_2=enable *.log_archive_max_processes=4 *.fal_client='std' #(3)用于备库切换主库时使用#自己作为备机时填的信息,此处client端填自己的tnsnames的名称; *.fal_server='pri' #(2)用于备库切换主库时使用#自己作为备机时填的信息,此处server端填对方的tnsnames的名称; *.db_file_name_convert='/home/oracle/app/oracle/oradata/pri','/home/oracle/app/oracle/oradata/std' *.log_file_name_convert='/home/oracle/app/oracle/oradata/pri','/home/oracle/app/oracle/oradata/std' *.standby_file_management='auto' 注意:整个搭建过程最需要留意的就是主库和备库的PFILE配置,建议修改完后仔细对照主备库PFILE的区别
2、在备库端手工创建所需的目录 (备库端做,不提前创建的话恢复时会报错!)
mkdir -pv /home/oracle/app/oracle/admin/std/adump mkdir -pv /home/oracle/app/oracle/diag/rdbms/std/std/trace mkdir -pv /home/oracle/app/oracle/arch mkdir -pv /home/oracle/app/oracle/oradata/std mkdir -pv /home/oracle/app/oracle/oradata/standbylog mkdir -pv /home/oracle/app/oracle/flash_recovery_area
3、用修改后的pfile创建一个spfile,用于启动数据库 (备库端做)
(1)确保数据库为关闭状态:SQL> shutdown immediate
[oracle@STD_ADG dbs]$ sqlplus / as sysdba
(2) SYS > create spfile from pfile;
File created.
(3)将数据库启动到nomount状态:
SYS > startup nomount;
4、监听修改
[oracle@pri ~]$ cd $ORACLE_HOME/network/admin
[oracle@pri admin]$ vim listener.ora 添加的内容如下红色字体部分:
# listener.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora # Generated by Oracle configuration tools. LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.11.121)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) ) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = std) (ORACLE_HOME = /home/oracle/app/oracle/product/11.2.0/dbhome_1) (SID_NAME = std) ) ) ADR_BASE_LISTENER = /home/oracle/app/oracle
5、编辑网络服务名配置文件tnsnames.ora
[oracle@PRI_ADG admin]$ vim /home/oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/tnsnames.ora # tnsnames.ora Network Configuration File: /home/oracle/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora # Generated by Oracle configuration tools. pri = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.18.1.207)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = pri) ) ) std = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.18.1.208)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = std) ) )
五、备库恢复
1、利用RMAN在备库上恢复主库 (备库端做)
[oracle@std ~]$ rman target sys/oracle@pri auxiliary sys/oracle@std
原库:sys/oracle@pri
备库:sys/oracle@std
RMAN> duplicate target database for standby from active database --【nofilenamecheck 这个参数先不用加】;
这条命令可以直接恢复数据文件,standby控制文件,standby日志组,非常霸道,查看如下日志:
上述备库数据同步完成,下面进行登录检查测试
2、尝试开启备库
登陆并查看数据库当前状态:
[oracle@std ~]$ sqlplus / as sysdba SYS@std> startup SYS@std> select status from v$instance; STATUS ------------ MOUNTED (RMAN恢复完直接就是mount状态)
3、检查测试:
(1)、检查Dataguard 状态
select database_role,protection_mode,protection_level,open_mode from v$database;
(2)、启动dataguard数据库同步(备库执行),开启后,数据开始从主库同步至备库[最好手动执行一下SQL> alter system switch logfile;手动归档,数据会立即传输到备库]
SQL> alter database recover managed standby database disconnect from session;
(3)、关闭datagurade数据同步(备库执行),关闭后,数据不再同步至备库(如果关闭了数据同步功能,即使archivelog从主库同步过来,也不会像备库表中写入数据)。
SQL>alter database recover managed standby database cancel;
(4)、主备库检查dataguard 状态【查看archivelog序列号是否一致,下面两种都可以查看】:
SQL>select unique thread#,max(sequence#) over(partition by thread#)last from v$archived_log; SQL>archive log list;
(5)、检查dataguard日志:
主库日志:tail -100f /home/oracle/app/oracle/diag/rdbms/pri/pri/trace/alert_std.log
备库日志:tail -100f /home/oracle/app/oracle/diag/rdbms/std/std/trace/alert_std.log
或使用命令:SQL>select * from v$dataguard_status;
6、查看日志应用情况:
SYS@std> set pagesize 100 SYS@std> select sequence#,applied from v$archived_log order by 1;
如上,如果发现有个NO的,也是正常的,说明该日志在主库上还没有归档,可以在主库上运行alter system switch logfile;命令来进行日志切换,再到备库查看日志应用情况
至此,DataGuard的搭建成功!
注:ADG——物理standby database的日常维护
另:ADG的工作原理(ADG备机可以工作在mounted状态下,也可以运行在read-only 状态下;而DG的备机只能运行在mounted状态下)
##########################################################################################################################################################################################################################################################################################################################################################################################################################################
7、检查命令-备库
(1)查看standby启动的DG进程
SQL> select process,client_process,sequence#,status from v$managed_standby;
SQL> select process,client_process,sequence#,status from v$managed_standby;
PROCESS CLIENT_P SEQUENCE# STATUS --------- -------- ---------- ------------ ARCH ARCH 92 CLOSING ARCH ARCH 93 CLOSING ARCH ARCH 0 CONNECTED //归档进程 ARCH ARCH 95 CLOSING RFS ARCH 0 IDLE RFS LGWR 96 IDLE //归档传输进程 RFS UNKNOWN 0 IDLE RFS UNKNOWN 0 IDLE MRP0 N/A 96 WAIT_FOR_LOG //日志应用进程 9 rows selected.
(2)查看数据库的保护模式(主库+备库):
#主库:
SQL> select database_role,protection_mode,protection_level,open_mode from v$database;
#standby 备库端查看,也是一样的。
SQL> select database_role,protection_mode,protection_level,open_mode from v$database;
(3)查看DG的日志信息
SQL> select * from v$dataguard_status;
8、Open Read Only standby数据库并且开启实时日志应用(备库)
(1)关闭并完全打开
(2) SQL> select database_role,protection_mode,protection_level,open_mode from v$database;
只读模式
(3) SQL> select process,client_process,sequence#,status from v$managed_standby;
SQL> recover managed standby database using current logfile disconnect from session;--使用using current logfile参数,可以实时同步主库的更新
SQL> select process,client_process,sequence#,status from v$managed_standby;
六:相关知识补充:
1:DataGuard的三种数据保护模式:
select database_role,protection_mode,protection_level,open_mode from v$database;通过此语句查看
(1)MAXIMIZE PROTECTION(最大保护模式):
最大数据保护与无数据分歧,LGWR将同时传送到备用节点,在主节点事务确认之前,备用节点也必须完全收到日志数据。如果网络不好,引起LGWR不能传送数据,将引起严重的性能问题,导致主节点DOWN机。
(2)MAXIMIZE AVAILABILITY(最大可用模式):
无数据丢失模式,允许数据分歧,允许异步传送。正常情况下运行在最大保护模式,在主节点与备用节点的网络断开或连接不正常时,自动切换到最大性能模式,主节点的操作还是可以继续的。在网络不好的情况下有较大的性能影响。
(3)MAXIMIZE PERFORMANCE(最大性能模式):
这种模式应当可以说是从8i继承过来的备用服务器模式,异步传送,无数据同步检查,可能丢失数据,但是能获得主节点的最大性能。
文章评论