条件:
本测试两台服务器,采用centos6.5 :
一台创建oracle数据库,主机名centosorcl,ip: 192.168.193.100 SID:ORCL
一台只安装了oracle软件,主机名centosorcl_dg,ip 192.168.193.110
Orcl: 主库(192.168.193.100 )的tnsnames 串
Orcl_dg: 备库(192.168.193.110 )的tnsnames 串
1设置数据库归档模式
①检查是否处于归档模式:
SQL> archive log list
②如果不是归档模式则设置归档模式,需要关闭数据库并置为mount状态
SQL> shutdown immediate
SQL> startup mount
SQL> alter database archivelog
再执行查询发现已经为归档模式,见上图
2设置数据库为force logging模式
SQL> alter database force logging
ORA-12920:说明已经设置为force loggging模式,如果要停止force logging,则执行SQL>alter database no force logging
3创建standby数据库控制文件
SQL> alter database create standby controlfile
as ‘/opt/oracle/oradata/orcl/standby.ctl’;
文件名随便取(sql中的文件名与下图sql中不一致,特说明)
SQL> alter database open
4配置主库监听listenter.ora和tnsnames.ora
Listener.ora:
增加SID_LIST
Tnsnames.ora增加DRCL_DG配置
然后将这两个文件传送至standby数据库的对应位置
$ scp $ORACLE_HOME/network/admin/listener.ora
oracle@192.168.193.110:/opt/oracle/11.2/network/admin/
注:IP可用主机名代替,需在/etc/hosts文件中配置standby的ip与主机名对应
并修改listener.ora中的主机名HOST,更改为本机ip,tnsnames.ora不用更改
SID_NAME与主服务器一样
因为standby服务器没有创建数据库,可以连接主库的数据库,测试上述配置是否准确
$ sqlplus /nolog
SQL> conn system@manager@orcl (或者SQL> tnsping orcl/tnsping orcl_dg)
启动监听
$ lsnrctl start
查看监听
$ ps -ef |grep tns
4创建primary数据库客户端初始化文件和密码文件
SQL> create pfile from spfile
①在/opt/oracle/product/11.2.0/db_1/dbs($ORACLE_HOME/dbs)目录下将多出一个init+SID.ora的文件
②将该文件复制一份,作为恢复初始化数据库备份(可省略)
$ cp initorcl.ora initorcl.ora.bak
③修改客户端初始化文件
$ vi initorcl.ora
底部增加如下:
DB_UNIQUE_NAME=orcl
LOG_ARCHIVE_CONFIG=’DG_CONFIG=(orcl,orcl_dg)’
LOG_ARCHIVE_DEST_1=’LOCATION=/opt/oracle/oradata/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl’
LOG_ARCHIVE_DEST_2=’SERVICE=orcl_dg LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARIY_ROLE) DB_UNIQUE_NAME=orcl_dg’
LOG_ARCHIVE_FORMAT=’%t_%s_%r.arc’
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
FAL_SERVER=orcl_dg
FAL_CLIENT=orcl
STANDBY_FILE_MANAGEMENT=AUTO
#archive目录没有则创建
④ 创建密码文件
$ orapwd file=/opt/oracle/product/11.20/db_1/dbs/orapworcl password=verysafe entries=30
密码文件名格式:orapw+SID(UNIX) ,不然报ORA-01031 insufficient privileges,主库备库密码文件需要一致.WIN(pwd+SID)
5 将主库数据拷贝至standby库
主要拷贝的地方:
位置1:$ORACLE_BASE/oradata
$ scp -r /opt/oracle/oradata/orcl 192.168.193.110:/opt/oracle/oradata/
位置2:$ORACLE_BASE/admin
$ scp -r /opt/oracle/admin/orcl 192.168.193.110:/opt/oracle/admin/
位置3:$ORACLE_HOME/dbs
$ scp $ORACLE_HOME/dbs/initorcl.ora 192.168.193.110:$ORACLE_HOME/dbs/
$ scp $ORACLE_HOME/dbs/orapworcl.ora 192.168.193.110:$ORACLE_HOME/dbs/
注:拷贝时保持目录结构相同
6修改刚才拷贝至standby服务器的文件
①$ cd /opt/oracle/oradata/orcl
将control01.ctl删除,将standby.ctl 改名为control01.ctl
$ rm control01.ctl
$ mv standby.ctl control01.ctl
② $ vi $ORACLE_HOME/dbs/initorcl.ora 修改初始化文件(红色部分)
DB_UNIQUE_NAME=orcl_dg
LOG_ARCHIVE_CONFIG=’DG_CONFIG=(orcl_dg,orcl)’
LOG_ARCHIVE_DEST_1=’LOCATION=/opt/oracle/oradata/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl’
LOG_ARCHIVE_DEST_2=’SERVICE=orcl LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARIY_ROLE) DB_UNIQUE_NAME=orcl’
LOG_ARCHIVE_FORMAT='%t_%s_%r.arc'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
FAL_SERVER=orcl
FAL_CLIENT=orcl_dg
STANDBY_FILE_MANAGEMENT=AUTO
7启动主库
删除$ORACLE_HOME/dbs/spfileorcl.ora
$ rm spfileorcl.ora #今日该文件目录
$ sqlplu /nolog
SQL> conn /as sysdba
SQL> create spfile from pfile #创建spfile文件
$ startup
8 standby数据库创建spfile
$ sqlplu /nolog
SQL> conn /as sysdba
SQL> create spfile from pfile
SQL> quit
查看SID是否与主库一样
$ ps -ef |grep SID
$ env |grep SID
8 验证
$ sqlplu /nolog
SQL> conn /as sysdba
SQL> startup nomount
报错如下 没有找到db_recovery_file_dest 目录
找到查看 $ORACLE_HOME/dbs/initorcl.ora
然后创建此目录 再执行 SQL> startup nomount ,成功
SQL> ALTER database mount standby database
报错:
日志路径(oracle 11g):
$ORACLE_BASE/diag/rdbms/orcl_dg/orcl/alert
$ORACLE_BASE/diag/rdbms/orcl_dg/orcl/trace
根据日志查看是找不到:
/opt/oracle/flash_recovery_area/orcl/control02.ctl
然后将
/opt/oracle/oradata/orcl/conrol01.ctl拷贝过来并改名control02.ctl
再次执行SQL> ALTER database mount standby database 成功
①SQL> select name ,database_role from v$database
主库查询结果
Standby库查询结果
②stanby 数据库准备接受主库redo数据
SQL> Alter database recover managed standby database disconnect from session;
③加速日志传输 在primary库执行
创建表并插入测试数据后执行
SQL> Alter system switch logfile;
④standby数据库查看归档日志
SQL>select sequence#,first_time,next_time from v$archived_log order by sequence#;
说明日志已经传输到standby了
⑤在standby上执行
SQL> select sequence#,applied from v$archived_log order by sequence#;
发现全部是NO,日志没有应用。稍等一下再试试发现全部变成YES了。
如果还是NO,就是有问题了。然后请查看日志判断错误信息(位置见上文)
Redo文件查看:
SQL> show parameter log_file_name_convert; 查看日志路径
SQL> select group#,member from v$logfile; 查看具体文件
SQL> select group#,members,status from v$log; 查看日志状态
⑥取消日志应用,检查同步数据是否完成
SQL> alter database recover managed standby database cancel;
SQL> ALTER DATABASE OPEN READ ONLY;
SQL> select * from dgtest ; #dgtest需要同步的表
至此,physical dataguard就配置结束了,物理dg的日志恢复与查询是互斥的,所以对于想对主备数据库实现读写分离的朋友就不能使用物理dg了
启动时候先启动从库,再启动主库,关闭时候则相反
详细文档点击------> 戳这里