标签:搭建 连接 数据库版本 real 物理 相关 之间 c99 不同
Oracle RAC Standby实施手册
目录
DataGuard三种保护模式:最大化保护、最大有效性、最大性能。为了降低对主数据库的影响,以下采用最大性能模式进行DataGuard配置。
DataGuard配置中备数据库类型主要有三种:逻辑备数据库、物理备数据库和基于快照的备数据库,以下采用物理备数据库方式进行DataGuard配置。
DataGuard配置中的主数据库和备数据库之间数据同步是通过TCP/IP网络通信实现的,为了尽可能降低网络带宽的竞争和对现有应用程序性能问题,建议在主数据库主机和备数据库主机之间构建专属于DataGuard的网络,即需要添加新的网卡等硬件资源搭建专属于DataGuard的网络。
另外,建议在主数据库和备数据库上创建专属于DataGuard的数据库监听器,如listener_dg,监听端口为1525,如果主数据库和备数据库在不同网段上且存在防火墙,需要在防火墙上开通1525端口。
主机名 | IP地址 | 描述 | |
主数据库环境 | crmdb1 | 192.168.56.210 | 公网IP地址 |
192.168.56.216 | DG专署IP地址 | ||
crmdb2 | 192.168.56.211 | 公网IP地址 | |
192.168.56.217 | DG专署IP地址 | ||
备数据库环境 | crmdg1 | 192.168.56.220 | 公网IP地址 |
192.168.56.225 | DG专署IP地址址 | ||
crmdg2 | 192.168.56.221 | 公网IP地址 | |
192.168.56.226 | DG专署IP地址 |
数据库类型 | 主机名 | DB_UNIQUE_NAME | INSTANCE_NAME | Net Service Name |
主库 | crmdb1 | crmdb | crmdb1 | CRMDB_DG |
crmdb2 | crmdb2 | |||
备库 | crmdg1 | crmdg | crmdb1 | CRMDG_DG |
crmdb2 | crmdb2 |
为便于管理,主备库软件环境信息配置一致。
主库软件环境信息 | |
数据库sys用户密码 | 主数据库和备数据库密码必须一致,设置为oracle |
Grid和数据库版本 | 11.2.0.4 |
ORACLE_SID环境变量 | crmdb1和crmdb2 |
GRID软件ORACLE_BASE目录 | /oracle/app/oracle |
GRID软件ORACLE_HOME目录 | /grid/app/11.2.0.4/grid |
DB软件ORACLE_BASE目录 | /oracle/app/oracle |
DB软件ORACLE_HOME目录 | /oracle/app/oracle/product/11.2.0.4/db_1 |
DG专署监听器 | LISTENER_DG |
DG专署监听器端口 | 1525 |
初始化参数 | DB_NAME=crmdb |
DB_UNIQUE_NAME=crmdb | |
COMPATIBLE主数据库和备数据库必须一致 | |
归档模式 | 归档模式 |
归档目录 | +CRMDBARCH |
备库软件环境信息 | |
数据库sys用户密码 | 主数据库和备数据库密码必须一致,设置为oracle |
Grid和数据库版本 | 11.2.0.4 |
ORACLE_SID环境变量 | crmdb1和crmdb2 |
GRID软件ORACLE_BASE目录 | /oracle/app/oracle |
GRID软件ORACLE_HOME目录 | /grid/app/11.2.0.4/grid |
DB软件ORACLE_BASE目录 | /oracle/app/oracle |
DB软件ORACLE_HOME目录 | /oracle/app/oracle/product/11.2.0.4/db_1 |
DG专署监听器 | LISTENER_DG |
DG专署监听器端口 | 1525 |
初始化参数 | DB_NAME=crmdb |
DB_UNIQUE_NAME=crmdg | |
COMPATIBLE主数据库和备数据库必须一致 | |
归档模式 | 归档模式 |
归档目录 | +CRMDGARCH |
实施Active DataGuard的前提条件如下:
1. 主数据库主机和备数据库主机硬件平台一致,如都为Linux 主机;
2. 主数据库和备数据库软件版本一致且都为11.2.0.4;
3. 备数据库数据库存储空间大小不小于主数据库数据库存储空间大小;
$ asmcmd
ASMCMD> lsdg
4. 主数据库数据库运行正常且工作在archivelog模式下;
$ sqlplus / as sysdba
--1. 修改并检查归档参数
SQL> alter system set log_archive_dest_1='location=+CRMDBARCH';
SQL> show parameter log_archive_dest_1;
SQL> show parameter log_archive_format;
--2. 关闭主库两各节点
SQL> shutdown immediate;
--3. 启动一各节点进行启用归档操作
SQL> startup mount;
SQL> alter database ARCHIVELOG;
SQL> alter database open;
--4. 启动另外一各节点
SQL> startup;
--5. 测试归档配置结果
SQL> alter system archive log current;
5. 主数据库数据库需要启动force logging功能;
$ sqlplus / as sysdba
SQL> select FORCE_LOGGING from v$database;
SQL> alter database force logging;
6. 主数据库和备数据库sys用户的密码一样,并且密码文件必须存在且主数据库初始化参数remote_login_passwordfile必须设置为EXCLUSIVE;
为便于主备库切换时,应用可以进行快速切换,主备库数据库实例名名称相同。
通过grid登录主/备数据库各节点主机,创建LISTENER_DG监听器。主/备数据库主机清单见:IP地址规划。
主库配置文件(crmdb1/crmdb2主机):
[grid@crmdb1 ~]$ cd $ORACLE_HOME/network/admin
[grid@crmdb1 admin]$ cp listener.ora listener.ora.`date +%Y%m%d`
[grid@crmdb1 admin]$ vi listener.ora
# ADD FOR DG
LISTENER_DG =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.216)(PORT = 1525))
)
)
SID_LIST_LISTENER_DG =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = crmdb)
(ORACLE_HOME = /oracle/app/oracle/product/11.2.0.4/db_1)
(SID_NAME = crmdb1)
)
)
红色部分内容描述:
LISTENER_DG:DG专用监听器名称
192.168.56.216:crmdb1 节点DG专署监听IP地址
1525:DG专署监听端口
crmdb:DB_UNIQUE_NAME初始化参数值
crmdb1:当前主机ORACLE_SID或INSTANCE_NAME
备库配置文件(crmdg1/crmdg2主机):
[grid@crmdg1 ~]$ cd $ORACLE_HOME/network/admin
[grid@crmdg1 admin]$ cp listener.ora listener.ora.`date +%Y%m%d`
[grid@crmdg1 admin]$ vi listener.ora
# ADD FOR DG
LISTENER_DG =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.225)(PORT = 1525))
)
)
SID_LIST_LISTENER_DG =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = crmdg)
(ORACLE_HOME = /oracle/app/oracle/product/11.2.0.4/db_1)
(SID_NAME = crmdb1)
)
)
红色部分内容描述:
LISTENER_DG:DG专用监听器名称
192.168.56.225:crmdg1 节点DG专署监听IP地址,该参数各主机不同
1525:DG专署监听端口
crmdg:DB_UNIQUE_NAME初始化参数值,该参数主备库不同
crmdb1:当前主机ORACLE_SID或INSTANCE_NAME,该参数集群中各节点不同
主库:
[grid@crmdb1 ~]$ srvctl add listener -l LISTENER_DG -p TCP:1525
[grid@crmdb1 ~]$ srvctl start listener -l LISTENER_DG -n crmdb1
[grid@crmdb2 ~]$ srvctl start listener -l LISTENER_DG -n crmdb2
备库:
[grid@crmdg1 ~]$ srvctl add listener -l LISTENER_DG -p TCP:1525
[grid@crmdg1 ~]$ srvctl start listener -l LISTENER_DG -n crmdg1
[grid@crmdg2 ~]$ srvctl start listener -l LISTENER_DG -n crmdg2
该配置主备库相同。
[oracle@crmdb1 ~]$ cd $ORACLE_HOME/network/admin
[oracle@crmdb1 admin]$ cp tnsnames.ora tnsnames.ora.`date +%Y%m%d`
[oracle@crmdb1 admin]$ vi tnsnames.ora
CRMDB_DG =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.216)(PORT = 1525))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.217)(PORT = 1525))
(CONNECT_DATA =
(SERVICE_NAME = CRMDB)
)
)
CRMDG_DG =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.225)(PORT = 1525))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.226)(PORT = 1525))
(CONNECT_DATA =
(SERVICE_NAME = CRMDG)
)
)
注意:
备库的SERVICE_NAME是CRMDG,但ORACLE_SID中配置为crmdb1/crmdb2。
如果需要修改sys用户的密码,则在节点crmdb1执行以下命令后再将数据库密码文件ftp到其他crmdb2、crmdg1和crmdg2节点上。
[oracle@crmdb1 ~]$ cd $ORACLE_HOME/dbs
--1. ftp到各节点,使用主机名便于整理脚本,实际操作需要主机ip地址
[oracle@crmdb1 dbs]$ scp orapwcrmdb1 crmdb2:`pwd` #复制口令文件到crmdb2
[oracle@crmdb1 dbs]$ scp orapwcrmdb1 crmdg1:`pwd` #复制口令文件到crmdg1
[oracle@crmdb1 dbs]$ scp orapwcrmdb1 crmdg2:`pwd` #复制口令文件到crmdg2
--2. 修改口令文件名称
[oracle@crmdb2 dbs]$ mv orapwcrmdb1 orapwcrmdb2 #在节点crmdb2操作
[oracle@crmdg2 dbs]$ mv orapwcrmdb1 orapwcrmdb2 #在节点crmdg2操作
--3. 修改口令文件权限(实际通过oracle用户进行ftp不需要进行该操作)
[oracle@crmdb2 dbs]$ chown oracle:oinstall orapwcrmdb2 #在节点crmdb1操作
[oracle@crmdg1 dbs]$ chown oracle:oinstall orapwcrmdb1 #在节点crmdg1操作
[oracle@crmdg2 dbs]$ chown oracle:oinstall orapwcrmdb2 #在节点crmdg2操作
所有主机进行连通性测试。
[oracle@crmdb1 ~]$ tnsping CRMDB_DG
[oracle@crmdb1 ~]$ tnsping CRMDG_DG
[oracle@crmdb1 ~]$ sqlplus sys/oracle@CRMDB_DG as sysdba
[oracle@crmdb1 ~]$ sqlplus sys/oracle@CRMDG_DG as sysdba
DB_UNIQUE_NAME,INSTANCE_NAME,Net Service Name相关参数配置,参考归档配置相关参数。
SQL> show parameter spfile;
--1. 备份主库参数文件
SQL> create pfile='/home/oracle/crmdb.pfile' from spfile;
--2. 修改主库参数文件
alter system set LOG_ARCHIVE_CONFIG='DG_CONFIG=(crmdb,crmdg)';
alter system set LOG_ARCHIVE_DEST_1='LOCATION=+CRMDBARCH VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=crmdb';
alter system set LOG_ARCHIVE_DEST_2='SERVICE=CRMDG_DG LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=crmdg';
alter system set FAL_SERVER=CRMDG_DG;
alter system set STANDBY_FILE_MANAGEMENT=AUTO;
alter system set LOG_ARCHIVE_MAX_PROCESSES=4;
alter system set DB_FILE_NAME_CONVERT='+CRMDGDATA/crmdg/','+CRMDBDATA/crmdb/' scope=spfile;
alter system set LOG_FILE_NAME_CONVERT='+CRMDGDATA/crmdg/','+CRMDBDATA/crmdb/' scope=spfile;
--3. 重启主库进行验证
SQL> shutdown immediate;
SQL> startup;
--4. 生成当前主库参数文件,用于备库参数文件模版
SQL> create pfile='/home/oracle/crmdb.primary' from spfile;
*.audit_file_dest='/oracle/app/oracle/admin/crmdb/adump'
*.audit_trail='db'
*.cluster_database=true
*.compatible='11.2.0.4.0'
*.control_files='+CRMDBDATA/crmdb/controlfile/current.256.960630751'
*.db_block_size=8192
*.db_create_file_dest='+CRMDBDATA'
*.db_domain=''
*.db_name='crmdb'
*.diagnostic_dest='/oracle/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=crmdbXDB)'
*.open_cursors=300
*.pga_aggregate_target=1073741824
*.processes=1500
*.remote_listener='crmdb-scan:1521'
*.remote_login_passwordfile='exclusive'
*.sessions=1655
*.sga_target=4294967296
crmdb1.instance_number=1
crmdb2.instance_number=2
crmdb1.thread=1
crmdb2.thread=2
crmdb1.undo_tablespace='UNDOTBS1'
crmdb2.undo_tablespace='UNDOTBS2'
*.fal_server='CRMDG_DG'
*.log_archive_config='DG_CONFIG=(crmdb,crmdg)'
*.log_archive_dest_1='LOCATION=+CRMDBARCH VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=crmdb'
*.log_archive_dest_2='SERVICE=CRMDG_DG LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=crmdg'
*.db_file_name_convert='+CRMDGDATA/crmdg/','+CRMDBDATA/crmdb/'
*.log_file_name_convert='+CRMDGDATA/crmdg/','+CRMDBDATA/crmdb/'
*.standby_file_management='AUTO'
ALTER DATABASE ADD STANDBY LOGFILE thread 1 group 5 ('+CRMDBDATA') SIZE 52428800;
ALTER DATABASE ADD STANDBY LOGFILE thread 1 group 6 ('+CRMDBDATA') SIZE 52428800;
ALTER DATABASE ADD STANDBY LOGFILE thread 1 group 7 ('+CRMDBDATA') SIZE 52428800;
ALTER DATABASE ADD STANDBY LOGFILE thread 2 group 8 ('+CRMDBDATA') SIZE 52428800;
ALTER DATABASE ADD STANDBY LOGFILE thread 2 group 9 ('+CRMDBDATA') SIZE 52428800;
ALTER DATABASE ADD STANDBY LOGFILE thread 2 group 10 ('+CRMDBDATA') SIZE 52428800;
STANDBY 日志文件创建原则:
1. 每个实例的STANDBY日志文件组大于联机日志文件组数;
2. 每个STANDBY日志文件大小与联机日志文件大小一致;
将主库生成的参数文件复制一份,作为备库参数文件的模版进行修改。
[oracle@crmdb1 ~]$ cp crmdb.primary crmdg.standby
--1. DG无关的参数
*.cluster_database=true
*.compatible='11.2.0.4.0'
*.db_block_size=8192
*.db_name='crmdb'
*.diagnostic_dest='/oracle/app/oracle'
*.open_cursors=300
*.pga_aggregate_target=809500672
*.processes=1500
*.sessions=1655
*.sga_target=2428502016
*.log_archive_max_processes=4
*.remote_login_passwordfile='exclusive'
crmdb1.undo_tablespace='UNDOTBS1'
crmdb2.undo_tablespace='UNDOTBS2'
crmdb1.instance_number=1
crmdb2.instance_number=2
*.standby_file_management='AUTO'
--2. 目录相关参数
*.audit_file_dest='/oracle/app/oracle/admin/crmdg/adump'
*.control_files='+CRMDGDATA/crmdg/controlfile/current.260.958853369'
*.db_create_file_dest='+CRMDGDATA'
--3. 网络服务相关参数
*.db_unique_name='crmdg'
*.log_archive_config='DG_CONFIG=(crmdg,crmdb)'
*.fal_server='CRMDB_DG'
*.log_archive_dest_1='LOCATION=+CRMDGARCH VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=crmdg'
*.log_archive_dest_2='SERVICE=CRMDB_DG LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=crmdb'
*.remote_listener='crmdg-cluster01-scan:1521'
*.db_file_name_convert='+CRMDBDATA/crmdb/','+CRMDGDATA/crmdg/'
*.log_file_name_convert='+CRMDBDATA/crmdb/','+CRMDGDATA/crmdg/'
备库参数文件模版:
*.audit_file_dest='/oracle/app/oracle/admin/crmdg/adump'
*.cluster_database=true
*.compatible='11.2.0.4.0'
*.db_block_size=8192
*.db_create_file_dest='+CRMDGDATA'
*.db_name='crmdb'
*.diagnostic_dest='/oracle/app/oracle'
*.open_cursors=300
*.pga_aggregate_target=809500672
*.processes=1500
*.remote_login_passwordfile='exclusive'
*.sessions=1655
*.sga_target=4294967296
*.pga_aggregate_target=1073741824
crmdb1.thread=1
crmdb2.thread=2
crmdb1.instance_number=1
crmdb2.instance_number=2
crmdb1.undo_tablespace='UNDOTBS1'
crmdb2.undo_tablespace='UNDOTBS2'
*.db_unique_name='crmdg'
*.control_files='+CRMDGDATA/crmdg/controlfile/current.260.958853369'
*.log_archive_config='DG_CONFIG=(crmdg,crmdb)'
*.log_archive_dest_1='LOCATION=+CRMDGARCH VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=crmdg'
*.log_archive_dest_2='SERVICE=CRMDB_DG LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=crmdb'
*.remote_listener='crmdg-cluster01-scan:1521'
*.fal_server='CRMDB_DG'
*.standby_file_management='AUTO'
*.db_file_name_convert='+CRMDBDATA/crmdb/','+CRMDGDATA/crmdg/'
*.log_file_name_convert='+CRMDBDATA/crmdb/','+CRMDGDATA/crmdg/'
注意:
问题:control_files 在进行RMAN DUPLICATE完成后,会发生变化,而且DUPLICATE完成后,备库使用的spfile文件包含内存信息,因此无法作为生产spfile文件使用。
建议:将DUPLICATE后的control_files参数替换创建备库时的pfile文件中的control_files参数,并通过该pfile文件,重新创建一个新的spfile文件。
实例启动时,需要有审计日志目录,该目录需要手工在备库的2个节点(crmdg1/crmdg2)上进行创建。
[oracle@crmdg1 ~]$ mkdir -p /oracle/app/oracle/admin/crmdg/adump
SET LINESIZE 160;
COL NAME FOR A30;
COL VALUE FOR A80;
SELECT INST_ID, NAME, VALUE
FROM GV$PARAMETER
WHERE (NAME IN ('cluster_database',
'db_name',
'db_unique_name',
'dg_broker_start',
'dg_broker_config_file1',
'dg_broker_config_file2',
'fal_client',
'fal_server',
'archive_lag_target',
'log_archive_max_processes',
'log_archive_config',
'log_archive_trace',
'db_file_name_convert',
'log_file_name_convert',
'remote_login_password_file',
'standby_file_management',
'redo_transport_user'))
OR (NAME LIKE 'log_archive_dest%' AND UPPER(VALUE) != UPPER('ENABLE'))
ORDER BY NAME, INST_ID;
设置备库各节点环境变量参数ORACLE_SID与主库各节点一致。
[oracle@crmdg1 ~]$ cat /home/oracle/.bash_profile | grep ORACLE_SID
将前面编辑的crmdg.standby文件,传输到备库各节点。启动备库实例到NOMOUNT状态。
[oracle@crmdg1 ~]$ sqlplus / as sysdba
SQL> startup nomount pfile='/home/oracle/crmdg.standby';
[oracle@crmdg2 ~]$ sqlplus / as sysdba
SQL> startup nomount pfile='/home/oracle/crmdg.standby';
主备库所有节点都进行测试操作。
[oracle@crmdb1 ~]$ sqlplus sys/oracle@CRMDG_DG as sysdba
[oracle@crmdb1 ~]$ sqlplus sys/oracle@CRMDB_DG as sysdba
rman target sys/oracle@crmdb_dg auxiliary sys/oracle@crmdg_dg << !
run {
allocate channel ch001 type disk;
allocate channel ch002 type disk;
allocate channel ch003 type disk;
allocate channel ch004 type disk;
allocate auxiliary channel ch005 type disk;
duplicate target database for standby from active database;
release channel ch001;
release channel ch002;
release channel ch003;
release channel ch004;
release channel ch005;
}
!
[oracle@crmdg1 ~]$ sqlplus / as sysdba
--1. 查看当前的控制文件参数
SQL> show parameter control_files;
SQL> shutdown immediate;
--2. 编辑创建备库参数文件,用新的控制文件替换旧的控制文件信息
[oracle@crmdg1 ~]$ vi crmdg.standby
*.control_files='+CRMDGDATA/crmdg/controlfile/current.256.958853369'
--3. 创建新spfile文件
SQL> create spfile='+CRMDGDATA/crmdg/spfilecrmdb.ora' from pfile='/home/oracle/crmdg.standby';
--4. 创建pfile文件,连接到新的参数文件
[oracle@crmdg1 ~]$ cd $ORACLE_HOME/dbs
[oracle@crmdg1 dbs]$ rm spfilecrmdb1.ora
[oracle@crmdg1 dbs]$ vi initcrmdb1.ora
spfile='+CRMDGDATA/crmdg/spfilecrmdb.ora'
[oracle@crmdg2 ~]$ cd $ORACLE_HOME/dbs
[oracle@crmdg2 dbs]$ vi initcrmdb2.ora
spfile='+CRMDGDATA/crmdg/spfilecrmdb.ora'
[oracle@crmdg1 ~]$ srvctl add database -d crmdg -n crmdb -o $ORACLE_HOME
[oracle@crmdg1 ~]$ srvctl add instance -d crmdg -i crmdb1 -n crmdg1
[oracle@crmdg1 ~]$ srvctl add instance -d crmdg -i crmdb2 -n crmdg2
[oracle@crmdg1 ~]$ srvctl start database -d crmdg
1. 用户oracle登陆crmdg1主机取消归档日志文件追加
SQL> alter database recover managed standby database cancel;
2. 用户oracle登陆crmdg1主机以real-time方式同步主数据库
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE PARALLEL 8 USING CURRENT LOGFILE DISCONNECT FROM SESSION;
SQL> SELECT OPEN_MODE FROM GV$DATABASE;
3. 观察日志追加状态
SQL> SELECT thread#,max(sequence#) from v$archived_log where applied='YES' GROUP BY THREAD#;
SQL> select * from v$archive_gap;
Oracle 11.2.0.4 RAC Standby实施手册
标签:搭建 连接 数据库版本 real 物理 相关 之间 c99 不同
原文地址:http://blog.51cto.com/recyclebin/2067417