Oracle11g DaraGuard部署
一、DataGuard简介
Oracle DataGuard是Oracle自带的数据同步功能,基本原理是将日志文件从原数据库传输到目标数据库,然后在目标数据库上应用这些日志文件,从而使目标数据库与源数据库保持同步,是一种数据库级别的高可用性方案。
DataGuard可以提供Oracle数据库的冗灾、数据保护、故障恢复等,实现数据库快速切换与灾难性恢复。在生产数据库的保证"事务一致性"时,使用生产库的物理全备份创建备库,备库会通过生产库传输过来的归档日志或重做条目自动维护备用数据库。
DataGuard数据同步技术有以下优势:
1) Oracle数据库自身内置的功能,与每个Oracle新版本的新特性都完全兼容,且不需要另外付费。
2) 配置管理较简单,不需要熟悉其他第三方的软件产品。
3) 物理Standby数据库支持任何类型的数据对象和数据类型;
4) 逻辑Standby数据库处于打开状态,可以在保持数据同步的同时执行查询等操作。
5) 在最大保护模式下,可确保数据的零丢失。
1.1 架构
Oracle DataGuard由一个primary数据库(生产数据库)及一个或多个standby数据库(最多9个)组成。组成Data Guard的数据库通过Oracle Net连接,并且有可以分布于不同地域。只要各库之间可以相互通信,它们的物理位置并没有什么限制,不受操作系统的限制。
1.1.1.Primary 数据库
DataGuard包含一个primary数据库即被大部分应用访问的生产数据库,该库既可以是 单实例数据库,也可以是RAC。
1.1.2.Standby 数据库
Standby数据库是primary数据库的复制(事务上一致)。在同一个Data Guard中可以最多创建9个standby数据库。一旦创建完成,Data Guard通过应用primary数据库的redo自动维护每一个standby数据库。Standby数据库同样即可以是单实例数据库,也可以是RAC结构。
1.2 Standby数据库类型
Standby数据库通常分两类:逻辑standby和物理standby。 逻辑standby
逻辑standby是通过接收primary数据库的redo log并转换成sql语句,然后在standby数据库上执行SQL语句实现同步。 物理standby
物理standby是通过接收并应用primary数据库的redo log以介质恢复的方式实现同步,不仅文件的物理结构相同,连块在磁盘上的存储位置都是一模一样的。
1.3 服务
重做传输服务(Redo Transport Services)
控制redo数据的传输到一个或多个归档目的地。 日志应用服务(Log Apply Services)
应用redo数据到standby数据库,以保持与primary数据库的事务一致。redo数据即可以从standby数据库的归档文件读取,也可直接应用备用日志文件读取。 角色转换服务(Role Transitions)
DataGuard中有两种角色:primary和standby。角色转换就是让数据库在这两个角色中切换, 切换分两种:switchover和failover
1)switchover:转换primary数据库与standby数据库。switchover可以确保不会丢失数据。
2)failover:当primary数据库出现故障并且不能被及时恢复时,会调用failover将一个standby数据库转换为新的primary数据库。在最大保护模式或最高可用性模式下,failover可以保证不会丢失数据。
1.4保护模式
1.4.1 最大保护
这种模式是默认的数据保护模式,在不影响源数据库性能的条件下提供尽可能高的数
据保护等级。在该种模式下,一旦日志数据写到源数据库的联机日志文件,事务即可提交,不必等待日志写到目标数据库,如果网络带宽充足,该种模式可提供类似于最大可用模式的数据保护等级。
1.4.2 最大可用性
这种模式和"最大保护"基本上差不多。正常情况下,主备库之间是同步的。
当网络或者备库出现问题时,不会影响到主库的当机,主库会自动转换库"最大性能"模式,等待备库可用时,将归档传输到备库做恢复。
1.4.3最大性能
这种模式保证主库性能最大化,主备库之间数据是异步传输的。即,主备日志归档以
后才会传输到备用库,在备库上使用归档日志文件做恢复操作。
1.5 安装条件
运行DataGuard需要具备以下几个条件:
1、 在主库和从库的所有机器上必须安装同一个版本的Oracle企业版。
2、 主库必须运行在归档模式下。
3、 主库和从库的操作系统必须一样(允许版本不同),从库可以使用与主库不同的目录结构。
4、 主从库硬件系统的体系结构必须相同。比如:主库运行在64位的Sun Sparc系统上,如果从库是32位的Linux Intel系统就不允许。主从库硬件的配置可以不同,比如:CPU数量、内存大小、存储配置等。
一、环境说明
系统:Red Hat Enterprise Linux Server release 6.3
IP地址 主机名
192.168.24.93 orcl
192.168.24.94 orcldg
预装oracle11gR2 11.2.0.1.0
2台主机名在/etc/hosts都需要配置
二、主库配置
2.1 开启归档并强制日志模式
开启归档
1) shutdown immediate;
2) startup mount;
3) alter database archivelog;
4) ater database open;
5) archive log list;
强制日志模式
alter database force logging;
select name,log_mode,force_logging from v$database;
2.2 创建standby redolog日志组
查看当前线程与日志组的对应关系及日志组的大小:
select thread#,group#,bytes/1024/1024 from v$log;
这里有三组redo log,所以至少需要创建4组Standby redo log,大小均为50M:
alter database add standby logfile group 4('/u01/app/oracle/oradata/orcl/standbyredo01.log') size 50m;
alter database add standby logfile group 5('/u01/app/oracle/oradata/orcl/standbyredo02.log') size 50m;
alter database add standby logfile group 6('/u01/app/oracle/oradata/orcl/standbyredo03.log') size 50m;
alter database add standby logfile group 7('/u01/app/oracle/oradata/orcl/standbyredo04.log') size 50m;
查看standby 日志组的信息:
select group#,sequence#,status, bytes/1024/1024 from v$standby_log;
2.3 创建主库密码文件
su - oracle
orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=oracle force=y
2.4 配置spfile文件
2.4.1 查看spfile的路径:
show parameter spfile;
2.4.2 用spfile创建一个pfile,用于修改:
create pfile='/tmp/initorcl.ora' from spfile;
2.4.3 修改pfile文件:
vim /tmp/initorcl.ora
orcl.__db_cache_size=637534208
orcl.__java_pool_size=16777216
orcl.__large_pool_size=33554432
orcl.__oracle_base='/u01/app/oracle'
orcl.__pga_aggregate_target=671088640
orcl.__sga_target=989855744
orcl.__shared_io_pool_size=0
orcl.__shared_pool_size=268435456
orcl.__streams_pool_size=16777216
*.audit_file_dest='/u01/app/oracle/admin/orcl/adump'
*.audit_trail='db'
*.compatible='11.2.0.1.0'
*.control_files='/u01/app/oracle/oradata/orcl/control01.ctl','/u01/app/oracle/flash_recovery_area/orcl/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='orcl'
*.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=4385144832
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
*.memory_target=1653604352
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'
*.db_unique_name='orclpr'
*.fal_client='orclpr'
*.fal_server='orcldg'
*.standby_file_management='AUTO'
*.log_archive_config='DG_CONFIG=(orclpr,orcldg)'
*.log_archive_dest_1='location=/u01/app/oracle/oradata/orcl/archivelog'
*.log_archive_dest_2='SERVICE=orcldg LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcldg'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'
3.4.4 复制pfile文件到spfile:
shutdown immediate;
create spfile from pfile='/tmp/initorcl.ora';
startup;
2.5 修改监听文件,添加静态监听
vi $ORACLE_HOME/network/admin/listener.ora
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.24.93)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
(SID_NAME = orcl)
)
)
ADR_BASE_LISTENER = /u01/app/oracle
SAVE_CONFIG_ON_STOP_LISTENER = ON
重启监听服务:
lsnrctl stop
lsnrctl start
2.6 编辑网络服务名配置文件tnsnames.ora
vi $ORACLE_HOME/network/admin/tnsnames.ora,添加内容
orcldg =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.24.94)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
orclpr =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.24.93)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
tnsping测试:
tnsping orcldg
三、备库配置:
3.1 将主库中的密码文件、pfile文件、监听文件复制到备库中
主库使用Oracle用户操作
cd /u01/app/oracle/product/11.2.0/dbhome_1/dbs
scp orapworcl 192.168.24.94:/u01/app/oracle/product/11.2.0/dbhome_1/dbs/
scp /tmp/initorcl.ora 192.168.24.94:/tmp/
cd /u01/app/oracle/product/11.2.0/dbhome_1/network/admin
scp listener.ora 192.168.24.94:/u01/app/oracle/product/11.2.0/dbhome_1/network/admin/
scp tnsnames.ora 192.168.24.94:/u01/app/oracle/product/11.2.0/dbhome_1/network/admin/
3.2 手工创建所需的目录
su - oracle
mkdir -p /u01/app/oracle/admin/orcl/adump
mkdir -p /u01/app/oracle/admin/orcl/dbdump
mkdir -p /u01/app/oracle/admin/orcl/pfile
mkdir -p /u01/app/oracle/oradata/orcl
mkdir -p /u01/app/oracle/flash_recovery_area/orcl
mkdir -p /u01/app/oracle/oradata/orcl/archivelog
3.3 配置spfile文件
从库修改pfile文件:
vim /tmp/initorcl.ora
orcl.__db_cache_size=637534208
orcl.__java_pool_size=16777216
orcl.__large_pool_size=33554432
orcl.__oracle_base='/u01/app/oracle'
orcl.__pga_aggregate_target=671088640
orcl.__sga_target=989855744
orcl.__shared_io_pool_size=0
orcl.__shared_pool_size=268435456
orcl.__streams_pool_size=16777216
*.audit_file_dest='/u01/app/oracle/admin/orcl/adump'
*.audit_trail='db'
*.compatible='11.2.0.1.0'
*.control_files='/u01/app/oracle/oradata/orcl/control01.ctl','/u01/app/oracle/flash_recovery_area/orcl/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='orcl'
*.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=4385144832
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
*.memory_target=1653604352
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'
*.db_unique_name='orcldg'
*.fal_client='orcldg'
*.fal_server='orclpr'
*.standby_file_management='AUTO'
*.log_archive_config='DG_CONFIG=(orclpr,orcldg)'
*.log_archive_dest_1='location=/u01/app/oracle/oradata/orcl/archivelog'
*.log_archive_dest_2='SERVICE=orclpr LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orclpr'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'
3.3 复制pfile文件到spfile
shutdown immediate;
create spfile from pfile='/tmp/initorcl.ora';
startup nomount;
3.4 修改监听文件
vi $ORACLE_HOME/network/admin/listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
(SID_NAME = orcl)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.24.94)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
ADR_BASE_LISTENER = /u01/app/oracle
重启监听服务:
lsnrctl stop
lsnrctl start
3.5 tnsping测试
tnsping orcldg
tnsping orclpr
3.7 启动备库到nomount
shutdown immediate;
startup nomount;
3.8 利用RMAN在备库上恢复主库
alter user sys identified by password,主从库修改sys密码
rman target sys/oracle@orclpr auxiliary sys/oracle@orcldg
duplicate target database for standby from active database nofilenamecheck;
过程中如报错RMAN-05501: aborting duplication of target database
说明使用了catalog,但是在连接的时候没有指定catalog,需要用下面的连接方式:
rman target sys/password@orclpr auxiliary sys/password@orcldg nocatalog
3.9 登陆备库并查看数据库当前状态
select status from v$instance;
RMAN恢复完直接就是mount状态。
3.10 备库启动日志应用
alter database recover managed standby database disconnect from session;
select sequence#,applied from v$archived_log order by 1;
3.11 分别查看主库和备库的归档序列号是否一致
先在主库手动切换一下日志再查看:
alter system switch logfile;
archive log list;
再在备库上查看:
参数一致
四、DataGuard日常维护
4.1 正确打开主库和备库
主库
SQL> STARTUP MOUNT;
SQL> ALTER DATABASE OPEN;
备库 :
SQL> STARTUP MOUNT;
SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
4.2 正确关闭顺序
备库 :
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
SQL>SHUTDOWN IMMEDIATE;
主库
SQL>SHUTDOWN IMMEDIATE;
4.3 备库 Read-Only Read-Only模式打开
当前主库正常 OPEN 状态 、 备库处于日志传送状态 .
在备库停止日志传送
SQL> recover managed standby database cancel;
备库 Read-only 模式打开
SQL> alter database open read only;
备库回到日志传送模式
SQL> recover managed standby database disconnect from session;
手工令备库应用归档日志
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
五、测试DataGuard
5.1 先开启主备数据库的监听,在主库和备库分别登录,如果能登录说明监听没问题。
5.2 在主库上 startup启动数据库到open
5.3 在备库上 startup mount
启动redo 应用
SQL> alter database recover managed standby database disconnect from session;
查看同步情况,分别主从库上查询
SQL> show parameter instance_name;
SQL> select sequence#, first_time, next_time, applied, fal from v$archived_log order by sequence#;
5.4 数据验证
最后,我们在主库上创建一个表并插入一些数据,然后模拟日志切换,最后在备库上验证数据的传输情况。
主库上建测试表
主库上模拟日志切换:alter system archive log current;
以只读模式打开备库,验证数据 alter database recover managed standby database cancel;
ORA-16136: Managed Standby Recovery not active
报错运行 recover managed standby database disconnect from session
alter database open read only;
验证主库数据是否过来
六、主备库切换
6.1 将主库切换到备用状态
查看主库角色
select name,open_mode,protection_mode,database_role from v$database;
alter database commit to switchover to physical standby;
shutdown immediate
startup nomount;
alter database mount standby database;
select name,open_mode,protection_mode,database_role from v$database;
alter database recover managed standby database disconnect from session;
6.2 将备库转换成主库模式
alter database commit to switchover to primary;
报错运行 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
shutdown immediate
startup mount
alter database commit to switchover to primary;
select name,open_mode,protection_mode,database_role from v$database;