ORACLE双机教程
1. 双机热备的概念
双机热备这一概念包括了广义与狭义两种意义。
从广义上讲,双机热备(双机容错)就是对于重要的服务,使用两台服务器,互相备份,共同执行同一服务。当一台服务器出现故障时,可以由另一台服务器承担服务任务,从而在不需要人工干预的情况下,自动保证系统能持续提供服务
双机热备由备用的服务器解决了在主服务器故障时服务不中断的问题。但在实际应用中,可能会出现多台服务器的情况,即服务器集群
双机热备一般情况下需要有共享的存储设备。但某些情况下也可以使用两台独立的服务器
实现双机热备,需要通过专业的集群软件或双机软件
从狭义上讲,双机热备特指基于active/standby方式的服务器热备。服务器数据包括数据库数据同时往两台或多台服务器写,或者使用一个共享的存储设备。在同一时间内只有一台服务器运行。当其中运行着的一台服务器出现故障无法启动时,另一台备份服务器会通过双机软件的诊测(一般是通过心跳诊断)将standby机器激活,保证应用在短时间内完全恢复正常使用。
2. oracle双机备份方法
2.1创建Standby Database 要求
1、 Primary(主) 与standby(备) 数据库所在主机上的Oracle server及操作系统版本必须相同,且具有相同的补丁;
2、primary数据库必须为archive mode(归档模式);Standby Database也必须为archive mode ;
2.2双机热备的步骤
安装Primary数据库(如已有数据库省略此步骤)。
首先查看Primary Database的归档模式
方法如下:
SQL> archive log list;
SQL> select force_logging from v$database
如为非归档模式,则修改为归档模式。
方法如下:
如里当前启动以SPFILE方式启动,则需要创建PFILE文件,改为以PFILE方式启动。
具体方法如下:
查看启动方式:
显示spfile不为空则为SPFILE方式启动。则创建PFILE。
到相应目录下,如创建成功,则目录下将存在INIT%ORACLE_SID%.ORA文件,则原SPFILE%ORACLE_SID%.ORA改名。重新启动数据库。
查看spfile参数,显示为空则以PFILE方式启动。
检测是主库是否能够在归档模式下运行。
SQL>alter system switch logfile;
如果成功则,相应的日志目录下产生归档日志文件。
安装Standby数据库(不创建数据库,只安装软件)
如没监听服务--在--net config 助手---配置一下即出现监听服务
拷贝主机上已经有相应文件到备机相同目录下
包括数据文件和口令文件到备机中,目录与主机相同(拷贝前将主机数据库关闭,不包括控制文件)。注:拷贝前注意关闭数据库。
在主机上修改参数文件
修改INIT%ORACLE_SID%.ORA文件中的参数,加入: 红色部分
*.aq_tm_processes=1
*.background_dump_dest='C:/oracle/admin/cgsdzda/bdump'
*.compatible='9.2.0.0.0'
*.control_files='d:/oracle/oradata/cgsdzda/CONTROL01.CTL','d:/oracle/oradata/cgsdzda/CONTROL02.CTL','d:/oracle/oradata/cgsdzda/CONTROL03.CTL'
*.core_dump_dest='C:/oracle/admin/cgsdzda/cdump'
*.db_block_size=8192
*.db_cache_size=658291200
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='cgsdzda'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=cgsdzdaXDB)'
*.fast_start_mttr_target=300
*.hash_join_enabled=TRUE
*.instance_name='cgsdzda'
*.java_pool_size=20971520
*.job_queue_processes=10
*.large_pool_size=52428800
*.open_cursors=300
*.pga_aggregate_target=52428800
*.processes=150
*.query_rewrite_enabled='FALSE'
*.remote_login_passwordfile='EXCLUSIVE'
*.shared_pool_size=209715200
*.sort_area_size=524288000
*.star_transformation_enabled='FALSE'
*.timed_statistics=TRUE
*.undo_management='AUTO'
*.undo_retention=10800
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='C:/oracle/admin/cgsdzda/udump'
*.log_archive_dest_1='LOCATION=C:/oracle/oradata/cgsdzda/archive'
*.log_archive_format='%t_%s.dbf'
*.log_archive_start=true
*.log_archive_dest_2 = 'service=standby optional reopen=5 MAX_FAILURE=5000'
*.log_archive_dest_state_2=enable
*.archive_lag_target=1800
*.service_names = 'cgsdzda'
其中log_archive_dest_1 是指主机归档日志文件存放的位置,可根据实际情况来设定,如E 盘空间较大,可以设为:log_archive_dest_1 =e:/oracle/database/archive
在Primary 服务中修改tnsnames.ora中 增加
standby =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 68.16.50.48)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = testDB)
)
)
在备机上注册服务
C:/>oradim -new -sid testDB -startmode m
C:/>oradim -edit -sid testDB -startmode a
修改备机的参数文件
修改备机的INIT%ORACLE_SID%.ORA文件,追加红色部分
*.aq_tm_processes=1
*.background_dump_dest='C:/oracle/admin/cgsdzda/bdump'
*.compatible='9.2.0.0.0'
*.control_files='d:/oracle/oradata/cgsdzda/CONTROL01.CTL','d:/oracle/oradata/cgsdzda/CONTROL02.CTL','d:/oracle/oradata/cgsdzda/CONTROL03.CTL'
*.core_dump_dest='C:/oracle/admin/cgsdzda/cdump'
*.db_block_size=8192
*.db_cache_size=658291200
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='cgsdzda'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=cgsdzdaXDB)'
*.fast_start_mttr_target=300
*.hash_join_enabled=TRUE
*.instance_name='cgsdzda'
*.java_pool_size=20971520
*.job_queue_processes=10
*.large_pool_size=52428800
# *.log_archive_dest_1='LOCATION=C:/oracle/oradata/cgsdzda/archive'
*.log_archive_format='%t_%s.dbf'
*.log_archive_start=false
*.open_cursors=300
*.pga_aggregate_target=52428800
*.processes=150
*.query_rewrite_enabled='FALSE'
*.remote_login_passwordfile='EXCLUSIVE'
*.shared_pool_size=209715200
*.sort_area_size=524288000
*.star_transformation_enabled='FALSE'
*.timed_statistics=TRUE
*.undo_management='AUTO'
*.undo_retention=10800
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='C:/oracle/admin/cgsdzda/udump'
*.log_archive_format='%t_%s.dbf'
*.log_archive_start=true
*.standby_archive_dest='location=d:/oracle/arc_dest/arch'
*.log_archive_dest='d:/oracle/arc_dest/arch'
*.standby_file_management ='auto'
*.fal_server='primary'
*.fal_client='standby'
*.remote_archive_enable=true
*.archive_lag_target=1800
修改备机的tnsnames.ora ,添加
primary=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 68.16.50.47)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = testDB)
(INSTANCE_NAME = testDB)
(SERVER = DEDICATED)
)
)
standby=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 68.16.50.48)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = testDB)
)
)
在Primary Database上为Standby创建Controlfile
将controlfile 拷贝至 Standby Database 的相应目录下,并将原来controlfile删除,将文件改名为:control01.ctl,并复制两份,改名为control02.ctl,control03.ctl的方法如下:
SQL>shutdown immediate;
SQL>startup mount;
SQL>alter database create standby controlfile as 'c:/ CONTROL01.CTL';
注意: 如果数据数两边都是copy过去的, 这时千万别open数据库, 否则会造成主备不一致
启动主机
正常启动主机。
启动备机
运行以下脚本启动备机。
注:每次系统启动时都需要手工运行以下脚本。
3. 日常监控脚本
=================================================================
主数据库(primary db)
alter system archive log current;
select thread#,max(sequence#) from v$archived_log group by thread#;
备库(standby db)
select thread#,sequence#,archived,applied ,
to_char(COMPLETION_TIME,'yyyy-mm-dd hh24:mi:ss') a
from v$archived_log order by a;
备库standby db (重要: 确认MRPO进程是否存在)
select process,pid,status from v$managed_standby;
select process,pid,status, delay_mins from v$managed_standby;
当手工拷过去的日志在备库的archived_log无法找到时需将日志文件注册一下
alter database register logfile '/oracle/arc_dest/arch/orcl_1_105.arc';