安装环境
主数据库: OS:linux6.6 DB:oracle11.2
备数据库::OS:linux6.6 DB:oracle11.2
主、备数据库安装目录结构相同。
一、主数据库配置及相关操作
set linesize 999
set pagesize 999
col member for a90
1、确认主库处于归档模式
>archive log list;
如果没有归档,执行以下操作:
shutdown immediate;
startup mount;
alter database archivelog;
archive log list;
alter database open;
2、将主数据库设置为force logging模式 ,使得Oracle无论什么操作都进行redo的写入。
>alter database force logging;
>select log_mode,force_logging from v$database;
3、创建角色转换后接收日志的redo log
此步是可选项,主要是用于主库角色转换后做为standby log日志接收主库的日志
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/home/oracle/app/oradata/orcl/slog1.rdo') SIZE 50M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/home/oracle/app/oradata/orcl/slog2.rdo') SIZE 50M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/home/oracle/app/oradata/orcl/slog3.rdo') SIZE 50M;
SQL> select * from v$logfile;
4、创建主数据库客户端初始化参数文件
注:主要此处修改项较多,为了方便,我们首先创建并修改pfile,然后再通过pfile 重建spfile。
SQL> create pfile from spfile; (稍后后复制到standby的$ORACLE_HOME/dbs下)
修改客户端初始化参数文件(主库的initorcl.ora),增加下列内容
vi /home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/initorcl.ora
*.db_name=orcl
*.DB_UNIQUE_NAME=ossdb1
*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(ossdb1,ossdb2)'
*.LOG_ARCHIVE_DEST_1='LOCATION=/home/oracle/app/oradata/orcl/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=ossdb1'
*.LOG_ARCHIVE_DEST_2='SERVICE=ossdb2 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ossdb2'
*.LOG_ARCHIVE_DEST_STATE_1=ENABLE
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE
*.REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
LOG_ARCHIVE_MAX_PROCESSES=30
--下面是角色转换用到的参数
*.FAL_CLIENT=ossdb1
*.FAL_SERVER=ossdb2
*.DB_FILE_NAME_CONVERT='/home/oracle/app/oradata/orcl/','/home/oracle/app/oradata/orcl/'
*.LOG_FILE_NAME_CONVERT='/home/oracle/app/oradata/orcl/','/home/oracle/app/oradata/orcl/'
*.STANDBY_FILE_MANAGEMENT=AUTO #主库数据库文件发生变化,备库也会增加
通过pfile 重建spfile
SQL> shutdown immediate
SQL> create spfile from pfile='initorcl.ora';
SQL> startup
5、创建一份主库的备份
用rman或其它方法备份主库的数据文件,这里使用的是将主库数据文件拷贝到备库方式。
Shutdown主库,将主库备份文件*.dbf文件拷贝的备机上
$ scp *.dbf [email protected]:/home/oracle/app/oradata/orcl/
6、创建standby 数据库控制文件
主库
SQL> startup mount
ALTER DATABASE CREATE STANDBY CONTROLFILE AS ‘/tmp/ossdb2trl1.ctl’;
拷贝控制文件至备库
scp ossdb2trl1.ctl [email protected]:/home/oracle/app/oradata/orcl/
拷贝init文件至备库并修改
scp initorcl.ora [email protected]:/home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/
*.control_files='/home/oracle/app/oradata/orcl/ossdb2trl1.ctl', '/home/oracle/app/oradata/orcl/ossddb2trl2.ctl'
*.db_name=orcl
*.DB_UNIQUE_NAME=ossdb2
*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(ossdb1,ossdb2)'
*.DB_FILE_NAME_CONVERT='/home/oracle/app/oradata/orcl/','/home/oracle/app/oradata/orcl/'
*.LOG_FILE_NAME_CONVERT='/home/oracle/app/oradata/orcl/','/home/oracle/app/oradata/orcl/'
*.LOG_ARCHIVE_FORMAT=log%t_%s_%r.arc
*.LOG_ARCHIVE_DEST_1='LOCATION=/home/oracle/app/oradata/orcl/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=ossdb2'
*.LOG_ARCHIVE_DEST_STATE_1=ENABLE
#---下列参数用于角色切换
*.LOG_ARCHIVE_DEST_2='SERVICE=ossdb1 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ossdb1'
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE
*.REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
*.FAL_SERVER=ossdb1
*.FAL_CLIENT=ossdb2
*.STANDBY_FILE_MANAGEMENT=AUTO
拷贝密码文件
scp /home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/orapworcl [email protected]:/home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/
7、配置主数据库tnsnames.ora文件
cd /home/oracle/app/oracle/product/11.2.0/dbhome_1/network/admin
vi tnsnames.ora
ossdb1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = ossdb1)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
ossdb2 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = ossdb2)(PORT = 1521))
)
(CONNECT_DATA =
(SID = orcl)
)
)
8、配置备数据库tnsnames.ora文件
cd /home/oracle/app/oracle/product/11.2.0/dbhome_1/network/admin
vi tnsnames.ora
ossdb2=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = ossdb2)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
ossdb1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = ossdb1)(PORT = 1521))
)
(CONNECT_DATA =
(sid = orcl)
)
)
注:listener.ora装数据库一般都已经配好,不用动就行。
配完之后重启主备listener:
[oracle@DB1 ~]$ lsnrctl stop
[oracle@DB1 ~]$ lsnrctl start
使用tnsping测试
$tnsping ossdb1
注意空格,括号等
二、Standby数据库配置及相关操作
1、通过该pfile 创建spfile
SQL> create spfile from pfile;
2、启动standby 到mount
SQL> startup mount;
3、启动redo 应用
SQL> alter database recover managed standby database disconnect from session;
SQL> recover managed standby database cancel;
SQL> alter database open;
SQL> select name,open_mode,PROTECTION_MODE,DATABASE_ROLE from v$database;
三、oracle dg 状态检查
1、查看主库的基本信息
select open_mode,protection_mode,database_role,switchover_status from v$database;
2、查看备库的基本信息
select open_mode,protection_mode,database_role,switchover_status from v$database;
3、查看同步情况
(1)检查实例状态是否一致
连接到主数据库
show parameter instance_name ;
连接到备数据库
show parameter instance_name ;
(2)检查主备两边的序号
连接到主数据库
select max(sequence#) from v$archived_log;
连接到备数据库
select max(sequence#) from v$archived_log;
(3)备库执行,查看是否有数据未应用
select sequence#,applied from v$archived_log ;
(4)检查备库状态,状态应该为not allowed
select switchover_status from v$database;
(5)查看备库是否有管理恢复进程(MRP)
ps aux|grep mrp
4、dg主备库切换步骤
主库
SQL> select switchover_status from v$database;
SQL> Alter database commit to switchover to physical standby with session shutdown;
SQL> shut immediate
SQL> startup nomount
SQL> alter database mount standby database;
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION ;
备库
SQL> select switchover_status from v$database;
SQL> select * from v$version where rownum<2;
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
SQL> shut immediate
SQL> startup
用来check当前主备库差异状态
set line 2000
set pages 2000
select name,open_mode,database_role,switchover_status,PROTECTION_MODE, PROTECTION_LEVEL from v$database;
SELECT al.thrd "Thread", almax "Last Seq Received", lhmax "Last Seq Applied" FROM (select thread# thrd, MAX(sequence#) almax FROM v$archived_log WHERE resetlogs_change#=(SELECT resetlogs_chan
ge# FROM v$database) GROUP BY thread#) al, (SELECT thread# thrd, MAX(sequence#) lhmax FROM v$log_history WHERE resetlogs_change#=(SELECT resetlogs_change# FROM v$database) GROUP BY thread#) l
h WHERE al.thrd = lh.thrd;
select pid,process,status,blocks,block# from v$managed_standby;
select to_char(SYSDATE,'yyyymmdd hh24:mi:ss') CTIME,NAME,VALUE,DATUM_TIME from V$DATAGUARD_STATS WHERE NAME LIKE '%lag';
启动完毕后,返回查看同步情况
参考文章:
https://blog.csdn.net/lichangzai/article/details/7979032