为一套现有RAC搭建一个单实例备库,组成DG高可用架构
资源规划:
主数据库RAC:
rac1 public ip:主库rac1的物理ip
rac2 public ip:主库rac2的物理ip
rac1 sid:orcl1
rac2 sid:orcl2
db_name:orcl
db_unique_name:orcl
备数据库单实例:
备库单实例:备库单实例ip
sid:orcl
db_name:orcl
db_unique_name:orclstd
数据库安装路径和文件路径
ORACLE_BASE:
/data/app/oracle
ORACLE_HOME:
/data/app/oracle/product/12.2.0
#需要提前在备库安装下数据库软件:
略
一 开始前,先备份下主库参数文件
create pfile='/home/oracle/bak.ora' from spfile;
二 在主库建测试表(用于测试DG搭建完成后数据库同步是否正常)
create table sys.test(id int ,name char(20));
insert into sys.test values(9568,'华三');
insert into sys.test values(45768,'华四');
insert into sys.test values(9090,'华五');
commit;
select * from sys. test;
三 更改主库的强制日志模式
查看当前主库是否开启归档和是否强制日志模式:
SQL> select name,log_mode,force_logging from v$database;
NAME LOG_MODE FORCE_LOGGING
--------- ------------ ---------------------------------------
ORCL ARCHIVELOG NO
如果log_mode是NOARCHIVELOG,则需要开启归档,rac如何开启归档可参考:rac 11g怎样开启归档日志_11grac 开启归档日志-CSDN博客
如果FORCE_LOGGING为NO的话,执行下面命令开启强制日志模式:
SQL> alter database force logging;
四 主库添加standby日志
select thread#,group#,members,bytes from v$log;
select group#,member from v$logfile;
standby redo log大小应该和源端的redo log一样。
standby redo 比online redo 需要多一组,这里主库一共有8组REDOLOG,需要建9组STANDBYLOG
#位置记得写共享盘的位置+DATA:
alter database add standby logfile thread 1 group 5 ('+DATA') size 200M;
alter database add standby logfile thread 1 group 6 ('+DATA') size 200M;
alter database add standby logfile thread 1 group 7 ('+DATA') size 200M;
alter database add standby logfile thread 1 group 8 ('+DATA') size 200M;
alter database add standby logfile thread 1 group 9 ('+DATA') size 200M;
alter database add standby logfile thread 2 group 10 ('+DATA') size 200M;
alter database add standby logfile thread 2 group 11 ('+DATA') size 200M;
alter database add standby logfile thread 2 group 12 ('+DATA') size 200M;
alter database add standby logfile thread 2 group 13 ('+DATA') size 200M;
#检查是否创建成功
SELECT GROUP#, TYPE, MEMBER, STATUS FROM V$LOGFILE WHERE TYPE = 'STANDBY';
五 在备库创建相关目录
su - oracle
cd /data/app/oracle
mkdir -p admin/orclstd/adump
mkdir -p /data/app/oracle/oradata/orclstd/tempfile
/*
使用 ASM 作为存储时,datafile 和 tempfile 是分别放在两个目录下的,所以在Standby
上也单独创建一个tempdata 目录。后面需要在db_file_name_convert 中作相应的设置。
*/
六 拷贝主库的密码文件到备库
此步骤只在主库上做
cd $ORACLE_HOME/dbs
scp orapworcl1 备库单实例ip:/data/app/oracle/product/12.2.0/dbs/orapworclstd
/*
如果主库没orapw口令文件,需要先生成:
orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=自定义一个密码entries=4 force=y
*/
七 修改主库相关参数,并导出参数文件,修改后同步至从库
主库RAC文件路径为共享存储+DATA:
主库不停服务,使用alter system修改
alter system set log_archive_config='dg_config=(orcl,orclstd)' scope=both sid='*';
alter system set log_archive_dest_1='location=+DATA/ORCL/ARCHIVELOG valid_for=(all_logfiles,all_roles) db_unique_name=orcl' scope=both sid='*' ;
alter system set log_archive_dest_2='service=orclstd valid_for=(online_logfiles,primary_role) db_unique_name=orclstd' scope=both sid='*';
alter system set log_archive_dest_state_1=enable scope=both sid='*';
alter system set log_archive_dest_state_2=enable scope=both sid='*';
alter system set log_archive_max_processes=4 scope=both sid='*';
alter system set fal_server='orclstd' scope=both sid='*' ;
alter system set fal_client='orcl' scope=both sid='*';
alter system set standby_file_management='auto' scope=both sid='*';
alter system set db_file_name_convert='/data/app/oracle/oradata/orclstd','+DATA/ORCL/DATAFILE','/data/app/oracle/oradata/orclstd/tempfile','+DATA/ORCL/TEMPFILE' scope=spfile sid='*';
alter system set log_file_name_convert='/data/app/oracle/oradata/orclstd','+DATA/ORCL/ARCHIVELOG' scope=spfile sid='*';
/*
db_file_name_convert 和 log_file_name_convert 仅当数据库被 standby 时才会生效,
这里配置,是 为切换做准备
*/
修改完成后,生成pfile参数文件 create pfile='/home/oracle/temp.ora' from spfile ;
将temp.ora拷贝到从库:
scp /home/oracle/temp.ora 备库单实例ip:/home/oracle/temp.ora
修改从库temp.ora
修改以下参数值:
*.audit_file_dest='/data/app/oracle/admin/orclstd/adump'
*.control_files='/data/app/oracle/oradata/orclstd/control01.ctl','/data/app/oracle/oradata/orclstd/control02.ctl'
LOG_ARCHIVE_CONFIG='DG_CONFIG=(orclstd,orcl)'
*.log_archive_dest_1='location=/data/app/oracle/arch valid_for=(all_logfiles,all_roles) db_unique_name=orclstd'
*.log_archive_dest_2='service=orcl valid_for=(online_logfiles,primary_role) db_unique_name=orcl'
*.fal_server='orcl'
*.fal_client='orclstd'
*.db_file_name_convert='+DATA/ORCL/DATAFILE','/data/app/oracle/oradata/orclstd','+DATA/ORCL/TEMPFILE','/data/app/oracle/oradata/orclstd/tempfile'
*.log_file_name_convert='+DATA/ORCL/ARCHIVELOG','/data/app/oracle/oradata/orclstd'
DB_CREATE_FILE_DEST='/data/app/oracle/oradata/orclstd'
*.db_recovery_file_dest='/data/app/oracle/fast_recovery_area'
将以主库实例名开头的参数改成备库实例名开头,并去除重复配置,示例:
注释掉*.cluster_database=true
添加以下内容:
*.db_unique_name='orclstd'
八 修改从库环境变量
vi /home/oracle/.bash_profile
修改export ORACLE_SID=orclstd
source ~/.bash_profile
九 将备库使用pfile启动至nomount状态
startup nomount pfile='/home/oracle/temp.ora' ;
十 配置监听
10.1 修改主库监听配置
在RAC环境中,监听默认路径grid用户下的$ORACLE_HOME/network/admin/listener.ora
su - grid
cd $ORACLE_HOME/network/admin/
cp listener.ora listener.ora_bak_250520
vi listener.ora
文件中加入如下内容:
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN1 = ON
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = /data/app/oracle/product/12.2.0/db_1)
(SID_NAME = orcl1)
)
)
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = LISTENER))
)
ADR_BASE_LISTENER = /data/app/grid
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER = ON
LISTENER_SCAN1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = LISTENER_SCAN1))
)
ADR_BASE_LISTENER_SCAN1 = /data/app/grid
节点 2,对应修改即可。
[grid@rac2 admin]$ cat listener.ora
# listener.ora Network Configuration File: /u01/app/11.2.0/grid/network/admin/listener.ora
# Generated by Oracle configuration tools.
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN1 = ON
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = /data/app/oracle/product/12.2.0/db_1)
(SID_NAME = orcl2)
)
)
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = LISTENER))
)
ADR_BASE_LISTENER = /u01/app/grid
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER = ON
LISTENER_SCAN1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = LISTENER_SCAN1))
)
ADR_BASE_LISTENER_SCAN1 = /data/app/grid
--这里写的 Oracle 用户的 ORACLE_HOME,否则连接时会报错:
ORA-01031: insufficient privileges
然后重启监听。
注意在 oracle 11gR2 的 RAC 环境下,监听是在 grid 用户下配置的。所以这里可以用 grid 用户连接,
并修 改。 最后重启监听。
10.2 修改备库监听
对于单实例,直接在 listener.ora 里添加:
# listener.ora Network Configuration File: /data/app/oracle/product/12.2.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orclstd)
(ORACLE_HOME = /data/app/oracle/product/12.2.0)
(SID_NAME = orclstd)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 备库单实例ip)(PORT = 1521))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
ADR_BASE_LISTENER = /data/app/oracle
10.3 在主库加载监听文件配置
su - grid
lsnrctl reload
10.4启动备库监听
su - oracle
lsnrctl start
十一 修改tnsnames.ora文件
修改tnsnames.ora(主备节点一致)
cd ${ORACLE_HOME}/network/admin
cp tnsnames.ora tnsnames.ora_bak_250520
vi tnsnames.ora
新增:
节点1,节点2,单实例 的 tnsnames.ora 文件是一致的,添加以下内容:
orcl=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 主库rac1的物理ip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 主库rac2的物理ip)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME =orcl)
)
)
orclstd=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 备库单实例ip)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orclstd)
)
)
执行tnsping orcl及tnsping orclstd确保反馈OK。
十二 主备数据同步
在主库上通过rman duplicate方式进行备库恢复。
shell>rman target sys/XXXXXXXX@orcl auxiliary sys/XXXXXXX@orclstd
RMAN>duplicate target database for standby from active database nofilenamecheck;
/*
假如登录报错:
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-00554: initialization of internal recovery manager package failed
RMAN-04005: error from target database:
ORA-01017: invalid username/password; logon denied
检查该参数值:
SHOW PARAMETER REMOTE_LOGIN_PASSWORDFILE
如果值是NONE,需要将其改为exclusive时,启用口令文件,允许远程登录
#主库
alter system set REMOTE_LOGIN_PASSWORDFILE=exclusive scope=spfile;
然后重启库
#从库
关闭数据库,添加remote_login_passwordfile=exclusive一行,再重新启动数据库startup nomount pfile='/home/oracle/temp.ora' ;
SHOW PARAMETER REMOTE_LOGIN_PASSWORDFILE
*/
Duplicate完成后,从库自动启动到了mount状态。
在此期间,在主库新增一些数据,切几个归档日志,看DG配置完之后主库新增的数据是否能同步到从库。
insert into sys.test(id,name) values(9091,'baidd');
insert into sys.test(id,name) values(9092,'jiao');
十三 启动从库数据库
alter database open ;
/*
假如启动报错:
第 1 行出现错误:
ORA-10458: standby database requires recovery
ORA-01152: ?? 1 ???????????
ORA-01110: ???? 1: '/data/app/oracle/oradata/orclstd/system.257.1200563609'
则:
alter database recover managed standby database using current logfile disconnect from session;
alter database recover managed standby database cancel;
再open库:
alter database open ;
*/
十四 备库启动日志应用
alter database recover managed standby database using current logfile disconnect from session;
/*
停止日志应用的命令是:
alter database recover managed standby database cancel;
*/
#验证数据
可以看到在开启日志应用后,后来新增的两条数据也同步过来了。
SQL> select database_role,open_mode from v$database;
DATABASE_ROLE OPEN_MODE
---------------- --------------------
PHYSICAL STANDBY READ ONLY WITH APPLY
#在主库再插入条数据,看能否同步到从库。
insert into sys.test(id,name) values(9093,'mubai');
#查看数据库保护模式
select database_role,protection_mode,protection_level,open_mode from v$database;
select switchover_status from v$database;
查看standby启动的DG进程
SQL>select process,client_process,sequence#,status from v$managed_standby;
十五 将从库改为用spfile方式启动
create spfile from pfile='/home/oracle/temp.ora';
shutdown immediate;
startup;
#检查确认
show parameter spfile;
#开启同步
SQL> alter database recover managed standby database using current logfile disconnect from session;
SQL> select database_role,open_mode from v$database;
DATABASE_ROLE OPEN_MODE
---------------- --------------------
PHYSICAL STANDBY READ ONLY WITH APPLY
十六 用客户端工具连接下主备,确保能连接成功
……