您的位置:首页 > 数据库 > Oracle

cent os6.5搭建oracle-dataguard

2017-06-21 16:06 148 查看
参考文章: 手把手教你安装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/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 bm-db3
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 bm-db3
192.168.1.105 bm-db3
192.168.1.106 bm-db2

备库:[oracle@bm-db2 ~]$ cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 bm-db2
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 bm-db2
192.168.1.105 bm-db3
192.168.1.106 bm-db2

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

[oracle@bm-db3 ~]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 19-JUN-2017 12:13:20
Copyright (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.ora
Listener Log File         /oracle/diag/tnslsnr/bm-db3/listener/alert/log.xml
Listening 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
4000
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 Mode
Automatic archival	       Enabled
………
若未开启 执行以下命令开启:alter database archivelog;

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

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

cd /$ORACLE_HOME/network/admin
orapwd 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 immediate
create spfile from pfile;
startup

5.传输文件

注意!以下所有执行都要下防火墙关闭模式下进行
主备库都执行以下命令service iptables stop
chkconfig iptables off
service iptables status
主库:
传输主库的参数文件、密码文件以及tnsname文件到备库上:

cd  $ORACLE_HOME/dbs
scp initJCZH.ora orapwJCZH bm-db2:$ORACLE_HOME/dbs
cd /$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_area
mkdir -p /mnt/disk1/oracle/oradata/JCZH
mkdir /mnt/disk1/backup
chown -R oracle:oinstall /mnt/disk1/backup /oracle/fast_recovery_area
chmod 777 /mnt/disk1/backup /oracle/fast_recovery_area
mkdir -p /mnt/disk1/arch/JCZH
chown -R oracle:oinstall /mnt/disk1/arch
chown -R oracle:oinstall /mnt/disk1/arch/JCZH
chmod 777 /mnt/disk1/arch/JCZH


主库上操作
在主库上用rman做一个全备,也需要创建备份的目录:mkdir /mnt/disk1/backup
chown -R oracle:oinstall /mnt/disk1/backup
chmod 777 /mnt/disk1 /backup
mkdir -p /mnt/disk1/arch/JCZH
chown -R oracle:oinstall /mnt/disk1/arch
chown -R oracle:oinstall /mnt/disk1/arch/JCZH
chmod 777 /mnt/disk1/arch/JCZH

主库上进行数据备份
rman
connect 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 – oracle
sqlplus / as sysdba
startup 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 JCZH
tnsping 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 list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /arch/JCZH
Oldest online log sequence 21
Next log sequence to archive 23
Current log sequence 23


备库:
SQL> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /arch/JCZHSTANDBY
Oldest online log sequence     21
Next log sequence to archive   0
Current 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 test
ERROR:
ORA-04043: object test does not exist
注意:
发现数据没有同步,请执行下面语句,接收数据。

SQL> alter database recover managed standby databas
a1f0
e 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开始学习到搭建成功,期间遇到过好多困难,与很多无法解决的错误(事实上是因为粗心问题导致,例如相应的目录没有权限)。要学会查看日志信息。如此文有不当之处还望各位指出。祝大家学习进步,工作顺利!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: