? 说明
线上有套oracle库通过物化视图定时刷新到另外库来实现主备的,其经常出现物化视图刷新Job异常,导致数据未同步;并且此种方式,假如真的主库挂了,那么将备库的物化视图转化为表的过程也会很痛苦,于是,最终决定放弃此种方式来做伪在线备份。
Oracle自身有在线standby的解决方案- DataGuard
它是在主节点与备用节点间通过日志同步来保证数据的同步,可以实现数据库快速切换与灾难性恢复。
综上,选用成熟的DataGuard来做在线Standby肯定优于物化视图的方法
关于DataGurad的详细知识,请参考oracle官方文档等
l 实施过程
l 环境规划
主机地址 | 10.10.10.65 | 10.10.10.200 |
角色 | primary | standby |
OS版本 | RHEL 6.5 | RHEL 6.5 |
DB版本 | Oracle 11.2.0.1.0 - 64bit 企业版 | |
instance_name | orcl | orcl |
db_name | orcl | orcl |
db_unique_name | orcl | orcl_stby |
1准备工作
1.1清除遗留脏数据
#primary
#删除旧的ygis和ygdw用户,同时删除其下所有对象
Drop user username cascade;
#删除之前创建的物化视图log
select ' drop materialized view log on '||LOG_OWNER||'.'||master||';' from dba_mview_logs;
1.2 standby安装oracle soft
略。。。。。。
1.3关闭防火墙和selinux
#primary and standby
~]# iptables -F
~]# iptables -t nat -F
~]# /etc/init.d/iptables stop
~]# chkconfig iptables off
~]# chkconfig --list iptables
iptables 0:off 1:off 2:off 3:off 4:off 5:off 6:off
~]# grep SELINUX= /etc/selinux/config |grep ^[^#]
SELINUX=disabled
#若不为disabled,vi /etc/selinux/config 修改为disabled
2.配置dataguard
2.1.Primary数据库
2.1.1确认是否支持dataguard
SQL> select * from v$option where parameter = 'Managed Standby';
PARAMETER VALUE
---------------------------------------------------------------- ----------------------------------------------------------------
Managed Standby TRUE
2.1.2打开归档
#归档位置
~]$ mkdir -p /data/oracle/arch
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;
2.1.3启用force logging
alter database force logging;
2.1.4修改DG相关参数的值
ALTER SYSTEM SET DB_UNIQUE_NAME='orcl' SCOPE=SPFILE;
ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(orcl,orcl_stby)';
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=/data/oracle/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl';
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=orcl_stby OPTIONAL LGWR SYNC AFFIRM COMPRESSION=ENABLE VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl_stby';
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_1='enable';
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2='enable';
ALTER SYSTEM SET LOG_ARCHIVE_FORMAT='%t_%s_%r.arc' SCOPE=SPFILE;
ALTER SYSTEM SET REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE SCOPE=SPFILE;
ALTER SYSTEM SET FAL_SERVER='orcl_stby';
ALTER SYSTEM SET FAL_CLIENT='orcl';
ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO;
ALTER SYSTEM SET DB_FILE_NAME_CONVERT='/data/oracle/oradata/orcl_stby','/data/oracle/oradata/orcl' SCOPE=SPFILE;
ALTER SYSTEM SET LOG_FILE_NAME_CONVERT='/data/oracle/oradata/orcl_stby','/data/oracle/app/oradata/orcl' SCOPE=SPFILE;
#请记住,有些参数不能修改,所以数据库将需要重新启动才能生效。
标识红颜色的是 primary数据库对应信息,绿颜色的是standby数据库对应信息,需要格外注意,不要搞混了,另外,标识紫色的参数是11g新加的,即支持压缩日志传输,使得传输效率更高效,更小网络负载。
SQL> shutdown immediate
SQL> startup
2.1.5检查参数
SQL> select log_mode,FORCE_LOGGING from v$database;
LOG_MODE FOR
------------ ---
ARCHIVELOG YES
SQL>show parameter db_name
SQL>show parameter db_unique_name
SQL> show parameter LOG_ARCHIVE_DEST_
SQL> show parameter DB_FILE_NAME_CONVERT
SQL> show parameter LOG_FILE_NAME_CONVERT
2.1.6生成standby对应的pfile
#在primary生成pfile
create pfile='/tmp/orcl_stby.ora' from spfile;
#修改下面dg相关参数为standby的即可
*.db_unique_name='orcl_stby'
*.fal_client='orcl_stby'
*.fal_server='orcl'
*.log_archive_dest_1='LOCATION=/data/oracle/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl_stby'
*.LOG_ARCHIVE_DEST_2='SERVICE=orcl_stby OPTIONAL LGWR SYNC AFFIRM COMPRESSION=ENABLE VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl_stby';
ALTER SYSTEM SET DB_FILE_NAME_CONVERT='/data/oracle/oradata/orcl','/data/oracle/oradata/orcl_stby' SCOPE=SPFILE;
ALTER SYSTEM SET DB_FILE_NAME_CONVERT='/data/oracle/app/oradata/orcl','/data/oracle/oradata/orcl_stby' SCOPE=SPFILE;
ALTER SYSTEM SET LOG_FILE_NAME_CONVERT='/data/oracle/app/oradata/orcl','/data/oracle/oradata/orcl_stby' SCOPE=SPFILE;
#注意:如果ORACLE_BASE与primary的不一致,相关dump目录等其他位置需要替换为standby实际的
2.1.7密码文件
创建密码文件,以下是linux/unix系统创建命令:
orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=oracle entries=5 force=y
注意:
1.如果原来已经创建过密码文件,需要加force=y参数,强制覆盖;
2.Standby数据库密码需要与此文件密码设置完全一致,否则日志传输会有问题
2.1.8配置listener.ora
#编辑监听配置文件
~]$ cat /data/oracle/app/product/11.2.0/dbhome_1/network/admin/listener.ora
# listener.ora Network Configuration File: /data/oracle/app/product/11.2.0/dbhome_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.65)(PORT = 1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = /data/oracle/app/product/11.2.0/dbhome_1)
(SID_NAME = orcl)
)
)
ADR_BASE_LISTENER = /data/oracle/app
注:标识为黄颜色的地方需要根据实际情况修改。
#修改完成之后,监听需要重启,方法如下
lsnrctl stop
lsnrctl start
lsnrctl status
Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...
有一个unknown 的表示此处为静态监听,另一个 READY 的为动态监听,在监听重启1分钟以后,会自动注册。
2.1.9配置tns
~]$ cat /data/oracle/app/product/11.2.0/dbhome_1/network/admin/tnsnames.ora
# tnsnames.ora Network Configuration File: /data/oracle/app/product/11.2.0/dbhome_1/network/admin /tnsnames.ora
# Generated by Oracle configuration tools.
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.65)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
ORCL_STBY =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.200)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
注:标识为绿的地方需要根据实际情况修改。
2.2.Standby数据库
2.2.1密码文件、监听、tns、pfile文件配置
拷贝primary上的生成的standby pfile文件密码文件、listener.ora、tnsname.ora相关配置文件到standby相应的目录
3部署standby
创建standby有不止一个方法,以下介绍最简单的方法,即直接用duplicate命令;
在使用该命令时,先说下使用该命令的注意事项:
1) 使用rman连target数据库时,不能使用操作系统认证,只能使用密码方式连接;
2) 源数据库必须在mount或者open状态,如果在open状态,必须打开归档,如果数据库不是open状态的,则数据库必须已经处于一致性;
3) 使用rman连接auxiliary数据库时,即使standby与primary在同一台服务器上,也要使用tns去连接;
4) 如果创建的不是standby数据库,那么密码文件不会自动复制;
5) 必须要使用具有sysdba权限的用户连接;
6) 在使用active database duplication时,不能使用until;
在清楚了以上限制条件之后,就可以开始操作了。
3.1 standby到nomount状态
startup nomount pfile=’/tmp/orcl_stby.ora'
3.2 rman复制数据
3.2.1使用rman DUPLICATE FROM ACTIVE DATABASE建立dg
rman TARGET sys/oracle@orcl AUXILIARY sys/oracle@orcl_stby
DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE DORECOVER NOFILENAMECHECK;
个别条款的简要说明如下所示。
? FOR STANDBY :这告诉DUPLICATE命令是用于待机,所以不会强制一个DBID改变。
? FROM ACTIVE DATABASE的DUPLICATE将被创建,直接从源数据文件,无需额外的备份步骤。
? DORECOVER :该DUPLICATE将包括恢复步骤,使待机可达目前的时间点。(此选项不需要额外备份)
? NOFILENAMECHECK :目标文件的位置不检查(主备dbfile logfile路径一致不需要此选项)。
一旦命令完成后,我们就可以启动应用进程。
from active database也是11g之后才推出的新功能,该功能支持源数据库在active的环境下,直接执行standby数据库的创建,而不会遇到以前10g的时候还需要先备份,然后再传输、恢复这种比较费时的缺陷,效率上有了很大的提升。
3.2.2使用rman DUPLICATE方式建立dg
#备份主库
rman TARGET
run{
configure channel device type disk format '/home/oracle/rmanbk/%d_%I_%s_%p.bkp';
backup as compressed backupset database include current controlfile for standby plus archivelog;
}
复制备份集到备库,目录路径要一致
#使用rman恢复数据库
rman TARGET sys/oracle@orcl AUXILIARY sys/oracle@orcl_stby
DUPLICATE TARGET DATABASE FOR STANDBY DORECOVER NOFILENAMECHECK;
3.3.3使用rman恢复方式建立dg
#主库
rman target /
backup full format=’/tmp/FULL_%U’ database plus archivelog;
#sqlplus中,生成standby controlfile
ALTER DATABASE CREATE STANDBY CONTROLFILE AS ‘/tmp/control01.ctl’;
#备库:拷贝主库上的备份和STANDBY CONTROLFILE到备库相应位置
a.使用修改的参数文件启动standby至nomount状态
b.开启数据库至mount状态
alter database mount standby database;
c.使用rman开始还原数据库
restore database;
以上完成之后,standby的创建也就基本完成了,但还需要一些收尾工作,但也是至关重要的
3.3 standby添加standby redo log
standby redo log 的添加原则:
1) 要与online redo log大小一致;
2) 要比online redo log至少多一组,如果primary数据库时rac,则online redo log要将rac的thread加起来
ALTER DATABASE ADD STANDBY LOGFILE ('/data/oracle/oradata/orcl_stby/standby_redo01.log') SIZE 512M;
ALTER DATABASE ADD STANDBY LOGFILE ('/data/oracle/oradata/orcl_stby/standby_redo02.log') SIZE 512M;
ALTER DATABASE ADD STANDBY LOGFILE ('/data/oracle/oradata/orcl_stby/standby_redo03.log') SIZE 512M;
ALTER DATABASE ADD STANDBY LOGFILE ('/data/oracle/oradata/orcl_stby/standby_redo04.log') SIZE 512M;
3.4 primary添加standby redo log
执行命令与上一致,注意logfile文件位置
ALTER DATABASE ADD STANDBY LOGFILE ('/data/oracle/app/oradata/orcl/standby_redo01.log') SIZE 512M;
ALTER DATABASE ADD STANDBY LOGFILE ('/data/oracle/app/oradata/orcl/standby_redo02.log') SIZE 512M;
ALTER DATABASE ADD STANDBY LOGFILE ('/data/oracle/app/oradata/orcl/standby_redo03.log') SIZE 512M;
ALTER DATABASE ADD STANDBY LOGFILE ('/data/oracle/app/oradata/orcl/standby_redo04.log') SIZE 512M;
3.5 standby创建spfile
SQL> create spfile from pfile=’/tmp/orcl_stby.ora’;
使用spfile重启数据库至mount状态
shutdown immediate
startup mount
3.6 开启日志应用
–11g支持redo apply状态下open
alter database open;
–开启归档日志应用
alter database recover managed standby database disconnect from session;
–开启实时应用
alter database recover managed standby database using current logfile disconnect from session;
3.7 primary修改数据保护模式
3.7.1查看当前保护模式
SQL> select OPEN_MODE, DATABASE_ROLE,protection_mode,protection_level from v$database;
PROTECTION_MODE PROTECTION_LEVEL
-------------------- --------------------
MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE
默认是最大性能保护模式;
3.7.2 修改初始化参数
由于开始配置参数时,就考虑到要修改数据保护模式,所以之前已经将参数修改了,如下:
SQL> show parameter log_archive_dest_2
3.7.3 修改保护模式
命令如下:
SQL>alter database set standby database to maximize availability;
3.7.4 重启数据库
shutdown immediate
startup
3.7.5 查看当前保护模式
SQL> show parameter db_unique_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_unique_name string orcl
SQL>
SQL> select protection_mode,protection_level from v$database;
PROTECTION_MODE PROTECTION_LEVEL
-------------------- --------------------
MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY
3.8 standby查看当前保护模式
SQL> show parameter db_unique_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_unique_name string orcl_stby
SQL> select protection_mode,protection_level from v$database;
PROTECTION_MODE PROTECTION_LEVEL
-------------------- --------------------
MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY
3.9 开启read only
由于11g的adg特性,使得standby在recover期间也可以提供对外查询服务。但如何开启也需要遵循一定的原则:
1) 在mount状态下,执行 alter database open;
2) 然后开启日志应用,alter database recover managed standby database disconnect from session;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
注意:以上执行顺序绝对不能颠倒。
如果不打算开启read only服务了怎么操作,步骤如下:
【standby】
1) alter database recover managed standby database cancel;
2) shutdown immediate
3) startup mount
4) alter database recover managed standby database disconnect from session;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
至此,此dataguard环境已经全部配置完成。
3.10在主库中查看第二存档终点是否有异常
col dest_name for a30
col error for a40
select dest_name,status,error,target,process from v$archive_dest where substr(dest_name,-1) in (1,2);
4数据同步验证
省略
5备份部署
在primary节点上部署
#每天23:15分 全备数据库
]$ crontab -l
15 23 * * * /data/sh/rman_fullbackup.sh
#备份脚本
]$ cat /data/sh/rman_fullbackup.sh
#!/bin/bash
TIME=`date +%Y%m%d_%H%M`
days=`date +%F`
rm -rf /data/backup/$days
mkdir /data/backup/$days
chown -R oracle:oinstall /data/backup/$days
chmod -R 775 /data/backup/$days
baklog=/data/backup/$days/rmanbk_$days.log
synclog=/data/backup/$days/sync_$days.log
. /home/oracle/.bash_profile
export ORACLE_SID=orcl
echo "==================start rman bakcup at $TIME==================" >>$baklog
$ORACLE_HOME/bin/rman target / <<EOF >>$baklog 2>&1
run
{
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 3 DAYS;
CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY;
allocate channel c1 type disk;
allocate channel c2 type disk;
allocate channel c3 type disk;
sql 'alter system archive log current';
backup as compressed backupset database format '/data/backup/$days/%d_%I_%s_%p_%T.bkp' include current controlfile;
sql 'alter system archive log current';
backup spfile format '/data/backup/$days/spfile_%d_%I_%s_%p_%T.bkp';
backup as compressed backupset archivelog all format '/data/backup/$days/archivelog_%d_%I_%s_%p_%T.bkp' delete input;
backup current controlfile format '/data/backup/$days/control_%d_%I_%s_%p_%T.bkp';
release channel c1;
release channel c2;
release channel c3;
}
delete noprompt obsolete;
crosscheck backup;
report obsolete;
delete noprompt expired backup;
EOF
find /data/backup/ -name "20*" -type d -mtime 10|xargs rm -rf
TIME=`date +%Y%m%d_%H%M`
echo "==================end bakcup at $TIME==================" >>$baklog
#######################################sync######################################################
echo "===================Start backup to storage137 `date '+%Y%m%d_%H%M'`===================" >>$synclog
nohup rsync -avzP /data/backup/ dbbackup@10.10.10.xxx::dB_bak/ >>$synclog 2>&1 &
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/27000195/viewspace-1817320/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/27000195/viewspace-1817320/