CentOs6.5Oracle DataGuard搭建

来源:互联网 发布:网络交易管理办法 问题 编辑:程序博客网 时间:2024/06/08 14:24


参考文章: 手把手教你安装Data Guard 非常感谢此文作者,在我搭建DataGuard的过程中提供了很大帮助。

此文综合了一些其他参考资料与上述文章,供初学者参考。

前言

此文适合于初步学习dataguard的同仁,本人也是刚接触dataguard 在搭建过程中吃了不少苦头,所以特地总结出来,希望能帮助到大家。

1 配置信息

主库安装数据库,备库只装数据库软件

主库:

操作系统:CentOs6.5

数据库版本:Oracle 11g R2

DB_UNIQUE_NAME:JCZH

GLOBAL_NAME:JCZH

SERVICE_NAME:JCZH

ORACLE_SID:JCZH

主机名 bm-db3

IP:192.168.1.105

 

备库: (以下部分信息是以主库信息生成的,之前不存在

操作系统:CentOs6.5

数据库版本:Oracle 11g R2

DB_UNIQUE_NAME:JCZHSTANDBY

GLOBAL_NAME:JCZHSTANDBY

SERVICE_NAME:JCZHSTANDBY

ORACLE_SID:JCZH

主机名 bm-db2

IP:192.168.1.106


2修改Host文件

主库:

oracle@bm-db2 ~]$ cat /etc/hosts127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 bm-db3::1            localhost localhost.localdomain localhost6 localhost6.localdomain6 bm-db3192.168.1.105 bm-db3192.168.1.106 bm-db2

备库:

[oracle@bm-db2 ~]$ cat /etc/hosts127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 bm-db2::1            localhost localhost.localdomain localhost6 localhost6.localdomain6 bm-db2192.168.1.105 bm-db3192.168.1.106 bm-db2

3 确定开启监听文件(主库)

[oracle@bm-db3 ~]$ lsnrctl statusLSNRCTL for Linux: Version 11.2.0.4.0 - Production on 19-JUN-2017 12:13:20Copyright (c) 1991, 2013, Oracle.  All rights reserved.Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))STATUS of the LISTENER------------------------********************************Listener Parameter File   /oracle/product/11.2.4/db_1/network/admin/listener.oraListener Log File         /oracle/diag/tnslsnr/bm-db3/listener/alert/log.xmlListening Endpoints Summary...  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521)))Services Summary...Service "JCZH" has 2 instance(s).  Instance "JCZH", status UNKNOWN, has 1 handler(s) for this service...  Instance "JCZH", status READY, has 1 handler(s) for this service...Service "JCZHXDB" has 1 instance(s).  Instance "JCZH", status READY, has 1 handler(s) for this service...The command completed successfully

4 开启主库归档模式并修改监听,生成参数文件

4.1 开启主库归档模式

[oracle@bm-db3 ~]$ sqlplus "/as sysdba"查看:SQL> archive log list;Database log mode       Archive ModeAutomatic archival       Enabled………
若未开启 执行以下命令开启:

alter database archivelog;


更改主库为force loggingSQL> alter database force logging;Database altered.

4.2创建主库密码文件并修改监听(主库)

cd /$ORACLE_HOME/network/adminorapwd file=$ORACLE_HOME/dbs/orapwJCZH password=oracle entries=30;

修改监听文件,加入静态监听

[oracle@bm-db3 admin]$ cat listener.ora # listener.ora Network Configuration File: /oracle/product/11.2.4/db_1/network/admin/listener.ora# Generated by Oracle configuration tools.LISTENER =  (DESCRIPTION_LIST =    (DESCRIPTION =      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))    )  )SID_LIST_LISTENER =  (SID_LIST =    (SID_DESC =      (GLOBAL_DBNAME = JCZH)      (ORACLE_HOME = /mnt/disk1/oracle/product/11.2.4/db_1)      (SID_NAME = JCZH)    )  )ADR_BASE_LISTENER = /oracle
监听文件建议复制系统生成的格式进行修改 复制空格对不上也会导致不能正常启动

修改 tnsname文件

[oracle@bm-db3 admin]$ cat tnsnames.ora # tnsnames.ora Network Configuration File: /oracle/product/11.2.4/db_1/network/admin/tnsnames.ora# Generated by Oracle configuration tools.JCZH =  (DESCRIPTION =    (ADDRESS = (PROTOCOL = TCP)(HOST = bm-db3)(PORT = 1521))    (CONNECT_DATA =      (SERVER = DEDICATED)      (SERVICE_NAME = JCZH)    )  )JCZHSTANDBY =  (DESCRIPTION =    (ADDRESS = (PROTOCOL = TCP)(HOST = bm-db2)(PORT = 1521))    (CONNECT_DATA =      (SERVER = DEDICATED)      (SERVICE_NAME = JCZHSTANDBY)    )  )


4.3生成参数文件并修改

主库:进入sqlplus
sqlplus “/as sysdba”SQL->create pfile from spfile;cd  $ORACLE_HOME/dbs[oracle@bm-db3 dbs]$ cat initJCZH.ora ……..*.db_file_name_convert='/mnt/disk1/oracle/oradata/JCZH','/mnt/disk1/oracle/oradata/JCZH'*.db_name='JCZH'*.db_recovery_file_dest_size=10737418240*.db_unique_name='JCZH'*.fal_client='JCZH'*.fal_server='JCZHSTANDBY'*.log_archive_config='dg_config=(JCZH,JCZHSTANDBY)'*.log_archive_dest_1='LOCATION=/arch/JCZH LGWR VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=JCZH'*.log_archive_dest_2='service=JCZHSTANDBY LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=JCZHSTANDBY'*.log_archive_dest_state_1='enable'*.log_archive_dest_state_2='enable'*.log_archive_format='%t_%s_%r.arc'*.log_file_name_convert='/mnt/disk1/oracle/oradata/JCZH','/mnt/disk1/oracle/oradata/JCZH'*.standby_file_management='AUTO'修改文件中以上值 没有则添加,若有则保证路径信息等正确, db_recovery_file_dest_size 保证值不小于该值

注意:
1.log_archive_dest_2='SERVICE=STANDBY这个参数就是tnsnames的别名,就是这个文件开头的那个大写的名字。

log_archive_dest_1 为本地日志的存放信息

注意DB_UNIQUE_NAME的不同。

配置此参数的意义为开启远程归档日志的传输。
2: *.fal_server=JCZHSTANDBY
    *.fal_client=JCZH

这两个参数是各自的service_name。 主备库相反

3. db_file_name_convert log_file_name_convert分别是数据和日志存放地址,参数中第一个为备库的,第二个是主库的。注意。

修改完成后进入sqlplus 

执行create spfile from pfile;若出现提示数据库已打开则 shutdown immediatecreate spfile from pfile;startup

5.传输文件

注意!以下所有执行都要下防火墙关闭模式下进行

主备库都执行以下命令

service iptables stopchkconfig iptables offservice iptables status

主库:

传输主库的参数文件、密码文件以及tnsname文件到备库上:

cd  $ORACLE_HOME/dbsscp initJCZH.ora orapwJCZH bm-db2:$ORACLE_HOME/dbscd /$ORACLE_HOME/network/admin/scp tnsnames.ora bm-db2:$ORACLE_HOME/network/admin/


修改备库参数文件备库上操作

cd $ORACLE_HOME/dbs[oracle@bm-db2 dbs]$ cat initJCZH.ora *.audit_file_dest='/oracle/admin/JCZHSTANDBY/adump'*.control_files='/oracle/oradata/JCZH/control01.ctl','/oracle/fast_recovery_area/JCZH/control02.ctl'*.db_file_name_convert='/oracle/oradata/JCZH','/oracle/oradata/JCZH' #主备库相反 数据库文件存放地址*.db_name='JCZH'*.db_recovery_file_dest='/oracle/fast_recovery_area'*.db_recovery_file_dest_size=10737418240*.db_unique_name='JCZHSTANDBY' #修改 一定要与主库不同 作者没有配置过相同的*.diagnostic_dest='/oracle'*.dispatchers='(PROTOCOL=TCP) (SERVICE=JCZHXDB)'*.fal_client='JCZHSTANDBY' #修改与主库相反*.fal_server='JCZH' #同上*.log_archive_config='dg_config=(JCZHSTANDBY,JCZH)'*.log_archive_dest_1='LOCATION=/arch/JCZHSTANDBY LGWR VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=JCZHSTANDBY' 
#注意修改 为本地归档目录地址,录像在下文中创建*.log_archive_dest_2='service=JCZH LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=JCZH' #注意修改*.log_file_name_convert='/oracle/oradata/JCZH','/oracle/oradata/JCZH' #主备库相反 日志文件存放地址
将模板中的红色值修改为你自己的 注意 部分参数主备库是相反的。

6创建目录

在备库上创建相应的目录,因为备库开始没有创建数据库,有些目录是参数文件中没有的。

以下创建的目录一定要确定是Oracle用户 oinstall组的

在oracle用户下创建 如oracle用户没有权限则在root用户下创建

创建完成后执行

chown -R oracle:oinstall 对应目录

创建相关目录

mkdir -p  /mnt/disk1/oracle/admin/JCZH/adump/mkdir -p /oracle/fast_recovery_areamkdir -p /mnt/disk1/oracle/oradata/JCZHmkdir  /mnt/disk1/backupchown -R oracle:oinstall /mnt/disk1/backup /oracle/fast_recovery_areachmod 777 /mnt/disk1/backup /oracle/fast_recovery_areamkdir -p  /mnt/disk1/arch/JCZHchown -R oracle:oinstall /mnt/disk1/archchown -R oracle:oinstall  /mnt/disk1/arch/JCZHchmod 777  /mnt/disk1/arch/JCZH

主库上操作

在主库上用rman做一个全备,也需要创建备份的目录:

mkdir  /mnt/disk1/backupchown -R oracle:oinstall /mnt/disk1/backupchmod 777 /mnt/disk1 /backupmkdir -p  /mnt/disk1/arch/JCZHchown -R oracle:oinstall /mnt/disk1/arch chown -R oracle:oinstall  /mnt/disk1/arch/JCZHchmod 777  /mnt/disk1/arch/JCZH

主库上进行数据备份

rmanconnect target /backup device type disk format '/mnt/disk1/backup/%U' database plus archivelog;

退出rman,将主库的备份文件传输到备库

此处再此强调,一定要关闭防火墙,并且使创建的所有目录都在oracle用户下,且具有相应的权限

cd /mnt/disk1/backup/scp * bm-db2: /mnt/disk1/backup

备库上操作 启动oracle到nomount状态

su – oraclesqlplus / as sysdbastartup nomount;

修改备库的监听文件。

cd $ORACLE_HOME/networdk/admin[oracle@bm-db2 admin]$ cat listener.ora # listener.ora Network Configuration File: /oracle/product/11.2.4/db_1/network/admin/listener.ora# Generated by Oracle configuration tools.LISTENER =  (DESCRIPTION_LIST =    (DESCRIPTION =      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))    )  )SID_LIST_LISTENER =  (SID_LIST =    (SID_DESC =      (GLOBAL_DBNAME = JCZHSTANDBY)      (ORACLE_HOME = /oracle/product/11.2.4/db_1)      (SID_NAME = JCZH)    )  )ADR_BASE_LISTENER = /oracle

启动监听确保服务注册无误

 lsnrctl start 
若监听已启动,执行

lsnrctl reload;

此处配置完成后主备库都应进行连接测试

tnsping JCZHtnsping JCZHSTANDBY

显示Ok则配置完成,若有问题则检查防火墙与tns文件是否有误!

7应用备份文件

主库数据库启动到Mount状态

进入sqlplus 
shutdown immediate;startup mount;
主库应用备份文件到备库上,使用duplicate方式(在主库上执行)

Oralce用户下执行 rman指令

rman

connect target /

connect auxiliary sys/oracle@JCZHSTANDBY   

duplicate target database for standby;


如果主备库日志存放路径与数据库存放路径相同 standby后面加入 nofilenamecheck命令

duplicate target database for standby nofilenamecheck;

执行中 等待命令完成 


执行备库恢复模式。(在备库上执行

SQL> select instance_name,status from v$instance;INSTANCE_NAME    STATUS---------------- ------------JCZH MOUNTED

将主库切换为Open状态。

主库进入 sqlplus模式

alter database open;


备库上执行日志同步

SQL> alter database recover managed standbydatabase disconnect from session;Database altered.


查看日志同步情况,确保日志都应用了。

select name,sequence#,APPLIED from v$archived_log order by sequence#;

没有数据或日志出现No都有问题 检查文件权限以及防火墙问题,还不能解决

查看日志信息

没有数据或日志出现No都有问题 检查文件权限以及防火墙问题,还不能解决查看日志信息oracle@bm-db2 admin]$ cd $Oracle_Base/diag/rdbms/jczhstandby/JCZH/trace/[oracle@bm-db2 trace]$ tail -100f alert_JCZH.log

创建standby logfile。主库和备库都要添加。

主库:SQL> ALTER DATABASE ADD STANDBY LOGFILE '/mnt/disk1/oracle/oradata/JCZH/sredo01.log' size 512M; SQL> ALTER DATABASE ADD STANDBY LOGFILE '/mnt/disk1/oracle/oradata/JCZH/sredo02.log' size 512M; SQL> ALTER DATABASE ADD STANDBY LOGFILE '/mnt/disk1/oracle/oradata/JCZH/sredo03.log' size 512M; SQL> ALTER DATABASE ADD STANDBY LOGFILE '/mnt/disk1/oracle/oradata/JCZH/sredo04.log' size 512M; 备库:SQL> ALTER DATABASE ADD STANDBY LOGFILE '/mnt/disk1/oracle/oradata/JCZH/sredo01.log' size 512M; SQL> ALTER DATABASE ADD STANDBY LOGFILE '/mnt/disk1/oracle/oradata/JCZH/sredo02.log' size 512M; SQL> ALTER DATABASE ADD STANDBY LOGFILE '/mnt/disk1/oracle/oradata/JCZH/sredo03.log' size 512M; SQL> ALTER DATABASE ADD STANDBY LOGFILE '/mnt/disk1/oracle/oradata/JCZH/sredo04.log' size 512M; 注意路径修改



8 实现日志同步

备库上执行

alter database recover managed standby database disconnect from session;

若提示已有恢复进程在进行中,则应用以下命令取消:

SQL> alter database recover managed standby database cancel;


同步完成后 取消这个恢复进程

SQL> alter database recover managed standby database cancel;

将备库启动到openread only的状态
SQL> alter database open read only;

9查看日志是否同步

查看主库和备库的日志同步情况,确保已经同步

主库:

SQL> archive log listDatabase log mode              Archive ModeAutomatic archival             EnabledArchive destination            /arch/JCZHOldest online log sequence     21Next log sequence to archive   23Current log sequence           23


备库:
SQL> archive log listDatabase log mode              Archive ModeAutomatic archival             EnabledArchive destination            /arch/JCZHSTANDBYOldest online log sequence     21Next log sequence to archive   0Current log sequence           23


备库执行:

select name,sequence#,APPLIED from v$archived_log order bysequence#;

若未出现日志应用信息 则检查主库是否处于Open状态

若日志应用状态出现No 则执行

SQL> alter database recover managed standby database using current logfile disconnect from session;Database altered.
若日志已应用 但序号不统一 (Next不用管)

在主库上执行

alter system switch logfile;

执行完成后再使用 archive log list;进行对比


若仍然无法同步,查看日志信息 进行实时监控

10.确认数据同步 

在主库上创建一张表,看备库上是否可以查看到。

SQL> create table test (id number);
备库:SQL> desc testERROR:ORA-04043: object test does not exist
注意:
发现数据没有同步,请执行下面语句,接收数据。

SQL> alter database recover managed standby database using current logfile disconnect from session;Database altered.
SQL> desc test Name                                     Null?   Type ----------------------------------------- ------------------------------------ ID                                               NUMBER

再次验证数据是否同步。主库:SQL> insert into test values(1);1 row created.SQL> commit;Commit complete.备库:SQL> select * from test;        ID----------         1


至此DataGuard已经搭建完成,接下来就是主备切换了。


总结:

dataguard 从0开始学习到搭建成功,期间遇到过好多困难,与很多无法解决的错误(事实上是因为粗心问题导致,例如相应的目录没有权限)。
要学会查看日志信息。如此文有不当之处还望各位指出。
祝大家学习进步,工作顺利!



原创粉丝点击