l 第一部分:准备工作
一、 安装环境
Primary:
Standby:
OS:linux5.5 DB:oracle11.2
Primary、Standby数据库安装目录结构相同。
l 第二部分:物理standby创建
一、Primary数据库配置及相关操作
1、确认主库处于归档模式
SQL> archive log list
数据库日志模式 存档模式
自动存档 启用
存档终点 USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列 333
下一个存档日志序列 0
当前日志序列 334
注:如果没有归档,执行下面的步骤:
SQL> startup mount;
SQL> alter database archivelog;
SQL> archive log list;
SQL> alter database open;
2、将primary 数据库置为FORCE LOGGING 模式。通过下列语句:
SQL> alter database force logging;
3、创建角色转换后接收日志的redo log
此步是可选项,主要是用于主库角色转换后做为standby log日志接收主库的日志
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/oracle/dbs/slog1.rdo') SIZE 500M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/oracle/dbs/slog2.rdo') SIZE 500M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/oracle/dbs/slog3.rdo') SIZE 500M;
SQL> ALTER DATABASE ADD STANDBY LOGFILE ('/oracle/dbs/slog4.rdo') SIZE 500M;
4、创建primary数据库客户端初始化参数文件
注:主要此处修改项较多,为了方便,我们首先创建并修改pfile,然后再通过pfile 重建spfile,你当然也可以通过alter system set 命令直接修改spfile 内容。
SQL> create pfile from spfile;
稍后后复制到standby的$ORACLE_HOME/dbs下。
修改客户端初始化参数文件(primaryr的initorcl.ora),增加下列内容
*.db_name=orcl
*.DB_UNIQUE_NAME=primary
*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(primary,standby)'
*.LOG_ARCHIVE_DEST_1='LOCATION=/oradata/orcl/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=primary'
*.LOG_ARCHIVE_DEST_2='SERVICE=standby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standby'
*.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_SERVER=standby
*.DB_FILE_NAME_CONVERT='/oradata/orcl','/oradata/orcl'
*.LOG_FILE_NAME_CONVERT='/oradata/orcl','/oradata/orcl'
*.STANDBY_FILE_MANAGEMENT=AUTO
通过pfile 重建spfile
SQL> shutdown immediate
SQL> create spfile from pfile='initorcl.ora';
SQL> startup
5、创建一份主库的备份
用rman或其它方法备份主库的数据文件,建议用rman。
6、创建standby 数据库控制文件
SQL> alter database create standby controlfile as '/oradata/orcl/stdcotrl.ctl';
7、复制数据文件到standby 服务器(方式多样,不详述)
把主库的备份文件、init参数文件、上面备份的控制文件、密码文件copy到standby服务器的相应目录下。
8、配置主备的listener 及net service names如下:
(1)Primary的tnsnames.ora内容
primary =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = DB1)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
standby=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.204)(PORT = 1521))
)
(CONNECT_DATA =
(sid = orcl)
)
)
(2)standby的tnsnames.ora内容
standby=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = DB2)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
primary =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.202)(PORT = 1521))
)
(CONNECT_DATA =
(sid = orcl)
)
)
注:listener.ora装数据库一般都已经配好,不用动就行。
配完之后重启主备listener:
[oracle@DB1 ~]$ lsnrctl stop
[oracle@DB1 ~]$ snrctl start
在主备分别通过tnsping 测试tnsnames 是否正确有效
通过下面的测试oracle net的连接
--[oracle@DB1 ~]$ sqlplus system/oracle@standby
[oracle@DB2 ~]$ sqlplus system/oracle@primary
二、Standby数据库配置及相关操作
1、 如果服务器是windows通过ORADIM 创建新的OracleService,如果linux\unix可以略去这一步。
2、 如果上面没有拷贝密码文件,也可以手工创建密码文件。注意保持sys 密码与primary 数据库一致。
[oracle@DB2 ~]$orapwd file=$ORACLE_HOME/dbs/orapworcl password=oracle entries=30
--密码最好自己重建一下,否则可能会出现ORA-01031: insufficient privileges
3、创建目录
[oracle@DB2 ~]$cd /oracle/admin/orcl
[oracle@DB2 ~]$mkdir adump bdump cdump dpdump udump
4、复制文件,上面第7步已经做过,把复制过来的文件拷到相应目录下即可。
5、修改初始化参数文件($ORACLE_HOME/dbs/initorcl.ora)
修改和增加下列参数
*.control_files='/oradata/orcl/stdcotrl1.ctl', '/oradata/orcl/stdcotrl2.ctl'
*.db_name=orcl
*.db_unique_name=standby
*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(primary,standby)'
*.DB_FILE_NAME_CONVERT='/oradata/orcl','/oradata/orcl'
*.LOG_FILE_NAME_CONVERT='/oradata/orcl','/oradata/orcl'
*.LOG_ARCHIVE_FORMAT=log%t_%s_%r.arc
*.LOG_ARCHIVE_DEST_1='LOCATION=/oradata/orcl VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=standby'
*.LOG_ARCHIVE_DEST_STATE_1=ENABLE
#---下列参数用于角色切换
*.LOG_ARCHIVE_DEST_2='SERVICE=primary LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=primary'
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE
*.REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
*.FAL_SERVER=primary
*.STANDBY_FILE_MANAGEMENT=AUTO
注意同时修改*_dest 的路径。
通过该pfile 创建spfile
SQL> create spfile from pfile;
6、启动standby 到mount
SQL> startup mount;
7、启动redo 应用
SQL> alter database recover managed standby database disconnect from session;
SQL> select name,open_mode,PROTECTION_MODE,DATABASE_ROLE from v$database;
NAME OPEN_MODE PROTECTION_MODE DATABASE_ROLE
--------- ---------- -------------------- ----------------
PRIMARY MOUNTED MAXIMUM PERFORMANCE PHYSICAL STANDBY
首先连接到primary 数据库
SQL> show parameter instance_name;
NAME TYPE VALUE
---- ---- ----
instance_name string orcl
SQL> alter system switch logfile;
SQL> select max(sequence#) from v$archived_log;
然后连接到standby 数据库
SQL> show parameter instance_name;
NAME TYPE VALUE
---- ---- ----
instance_name string orcl
SQL> SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG;
---------- ---
9、暂停应用
通过下列语句暂停redo 应用。
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
注意,此时只是暂时redo 应用,并不是停止Standby 数据库,standby 仍会保持接收只不过不会再应用接收到的归档,直到你再次启动redo 应用为止。
10、使用standby的实时查询功能
COMPATIBLE数据库参数必需设为11.0以上时才能使用Oracle Active Data Guard新特性
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
SQL> ALTER DATABASE OPEN;
SQL> select open_mode from v$database;
OPEN_MODE
--------------------
READ ONLY
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
SQL> select open_mode from v$database;
OPEN_MODE
--------------------
READ ONLY WITH APPLY
注:也可以用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
提 示:
DISCONNECT FROM SESSION子句并非必需,该子句的作用呢,是指定启动完应用后自动退出到命令操作符前。如果不指定该子句的话,当前SESSION就会一直停留处理REDO应用,如果想做其他操作,就只能新建一个连接。