物理standby rac到 单机搭建
OS : CentOS 6.6
DB : 11204
数据库类型 DB_UNIQUE_NAME
---------------------------------------------
primary xedb
physical standby
stxedb
1.创建standby数据库:
步骤1: 在主库设置强制日志: sql > alter database force logging;
步骤2: 启用主数据库归档:
sql> shutdown immediate;
sql> startup mount;
sql> alter database archivelog;
sql> alter database open;
步骤3: 配置主数据库standby redo日志
搭建Data Guard环境,Oracle推荐主数据库配置Standby redo日志。主数据库随时准备快速转换为standby角色,所以需要提前在主数据库配置好standby redo,以便能够顺利的接收实时传送的日志,使整个切换过程更加平滑。
查看主库的联机日志:
sql> select thread#,bytes/1024/1024 "size(MB)",members from v$log;
THREAD# size(MB) MEMBERS
---------- ---------- ----------
1 50 2
1 50 2
2 50 2
2 50 2
当前环境只有2个节点,有2个日志组,每个日志组50M,每个日志组又两个成员。执行下面的sql为每个线程创建3个大小为50M,每个日志组2个成员。为 datadg1磁盘组。
注意: 无论什么时候添加一个redo日志组到主数据库,也必须添加日志组到standby数据库。否则,standby数据库可能变得不同步,这可能导致零数据丢失配置临时失败,或者导致最大保护模式下的主数据库被关闭。
sql> alter database add standby logfile thread 1('+DATADG01') size 50M;
sql> alter database add standby logfile thread 1('+DATADG01') size 50M;
sql> alter database add standby logfile thread 1('+DATADG01') size 50M;
sql> alter database add standby logfile thread 2('+DATADG01') size 50M;
sql> alter database add standby logfile thread 2('+DATADG01') size 50M;
sql> alter database add standby logfile thread 2('+DATADG01') size 50M;
查看所有redo文件列表,select * from v$logfile order by 1;
SQL> select * from v$logfile order by 1;
GROUP# STATUS MEMBER
----------------------------------------------------------------------
1 ONLINE +DATADG01/xedb/onlinelog/group_1.257.894187573
1 ONLINE +DATADG01/xedb/onlinelog/group_1.272.895662351
2 ONLINE +DATADG01/xedb/onlinelog/group_2.258.894187573
2 ONLINE +DATADG01/xedb/onlinelog/group_2.271.895662355
3 ONLINE +DATADG01/xedb/onlinelog/group_3.265.894189463
3 ONLINE +DATADG01/xedb/onlinelog/group_3.270.895662361
4 ONLINE +DATADG01/xedb/onlinelog/group_4.266.894189465
4 ONLINE +DATADG01/xedb/onlinelog/group_4.273.895662365
5 ONLINE +DATADG01/xedb/onlinelog/group_5.275.898078073
5 ONLINE +DATADG01/xedb/onlinelog/group_5.278.898078215
6 ONLINE +DATADG01/xedb/onlinelog/group_6.277.898078147
6 ONLINE +DATADG01/xedb/onlinelog/group_6.279.898078231
7 STANDBY +DATADG01/xedb/onlinelog/group_7.282.901709803
8 STANDBY +DATADG01/xedb/onlinelog/group_8.283.901709811
9 STANDBY +DATADG01/xedb/onlinelog/group_9.284.901709815
10 STANDBY +DATADG01/xedb/onlinelog/group_10.285.901709823
11 STANDBY +DATADG01/xedb/onlinelog/group_11.286.901709827
12 STANDBY +DATADG01/xedb/onlinelog/group_12.287.901709829
6 rows selected.
3.源端:rman 备份
run
{
allocate channel c1 type disk;
allocate channel c2 type disk;
backup database format '/oradata/backup/full_%d_%T_%s_%p';
sql 'alter system archive log current';
sql 'alter system archive log current';
sql 'alter system archive log current';
backup archivelog all format '/oradata/backup/arch_%d_%T_%s_%p';
}
创建目标端控制文件,也可以用rman备份
SQL>alter database create standby controlfile as '/oradata/ctl_bf';
rman target /
backup current controlfile for standby format '/oradata/backup/ctl_bf'
步骤4:设置主数据库的初始化参数
在主数据库通过定义log_archive_dest_n控制redo传输服务。当主数据库被转换为standby角色,需要添加额外的参数,控制redo数据的接收和应用服务。
4.1 源端创建pfile: sql> create pfile='/tmp/test.ora' from spfile;
由于rac共享spfile文件,所以修改参数文件的操作只需要在一个节点完成。
4.2. scp 参数文件到目标端
scp rman备份到目标端
4.3. vi 参数文件,控制文件 路径改一下添加如下内容
*.db_name='xedb'
*.fal_client='STXEDB'
*.fal_server='XEDB'
*.log_archive_config='dg_config=(xedb,stxedb)'
*.log_archive_dest_1='location=+ARCH_DG/arc1' valid_for=(all_logfiles,all_roles) db_unique_name=xedb'
*.log_archive_dest_2='service=stxedb lgwr sync affirm valid_for=(online_logfiles,primary_role) db_unique_name=stxedb'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'
*.log_file_name_convert='+DATADG01','/oradata/stxedb'
*.db_file_name_convert='+DATADG01','/oradata/stxedb'
*.standby_archive_dest='location=/oradata/arch'
*.standby_file_management='AUTO'
----------------------------------------------------------------------------
如果主库不停机可直接设置:
alter system set log_archive_config='dg_config=(xedb,standbyxedb)' scope=spfile;
alter system set log_archive_dest_1='LOCATION=+ARCH_DG/ARC1' valid_for=(all_logfiles,all_roles) db_unique_name=xedb' scope=spfile;
alter system set log_archive_dest_2='service=standbyxedb lgwr sync affirm valid_for=(online_logfiles,primary_role) db_unique_name=standbyxedb' scope=spfile;
alter system set log_archive_dest_state_1=enable scope=spfile;
alter system set log_archive_dest_state_2=enable scope=spfile;
alter system set remote_login_passwordfile=exclusive scope=spfile;
alter system set fal_server=standbyxedb scope=spfile;
alter system set standby_file_management=auto scope=spfile;
-----------------------------------------------------------------------------
参数说明:
log_archive_dest_1: location属性指定LOCATION=+ARCH_DG/ARC1表明本地归档Redo日志存放位置 valid_for 表明无论数据库是什么角色,各种类型的日志都要归档到这个目的地; log_archive_dest_1指定的 db_unique_name 必须在 dg_config 中出现,必须要与归档位置所在的数据库db_unique_name初始化参数相同。
log_archive_dest_2: service 指定远程服务器,通过 oracle net连接串,lgwr sync affirm 表明redo日志由lgwr进程以实时同步的方式传送到standby数据库中的Standby redo日志,并且在同步完成后给出响应;valid_for 表明该数据库是主数据库的时候,联机redo日志会被归档到该目录位置。
fal_server 和 standby_file_management 参数是当主数据库被转换为standby角色的时候变得有效,fal_server 指定本地oracle net服务名,从11g开始不需要fal_client参数。
db_file_name_convert='+DATADG01','/oradata/standynode'
log_file_name_convert='+DATADG01','/oradata/standynode'
注意:对于db_file_name_convert 和 log_file_name_convert 两个参数的配置要特别注意。如果有两台服务器A和B组成的DataGuard环境,服务器A是主服务器,服务器B是Standby数据库服务器,那么在A服务器的参数文件配置从服务器B转换为A的目录,在B服务器中的参数文件配置从服务器A转换到服务器B的目录。
在主数据库的参数文件配置完成后,copy到备服务器的$ORACLE_HOME/dbs目录下
步骤5: 位standby数据库创建初始化参数文件
直接在standby数据库中对从主数据库拷贝过来的参数文件进行修改,修改后按照init.ora的命名规则重命名参数文件。
修改传递过来的参数文件,去掉有关rac配置以及修改相关的DG配置。修改后的初始化参数文件如下:
*.db_name='xedb'
*.db_unique_name='stxedb'
*.fal_client='stxedb'
*.fal_server='xedb'
*.log_archive_config='dg_config=(xedb,stxedb)'
*.log_archive_dest_1='location=/oradata/arch'
*.log_archive_dest_2='service=stxedb lgwr sync affirm valid_for=(online_logfiles,primary_role) db_unique_name=stxedb'
*.log_archive_dest_state_1='enable'
*.log_archive_dest_state_2='enable'
*.log_file_name_convert='+datadg01/xedb/onlinelog','/oradata/stxedb','+arch_dg/xedb/archivelog','/oradata/arch','+arch_dg/arc1','/oradata/arch'
*.db_file_name_convert='+DATADG01/xedb/datafile','/oradata/stxedb','+DATADG01/xedb/tempfile','/oradata/stxedb'
*.remote_login_passwordfile='exclusive'
*.standby_file_management='auto'
如果主数据库与standby数据库的目录不同,还需要添加如下参数,指定数据文件目录和日志文件目录的转换
db_file_name_convert='+DATADG01','/oradata'
log_file_name_convert='+DATADG01/arc','/oradata/arc'
注意:确保compatible初始化参数在主数据库和standby数据库中的设置是相同的。如果值不同,redo传输服务可能不能从主数据库传送redo数据到standby数据库。
步骤6:创建相应的目录结构
6.1 创建文件系统目录
根据参数文件的内容,创建相应的目录结构,并修改所有者和权限。
11g要创建这些目录
rm -rf $ORACLE_BASE/admin/$ORACLE_SID
mkdir -p $ORACLE_BASE/admin/$ORACLE_SID/adump
mkdir -p $ORACLE_BASE/admin/$ORACLE_SID/dpdump
mkdir -p $ORACLE_BASE/admin/$ORACLE_SID/pfile
mkdir -p $ORACLE_BASE/admin/$ORACLE_SID/scripts
chmod -R 750 $ORACLE_BASE/admin
rm -rf $ORACLE_BASE/diag/rdbms/$ORACLE_SID
mkdir -p $ORACLE_BASE/diag/rdbms/$ORACLE_SID/$ORACLE_SID/alert
mkdir -p $ORACLE_BASE/diag/rdbms/$ORACLE_SID/$ORACLE_SID/cdump
mkdir -p $ORACLE_BASE/diag/rdbms/$ORACLE_SID/$ORACLE_SID/hm
mkdir -p $ORACLE_BASE/diag/rdbms/$ORACLE_SID/$ORACLE_SID/incident
mkdir -p $ORACLE_BASE/diag/rdbms/$ORACLE_SID/$ORACLE_SID/incpkg
mkdir -p $ORACLE_BASE/diag/rdbms/$ORACLE_SID/$ORACLE_SID/ir
mkdir -p $ORACLE_BASE/diag/rdbms/$ORACLE_SID/$ORACLE_SID/lck
mkdir -p $ORACLE_BASE/diag/rdbms/$ORACLE_SID/$ORACLE_SID/metadata
mkdir -p $ORACLE_BASE/diag/rdbms/$ORACLE_SID/$ORACLE_SID/stage
mkdir -p $ORACLE_BASE/diag/rdbms/$ORACLE_SID/$ORACLE_SID/sweep
mkdir -p $ORACLE_BASE/diag/rdbms/$ORACLE_SID/$ORACLE_SID/trace
chmod -R 750 $ORACLE_BASE/diag/rdbms/$ORACLE_SID
确保参数文件的配置目录都已经创建,并且有合适权限
上面的操作也可以通过asmcmd工具的mkdir命令完成
步骤7:配置Redo传输认证
Data Guard 通过orale net 会话在Data Guard配置的成员之间 传送redo数据和控制消息。 redo传输会话可以使用ssl协议或者远程登陆密码文件进行认证。如果没有使用ssl认证,每个DataGuard配置中的成员必须配置使用远程登陆密码文件和每个物理Standby数据库必须有一个来自主数据库的最新密码文件拷贝。
注意: 无论什么时候,在主数据库授权或者收回sysdba权限,或者改变这些权限用户的登陆密码,都必须从主数据库拷贝最新的密码文件到 Data Guard配置中的每个standby数据库以替换密码文件,或者将每个standby 数据库修改为相同密码。
从主数据库的$ORACLE_HOME/dbs目录传递密码文件到standby 数据库的相同目录,并重命名为orapwrtddg1,修改权限和用户组
步骤8: 配置主备数据库监听器
用net manager为各自的数据库配置监听器,在11gR2中,监听器的创建和管理要使用grid用户来完成。
对于standby 数据库而言 ,由于需要在节点使用rman连接standby数据库执行duplicate操作,所以需要配置静态的服务名,用于主数据库RMAN工具
的连接。在grid用户下的$GRID_HOME/network/admin/listener.ora文件加入以下内容:
SID_LIST_LISTENER=
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME=rtdg1)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)
(SID_NAME = rtdg1)
)
)
在listener.ora文件的SID_LIST列表中加入SID_DESC的描述,确保配置中的SID_NAME和ORACLE_HOME与oracle系统用户的 ORACLE_SID和ORACLE_HOME环境变量值是一致的。配置完成后用grid用户重启监听,是配置生效。
注意: 配置是修改grid用户下的GRID_HOME/network/admin/listener.ora配置文件,改文件配置中制定的ORACLE_HOME是oracle用户的ORACLE_HOME,而非grid用户的ORACLE_HOME
复制密码文件:
步骤9:创建Oracle Net服务名
以oracle 用户登录服务器,修改主备数据库的$ORACLE_HOME/network/tnsname.ora文件,完成后 tnsping 验证一下。
步骤10: 启动standby数据库到nomount模式
SQL> startup nomount pfile='/oradata/test.ora';
sql> create spfile from pfile;
sql> startup nomount ;
注意: standby先创建spfile,再启动到nomount模式
步骤11: 从主数据库复制文件到standby数据库,这里用rman
从主数据库复制文件到standby数据库,最简单的方法莫过于使用 rman的duplicate复制命令,在10g中使用rman的duplicate命令复制standby数据库需要先将主数据库进行备份再复制,从11g开始使用该命令支持直接对活动的数据库进行复制,这对于数据量大的系统来说可以大大减少DataGuard部署需要花费的时间。
RMAN> restore standby controlfile from '/oradata/backup/ctl_bf';
Starting restore at 29-DEC-14
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=20 device type=DISK
channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete, elapsed time: 00:00:03
output file name=/oradata/ogg02/control01.ctl
output file name=/oradata/ogg02/control02.ctl
Finished restore at 29-DEC-14
alter database mount;
RMAN> alter database mount ;
database mounted
released channel: ORA_DISK_1
验证有没有生效
select name from v$datafile;
12.rman 恢复
run
{
set newname for datafile '+DATADG01/xedb/datafile/system.259.894187575' to '/oradata/stxedb/system.259.894187575';
set newname for datafile '+DATADG01/xedb/datafile/sysaux.260.894187589' to '/oradata/stxedb/sysaux.260.894187589';
set newname for datafile '+DATADG01/xedb/datafile/undotbs1.261.894187601'to'/oradata/stxedb/undotbs1.261.894187601';
set newname for datafile '+DATADG01/xedb/datafile/undotbs2.263.894187615'to'/oradata/stxedb/undotbs2.263.894187615';
set newname for datafile '+DATADG01/xedb/datafile/users.264.894187621' to '/oradata/stxedb/users.264.894187621';
set newname for datafile '+DATADG01/xedb/datafile/users.268.895081225' to '/oradata/stxedb/users.268.895081225';
set newname for datafile '+DATADG01/xedb/datafile/users.269.895582787' to '/oradata/stxedb/users.269.895582787';
set newname for datafile '+DATADG01/xedb/datafile/users.280.898078315' to '/oradata/stxedb/users.280.898078315';
restore database ;
switch datafile all;
}
run{
allocate channel c1 type disk;
recover database;
}
主库先备份归档:RMAN> backup archivelog all format '/oradata/backup/arch_%d_%T_%s_%p';
将归档备份集Scp到备库;
备库再注册归档备份集:
RMAN> catalog backuppiece '/oradata/backup/arch_XEDB_20160121_25_1';
RMAN> recover database;
RMAN-06054: media recovery requesting unknown archived log for thread 1 with sequence 11 and starting SCN of 964852828
注意:所有的standby数据库复制工作结束后,删除之前在standby数据库监听器中配置的静态服务名。
步骤13: 启动redo apply
13.1 查看实例状态
sql> select status from v$instance;
shutdown immediate;
startup nomount;
alter database mount standby database;
SQL> select controlfile_type from v$database;
CONTROL
-------
STANDBY
13.2 以只读方式打开standby
sql> alter database open read only;
13.3 启动redo apply
sql> alter database recover managed standby database using current logfile disconnect from session;
从11gR2开始,物理standby数据库在打开的情况下也能应用日志,成为Active DataGuard
注意:如果standby数据库是一个rac数据库,所有节点传送的日志放在共享存储上,只有一个节点会启动MRP进程应用日志