参考文章: 手把手教你安装Data Guard
此文综合了一些其他参考资料与上述文章,供初学者参考。
前言
此文适合于初步学习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 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 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开始学习到搭建成功,期间遇到过好多困难,与很多无法解决的错误(事实上是因为粗心问题导致,例如相应的目录没有权限)。