# 登录数据库
sqlplus / as sysdba
# 查看数据库归档模式,确认Archivelog已启用
select name,log_mode from v$database;
# 查看数据库是否已启用Oracle Data Guard
select * from v$option where parameter = 'Oracle Data Guard';
# 检查数据库是否启用强制日志(为了保障日志安全和数据完整性,强烈建议启用,默认False)
select name,force_logging from v$database;
# 启用强制日志
alter database force logging;
# 再次确认数据库是否启用强制日志
select name,force_logging from v$database;
# 查看Redo Log文件大小
select group#,bytes/1024/1024 as Mb from v$log;
# 创建与Redo Log文件大小完全相同的Standby Redo Log文件(注意:大小必须一致)
alter database add standby logfile group 11 'D:/Oracle/oradata/PMS/standby11.log' size 50M;
alter database add standby logfile group 12 'D:/Oracle/oradata/PMS/standby12.log' size 50M;
alter database add standby logfile group 13 'D:/Oracle/oradata/PMS/standby13.log' size 50M;
alter database add standby logfile group 14 'D:/Oracle/oradata/PMS/standby14.log' size 50M;
注:Standby Redo Logs(SRL)即备份的重做日志,创建SRL后,主库上写入每个Online Redo Log时都会被传输到备库,同时也会写入到SRL中。
SRL是额外的Redo Log,但SRL的创建有以下几个原则:
1)Standby Redo Log File要与Online Redo Log File一样大
查询方法:SELECT GROUP#, BYTES/1024/1024 M FROM V$LOG;
2)Standby Redo Log Group的数量至少要比Online Redo Log Group的数量多1组
查询方法:SELECT GROUP#, BYTES/1024/1024 M FROM V$LOG;
3)当主库添加了Redo Log Group,备库也必须添加相应的Redo Log Group,否则会导致备库在主库switch log后不同步。
SRL创建方法:alter database add standby logfile group 14 'D:/Oracle/oradata/PMS/standby14.log' size 50M;(创建一个节点)
SRL删除方法:alter database drop standby logfile group 14;
SRL查看方法:select group#,bytes/1024/1024 as Mb from v$standby_log;
4)归档位置原则:
a)如果配置了STANDBY_ARCHIVE_DEST,则归档将使用该目录位置
b)如果LOG_ARCHIVE_DEST_n参数明确定义了VALID_FOR=(STANDBY_LOGFILE,*)选项,则归档将使用LOG_ARCHIVE_DEST_n目录位置
c)如果STANDBY_ARCHIVE_DEST和LOG_ARCHIVE_DEST_n都没有配置,则使用STANDBY_ARCHIVE_DEST的缺省位置%ORACLE_HOME%\database\archive(Linux位于%ORACLE_HOME%\dbs\arc)
d)如果需要将Standby Redo Log归档到FRA(Fast Recovery Area):
Ⅰ)设置LOG_ARCHIVE_DEST_n的LOCATION参数为USE_DB_RECOVERY_FILE_DEST
Ⅱ)设置LOG_ARCHIVE_DEST_n的VALID_FOR参数为“允许归档”。即VALID_FOR=(ALL_LOGFILES,ALL_ROLES)
e)如果需要将Standby Redo Log归档到本地指定位置:
Ⅰ)设置LOG_ARCHIVE_DEST_n的LOCATION参数为USE_DB_RECOVERY_FILE_DEST。
即LOG_ARCHIVE_DEST_1='LOCATION=D:/Oracle/oradata/PMS VALID_FOR=(STANDBY_LOGFILE,STANDBY_ROLE)'
Ⅱ)设置LOG_ARCHIVE_DEST_n的VALID_FOR参数为“允许归档”。
即VALID_FOR=(STANDBY_LOGFILE,STANDBY_ROLE)
一般情况下密码文件在:%ORACLE_HOME%/database/PWDPMS.ora,linux系统密码文件在:%ORACLE_HOME%/dbs/orapwpms.ora
如果密码文件丢失,可通过orapwd命令恢复出来
orapwd file=%ORACLE_HOME%/database/PWDPMS.ora password=000000;
将密码文件拷贝到备库服务器
拷贝过程略(Ctrl + C、Ctrl + V)
修改D:\Oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.ora文件
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = PMS) ### 增加该行,增加数据库全局名称
(SID_NAME = PMS) ### 增加该行,修改数据库实例SID
# (SID_NAME = CLRExtProc) ### 取消该行
(ORACLE_HOME = D:\Oracle\product\11.2.0\dbhome_1)
# (PROGRAM = extproc) ### 取消该行
# (ENVS = "EXTPROC_DLLS=ONLY:D:\Oracle\product\11.2.0\dbhome_1\bin\oraclr11.dll") ### 取消该行
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.245)(PORT = 1521)) ### 修改HOST为主库IP地址
)
)
ADR_BASE_LISTENER = D:\Oracle
修改D:\Oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora文件
# tnsnames.ora Network Configuration File: D:\Oracle\product\11.2.0\dbhome_1\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.
# 修改主库连接名称
PMS_PRIMARY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.245)(PORT = 1521))
(CONNECT_DATA =
# (SERVER = DEDICATED) ### 取消该行
(SERVICE_NAME = PMS)
)
)
# 增加备库连接信息
PMS_STANDBY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.55)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = PMS)
)
)
ORACLR_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
(CONNECT_DATA =
(SID = CLRExtProc)
(PRESENTATION = RO)
)
)
将监听文件listener.ora和tnsnames.ora两个文件拷贝到备库服务器
拷贝过程略(Ctrl + C、Ctrl + V)
lsnrctl stop # 关闭监听
lsnrctl start # 启动监听(重启监听)
lsnrctl status # 查看监听状态
tnsping pms # 测试PMS监听,通过
tnsping pms_standby # 测试PMS_STANDBY监听,测试不通过(备库还未配置)
我们可以像配置数据库归档一样,用alter system set命令的方式修改直接参数文件(spfile),但是此处修改内容较多,为了方便,建议先创建并修改pfile,然后通过pfile再重建spfile。
sqlplus / as sysdba
create pfile='d:/pfile.ora' from spfile;
修改pfile.ora文件
pms.__db_cache_size=35567697920
pms.__java_pool_size=805306368
pms.__large_pool_size=939524096
pms.__oracle_base='D:\Oracle'#ORACLE_BASE set from environment
pms.__pga_aggregate_target=13824425984
pms.__sga_target=41339060224
pms.__shared_io_pool_size=0
pms.__shared_pool_size=3623878656
pms.__streams_pool_size=134217728
*.audit_file_dest='D:\Oracle\admin\PMS\adump'
*.audit_trail='db'
*.compatible='11.2.0.4.0'
*.control_files='D:\Oracle\oradata\PMS\control01.ctl','D:\Oracle\fast_recovery_area\PMS\control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='PMS' # 注意,主备必须一致
*.db_unique_name='PMS_PRIMARY' # 注意,主备全局名称不能一样
*.fal_server='PMS_PRIMARY' # 设定主库名称
*.fal_client='PMS_STANDBY' # 设定备库名称
*.db_file_name_convert='D:\Oracle\oraback','D:\Oracle\oraback' # 设置数据库备份文件恢复路径(主备库路径不一致时可通过此处进行转换)
*.log_file_name_convert='D:\Oracle\oralog','D:\Oracle\oralog' # 设置日志备份文件恢复路径(主备库路径不一致时可通过此处进行转换)
*.standby_file_management='AUTO' # 启动热备功能
*.db_recovery_file_dest_size=4385144832
*.db_recovery_file_dest=''
*.deferred_segment_creation=FALSE
*.diagnostic_dest='D:\Oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=PMSXDB)'
*.log_archive_config='dg_config=(PMS_PRIMARY,PMS_STANDBY)' # 设置日志配置
*.log_archive_dest_1='location=D:/Oracle/oralog valid_for=(all_logfiles,all_roles) db_unique_name=PMS_PRIMARY' # 设置日志推送通道1,主库通道设定
*.log_archive_dest_2='service=PMS_STANDBY lgwr sync valid_for=(online_logfile,primary_role) db_unique_name=PMS_STANDBY' # 设置日志推送通道2,备库通道设定
*.log_archive_dest_state_1='enable' # 启用日志推送通道1
*.log_archive_dest_state_2='enable' # 启用日志推送通道2
*.log_archive_dest='' # 关闭默认归档通道
*.log_archive_format='%t_%s_%r.arch' # 格式化归档日志文件格式
*.open_cursors=300
*.pga_aggregate_target=13742637056
*.processes=2000 # 设置数据库最大连接数
*.remote_login_passwordfile='EXCLUSIVE'
*.sec_case_sensitive_logon=FALSE
*.sga_target=41227911168
*.undo_tablespace='UNDOTBS1'
注意:以上配置中参数名称、单引号内、等号两侧均不能有空格(强烈不建议直接拷贝我的配置,请自行使用自己的配置进行修改,配置文件中的注释请自行删除)
修改完成以上配置后,关闭数据库,将本次配置通过重建spfile方式导入到数据库中
shutdown immediate
create spfile from pfile='d:/pfile.ora';
数据库spfile信息已更新(先不要正常启动数据库)。
现在顺便生成供备库使用的控制文件:
startup mount;
alter database create standby controlfile as 'D:/standby/CONTROL01.CTL';
注意:
1)控制文件一般需要多分,我们将生成的CONTROL01.CTL手动复制出CONTROL02.CTL;或者用上面命令生成CONTROL02.CTL文件。
2)在控制文件生成之后到备库应用控制文件之前,要保证主库数据库在此期间不发生结构性变化(如增加表空间等操作),否则同步会出问题。
将控制文件复制到备库服务器进行应用。拷贝过程略(Ctrl + C、Ctrl + V)
启动数据库,测试数据库是否正常
startup
查看归档信息
archive log list
查看Redo Log信息
select group#,bytes/1024/1024 as Mb from v$log;
查看Standby Redo Log信息
select group#,bytes/1024/1024 as Mb from v$standby_log;
主库配置基本完成,可以将该pfile文件拷贝到备库,开始配置备库服务器。
拷贝过程略(Ctrl + C、Ctrl + V)
1)从主库服务器拷贝密码文件PWDPMS.ora至备库服务器D:\Oracle\product\11.2.0\dbhome_1/database/PWDPMS.ora路径下,确保主备两个库的密码相同。
2)从主库服务器拷贝listener.ora和tnsnames.ora至备库服务器D:\Oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN路径下,并修改相关配置。
修改listener.ora文件中HOST地址为备库服务器地址。
3)从主库服务器生成的“适用于备库使用的控制文件”CONTROL01.CTL和CONTROL02.CTL拷贝至备库服务器(我的存放路径:D:/standby/)。
注意:该控制文件必须生成,不能直接拷贝主库控制文件
4)从主库服务器拷贝pfile文件至备库服务器,并对文件内容进行修改
pms.__db_cache_size=35567697920
pms.__java_pool_size=805306368
pms.__large_pool_size=939524096
pms.__oracle_base='D:\Oracle'#ORACLE_BASE set from environment
pms.__pga_aggregate_target=13824425984
pms.__sga_target=41339060224
pms.__shared_io_pool_size=0
pms.__shared_pool_size=3623878656
pms.__streams_pool_size=134217728
*.audit_file_dest='D:\Oracle\admin\PMS\adump'
*.audit_trail='db'
*.compatible='11.2.0.4.0'
*.control_files='D:/standby/CONTROL01.CTL','D:/standby/CONTROL02.CTL' # 指定初始化数据库的控制文件
*.db_block_size=8192
*.db_domain=''
*.db_name='PMS'
*.db_unique_name='PMS_STANDBY' # 此处全局名称配置已修改
*.fal_server='PMS_PRIMARY'
*.fal_client='PMS_STANDBY'
*.db_file_name_convert='D:\Oracle\oraback','D:\Oracle\oraback'
*.log_file_name_convert='D:\Oracle\oralog','D:\Oracle\oralog'
*.standby_file_management='AUTO'
*.db_recovery_file_dest_size=4385144832
*.db_recovery_file_dest=''
*.deferred_segment_creation=FALSE
*.diagnostic_dest='D:\Oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=PMSXDB)'
*.log_archive_config='dg_config=(PMS_PRIMARY,PMS_STANDBY)'
*.log_archive_dest_1='location=D:/Oracle/oralog valid_for=(all_logfiles,all_roles) db_unique_name=PMS_STANDBY' # 设置日志推送通道1,备库通道设定
*.log_archive_dest_2='service=PMS_PRIMARY lgwr sync valid_for=(online_logfile,primary_role) db_unique_name=PMS_PRIMARY' # 设置日志推送通道2,主库通道设定
*.log_archive_dest_state_1='enable'
*.log_archive_dest_state_2='enable'
*.log_archive_dest=''
*.log_archive_format='%t_%s_%r.arch'
*.open_cursors=300
*.pga_aggregate_target=13742637056
*.processes=2000
*.remote_login_passwordfile='EXCLUSIVE'
*.sec_case_sensitive_logon=FALSE
*.sga_target=41227911168
*.undo_tablespace='UNDOTBS1'
注:一般强烈建议主备服务器配置相同,如果不同,需要手动修改sga_target、__pga_aggregate_target、__db_cache_size等参数大小,如果该参数超过服务器承载,会导致数据库无法启动,甚至服务器自身崩溃(本人血泪史,就不讲了)。
5)给备库创建PMS实例服务
使用管理员权限的命令窗执行命令:
oradim -NEW -SID PMS -STARTMODE manual
其中PMS为您希望指定的实例名(与主库保持一致)。
服务创建完成后会自动启动,可在系统services.msc中查看。
6)重启监听并测试
lsnrctl stop
lsnrctl start
lsnrctl status
tnsping pms_primary(测试通过)
tnsping pms_standby(测试通过)
注:若测试不通过,请关闭主备服务器防火墙进行测试。
7)通过pfile文件创建spfile参数文件
a)建议手动重启一下数据库服务(先启动监听,后启动数据库)
b)首次使用sqlplus / as sysdba时提示无法连接(ORA-12560),这是因为备库是我们手动创建,因此操作系统(windows)未记录我们创建的PMS实例,因此需要先设置环境变量
在命令提示框中先执行:set oracle_sid=PMS再尝试登陆即可成功
c)通过pfile文件创建spfile参数文件
create spfile from pfile='D:/pfile.ora';
重启备库监听(先启)(备库操作)
lsnrctl stop
lsnrctl start
sqlplus / as sysdba
shutdown immediate
startup nomount # 此时备库先不挂载,接下来要恢复数据文件,数据库必须处于不挂载状态
重启主库监听(后启)(主库操作)
lsnrctl stop
lsnrctl start
shutdown immediate
startup
以主库辅助备库的方式,在备库连接RMAN(备库操作)
rman target sys/000000@pms_primary auxiliary sys/000000@pms_standby
通过命令复制主库数据文件到备库(该过程会影响主库资源,主库可能会在复制期间卡顿,若在线上操作,请注意)(备库操作)
duplicate target database for standby from active database nofilenamecheck;
执行完成后,备库的数据文件已复制过来了。
还有另一种方法:
直接将主库oracle目录下的admin、cfgtollogs、diag、flash_recover_area、oradata目录拷贝到备库相同路径,备库已有的文件和文件夹直接覆盖即可。
不过在条件允许的情况下,还是建议第一种方案,通过命令由oracle自行执行复制及配置。
启动日志传送服务
alter database recover managed standby database disconnect from session;
recover managed standby database cancel;
完成介质恢复后,重启数据库,以只读备库挂载模式启动
shutdown immediate;
startup nomount;
database mount standby database;
database open read only;
启动备库日志实时应用
alter database recover managed standby database using current logfile disconnect from session;
注:若数据文件未创建就启用备库日志实时应用,备库会同步,但数据库无法打开,将提示““ORA-01219:数据库未打开:仅允许在固定表/视图中查询”的警告窗口!”
此时可以使用命令停止同步
alter system set standby_file_management=manual;
创建对应文件后再开启自动同步(详见上面通过rman恢复数据文件或拷贝文件恢复数据文件)
查看同步状态
连接到主库,查看归档情况(主库操作)
SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
连接到备库,查看归档情况(备库操作)
SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
在主库切换归档日志(强制归档)(主库操作)
ALTER SYSTEM SWITCH LOGFILE;
SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
在备库查看最新归档是否已经同步过来(备库操作)
SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
在主库建表、插入数据,查看备库是否一致。
至此,主备同步(DG)已设置完成。
全篇回顾:万字长文,希望对您有所帮助。
Oracle11g DG实战配置(Windows版)(一)基础说明
Oracle11g DG实战配置(Windows版)(二)主库安装与基础配置
Oracle11g DG实战配置(Windows版)(三)主库数据库归档配置
Oracle11g DG实战配置(Windows版)(四)备库数据库安装
Oracle11g DG实战配置(Windows版)(五)主备库DG配置