11g搭建DataGuard的步骤(物理standby)
概要原理
DataGuard是通过建立一个PRIMARY和STANDBY组来确立其参照关系;STANDBY一旦创建,DataGuard就会通过将主数据库(PRIMARY)的REDO传递给STANDBY数据库,然后在STANDBY中应用REDO实现数据库的同步。有两种类型的STANDBY:物理STANDBY和逻辑STANDBY,物理STANDBY提供与主数据库完全一样的拷贝(块到块),数据库SCHEMA,包括索引都是一样的。它是直接应用REDO实现同步的。逻辑STANDBY则不是这样,在逻辑STANDBY中,逻辑信息是相同的,但物理组织和数据结构可以不同,它和主库保持同步的方法是将接收的REDO转换成SQL语句,然后在STANDBY上执行SQL语句。逻辑STANDBY除灾难恢复外还有其它用途,如用户查询和报表等。
二种传输模式
async(异步)和sync(同步)。异步传输模式就是指主库不必要等待备库应用redo的确认消息,就会完成提交工作,但是增加了数据丢失的风险性。同步传输模式就是指主库等待备库应用redo的确认消息,才会完成提交工作,如果一直收不到备份发来的确认信息,普通模式下会通过net_timeout值超时,继续完成本次操作,当存在于最大保护模式下时候,就会导致数据库夯住。
三种数据保护模式
1.最大保护模式
1)这种模式提供了最高级别的数据保护能力;
2)要求至少一个物理备库收到重做日志后,主库的事务才能够提交;
3)主库找不到合适的备库写入时,主库会自动关闭,防止未受保护的数据出现;
4)优点:该模式可以保证备库没有数据丢失;
5)缺点:主库的自动关闭会影响到主库的可用性,同时需要备库恢复后才能提交,对网络等客观条件要求非常的高,主库的性能会因此受到非常大的冲击。
2.最大可用性模式
1)该模式提供了仅次于“最大保护模式”的数据保护能力;
2)要求至少一个物理备库收到重做日志后,主库的事务才能够提交;
3)主库找不到合适的备库写入时,主库不会关闭,而是临时降低到“最大性能模式”模式,直到问题得到处理;
4)优点:该模式可以在没有问题出现的情况下,保证备库没有数据丢失,是一种折中的方法;
5)缺点:在正常运行的过程中缺点是主库的性能受到诸多因素的影响。
3.最大性能模式
1)该模式是默认模式,可以保证主数据库的最高可用性;
2)保证主库运行过程中不受备库的影响,主库事务正常提交,不因备库的任何问题影响到主库的运行;
4)优点:避免了备库对主数据库的性能和可用性影响;
5)缺点:如果与主库提交的事务相关的恢复数据没有发送到备库,这些事务数据将被丢失,不能保证数据无损失;
示例
参照前人的文档,加自己的实际环境做的测试:
项目 | primary库 | standby库 |
---|---|---|
操作系统版本 | OEL6.4 | OEL6.4 |
oracle版本 | 11.2.0.4.0 | 11.2.0.4.0 |
ip | 192.168.3.11 | 192.168.3.12 |
db_unique_name | his | his_dg |
1.在primary上安装oracle并建实例,在standby上安装oracle但不建实例(安装操作不再赘述,只对重要步骤做一些解释说明。用的OEL所以直接yum安装oracle-rdbms即可解决大部分依赖包)
> yum install oracle-rdbms-server-11gR2-preinstall
3.查看primary库归档模式
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 332
Next log sequence to archive 336
Current log sequence 336
SQL>
4.重建密码文件
充分利用主数据库原来环境,尽量不对主数据库参数配置作过多的修改。
orapwd file=’$ORACLE_HOME/dbs/orapwhis’ password oracle entries=10 force=y
4.1强制归档primary库,打开Forced Logging 模式
SQL>alter database force logging;
4.2修改主库参数文件
SQL>alter system set INSTANCE_NAME=’his’ scope=spfile;
SQL>alter system set DB_UNIQUE_NAME=’his’ scope=spfile;
SQL>alter system set LOCAL_LISTENER=’primary’ scope=spfile;
SQL>alter system set LOG_ARCHIVE_CONFIG=’DG_CONFIG=(his,his_dg)’;
SQL> alter system set LOG_ARCHIVE_DEST_1=’LOCATION=/u01/ora_rman/arc valid_for= (all_logfiles,all_roles) db_unique_name=his’ scope=both;
SQL>alter system set LOG_ARCHIVE_DEST_2=’SERVICE=standby lgwr async affirm valid_for=(online_logfiles,primary_role) db_unique_name=his_dg’ scope=both;
alter system set LOG_ARCHIVE_FORMAT=’ARC_%T_%S_%R.arc’ scope=both;
alter system set LOG_ARCHIVE_MAX_PROCESSES=5 scope=both;
alter system set FAL_CLIENT=’primary’ scope=both;
alter system set FAL_SERVER=’standby’ scope=both;
alter system set STANDBY_FILE_MANAGEMENT=AUTO scope=both;
alter system set STANDBY_ARCHIVE_DEST=’/u01/ora_rman/archlog_oradb’ scope=both;
5.修改监听文件
vim /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora 结果如下
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.11)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = his)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)
(SID_NAME = his)
)
)
ADR_BASE_LISTENER = /u01/app/oracle
6.修改tns配置文件
vim tnsnames.ora 结果如下
PRIMARY=
(DESCRIPTION =
(ADDRESS =
(PROTOCOL = TCP)(HOST = 192.168.3.11)(PORT = 1521))
(CONNECT_DATA = (SERVER = DEDICATED)
(SERVICE_NAME = his)
)
)
STANDBY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.12)(PORT = 1521))
(CONNECT_DATA = (SERVER = DEDICATED)
(SERVICE_NAME = his_dg)
)
)
7.监听服务重启
lsnrctl stop
lsnrctl start
8. primary上配置最大可用模式
SQL>startup
SQL>alter database set standby database to maximize availability;
9.备份数据库
RMAN> sql ”alter system archive log current”;
RMAN>backup database include current controlfile for standby plus archivelog;
10.在主库上建立备库控制文件
alter database create standby controlfile as ‘/u01/ora_rman/st_control.ctl’;
cp st_control.ctl control01.ctl
cp st_control.ctl control02.ctl
cp st_control.ctl control03.ctl
11.添加standby的redo文件
shutdown immediate
startup mount
alter database add standby logfile
alter database add standby logfile
group 4 ‘/u01/app/oracle/oradata/his/redo04.log’ size 50M,
group 5 ‘/u01/app/oracle/oradata/his/redo05.log’ size 50M,
group 6 ‘/u01/app/oracle/oradata/his/redo06.log’ size 50M,
group 7 ‘/u01/app/oracle/oradata/his/redo07.log’ size 50M;
alter database open;
12.standby上准备参数文件
scp 复制主库3.11上的inithis.ora文件到3.12对应/u01/app/oracle/product/11.2.0/db_1/dbs目录
并且vim inithis.ora 结果如下
his.__db_cache_size=469762048
his.__java_pool_size=16777216
his.__large_pool_size=33554432
his.__oracle_base=’/u01/app/oracle’#ORACLE_BASE set from environment
his.__pga_aggregate_target=486539264
his.__sga_target=704643072
his.__shared_io_pool_size=0
his.__shared_pool_size=167772160
his.__streams_pool_size=0
*.audit_file_dest=’/u01/app/oracle/admin/his/adump’
*.audit_trail=’db’
*.compatible=’11.2.0.4.0’
*.control_files=’/u01/app/oracle/oradata/his/control01.ctl’,’/u01/app/oracle/oradata/his/control02.ctl’
*.db_block_size=8192
*.db_domain=”
*.db_name=’his’
*.db_recovery_file_dest=’/u01/app/oracle/fast_recovery_area’
*.db_recovery_file_dest_size=4385144832
*.db_unique_name=’his_dg’
*.diagnostic_dest=’/u01/app/oracle’
*.dispatchers=’(PROTOCOL=TCP) (SERVICE=hisXDB)’
*.fal_client=’standby’
*.fal_server=’primary’
*.instance_name=’his’
*.local_listener=’standby’
*.log_archive_config=’DG_CONFIG=(his,his_dg)’
*.log_archive_dest_1=’LOCATION=/u01/ora_rman/arc valid_for=(all_logfiles,all_roles) db_unique_name=his_dg’
*.log_archive_dest_2=’SERVICE=primary lgwr async affirm valid_for=(online_logfiles,primary_role) db_unique_name=his’
*.log_archive_format=’ARC_%T_%S_%R.arc’
*.log_archive_max_processes=5
*.memory_target=1180696576
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile=’EXCLUSIVE’
*.standby_archive_dest=’/u01/ora_rman/archlog_oradb’
*.standby_file_management=’AUTO’
*.undo_tablespace=’UNDOTBS1’
13.通过主库镜像创建所有的生产库的文件目录,保持文件路径一致。
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1
export ORACLE_SID=his
mkdir -p ORACLEBASE/admin/ ORACLE_SID/adump
mkdir -p ORACLEBASE/oradata/ ORACLE_SID
mkdir -p ora_rman/arc
mkdir -p /u01/ora_rman/archlog_oradb
14.拷贝文件到备库主机
backup_%T_%s_%p.bak control01/02/03.ctl initoradb.ora
cd /ora_rman/
scp backup*.bak oracle@192.168.3.12:/u01/ora_rman/
scp initfxopt.ora oracle@192.168.3.12: ORACLEHOME/dbs/scporapwfxoptoracle@192.168.3.12: ORACLE_HOME/dbs/
scp control*.ctl oracle@192.168.3.12: ORACLEBASE/oradata/ ORACLE_SID
15.在standby库 修改监听配置文件
参照主库修改
建议是直接从primary传一份过来,修改一下。
17.在standby修改tns文件
参照主库修改
建议是直接从primary传一份过来。
18.启动standby库nomount状态
启动备库到nomount状态
create spfile from pfile;
startup nomount;
alter database mount standby database;
此过程可能会报错,好好查查是不是闪回区等文件夹没手动创建好。
19.恢复数据库
备库做RMAN恢复
RMAN> restore database;
RMAN> restore archivelog all;
介质恢复后,rman 自动将standby 数据库打开到mount 状态。
20.配置standby redolog
alter database add standby logfile group 4 ‘/u01/app/oracle/oradata/his/redo04.log’ size 50M,
group 5 ‘/u01/app/oracle/oradata/his/redo05.log’ size 50M,
group 6 ‘/u01/app/oracle/oradata/his/redo06.log’ size 50M,
group 7 ‘/u01/app/oracle/oradata/his/redo07.log’ size 50M;
21.启动数据库 查看数据库角色、角色切换、保护模式
SQL> alter database recover managed standby database disconnect from session;
SQL> select database_role,switchover_status,protection_mode,protection_level from v$database;
22.验证配置是否成功
SQL> archive log list;
检查主备之间的归档日志Current log sequence是否相同,相同则说明配置成功
23.DataGuard维护命令
1主库切换为备库 alter database commit to switchover to physical standby;
主库有会话连接的时候 alter database commit to switchover to physical standby with session shutdown;
shutdown immediate
startup nomount
alter database mount standby database;
alter database recover managed standby database disconnect from session;2.从库切换为主库 alter database commit to switchover to primary;
shutdown immediate;
startup
alter system switch logfile;
3. 从库打开只读实时应用模式 alter database recover managed standby database cancel;
alter database open;
alter database recover managed standby database using current logfile disconnect;
4.检查切换状态 select open_mode,database_role,db_unique_name from v$database;