声明
主要内容来自网易云课堂-繁星老师 容灾备份
的整理学习笔记
以下截图/代码。一部分是视频,一部分是自己实际设置的截图/代码。
存在一些出入,主要是参数的出入(配置第一次未成功0.0!)!繁星老师讲的很细,如有条件配合视频食用更佳。
这些参数请按照如下进行理解区分。存在出入的内容:
htlt 即为 prod
sdbd2 即为 sbdb
TNS 即为 tnsname.ora 中设置的名称
如果下文 请自行转换 (PS:失败一次后更改的的其他参数)
与路径相关的内容,需按照自身安装oracle路径修改
内容开始于两台服务器已经安装好oracle!
我是在 Redhat 7.2 中安装的两个 oracle 11.2.0.4.0 数据库
1号服务器IP:192.168.1.181
2号服务器IP:192.168.1.183
关于主库的配置
1. 开始进行主库的配置
1.1 启动主库的监听
lsnrctl start
1.1 链接主库数据库
sqlplus / as syssdba
2. 日志状态
2.1查询日志打开状态
SELECT force_logging form v$databse;
返回内容:for---NO
2.2修改这状态
alter database force logging;
返回内容:Database altered.
3. 归档模式 修改文件格式名
3.1 查询数据库归档模式
archive log list;
返回内容:Disabled (未归档)
3.2 修改归档模式文件格式参数名称
3.2.1 查询文件格式参数
show parameter log
查询配置,查询详细的为
show parameter 某某名称
3.2.2 修改log_archive_format
文件默认名称:%t_%s_%r.dbf
修改理由:因为系统文件也是dbf,不容易区分
alter system set log_archive_format='%t_%s_%r.arc' scope=spfile;
返回内容:System altered;
4. 主库关闭
干净的关闭方式
shutdown immediate
5. 打开主库SQL
在mout状态下改变归档模式
startup mount
6. 打开主库归档模式
alter database archivelog;
返回内容:Database altered.
7. 打开主库 数据库打开
alter database open;
8. 配置主库的监听
8.1 查找文件目录
$ORACLE_HOME/network/admin
修改listener.ora文件
修改后:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracledb)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
ADR_BASE_LISTENER = /home/oracle/app
LISTENER1 =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.181)(PORT = 1522))
)
)
)
SID_LIST_LISTENER1 =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = htlt)
(SID_NAME = htlt)
(ORACLE_HOME = /home/oracle/app/oracle/product/11.2.0/dbhome_1)
)
)
启动监听
lsnrctl start
lsnrctl start listener1
9. 主库配置db_unique_name
9.1 修改db_unique_name
- 使用 #1.1 连接数据库 使用 #3.2.1 查询该字段内容
默认有个prod的值,没有就改为prod
alter system set db_unique_name='prod' scope=spfile;
修改后重启数据库
10. 主库配置log_archive_config
- 使用 #1.1 连接数据库 使用 #3.2.1 查询该字段内容
alter system set log_archive_config='DG_CONFIG=(htlt,sbdb2)' scope=both;
DG_CONFIG 中 htlt为主库 sbdb2是备库 -》 是db_unique_name 的名称
11. 主库修改log_archive_dest_X归档位置
- 使用 #1.1 连接数据库 使用 #3.2.1 查询该字段内容
log_archive_dest_ 从1-31 我们只需要修改log_archive_dest_1、log_archive_dest_2
11.1 修改log_archive_dest_1
文件路径原本不存在,需要自己创建
DB_UNIQUE_NAME=htlt 中htlt为db_unique_name中设置的参数
alter system set log_archive_dest_1='LOCATION=/home/oracle/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=htlt' scope=both;
11.2 修改log_archive_dest_2
tnssbdb2-》备库的tns
DB_UNIQUE_NAME=sbdb2 -》 备库的db_unique_name参数
alter system set log_archive_dest_2='SERVICE=tnssbdb2 LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=sbdb2' scope=both;
12. 主库 配置TNS
文件路径
$ORACLE_HOME/network/admin
HTLT 原本有的服务名,复制他进行修改
host下面的IP如果:cat /etc/hosts下配置了可以用 快捷方式
HTLT =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.181)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = htlt)
)
)
tnssbdb2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.183)(PORT = 1522))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = htlt)
)
)
tnshtlt =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.181)(PORT = 1522))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = htlt)
)
)
13. 主库配置 df_file_name_convert 修改
- 使用 #1.1 连接数据库 使用 #3.2.1 查询该字段内容
13.1. 查询是否需要修改 df_file_name_convert
文件路径名修改,如果主库和备库路径名称一样就不需要修改
查询文件路径
select * from v$dbfile;
返回需要的内容:/home/oracle/app/oradata/sbdb2(需要截取)
13.2 修改df_file_name_convert
这里的路径 第一个需要时备库的实例名地址!第二个时自己的实例名
alter system set df_file_name_convert='/home/oracle/app/oradata/sbdb2','/home/oracle/app/oradata/htlt' scope=spfile;
返回内容:System altered
14. 主库配置 log_file_name_convert 修改
- 使用 #1.1 连接数据库 使用 #3.2.1 查询该字段内容
14.1. 查询是否需要修改 log_file_name_convert
文件路径名修改,如果主库和备库路径名称一样就不需要修改
查询文件路径
select * from v$dbfile;
返回需要的内容:/home/oracle/app/oradata/sbdb2(需要截取)
14.2 修改df_file_name_convert
这里的路径 第一个需要时备库的实例名地址!第二个时主库的实例名
alter system set log_file_name_convert='/home/oracle/app/oradata/sbdb2','/home/oracle/app/oradata/htlt' scope=spfile;
返回内容:System altered
15. 主库配置 修改standby_file_management
从MANUAL【手动】转AUTO【自动】
alter system set standby_file_management=auto scope=spfile;
返回内容:System altered
16. 修改 fal_client 和 fal_server
16.1 查询 修改内容
show parameter fal
16.2 修改内容
fal_client:tns主库
fal_server: tns备库
alter system set fal_server='tns主库' scope=both;
alter system set fal_server='tns备库' scope=both;
备库相关配置
17. 主库密码文件复制到备库
路径
$ORACLE_HOME/dbs/orapw主库服务名 -》 文件orapw主库服务名 例:orapworcl
scp $ORACLE_HOME/dbs/orapw主库服务名 备库IP:/$ORACLE_HOME/dbs/
17.1 备库需要修改文件
mv orapw主库服务名 orapw备库服务名
18. 设置备库的init#{服务名}.ora
18.1 创建 init
touch init#{备库服务名}.ora
18.2 修改 init
db_name='htlt'
db_unique_name='sbdb2'
audit_file_dest='/home/oracle/app/admin/sbdb2/adump'
compatible='11.2.0.4.0'
control_files='/home/oracle/app/oradata/sbdb2/control01.ctl','/home/oracle/app/fast_recovery_area/sbdb2/control02.ctl'
log_archive_config='DG_CONFIG=(htlt,sbdb2)'
log_archive_dest_1='LOCATION=/home/oracle/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=sbdb2'
log_archive_dest_2='SERVICE=tnshtlt LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=htlt'
db_file_name_convert='/home/oracle/app/oradata/htlt','/home/oracle/app/oradata/sbdb2'
log_file_name_convert='/home/oracle/app/oradata/htlt','/home/oracle/app/oradata/sbdb2'
db_recovery_file_dest='/home/oracle/app/fast_recovery_area'
db_recovery_file_dest_size=4385144832
fal_client='tnssbdb2'
fal_server='tnshtlt'
log_archive_format='%t_%s_%r.arc'
standby_file_management='AUTO'
18.2.1 解析修改的文件内容
db_name='#{主库服务名}'
db_unique_name='#{备库服务名}'
//需要在服务名下创建 adump 目录 mkidr -p
audit_file_dest='/home/oracle/app/admin/#{备库服务名}/adump'
compatible='11.2.0.4.0'
control_files='/home/oracle/app/oradata/#{备库服务名}/control01.ctl','/home/oracle/app/fast_recovery_area/#{备库服务名}/control02.ctl'
log_archive_config='DG_CONFIG=(#{主库服务名},#{备库服务名})'
//存放归档的路径 也需要在备库 中新增 mkidr -p
log_archive_dest_1='LOCATION=/home/oracle/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=#{备库服务名}'
log_archive_dest_2='SERVICE=tns#{主库Tns服务名} LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=#{主库服务名}'
//备库配置需要:主在前,备在后
db_file_name_convert='/home/oracle/app/oradata/#{主库}','/home/oracle/app/oradata/#{备库}'
log_file_name_convert='/home/oracle/app/oradata/#{主库}','/home/oracle/app/oradata/#{备库}'
db_recovery_file_dest='/home/oracle/app/fast_recovery_area'
db_recovery_file_dest_size=4385144832
fal_client='tns#{备库服务名}'
fal_server='tns#{主库服务名}'
log_archive_format='%t_%s_%r.arc'
standby_file_management='AUTO'
18.3 使配置生效
18.3.1 首先通过 shutdown immediate 干净的关闭oracle
18.3.2 然后输入指令
create spfile form pfile;
反馈内容:File created.
18.3.3 通过 nomount 启动备库
startup nomount
19. 检查备库的环境配置
查看环境变量
cat .bash_profile
需要修改ORACL_SID=prod 改成 备库的服务名 sdbd2
20. 备库参数设置
- 使用 #1.1 连接数据库
20.1 创建一个pfile
create sofile form pfile;
然后退出
exit;
20.2 创建后的效果
在$ORACLE_HOME/dbs目录下
$ORACLE_HOME/dbs
会生成一个 spfilesbdb.ora 文件
20.3 通过生成的文件启动备库
- 使用 #1.1 连接数据库
启动数据库
startup nomount
20.3.1 查询是否启动生成的文件
show parameter spfile;
返回内容
可以查看启动是否为创建的pfile文件启动的。
21. 配置备库的静态监听
配置listener.ora 同 #8 章节讲到的 配置备库
路径地址:$ORACLE_HOME/network/admin
原本备库是是没有这个文件的
选择复制,都可以,
1.供创建文件
touch listener.ora
2.复制主库代码
2.1需要连接到主库当同目录
scp #{ORACLE_HOME}/network/admin/listener.ora 备库IP:#{ORACLE_HOME}/network/admin/
备注:$ORACLE_HOME 用 oracle的路径
参考的修改内容
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.183)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
ADR_BASE_LISTENER = /home/oracle/app
LISTENER1 =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.183)(PORT = 1522))
)
)
)
SID_LIST_LISTENER1 =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = htlt)
(SID_NAME = sbdb2)
(ORACLE_HOME = /home/oracle/app/oracle/product/11.2.0/dbhome_1)
)
)
启动监听
lsnrctl start
lsnrctl start listener1
22. 备库配置TNS
文件路径
$ORACLE_HOME/network/admin
tnssbdb2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.183)(PORT = 1522))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = htlt)
)
)
tnshtlt =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.181)(PORT = 1522))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = htlt)
)
)
tnssbdb2:备库地址
tnshtlt:主库地址,主库tns服务名
23. 配置后 测试两边是否相通的
23.1 通过tnsping 测试是否相通
23.1.1 主库ping备库
tnsping #{备库的tns}
示例
tnsping tnssbdb2
23.1.2 备库ping主库
tnsping #{主库的tns}
示例
tnsping tnshtlt
注:tnsping 是 oracle 安装后自带的工具
如果ping不通,可以尝试ping自己。还报错就是配置问题
返回结果:
23.2 通过tns连接对方数据库 测试是否相通
23.2.1 主库连接备库
sqlplus 账号/密码@#{备库的tns} as sysdba
示例
sqlplus sys/密码@tnssbdb2 as sysdba
23.2.2 备库连接主库
sqlplus 账号/密码@#{主库的tns} as sysdba
示例
sqlplus sys/密码@tnshtlt as sysdba
24. 开始DG前的参数配置检查
主库 备库 都需要检查
如何查询:
通过sqlplus / as sysdba连接后查询
24.1 检查db_unique_name
主库和备库的 核心配置 之一
show parameter db_unique_name
主库为:prod
备库为:sbdb
24.2 检查compatible 版本
主库备库 需要相同
show parameter compatible
24.3 检查log_archive_config
主库:DG_CONFIG=(【主库db_unique_name】,【备库db_unique_name】)
备库:DG_CONFIG=(【主库db_unique_name】,【备库db_unique_name】)
顺序都是一样的 , DG_CONFIG=(prod,sbdb)
show parameter log_archive_config
24.4 检查log_archive_dest_1,_2
请看 #11 如何的配置
24.4.1检查log_archive_dest_1
show parameter log_archive_dest_1
主库:
LOCATION=/home/oracle/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=#{主库db_unique_name}
备库:
LOCATION=/home/oracle/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=#{备库db_unique_name}
24.4.1检查log_archive_dest_2
show parameter log_archive_dest_2
主库:
SERVICE={备库TNS地址} LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=#{备库db_unique_name}
备库:
SERVICE={主库TNS地址} LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=#{主库db_unique_name}
24.5 检查 log_archive_dest_state_
主库:enable 启用状态
备库:enable 启用状态
show parameter log_archive_dest_state_
如果是defer即禁用状态,如果发现未启用,需要设置为启用!
重点检查 log_archive_dest_state_1,log_archive_dest_state_2
24.6 检查 db_file_name_convert
(主备切换)
指定的自己的oracle路径:参考 #14.2 章节说明。包括检查log_file_name_convert.一起
show parameter db_file_name_convert
show parameter log_file_name_convert
主库配置:
备库配置:
注意:相反的!!!
主库:备前主后
备库:主前备后
log_file_name_convert :也是同理
24.7 检查 standby_file_management
需要开启为:AUTO模式 在 #15 中可以查看如何设置
show parameter log_file_name_convert
24.8 检查 log_archive_format
两边都要配置相同的文件格式 请查看 #3.2.2
show parameter log_archive_format
24.9 检查完后 需要重启生效
shutdown immediate
备库 :
startup nomount
使用Duplicate创建物理standby
- 目前两台服务器的ORACLE状态:
- 主库启动状态:startup
- 备库启动状态:startup nomount
25. 通过 RMAN 连接主备库
25.1 主库连接 RMAN
主库操作
rman target sys/Oracle123@{主库的TNS}
不要使用 rman target / 进行连接
25.2 主库通过RMAN连接备库
主库操作
connected to auxiliary sys/Oracle123@{备库的TNS}
显示连接成功,prod(本机) 为挂挂载状态
25.3 简化的连接方法
这是一种简化操作:和 #25.1 #25.2 两个命令相同效果
同样在主库上进行
rman target sys/Oracle123@{主库的TNS} auxiliary sys/Oracle123@{备库的TNS}
25. 进行同步工作
切记:此命令是在连接RMAN后进行的。需要同时连接主库备库。即 #25 做的事情,输入以下同步代码:
duplicate target database for standby from active database nofilenamecheck;
回车后就开始进行同步工作,需要比较长的时间!
26. 查看同步状态
在 #25 完成后,进行的操作
备库服务器操作
路径是在 #13 中配置的
添加 Standby 日志组并开启同步
需要了解的概念
Standby日志组 = redo日志组+1
27. 新增 standby 日志组
27.1 主库查询redo日志组列表
可以使用 nacatac/PLSQL 工具查询
全部
select * from v$logfile;
27.2 主库新增日志组列表
由 #27.1 查询可知 group 1,2,3已被占用
#{日志路径} 可以查用查询出来的redo 取其路径
alter database add standby logfile group 4 ('#{日志路径}/#{主库实例名}/standby04.rdo') size 50M;
alter database add standby logfile group 5 ('#{日志路径}/#{主库实例名}/standby05.rdo') size 50M;
alter database add standby logfile group 6 ('#{日志路径}/#{主库实例名}/standby06.rdo') size 50M;
alter database add standby logfile group 7 ('#{日志路径}/#{主库实例名}/standby07.rdo') size 50M;
路径需要参考自己的安装oralce路径。
不推荐 standby07.log log结尾,防止被意外删除!
27.3 备库新增日志组列表
由 #27.1 查询可知 group 1,2,3已被占用
#{日志路径} 可以查用查询出来的redo 取其路径
alter database add standby logfile group 4 ('#{日志路径}/#{备库实例名}/standby04.rdo') size 50M;
alter database add standby logfile group 5 ('#{日志路径}/#{备库实例名}/standby05.rdo') size 50M;
alter database add standby logfile group 6 ('#{日志路径}/#{备库实例名}/standby06.rdo') size 50M;
alter database add standby logfile group 7 ('#{日志路径}/#{备库实例名}/standby07.rdo') size 50M;
路径需要参考自己的安装oralce路径。
不推荐 standby07.log log结尾,防止被意外删除!
28. 开启同步
28.1 调整备库 将挂载状态打开
- 目前备库为挂载状态,需要调整打开
alter database open;
28.2 开启 根据日志 实时应用 备份
- 开启实时同步
alter database recover managed standby database using current logfile disconnect from session;
1.1. 开启实时同步 (推荐)
alter database recover managed standby database using current logfile disconnect;
from session:回车后 控制立马还给 shell命令
- 开启同步(日志切换才会同步)
alter database recover managed standby database disconnect from session;
3.停止同步
alter database recover managed standby database cancel;
29 查看试试同步状态(是否成功)
29.1 查看v$database;
open_mode | 查询状态 |
---|---|
READ ONLY WITH APPLY(备库正常) | 打开并应用日志 |
READ ONLY (备库异常) | 只读(未同步日志) |
READ WRITE(主库) | 读写模式 |
MOUNTED | 挂载 |
database_role | 打开模式 |
---|---|
RHYSICAL STANDEY | 物理STANDEY |
PRIMARY | 主库 |
模式:protection_mode,protection_level
名称 | 含义 | 修改方式(log_archive_dest_2) | 切换SQL |
---|---|---|---|
MAXIMUM PERFORMANCE | 最大性能模式 | LGWR ASYNC NOAFFIRM | alter database set standby database to maximize availability; |
MAXIMUM PERFORMANCE | 最大可用模式 | LGWR SYNC AFFIRM | alter database set standby database to maximize performance; |
MAXIMUM PERFORMANCE | 最高保护模式 | LGWR SYNC AFFIRM | alter database set standby database to maximize avilability; |
29.1.1 备库执行
select open_mode,database_role,protection_mode,protection_level from v$database;
29.1.2 主库执行
select open_mode,database_role,protection_mode,protection_level from v$database;
疑问/问题 解决方案
1.1 为什么备库一定要配置动态监听?
解答:nomount状态下必须使用静态兼听才能连接到实例
1.2 通过startup nomount启动后,是完全启动吗?
解答:不是的,此指令操作是为了完成(读初始化参数文件,启动实例)
需要通过 alter database open; 在进行启动,才算完全启动。
这里 需要了解 oracle:nomount mount open 三种启动状态含义。百度就有!
1.3 如何重新开关数据库
- 拒绝突然断电、关机(很容易出问题)
关机顺序 先主机再备机,先实例后监听
开机顺序 先备机再主机
1.3.1 关机详细步骤
1.3.1.1 主库关闭数据库
shutdown immediate;
1.3.1.2 备库关闭同步状态
alter database recover managed standby database cancel;
1.3.1.3 备库关闭数据库
shutdown immediate;
1.3.2 开机详细步骤
1.3.2.1 备库打开监听状态
lsnrctl start
lsnrctl start listener1
1.3.2.2 主库关闭同步状态
lsnrctl start
lsnrctl start listener1
1.3.2.3 连接备库oracle
sqlplus / as sysdba
1.3.2.4 备库打开数据库
startup;
1.3.2.5 备库开启日志同步
alter database recover managed standby database using current logfile disconnect;
1.3.2.6 连接主库oracle
sqlplus / as sysdba
1.3.2.7 主库打开数据库
startup;
1.4 startup启动备库出现 ORA-10458: standby database requires recovery
ORA-10458: standby database requires recovery
ORA-01196: file 1 is inconsistent due to a failed media recovery session
ORA-01110: data file 1: 'oralce路径/system01.dbf'
1.4.1 解决方案二
其他博主解决的方案
这个方案我没解决成功,他是在 #28 步开始的恢复工作!
个人建议:未解决问题,再往前挖,直至解决问题!因为未解决我的问题,所以可以执行方案二。
1.4.2 解决方案二
- 谨慎的人员,推荐检查一下 #24 参数配置。
- 问题解析:这一步出现在主备system01.dbf无法进行同步上,所以需要在此同步。
- 需要重新执行 #25 进行一次同步工作,在从 #25 其中 #27 无需操作,不需要创建新的了往下执行。
PS:在执行
channel ORA_DISK_1: starting datafile copy
input datafile file number=00001 name={路径}/system01.dbf
的时候,需要很长时间,请耐心等待,随着数据越大同步时间越长。不是报错!
我大概用了2小时! - 然后在启动尝试,运气好的,备库就已经可以启动了!
常用的指令整合
- 无账号密码快速访问
sqlplus / as sysdba
- 开启数据库的两张方式
startup
进入归档模式
startup mount
- 启动监听
lsnrctl start
lsnrctl start listener1
- 干净的关闭数据库
shutdown immediate
评论区