Ê¢¸çÒ»µãÒ»µÎ½²½âdata guardÇ°ÊÀ½ñÉú

116
1 《盛哥一点一滴讲解 Data Guard 前世今生》 注:能多详细有多详细 版本 info OS VersionOracle Linux Release 6 Update 4 for x86_64 (64 Bit) Oracle VersionOracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production linux.x64_11gR2_database_1of2.zip + linux.x64_11gR2_database_2of2.zip Virtualbox Version4.2.16 作者 info Userleonarding 刘盛 Date2013.08.09 Blogwww.leonarding.com Sitebeijing 总体架构图 Primary Standby Data Guard Windows 7 virtualbox 4.2.16 Oracle 11GR2 Oracle 11GR2

Upload: thota-mahesh

Post on 24-Dec-2015

230 views

Category:

Documents


3 download

DESCRIPTION

k

TRANSCRIPT

Page 1: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

1

《盛哥一点一滴讲解 Data Guard 前世今生》

注:能多详细有多详细

版本 info

OS Version:Oracle Linux Release 6 Update 4 for x86_64 (64 Bit) Oracle Version:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production linux.x64_11gR2_database_1of2.zip + linux.x64_11gR2_database_2of2.zip Virtualbox Version:4.2.16

作者 info

User:leonarding 刘盛 Date:2013.08.09 Blog:www.leonarding.com Site:beijing

总体架构图

Primary Standby Data Guard

Windows 7 virtualbox 4.2.16

Oracle 11GR2

Oracle 11GR2

Page 2: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

2

目 录

一 版本信息 ........................................................... ..................................................1

二 虚拟机环境 ........... ..................................................................................................3

三 安装 Oracle Linux 6.4 操作系统 .............................................................................8

四 配置 Oracle Linux 6.4 操作系统 ............................................................................42

五 安装 Oracle 11GR2 数据库 ....................................................................................50

六 设置 Oracle 和 OEM 随机启动 ..............................................................................57

七 准备 Active Data Guard 实验环境 ........................................................................60

八 搭建 Physical Standby 物理备库 ..........................................................................64

九 实现 SWITCH OVER 无损切换 ...............................................................................92

十 实现 FAIL OVER 丢弃切换 .....................................................................................96

十一 DG Broker 管理工具 .........................................................................................102

Page 3: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

3

二 虚拟机环境

Virtualbox Version:4.2.16 CPU:2Core Memory:1.5G Disk:50G hostname: leonarding2.oracle.com IP Address eth0: 192.168.1.102 Default Gateway eth0: 192.168.1.1 Netmask:255.255.255.0 虚拟电脑名称:leonarding2 操作系统类型:Linux 64 bit

虚拟磁盘映像类型

Page 4: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

4

虚拟磁盘扩展类型

虚拟磁盘文件位置和大小

创建完成后对虚拟机进行配置

共享粘贴板:windows Linux 之间双向复制 粘贴 拖放

Page 5: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

5

Page 6: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

6

Page 7: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

7

显示选项卡不用管

声音选项卡不用管

串口选项卡不用管

USB 选项卡不用管

共享文件夹不用管

点击“确定”完成配置

这是我配置好的虚拟机信息

Page 8: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

8

三 安装 Oracle Linux 6.4 操作系统

OS Version:Oracle Linux Release 6 Update 4 for x86_64 (64 Bit) 1.添加镜像文件到光驱,点击“确定”

镜像文件名称:Oracle Linux Release 6 Update 4 for x86_64 (64 Bit)

2.点击“启动”,开始安装 Linux 操作系统,当出现提示框的时候,点击“确认”按钮

Page 9: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

9

3.虚拟电脑控制台,选择[32 位]颜色模式,点击“确定”

4.Linux 6.4 安装步骤截图

启动虚拟机

Page 10: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

10

界面说明:

Install or upgrade an existing system 安装或升级现有的操作系统

install system with basic video driver 安装过程中采用基本的显卡驱动

Rescue installed system 进入系统救援模式

Boot from local drive 退出安装从硬盘启动

这里选择第一项,安装或升级现有的操作系统,回车。

Page 11: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

11

是否对“安装光盘介质 CD”进行检查测试,ok 是继续检查,skip 跳过此步骤加快安装速度

Page 12: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

12

我们安装的版本:Oracle Linux Release 6 Update 4 for x86_64 (64 Bit),点击“Next”继续

Page 13: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

13

选择操作系统语言:Chinese(Simplified)简体中文版,针对看 E 文就晕头的人士贴心设计,点击“Next”继续

操作系统键盘类型:美国英语式,点击“下一步”继续

如果你使用自己机器的磁盘作为存储设备,请选择“基本存储设备”,点击“下一步”继续

Page 14: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

14

Linux 探测到新分配给操作系统的 50G 硬盘,但这个硬盘中没有原始分区(这是正常的一个新硬盘本身就是空白的

需要你自己重新规划分区表),您确定这个设备中不包含有价值的数据吗?答:是,忽略所有数据(Y)

Page 15: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

15

指定新操作系统主机名 hostname:leonarding2.oracle.com

配置操作系统新网卡eth0,点击左下角“配置网络”,在弹出的网络连接对话框中选择“System eth0”->编辑按钮进

行配置

Page 16: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

16

打钩“自动连接”

IP Address eth0: 192.168.1.102

Netmask:255.255.255.0

Default Gateway eth0: 192.168.1.1 (如果是 RAC 模式 VIP 必须使用网关,否则不用设置)

Primary DNS:8.8.8.8 Google Public DNS 如果没有自己的 DNS 话还想访问公网可以设置

Secondary DNS:8.8.4.4 备用 DNS

Chinaunicom:202.99.96.68 中国联通的 DNS

配置完毕之后,点击“应用”使其生效,关闭网络连接对话框,点击“下一步”继续

Page 17: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

17

时区:亚洲/上海,点击“下一步”继续,如果你选择是中文语言的话,这里会自动返填“下一步”

Page 18: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

18

root 用户密码:oracle,长度必须 6 位字符以上,点击“下一步”继续

提示:密码拼写不够安全,点击“无论如何都使用”

Page 19: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

19

规划系统分区,按自己的想法分配磁盘空间

我们看到 sda 是一个空磁盘,空间 51200M,我们挂载点分成

/boot 500M 标准分区

/swap 2048M 标准分区

/ 剩余空间 LVM 分区

开始创建分区了

Page 20: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

20

先创建/boot 分区,选择“标准分区”,点击“创建”继续

挂载点:/boot

文件系统类型:ext4

大小(MB):500

点击“确定”继续

Page 21: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

21

再创建虚拟内存 swap

挂载点:虚拟内存无挂载点

文件系统类型:swap

大小(MB):2048

点击“确定”继续

Page 22: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

22

现在开始创建逻辑卷,创建逻辑卷的顺序:首先创建物理卷 PVM -> 再次创建卷组 VG -> 最后创建逻辑卷 LVM

文件系统类型:物理卷 physical volume(LVM)

大小(MB):使用全部可用空间

点击“确定”继续

Page 23: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

23

把创建好的物理卷生成卷组,选择 LVM 卷组,点击“创建”继续

把创建好的卷组 VG 生成逻辑卷 LVM,注意逻辑卷 LVM 大小:所有剩余空间

点击“确认”继续

Page 24: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

24

我们的分区创建完成

创建好的分区树如下所示,点击“下一步”继续

Page 25: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

25

格式化/dev/sda 警告,sda 就是我们创建的 50G 虚拟磁盘,对磁盘进行格式化肯定会删除所有数据,点击“格式化”

将分区表写入磁盘保存,点击“将修改写入磁盘”

选择“安装引导装载程序”位置,默认,点击“下一步”

Page 26: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

26

选择随操作系统安装的组件包,Customize later 稍后安装 Customize now 现在安装(我们选这个)

如果你对包的关联性不太清楚的话,上上策就是基本全选上,当然安装的过程也会随着包的多少而长短

第一个“基本系统”组件包

第二个“服务器”组件包

Page 27: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

27

第三个“Web 服务”组件包

Page 28: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

28

第四个“数据库”组件包

第五个“系统管理”组件包

第六个“虚拟化”组件包

Page 29: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

29

第七个“桌面”组件包,这个组件包全部选上(包括可选软件包),默认什么也不选安装后无法启动图形化界面

第八个“应用程序”组件包

Page 30: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

30

第九个“开发”组件包,能选上都选上,包到用时方恨少

Page 31: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

31

第十个“语言支持”组件包,中文支持打钩,英国英语支持打钩

检查软件包依赖关系

启动安装进程,开始安装 Oracle Linux 6.4 操作系统,进度条满时说明安装完毕

Page 32: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

32

现在就剩下慢慢等待 ing,你可以放松一下,我做了瞭望远方,查了查京东商城的包裹 ing,时间过的很快

您的 Oracle Linux Server 安装已经完成 reboot 重启操作系统,点击“重新引导”

Page 33: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

33

重启之后,发现 linux 运行在命令行模式[3]而非图形化模式[5],因此我们修改运行级别配置文件/etc/inittab

把最后一行 id 3 initdefault 修改成 id 5 initdefault 即可,保存->reboot 重启

选择 Linux 内核版本

Page 34: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

34

Unbreakable:牢不可破的,我们选择这种方式

Compatible:兼容性

正在读取进度 ing,如果可以顺利进入欢迎界面,就无需修改/etc/inittab 配置文件运行级别

服务器硬件常规检查

Page 35: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

35

进入到欢迎界面,从这里开始就需要一些基本配置 Linux,点击“前进”继续

是,我同意该许可证协议,点击“前进”继续

Page 36: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

36

不,我将在以后注册,点击“前进”继续

Page 37: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

37

完成更新设置,点击“前进”继续

现在不需要创建用户,我们一会儿在创建 oracle 用户,点击“前进”继续

Page 38: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

38

您没有设置可登陆到该系统的用户账户。您确定要继续吗?点击“是”继续

设置日期和时间,默认就是北京时间,点击“前进”继续

Kdump 是一个内核崩溃转储机制,在系统崩溃的时候 Kdump 将捕获系统信息,点击“完成”

Page 39: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

39

输入用户名/密码:root/oracle 登陆系统

正常进入系统安装 Virtualbox 增强包,设备菜单->安装增强功能

Page 40: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

40

会弹出一个光盘图标并打开文件夹点击“autorun.sh”自动安装 Virtualbox 增强包

Page 41: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

41

这是 Virtualbox 增强包安装过程,安装完毕后自动关闭对话框,reboot 重启操作系统

Virtualbox 增强包作用:鼠标自由切换,增强屏幕分辨率,共享剪切板

Page 42: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

42

四 配置 Oracle Linux 6.4 操作系统

1.系统常规参数检查

磁盘

[root@leonarding2 桌面]# df -h

文件系统 容量 已用 可用 已用%% 挂载点

/dev/sda3 47G 5.0G 40G 12% /

tmpfs 751M 260K 751M 1% /dev/shm

/dev/sda1 485M 56M 404M 13% /boot

/dev/sr0 57M 57M 0 100% /media/VBOXADDITIONS_4.2.16_86992

内核

[root@leonarding2 桌面]# uname -a

Linux leonarding2.oracle.com 2.6.39-400.17.1.el6uek.x86_64 #1 SMP Fri Feb 22 18:16:18 PST 2013 x86_64 x86_64 x86_64

GNU/Linux

版本

[root@leonarding2 桌面]# cat /etc/redhat-release

Red Hat Enterprise Linux Server release 6.4 (Santiago)

物理内存

[root@leonarding2 桌面]# grep MemTotal /proc/meminfo

MemTotal: 1536780 kB

虚拟内存

[root@leonarding2 桌面]# grep SwapTotal /proc/meminfo

SwapTotal: 2097148 kB

主机名

[root@leonarding2 桌面]# hostname

leonarding2.oracle.com

ip 地址

[root@leonarding2 桌面]# ifconfig

eth0 Link encap:Ethernet HWaddr 08:00:27:D8:95:7A

inet addr:192.168.1.102 Bcast:192.168.1.255 Mask:255.255.255.0

inet6 addr: fe80::a00:27ff:fed8:957a/64 Scope:Link

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:12619 errors:0 dropped:0 overruns:0 frame:0

TX packets:40 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:774420 (756.2 KiB) TX bytes:2767 (2.7 KiB)

lo Link encap:Local Loopback

inet addr:127.0.0.1 Mask:255.0.0.0

inet6 addr: ::1/128 Scope:Host

UP LOOPBACK RUNNING MTU:16436 Metric:1

RX packets:12 errors:0 dropped:0 overruns:0 frame:0

TX packets:12 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX bytes:720 (720.0 b) TX bytes:720 (720.0 b)

####################################################################################################

2.关闭防火墙服务 iptables&SELinux 安全策略&邮件服务 sendmail&时间同步服务 NTP

(1)关闭防火墙服务

Page 43: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

43

[root@leonarding2 桌面]# service iptables status 现在防火墙是开启状态

表格:filter

Chain INPUT (policy ACCEPT)

num target prot opt source destination

1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED

2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0

3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0

4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22

5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)

num target prot opt source destination

1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)

num target prot opt source destination

[root@leonarding2 桌面]# service iptables stop 关闭防火墙服务

iptables:清除防火墙规则: [确定]

iptables:将链设置为政策 ACCEPT:filter [确定]

iptables:正在卸载模块: [确定]

[root@leonarding2 桌面]# service iptables status 防火墙已经关闭

iptables:未运行防火墙。

[root@leonarding2 桌面]# chkconfig --list iptables 防火墙服务 2345 级别开机都启动

iptables 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭

[root@leonarding2 桌面]# chkconfig iptables off 关闭防火墙服务

[root@leonarding2 桌面]# chkconfig --list iptables 开机不启动防火墙服务

iptables 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭

(2)关闭 SELinux 安全策略

[root@leonarding2 桌面]# getenforce 显示 SELinux 开启状态

Enforcing

a 永久关闭方法 – 需要重启服务器

修改/etc/selinux/config 文件中设置 SELINUX=disabled ,然后重启服务器。

[root@leonarding2 桌面]# vim /etc/selinux/config

# This file controls the state of SELinux on the system.

# SELINUX= can take one of these three values:

# enforcing - SELinux security policy is enforced.

# permissive - SELinux prints warnings instead of enforcing.

# disabled - No SELinux policy is loaded.

SELINUX=disabled

# SELINUXTYPE= can take one of these two values:

# targeted - Targeted processes are protected,

# mls - Multi Level Security protection.

SELINUXTYPE=targeted

b 临时关闭方法 – 设置系统参数

使用命令 setenforce 0

附:

Page 44: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

44

setenforce 1 设置 SELinux 成为 enforcing 模式

setenforce 0 设置 SELinux 成为 permissive 模式

(3)关闭邮件服务 sendmail

[root@leonarding2 桌面]# service sendmail stop

sendmail: 未被识别的服务

Oracle Linux 6.4 版本下没有安装 sendmail 服务,我们就不用管它了,如果你的系统里面开启了,可以按照如下方式

关闭即可

service sendmail stop

chkconfig sendmail off

(4)关闭 NTP 时间同步服务

[root@leonarding2 桌面]# service ntpd status 已经是关闭状态

ntpd 已停

[root@leonarding2 桌面]# service ntpd stop 如果是开启可以使用这条命令关闭

关闭 ntpd: [失败]

[root@leonarding2 桌面]# chkconfig --list ntpd 开机不启动 NTP 服务

ntpd 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭

3.配置 hosts 文件

注:为什么要配置 hosts 文件呢,hosts 文件是用于 ip 地址与主机名映射的,在操作中有时会用到主机名进行访问,

这时就需要 hosts 文件对主机名进行解析,转换成 ip 地址,注意这里主备库信息都需要配置。

[root@leonarding2 桌面]# cat /etc/hosts

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4

::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

##primary 是域名,leonarding2.oracle.com 是主机名

## Network - (eth0)

192.168.1.102 primary leonarding2.oracle.com

192.168.1.103 standby leonarding3.oracle.com

测试如果可以 ping 通证明转换成功

[root@leonarding2 桌面]# ping leonarding2.oracle.com

PING primary (192.168.1.102) 56(84) bytes of data.

64 bytes from primary (192.168.1.102): icmp_seq=1 ttl=64 time=0.037 ms

64 bytes from primary (192.168.1.102): icmp_seq=2 ttl=64 time=0.042 ms

^C

--- primary ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 1326ms

rtt min/avg/max/mdev = 0.037/0.039/0.042/0.006 ms

[root@leonarding2 桌面]# ping leonarding3.oracle.com

PING standby (192.168.1.103) 56(84) bytes of data.

64 bytes from standby (192.168.1.103): icmp_seq=1 ttl=64 time=0.275 ms

64 bytes from standby (192.168.1.103): icmp_seq=2 ttl=64 time=0.280 ms

^C

--- standby ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 1334ms

rtt min/avg/max/mdev = 0.275/0.277/0.280/0.016 ms

[root@leonarding2 桌面]# ping primary

PING primary (192.168.1.102) 56(84) bytes of data.

64 bytes from primary (192.168.1.102): icmp_seq=1 ttl=64 time=0.032 ms

64 bytes from primary (192.168.1.102): icmp_seq=2 ttl=64 time=0.037 ms

Page 45: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

45

^C

--- primary ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 1341ms

rtt min/avg/max/mdev = 0.032/0.034/0.037/0.006 ms

[root@leonarding2 桌面]# ping standby

PING standby (192.168.1.103) 56(84) bytes of data.

64 bytes from standby (192.168.1.103): icmp_seq=1 ttl=64 time=0.316 ms

64 bytes from standby (192.168.1.103): icmp_seq=2 ttl=64 time=0.324 ms

^C

--- standby ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 1198ms

rtt min/avg/max/mdev = 0.316/0.320/0.324/0.004 ms

4.配置操作系统内核参数

[root@leonarding2 桌面]# vim /etc/sysctl.conf

结尾添加如下参数

kernel.shmmni = 4096

kernel.sem = 250 32000 100 128

fs.file-max = 6815744

net.ipv4.ip_local_port_range = 9000 65500

net.core.rmem_default = 4194304

net.core.rmem_max = 4194304

net.core.wmem_default = 1048576

net.core.wmem_max = 1048576

fs.aio-max-nr = 1048576

内核参数生效

[root@leonarding2 桌面]# /sbin/sysctl -p

net.ipv4.ip_forward = 0

net.ipv4.conf.default.rp_filter = 1

net.ipv4.conf.default.accept_source_route = 0

kernel.sysrq = 0

kernel.core_uses_pid = 1

net.ipv4.tcp_syncookies = 1

error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key

error: "net.bridge.bridge-nf-call-iptables" is an unknown key

error: "net.bridge.bridge-nf-call-arptables" is an unknown key

kernel.msgmnb = 65536

kernel.msgmax = 65536

kernel.shmmax = 68719476736

kernel.shmall = 4294967296

kernel.shmmni = 4096

kernel.sem = 250 32000 100 128

fs.file-max = 6815744

net.ipv4.ip_local_port_range = 9000 65500

net.core.rmem_default = 4194304

net.core.rmem_max = 4194304

net.core.wmem_default = 1048576

net.core.wmem_max = 1048576

Page 46: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

46

fs.aio-max-nr = 1048576

检查内核参数

[root@leonarding2 桌面]# ulimit -a

core file size (blocks, -c) 0

data seg size (kbytes, -d) unlimited

scheduling priority (-e) 0

file size (blocks, -f) unlimited

pending signals (-i) 7836

max locked memory (kbytes, -l) 64

max memory size (kbytes, -m) unlimited

open files (-n) 1024

pipe size (512 bytes, -p) 8

POSIX message queues (bytes, -q) 819200

real-time priority (-r) 0

stack size (kbytes, -s) 8192

cpu time (seconds, -t) unlimited

max user processes (-u) 7836

virtual memory (kbytes, -v) unlimited

file locks (-x) unlimited

修改 oracle 用户 shell 权限

[root@leonarding2 桌面]# vim /etc/security/limits.conf

结尾添加如下参数

# End of file

oracle soft nproc 2047

oracle hard nproc 16384

oracle soft nofile 1024

oracle hard nofile 65536

oracle soft stack 10240

oracle hard stack 32768

[root@leonarding2 pam.d]# vim /etc/pam.d/login 在此文件中添加如下一行

session required pam_limits.so

5.配置 YUM 源安装必备软件包

我们需创建一个新的 YUM 配置文件,使用安装光盘作为 YUM 源,原自带配置文件移动到备份目录

[root@leonarding2 pam.d]# cd /etc/yum.repos.d/

[root@leonarding2 yum.repos.d]# ll;

总用量 4

-rw-r--r--. 1 root root 1953 2 月 24 16:43 public-yum-ol6.repo

[root@leonarding2 yum.repos.d]# mkdir bk

[root@leonarding2 yum.repos.d]# mv public-yum-ol6.repo bk/

[root@leonarding2 yum.repos.d]# cd bk

[root@leonarding2 bk]# ll

总用量 4

-rw-r--r--. 1 root root 1953 2 月 24 16:43 public-yum-ol6.repo

[root@leonarding2 bk]# cd ..

[root@leonarding2 yum.repos.d]# vim leonarding-yum.repo

##添加如下信息

[Oracle]

Page 47: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

47

name=Oracle Linux $releasever - Media

baseurl=file:///mnt

gpgcheck=0

enabled=1

挂载光驱到挂载点

[root@leonarding2 mnt]# mount /dev/cdrom /mnt

mount: block device /dev/sr0 is write-protected, mounting read-only

安装必备软件包

[root@leonarding2 yum.repos.d]# yum -y install binutils-2.* compat-libstdc++-33* elfutils-libelf-0.* elfutils-libelf-devel-*

gcc-4.* gcc-c++-4.* glibc-2.* glibc-common-2.* glibc-devel-2.* glibc-headers-2.* ksh-2* libaio-0.* libaio-devel-0.*

libgcc-4.* libstdc++-4.* libstdc++-devel-4.* make-3.* sysstat-7.* unixODBC-2.* unixODBC-devel-2.*

Loaded plugins: refresh-packagekit, security

Setting up Install Process

Package binutils-2.20.51.0.2-5.36.el6.x86_64 already installed and latest version

Package compat-libstdc++-33-3.2.3-69.el6.x86_64 already installed and latest version

Package elfutils-libelf-0.152-1.el6.x86_64 already installed and latest version

Package elfutils-libelf-devel-0.152-1.el6.x86_64 already installed and latest version

Package gcc-4.4.7-3.el6.x86_64 already installed and latest version

Package gcc-c++-4.4.7-3.el6.x86_64 already installed and latest version

Package glibc-2.12-1.107.el6.x86_64 already installed and latest version

Package glibc-common-2.12-1.107.el6.x86_64 already installed and latest version

Package glibc-devel-2.12-1.107.el6.x86_64 already installed and latest version

Package glibc-headers-2.12-1.107.el6.x86_64 already installed and latest version

Package libaio-0.3.107-10.el6.x86_64 already installed and latest version

Package libgcc-4.4.7-3.el6.x86_64 already installed and latest version

Package libstdc++-4.4.7-3.el6.x86_64 already installed and latest version

Package libstdc++-devel-4.4.7-3.el6.x86_64 already installed and latest version

Package 1:make-3.81-20.el6.x86_64 already installed and latest version

No package sysstat-7.* available.

Resolving Dependencies

--> Running transaction check

---> Package ksh.x86_64 0:20100621-19.el6 will be installed

---> Package libaio-devel.x86_64 0:0.3.107-10.el6 will be installed

---> Package unixODBC.x86_64 0:2.2.14-12.el6_3 will be installed

---> Package unixODBC-devel.x86_64 0:2.2.14-12.el6_3 will be installed

--> Finished Dependency Resolution

Dependencies Resolved

================================================================================

Package Arch Version Repository Size

================================================================================

Installing:

ksh x86_64 20100621-19.el6 Oracle 686 k

libaio-devel x86_64 0.3.107-10.el6 Oracle 13 k

unixODBC x86_64 2.2.14-12.el6_3 Oracle 377 k

unixODBC-devel x86_64 2.2.14-12.el6_3 Oracle 53 k

Page 48: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

48

Transaction Summary

================================================================================

Install 4 Package(s)

Total download size: 1.1 M

Installed size: 2.8 M

Downloading Packages:

--------------------------------------------------------------------------------

Total 11 MB/s | 1.1 MB 00:00

Running rpm_check_debug

Running Transaction Test

Transaction Test Succeeded

Running Transaction

Installing : unixODBC-2.2.14-12.el6_3.x86_64 1/4

Installing : unixODBC-devel-2.2.14-12.el6_3.x86_64 2/4

Installing : libaio-devel-0.3.107-10.el6.x86_64 3/4

Installing : ksh-20100621-19.el6.x86_64 4/4

Verifying : ksh-20100621-19.el6.x86_64 1/4

Verifying : unixODBC-devel-2.2.14-12.el6_3.x86_64 2/4

Verifying : libaio-devel-0.3.107-10.el6.x86_64 3/4

Verifying : unixODBC-2.2.14-12.el6_3.x86_64 4/4

Installed:

ksh.x86_64 0:20100621-19.el6 libaio-devel.x86_64 0:0.3.107-10.el6

unixODBC.x86_64 0:2.2.14-12.el6_3 unixODBC-devel.x86_64 0:2.2.14-12.el6_3

Complete!

6.创建用户和组

[root@leonarding2 /]# groupadd -g 5001 oinstall 创建主要属组

[root@leonarding2 /]# groupadd -g 5002 dba 创建次要属组

[root@leonarding2 /]# groupadd -g 5003 oper 创建次要属组

[root@leonarding2 /]# groupadd -g 5004 dgdba 创建次要属组

[root@leonarding2 /]# useradd -m -u 5001 -g oinstall -G dba,oper,dgdba -d /home/oracle -s /bin/bash -c "Oracle Software

Owner" oracle

-m 如家目录不存在则创建它

-u 指定用户的 UID,它必须是唯一的,且大于 499

-g 指定用户主要属组

-G 指定用户次要属组,可以是一个 list

-d 指定用户家目录路径

-s 指定用户登录 Shell,默认为 /bin/bash

-c 用户全名或描述

-p 指定用户密码,可以单独设置

设置 oracle 用户密码:oracle

[root@leonarding2 /]# passwd oracle

更改用户 oracle 的密码 。

新的 密码:

无效的密码: 它基于字典单词

Page 49: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

49

无效的密码: 过于简单

重新输入新的 密码:

passwd: 所有的身份验证令牌已经成功更新。

我们重启一次操作系统验证一下

7.创建安装目录

[root@leonarding2 ~]# mkdir -p /u01/app/oracle

[root@leonarding2 ~]# mkdir -p /u01/app/oracle/oradata

[root@leonarding2 ~]# mkdir -p /u01/app/oracle/flash_recovery_area

[root@leonarding2 ~]# mkdir -p /u01/app/oracle/backup

[root@leonarding2 ~]# chown -R oracle.oinstall /u01

[root@leonarding2 ~]# chmod -R 775 /u01

8.配置 oracle 环境变量

切换 oracle 用户

[root@leonarding2 oracle]# su – oracle

[oracle@leonarding2 ~]$ vim /home/oracle/.bash_profile

添加如下环境变量信息

# Oracle Settings #

export TMP=/tmp

export TMPDIR=$TMP

export ORACLE_BASE=/u01/app/oracle

export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1

export ORACLE_SID=primary

export ORACLE_ADMIN=$ORACLE_BASE/admin

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib

export ORACLE_TERM=xterm

export PATH=/usr/sbin:/usr/bin:/usr/local/bin:$ORACLE_HOME/bin:$ORACLE_HOME/jdk/bin:$PATH

重新加载环境变量

[oracle@leonarding2 ~]$ . .bash_profile

9.上传软件安装包并解压

数据库安装包

linux.x64_11gR2_database_1of2.zip

linux.x64_11gR2_database_2of2.zip

[oracle@leonarding2 ~]$ mkdir software 创建一个软件存放目录,把安装包上传到目录

[oracle@leonarding2 software]$ pwd

/home/oracle/software

[oracle@leonarding2 software]$ ll

总用量 2295600

-rw-rw-rw- 1 oracle oinstall 1239269270 7 月 25 18:29 linux.x64_11gR2_database_1of2.zip

-rw-rw-rw- 1 oracle oinstall 1111416131 7 月 25 18:32 linux.x64_11gR2_database_2of2.zip

解压

[oracle@leonarding2 software]$ unzip linux.x64_11gR2_database_1of2.zip

[oracle@leonarding2 software]$ unzip linux.x64_11gR2_database_2of2.zip

设置全权限方便安装

[oracle@leonarding2 software]$ chmod -R 777 database/

解压之后大小 2.4G

[oracle@leonarding2 software]$ du -sh database/

2.4G database/

Page 50: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

50

五 安装 Oracle 11GR2 数据库

检查 DISPLAY 环境变量,大家应该知道这个环境变量是做什么的嘛?good ->启动图形化界面的

[oracle@leonarding2 stage]$ xhost +

access control disabled, clients can connect from any host 当看到这句话时表示可以启动图形化界面

[oracle@leonarding2 stage]$ echo $DISPLAY

:0.0

####################################################################################################

>>> Could not execute auto check for display colors using command /usr/bin/xdpyinfo. Check if the DISPLAY variable is set. Failed <<<<

如果发现有报错不能启动图形化,解决方法

export DISPLAY=:0.0 设置 oracle 用户的 DISPLAY 环境变量,满足这个条件

####################################################################################################

开始安装

[oracle@leonarding2 database]$ pwd

/home/oracle/software/database

[oracle@leonarding2 database]$ ./runInstaller ####################################################################################################

因为我的 linux 操作系统选择的是“简体中文版”,在启动图形化界面的时候所有字体都变成了小方块,无法看清

解决方法:切换成英文版即可正常显示

[oracle@leonarding2 database]$ cat /etc/sysconfig/i18n

LANG="zh_CN.UTF-8" 操作系统中文版使用这个变量

LANG="en_US.UTF-8" 操作系统英文版使用这个变量

重启操作系统即可

Page 51: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

51

下面开始安装数据库软件这里省略安装过程(我们要加快速度啦),安装过程网上有很多,直接百度了解一下即可

Data Guard 简介

Leonarding2 是主数据库 primary

Leonarding3 是备数据库 standby

截止到上面这 2 台机器的安装与配置都是一样的,两台一起做下来即可(两台机器的路径可以做成一模一样的这样在

进行 DG 参数配置的时候比较方便),下面的配置就不一样了。

首先 Leonarding2 节点创建数据库 primary 和监听 listener

Leonarding3 节点无需创建数据库,只保留 RDBMS 软件即可

DBCA 安装数据库

NETCA 安装监听

配置 tnsnames.ora

Leonarding2 数据库配置信息

数据库 SID:primary

SGA:349MB

字符集:ZH16GBK

数据文件路径:/u01/app/oracle/oradata

Flash_recovery_area 路径:/u01/app/oracle/ flash_recovery_area

Flash_recovery_area 大小:4096MB

####################################################################################################

当我们在共享池中试图分配大片的连续内存失败的时候,Oracle 首先清除池中当前没使用的所有对象,使空闲内存

块合并。如果仍然没有足够大单个的大块内存满足请求,就会产生 ORA-04031 错误,点击“Ignore”继续

Page 52: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

52

数据库创建完成,详细日志请参考/u01/app/oracle/cfgtoollogs/dbca/primary

数据库信息

全局数据库名:primary

数据库实例名:primary

数据库参数文件:/u01/app/oracle/product/11.2.0/db_1/dbs/spfileprimary.ora

注意:所有的数据库账户除了 SYS、SYSTEM 之外都是锁定状态,使用“Password Management”可以管理这些账户

点击“Exit”退出安装界面

NETCA 安装监听

[oracle@leonarding2 db_1]$ netca

Oracle Net Services Configuration:

选择“Listener configuration”,点击“Next”

Page 53: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

53

选择“Add”添加监听 listener,点击“Next”

输入要创建的监听名默认即可,点击“Next”

Page 54: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

54

选择 Listener 使用的网络协议,这里都是自动返填的默认即可,点击“Next”

设置 Listener 端口号默认为 1521,点击“Next”

Page 55: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

55

你要继续配置其他监听吗?选择“No”点击“Next”

Oracle 监听器配置完成,点击“Next”结束

Page 56: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

56

Page 57: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

57

六 设置 Oracle 和 OEM 随机启动

1.使用 root 用户修改/etc/oratab

[root@leonarding2 dbs]# vim /etc/oratab

在最后一行中修改 Y 代替 N

primary:/u01/app/oracle/product/11.2.0/db_1:Y

2.使用 oracle 用户修改$ORACLE_HOME/bin/dbstart 和 dbshut 文件参数

修改这两个文件中的 ORACLE_HOME_LISTNER 参数值

[oracle@leonarding2 db_1]$ vim /u01/app/oracle/product/11.2.0/db_1/bin/dbstart

ORACLE_HOME_LISTNER=$ORACLE_HOME ($ORACLE_HOME 代替$1)

[oracle@leonarding2 db_1]$ vim /u01/app/oracle/product/11.2.0/db_1/bin/dbshut

ORACLE_HOME_LISTNER=$ORACLE_HOME

3.创建 Oracle 启动/关闭 shell 脚本

使用 root 用户在/etc/rc.d/init.d 目录下添加 oracle 启动文件,并在文件中添加如下脚本

[root@leonarding2 init.d]$ vim /etc/rc.d/init.d/oracle

#!/bin/bash

# chkconfig: 2345 99 10

# description: Startup Script for oracle Database

# /etc/rc.d/init.d/oracle

export ORACLE_BASE=/u01/app/oracle

export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1

export ORACLE_SID=LEO1

export PATH=/usr/sbin:/usr/bin:/usr/local/bin:$ORACLE_HOME/bin:$ORACLE_HOME/jdk/bin:$PATH

case "$1" in

start)

echo "-----startup oracle-----" >> /var/log/oracle11log

su oracle -c "$ORACLE_HOME/bin/dbstart"

touch /var/lock/subsys/oracle

echo "-----startup oracle successful-----" >> /var/log/oracle11log

echo "OK"

;;

stop)

echo "-----shutdown oracle-----" >> /var/log/oracle11log

su oracle -c "$ORACLE_HOME/bin/dbshut"

rm -f /var/lock/subsys/oracle

echo "-----shutdown oracle successful-----" >> /var/log/oracle11log

echo "OK"

;;

*)

echo "Usage: 'basename $0' start|stop"

exit 1

esac

exit 0

4.给 Oracle 启动/关闭 shell 脚本设置权限 755

[root@leonarding2 init.d]# chmod 755 /etc/rc.d/init.d/oracle

5.添加 Oracle 随机启动服务 service oracle start

[root@leonarding2 init.d]# chkconfig --add oracle 添加服务

Page 58: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

58

[root@leonarding2 init.d]# chkconfig oracle on 随机启动

[root@leonarding2 init.d]# chkconfig --list oracle 检查启动级别

oracle 0:off 1:off 2:on 3:on 4:on 5:on 6:off

我们重启一下操作系统进行测试 reboot

[root@leonarding2 init.d]# reboot

检查启动日志

[oracle@leonarding2 Desktop]$ cat /var/log/oracle11log

-----startup oracle-----

-----startup oracle successful-----

检查 oracle 后台进程

[oracle@leonarding2 Desktop]$ ps -ef | grep ora_ | grep -v grep

oracle 2106 1 0 14:48 ? 00:00:00 ora_pmon_primary

oracle 2108 1 0 14:48 ? 00:00:02 ora_vktm_primary

oracle 2112 1 0 14:48 ? 00:00:00 ora_gen0_primary

oracle 2114 1 0 14:48 ? 00:00:00 ora_diag_primary

oracle 2116 1 0 14:48 ? 00:00:00 ora_dbrm_primary

oracle 2118 1 0 14:48 ? 00:00:00 ora_psp0_primary

oracle 2120 1 0 14:48 ? 00:00:00 ora_dia0_primary

oracle 2122 1 0 14:48 ? 00:00:00 ora_mman_primary

oracle 2124 1 0 14:48 ? 00:00:00 ora_dbw0_primary

oracle 2126 1 0 14:48 ? 00:00:00 ora_lgwr_primary

oracle 2128 1 0 14:48 ? 00:00:00 ora_ckpt_primary

oracle 2130 1 0 14:48 ? 00:00:00 ora_smon_primary

oracle 2132 1 0 14:48 ? 00:00:00 ora_reco_primary

oracle 2134 1 0 14:48 ? 00:00:00 ora_mmon_primary

oracle 2136 1 0 14:48 ? 00:00:00 ora_mmnl_primary

oracle 2138 1 0 14:48 ? 00:00:00 ora_d000_primary

oracle 2140 1 0 14:48 ? 00:00:00 ora_s000_primary

oracle 2178 1 0 14:48 ? 00:00:00 ora_qmnc_primary

oracle 2297 1 0 14:48 ? 00:00:00 ora_cjq0_primary

oracle 2384 1 0 14:48 ? 00:00:00 ora_q000_primary

oracle 2386 1 0 14:48 ? 00:00:00 ora_q001_primary

oracle 2998 1 0 14:53 ? 00:00:00 ora_smco_primary

oracle 3000 1 0 14:53 ? 00:00:00 ora_w000_primary

数据库监听器状态正常

[oracle@leonarding2 Desktop]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 29-JUL-2013 15:11:02

Copyright (c) 1991, 2009, Oracle. All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=primary)(PORT=1521)))

STATUS of the LISTENER

------------------------

Alias LISTENER

Version TNSLSNR for Linux: Version 11.2.0.1.0 - Production

Start Date 29-JUL-2013 14:48:11

Page 59: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

59

Uptime 0 days 0 hr. 22 min. 51 sec

Trace Level off

Security ON: Local OS Authentication

SNMP OFF

Listener Parameter File /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora

Listener Log File /u01/app/oracle/diag/tnslsnr/leonarding2/listener/alert/log.xml

Listening Endpoints Summary...

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=primary)(PORT=1521)))

Services Summary...

Service "primary" has 1 instance(s). 实例已经成功注册到监听中

Instance "primary", status READY, has 1 handler(s) for this service...

Service "primaryXDB" has 1 instance(s).

Instance "primary", status READY, has 1 handler(s) for this service...

The command completed successfully

Page 60: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

60

七 准备 Active Data Guard 实验环境

1.登陆数据库

[oracle@leonarding2 admin]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Mon Jul 29 15:52:19 2013

Copyright (c) 1982, 2009, Oracle. All rights reserved.

Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

2.数据库版本

SQL> select * from v$version;

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

PL/SQL Release 11.2.0.1.0 - Production

CORE 11.2.0.1.0 Production

TNS for Linux: Version 11.2.0.1.0 - Production

NLSRTL Version 11.2.0.1.0 - Production

3.设置 sqlplus 命令行提示符样式

[oracle@leonarding2 admin]$ vim $ORACLE_HOME/sqlplus/admin/glogin.sql

在全局配置文件尾部添加一行

set sqlprompt "_user'@'_connect_identifier> "

测试

[oracle@leonarding2 admin]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Mon Jul 29 15:57:35 2013

Copyright (c) 1982, 2009, Oracle. All rights reserved.

Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

SYS@primary>

注:这样我们就可以很方便的知道哪个用户登录到哪台数据库上了,避免了混淆

3.安装 rlwrap 包使其可以在 sqlplus 和 rman 工具中运用方向键

(1)上传到 linux,使用 root 用户安装

[root@leonarding2 oracle]# rpm -ivh rlwrap-0.37-1.el5.x86_64.rpm

warning: rlwrap-0.37-1.el5.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 217521f6: NOKEY

Preparing... ########################################### [100%]

1:rlwrap ########################################### [100%]

Page 61: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

61

(2)参加 oracle 用户环境变量别名

[oracle@leonarding2 ~]$ vim .bash_profile

最后一行添加如下别名

alias sqlplus="rlwrap sqlplus"

alias rman="rlwrap rman"

[oracle@leonarding2 ~]$ . .bash_profile 重新加载环境变量生效

这样再进入 sqlplus 和 rman 工具里就可以使用方向键和回退键了

4.检查 instance 信息

SYS@primary> select instance_name,version,status,archiver,database_status from v$instance;

INSTANCE_NAME VERSION STATUS ARCHIVE DATABASE_STATUS

---------------- ----------------- ------------ ------- -----------------

primary 11.2.0.1.0 OPEN STOPPED ACTIVE

5.检查表空间

SYS@primary> select * from v$tablespace;

TS# NAME INC BIG FLA ENC

---------- ------------------------------ --- --- --- ---

0 SYSTEM YES NO YES

1 SYSAUX YES NO YES

2 UNDOTBS1 YES NO YES

3 TEMP NO NO YES

4 USERS YES NO YES

6.检查是否归档

SYS@primary> archive log list

Database log mode No Archive Mode

Automatic archival Disabled

Archive destination USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence 72

Current log sequence 74

7.检查 database 信息

SYS@primary> select name,log_mode,open_mode from v$database;

NAME LOG_MODE OPEN_MODE

--------- ------------ ---------------------------------------

PRIMARY NOARCHIVELOG READ WRITE

8.调整控制文件的位置,都放在一个目录下/u01/app/oracle/oradata/primary/方便管理

SYS@primary> select name from v$controlfile;

NAME

--------------------------------------------------------------------------------

/u01/app/oracle/oradata/primary/control01.ctl

/u01/app/oracle/flash_recovery_area/primary/control02.ctl

生成 pfile

SYS@primary> create pfile from spfile;

File created.

关闭数据库

SYS@primary> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

Page 62: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

62

修改纯文本参数文件中的 control_files 参数位置

[oracle@leonarding2 primary]$ cd $ORACLE_HOME/dbs/

[oracle@leonarding2 dbs]$ ll

total 28

-rw-rw---- 1 oracle oinstall 1544 Jul 26 16:10 hc_DBUA0.dat

-rw-rw---- 1 oracle oinstall 1544 Jul 29 16:59 hc_primary.dat

-rw-r--r-- 1 oracle oinstall 2851 May 15 2009 init.ora

-rw-r--r-- 1 oracle oinstall 946 Jul 29 16:59 initprimary.ora

-rw-r----- 1 oracle oinstall 24 Jul 26 16:26 lkPRIMARY

-rw-r----- 1 oracle oinstall 1536 Jul 26 16:25 orapwprimary

-rw-r----- 1 oracle oinstall 2560 Jul 29 16:08 spfileprimary.ora

[oracle@leonarding2 dbs]$ vim initprimary.ora

*.control_files='/u01/app/oracle/oradata/primary/control01.ctl','/u01/app/oracle/oradata/primary/control02.ctl'

把 control02.ctl 控制文件移动到/u01/app/oracle/oradata/primary/位置

[oracle@leonarding2 oracle]$ cd /u01/app/oracle/flash_recovery_area/primary

[oracle@leonarding2 primary]$ ll

total 9520

-rw-r----- 1 oracle oinstall 9748480 Jul 29 16:59 control02.ctl

[oracle@leonarding2 primary]$ mv control02.ctl /u01/app/oracle/oradata/primary/

[oracle@leonarding2 primary]$ ll

total 2009332

-rw-r----- 1 oracle oinstall 9748480 Jul 29 16:59 control01.ctl

-rw-r----- 1 oracle oinstall 9748480 Jul 29 16:59 control02.ctl

根据 pfile 生成 spfile

SYS@primary> create spfile from pfile;

File created.

检查 spfile 参数文件

[oracle@leonarding2 dbs]$ strings spfileprimary.ora

primary.__db_cache_size=121634816

primary.__java_pool_size=4194304

primary.__large_pool_size=4194304

primary.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment

primary.__pga_aggregate_target=155189248

primary.__sga_target=264241152

primary.__shared_io_pool_size=0

primary.__shared_pool_size=121634816

primary.__streams_pool_size=0

*.audit_file_dest='/u01/app/oracle/admin/primary/adump'

*.audit_trail='db'

*.compatible='11.2.0.0.0'

*.control_files='/u01/app/oracle/oradata/primary/control01.ctl','/u01/app/oracle/oradata/primary/control02.ctl'

使用 spfile 启动数据库

SYS@primary> show parameter control_file 控制文件修改完成

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

control_file_record_keep_time integer 7

control_files string /u01/app/oracle/oradata/primary/control01.ctl,

Page 63: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

63

/u01/app/oracle/oradata/primary/control02.ctl

9.启动归档模式

创建归档日志目录

[oracle@leonarding2 oracle]$ mkdir /u01/app/oracle/arch/primary

指定归档日志存放路径

SYS@primary> alter system set log_archive_dest_1='location=/u01/app/oracle/arch/primary' scope=both;

System altered.

SYS@primary> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SYS@primary> startup mount

ORACLE instance started.

Total System Global Area 417546240 bytes

Fixed Size 2213936 bytes

Variable Size 285214672 bytes

Database Buffers 121634816 bytes

Redo Buffers 8482816 bytes

Database mounted.

启动到归档模式

SYS@primary> alter database archivelog;

Database altered.

SYS@primary> alter database open;

Database altered.

SYS@primary> archive log list

Database log mode Archive Mode 归档模式设置完成

Automatic archival Enabled

Archive destination /u01/app/oracle/arch/primary

Oldest online log sequence 72

Next log sequence to archive 74

Current log sequence 74

测试

SYS@primary> alter system switch logfile; 手动切换日志

[oracle@leonarding2 primary]$ ll

total 14140

-rw-r----- 1 oracle oinstall 14477824 Jul 29 19:41 1_74_821809560.dbf 已经生成归档日志

Page 64: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

64

八 搭建 Physical Standby 物理备库

1.DG 日志传递模式-图文并茂 了解知道原理即可

LGWR(异步)传输日志模式:先把 redo 数据写入本地在线日志后在传递给备库在线日志并应用

LGWR(同步)传输日志模式:主库触发 LGWR->传给->备库重做日志->备库接收到重做日志后马上应用

Page 65: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

65

ARCH 传输日志模式:主库触发 ARCH->传给->备库归档日志->备库接受到归档日志后马上应用->当归档日志目录快满

时需要手工删除或备份到别处

2.确认主库处于归档模式并开启 force logging(不管什么操作都生成 redo 日志)功能

force logging 功能:不管什么操作都生成 redo 日志,因为 DG 要求 primary 与 standby 数据必须一致,因此为防止主

库的一些操作不产生 redo 导致无法完整同步备库,强制设置无论什么操作都要产生 redo,这就是 force logging 的目

的。

SYS@primary> select log_mode from v$database;

LOG_MODE

------------

ARCHIVELOG

SYS@primary> select force_logging from v$database; 当前没有开启 force logging

FOR

---

NO

SYS@primary> alter database force logging; 启动 force logging 功能

Database altered.

SYS@primary> select force_logging,log_mode from v$database;

FOR LOG_MODE

--- -------------------------

YES ARCHIVELOG

3.添加 standby logfile

standby logfile

(1)standby logfile 是备库组件,当成为备库时用来接收来自主库的 redo 日志内容

(2)现在也可以不用创建,当切换为备库时会自动创建与主库数量相同的日志个数和大小

Page 66: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

66

(3)添加 standby logfile 大小需要与 logfile 大小保持一致,数量最好 n+1 用于日志缓冲

SYS@primary> select group#,members,bytes/1024/1024,status from v$log;

GROUP# MEMBERS BYTES/1024/1024 STATUS

---------- ---------- --------------- ------------------------- --------------- --

1 1 50 INACTIVE

2 1 50 INACTIVE

3 1 50 CURRENT

Primary 数据库一共有三组 redo,每组一个成员,成员大小 50MB

添加四组 standby logfile

SYS@primary> alter database add standby logfile group 4 '/u01/app/oracle/oradata/primary/redo04.log' size 50M;

Database altered.

SYS@primary> alter database add standby logfile group 5 '/u01/app/oracle/oradata/primary/redo05.log' size 50M;

Database altered.

SYS@primary> alter database add standby logfile group 6 '/u01/app/oracle/oradata/primary/redo06.log' size 50M;

Database altered.

SYS@primary> alter database add standby logfile group 7 '/u01/app/oracle/oradata/primary/redo07.log' size 50M;

Database altered.

SYS@primary> select group#,type,member from v$logfile;

GROUP# TYPE MEMBER

--------------------------------------------------------------------------------

1 ONLINE /u01/app/oracle/oradata/primary/redo01.log

2 ONLINE /u01/app/oracle/oradata/primary/redo02.log

3 ONLINE /u01/app/oracle/oradata/primary/redo03.log

4 STANDBY /u01/app/oracle/oradata/primary/redo04.log

5 STANDBY /u01/app/oracle/oradata/primary/redo05.log

6 STANDBY /u01/app/oracle/oradata/primary/redo06.log

7 STANDBY /u01/app/oracle/oradata/primary/redo07.log

7 rows selected.

4.配置网络参数

现在来配置 primary 网络

检查 listener.ora 服务端配置文件和监听器状态

[oracle@leonarding2 admin]$ cat listener.ora

# listener.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora

# Generated by Oracle configuration tools.

LISTENER =

(DESCRIPTION_LIST =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = primary)(PORT = 1521))

)

)

ADR_BASE_LISTENER = /u01/app/oracle

SID_LIST_LISTENER=

(SID_LIST=

(SID_DESC= 静态注册语句

(GLOBAL_DBNAME=primary_DGMGRL) 向外提供的服务名 service_name

Page 67: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

67

(ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1)

(SID_NAME=primary) 服务名 实例名 instance_name

)

)

解释:添加静态注册语句才能顺利使用 DG broker 管理工具来实现 switchover 和 fast start failover,并且

GLOBAL_DBNAME必须以db_unique_name_DGMGRL.db_domain格式存在,可以使用 show parameter db_unique_name

和 show parameter db_domain 方式查询。

SYS@primary> show parameter db_unique_name

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

db_unique_name string primary

SYS@primary> show parameter db_domain

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

db_domain string

官方文档说明

To enable DGMGRL to restart instances during the course of broker operations, a service with a specific name must be statically registered with the local listener of each instance. A static service registration is also required to enable the observer to restart instances as part of automatic reinstatement of the old primary database after Fast-Start Failover has occurred. The value for the GLOBAL_DBNAME attribute must be set to a concatenation of db_unique_name_DGMGRL.db_domain For example, in the LISTENER.ORA file: LISTENER =

(DESCRIPTION = (ADDRESS_LIST=

(ADDRESS=(PROTOCOL=tcp)(HOST=host_name) (PORT=port_num)) )

) SID_LIST_LISTENER=

(SID_LIST= (SID_DESC=

(GLOBAL_DBNAME=db_unique_name_DGMGRL.db_domain) (ORACLE_HOME=oracle_home) (SID_NAME=sid_name)

) ) 重启监听

[oracle@leonarding2 admin]$ lsnrctl reload

LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 31-JUL-2013 11:13:33

Copyright (c) 1991, 2009, Oracle. All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=primary)(PORT=1521)))

The command completed successfully

查看监听状态

[oracle@leonarding2 admin]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 31-JUL-2013 11:15:14

Page 68: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

68

Copyright (c) 1991, 2009, Oracle. All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=primary)(PORT=1521)))

STATUS of the LISTENER

------------------------

Alias LISTENER

Version TNSLSNR for Linux: Version 11.2.0.1.0 - Production

Start Date 29-JUL-2013 14:48:11

Uptime 1 days 20 hr. 27 min. 2 sec

Trace Level off

Security ON: Local OS Authentication

SNMP OFF

Listener Parameter File /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora

Listener Log File /u01/app/oracle/diag/tnslsnr/leonarding2/listener/alert/log.xml

Listening Endpoints Summary...

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=primary)(PORT=1521)))

Services Summary...

Service "primary" has 1 instance(s).

Instance "primary", status READY, has 1 handler(s) for this service... primary 实例动态注册 primary 服务

Service "primaryXDB" has 1 instance(s).

Instance "primary", status READY, has 1 handler(s) for this service...

Service "primary_DGMGRL" has 1 instance(s).

Instance "primary", status UNKNOWN, has 1 handler(s) for this service... primary 实例静态注册 primary_DGMGRL 服务

The command completed successfully

名词解释

UNKNOWN:监听不知道实例的状态,连接请求时才进行实例检查,静态注册

READY:监听会不间断探测实例,当实例启动后会自动动态注册到监听,动态注册

我们配置客户端 tnsnames.ora 文件,要求主库与备库连接字符串都要配置好

[oracle@leonarding2 admin]$ vim tnsnames.ora

primary=

(DESCRIPTION=

(ADDRESS=(PROTOCOL=tcp)(HOST=primary)(PORT=1521))

(CONNECT_DATA=

(SERVER=DEDICATED)

(SERVICE_NAME=primary_DGMGRL)

)

)

standby=

(DESCRIPTION=

(ADDRESS=(PROTOCOL=tcp)(HOST=standby)(PORT=1521))

(CONNECT_DATA=

(SERVER=DEDICATED)

(SERVICE_NAME=standby_DGMGRL)

)

Page 69: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

69

)

注:只有使用静态注册连接串,才能应用 broker 工具管理 Data Guard

把 listener.ora tnsnames.ora 两个文件从 primary 拷贝到 standby 数据库上一份

[oracle@leonarding2 admin]$ scp listener.ora tnsnames.ora oracle@standby:$ORACLE_HOME/network/admin/

The authenticity of host 'standby (192.168.1.103)' can't be established.

RSA key fingerprint is 4e:c4:e1:cf:37:22:bd:ea:b1:20:17:ad:cb:40:38:19.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added 'standby' (RSA) to the list of known hosts.

oracle@standby's password:

listener.ora 100% 570 0.6KB/s 00:00

tnsnames.ora 100% 437 0.4KB/s 00:00

在 standby 库上修改 listener.ora 内容,使其符合 standby 角色

[oracle@leonarding3 admin]$ vim listener.ora

LISTENER =

(DESCRIPTION_LIST =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = standby)(PORT = 1521))

)

)

ADR_BASE_LISTENER = /u01/app/oracle

SID_LIST_LISTENER=

(SID_LIST=

(SID_DESC=

(GLOBAL_DBNAME=standby_DGMGRL)

(ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1)

(SID_NAME=standby)

)

)

5.创建备库密码文件

注意备库密码文件与主库密码文件内容保持一致

[oracle@leonarding3 admin]$ cd $ORACLE_HOME/dbs

[oracle@leonarding3 dbs]$ orapwd file=orapwstandby password=oracle entries=30

[oracle@leonarding3 dbs]$ ll

total 12

-rw-r--r-- 1 oracle oinstall 2851 May 15 2009 init.ora

-rw-r----- 1 oracle oinstall 5120 Jul 31 13:52 orapwstandby

6.创建必要目录

Standby 库

转储目录

[oracle@leonarding3 oracle]$ mkdir -p $ORACLE_BASE/admin/standby/{a,dp}dump

[oracle@leonarding3 oracle]$ mkdir -p $ORACLE_BASE/admin/standby/pfile

归档目录

[oracle@leonarding3 oracle]$ mkdir -p arch/standby

[oracle@leonarding3 standby]$ pwd

/u01/app/oracle/arch/standby

Page 70: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

70

Primary 库 归档目录

[oracle@leonarding2 primary]$ pwd

/u01/app/oracle/arch/primary

7.配置数据库参数文件

DG 的各种模式功能都是体现在参数文件中的,因此参数文件的配置是非常重要的,这里还分为主库角色使用的参

数和备库角色使用的参数

首先 primary 库参数文件进行配置

SYS@primary> create pfile from spfile; 使用 spfile 生成 pfile

File created.

给 pfile 添加新内容

[oracle@leonarding2 dbs]$ vim initprimary.ora

原参数

primary.__db_cache_size=117440512

primary.__java_pool_size=4194304

primary.__large_pool_size=4194304

primary.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment

primary.__pga_aggregate_target=146800640

primary.__sga_target=272629760

primary.__shared_io_pool_size=0

primary.__shared_pool_size=134217728

primary.__streams_pool_size=0

*.audit_file_dest='/u01/app/oracle/admin/primary/adump'

*.audit_trail='db'

*.compatible='11.2.0.0.0'

*.control_files='/u01/app/oracle/oradata/primary/control01.ctl','/u01/app/oracle/oradata/primary/control02.ctl'

*.db_block_size=8192

*.db_domain=''

*.db_name='primary'

*.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'

*.db_recovery_file_dest_size=4294967296

*.diagnostic_dest='/u01/app/oracle'

*.dispatchers='(PROTOCOL=TCP) (SERVICE=primaryXDB)' 删除这行

*.log_archive_dest_1='location=/u01/app/oracle/arch/primary' 删除这行

*.memory_target=417333248

*.open_cursors=300

*.processes=150

*.remote_login_passwordfile='EXCLUSIVE'

*.undo_tablespace='UNDOTBS1'

添加当为主库时的参数

## parameter for Primary Database

db_unique_name=primary

log_archive_format=log_%t_%s_%r.arc

log_archive_config='DG_CONFIG=(primary,standby)'

log_archive_dest_1='location=/u01/app/oracle/arch/primary valid_for=(all_logfiles,all_roles) db_unique_name=primary'

log_archive_dest_2='service=standby lgwr sync valid_for=(online_logfiles,primary_role) db_unique_name=standby'

log_archive_dest_state_1=enable

log_archive_dest_state_2=enable

Page 71: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

71

添加当为备库时的参数

## parameter for Standby Database

fal_server=standby

fal_client=primary

db_file_name_convert='standby','primary'

log_file_name_convert='standby','primary'

standby_file_management=auto

standby_archive_dest='/u01/app/oracle/arch/primary'

通过 pfile 重建 spfile

SYS@primary> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SYS@primary> create spfile from pfile;

File created.

8.给主库冷备 tar 包传递到备库

[oracle@leonarding2 oracle]$ cd $ORACLE_BASE/oradata

[oracle@leonarding2 oradata]$ tar -cvf primary.tar primary 打包

primary/

primary/redo03.log

primary/redo06.log

primary/redo05.log

primary/undotbs01.dbf

primary/temp01.dbf

primary/system01.dbf

primary/redo01.log

primary/control01.ctl

primary/users01.dbf

primary/sysaux01.dbf

primary/redo07.log

primary/control02.ctl

primary/redo04.log

primary/redo02.log

[oracle@leonarding2 oradata]$ ll

total 2245280

drwxr-x--- 2 oracle oinstall 4096 Jul 30 21:25 primary

-rw-r--r-- 1 oracle oinstall 2299156480 Aug 1 10:06 primary.tar

从 primary 传递到 standby

[oracle@leonarding2 oradata]$ scp primary.tar oracle@standby:/u01/app/oracle/oradata/

oracle@standby's password:

primary.tar 100% 2193MB 16.4MB/s 02:14

standby 端检查

oracle@leonarding3 oradata]$ ll

total 2245276

-rw-r--r-- 1 oracle oinstall 2299156480 Aug 1 10:12 primary.tar

Standby 端解开刚刚传过来的 primary.tar 包还原数据文件并重命名为 standby

Page 72: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

72

[oracle@leonarding3 oradata]$ tar -xvf primary.tar

primary/

primary/redo03.log

primary/redo06.log

primary/redo05.log

primary/undotbs01.dbf

primary/temp01.dbf

primary/system01.dbf

primary/redo01.log

primary/control01.ctl

primary/users01.dbf

primary/sysaux01.dbf

primary/redo07.log

primary/control02.ctl

primary/redo04.log

primary/redo02.log

[oracle@leonarding3 oradata]$ mv primary standby

[oracle@leonarding3 oradata]$ ll

total 4

drwxr-x--- 2 oracle oinstall 4096 Jul 30 21:25 standby

主库参数文件传递到备库然后重命名

[oracle@leonarding2 oradata]$ cd $ORACLE_HOME/dbs

[oracle@leonarding2 dbs]$ ll

total 32

-rw-rw---- 1 oracle oinstall 1544 Jul 26 16:10 hc_DBUA0.dat

-rw-rw---- 1 oracle oinstall 1544 Aug 1 10:00 hc_primary.dat

-rw-r--r-- 1 oracle oinstall 2851 May 15 2009 init.ora

-rw-r--r-- 1 oracle oinstall 1564 Aug 1 09:59 initprimary.ora

-rw-r--r-- 1 oracle oinstall 995 Jul 31 18:35 initprimary.ora_bak

-rw-r----- 1 oracle oinstall 24 Jul 26 16:26 lkPRIMARY

-rw-r----- 1 oracle oinstall 1536 Jul 26 16:25 orapwprimary

-rw-r----- 1 oracle oinstall 3584 Aug 1 10:00 spfileprimary.ora

[oracle@leonarding2 dbs]$ scp initprimary.ora oracle@standby:$ORACLE_HOME/dbs

oracle@standby's password:

initprimary.ora 100% 1564 1.5KB/s 00:00

standby 端检查

[oracle@leonarding3 oradata]$ cd $ORACLE_HOME/dbs

[oracle@leonarding3 dbs]$ ll

total 16

-rw-r--r-- 1 oracle oinstall 2851 May 15 2009 init.ora

-rw-r--r-- 1 oracle oinstall 1564 Aug 1 10:18 initprimary.ora

-rw-r----- 1 oracle oinstall 5120 Jul 31 13:52 orapwstandby

Standby 端重命名

[oracle@leonarding3 dbs]$ mv initprimary.ora initstandby.ora

[oracle@leonarding3 dbs]$ ll

total 16

-rw-r--r-- 1 oracle oinstall 2851 May 15 2009 init.ora

Page 73: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

73

-rw-r--r-- 1 oracle oinstall 1564 Aug 1 10:18 initstandby.ora

-rw-r----- 1 oracle oinstall 5120 Jul 31 13:52 orapwstandby

Standby 端手工删除原主库控制文件

[oracle@leonarding3 oradata]$ cd standby

[oracle@leonarding3 standby]$ rm control01.ctl

[oracle@leonarding3 standby]$ rm control02.ctl

Primary 端创建具有备库属性控制文件然后传递到 standby 端

SYS@primary> startup

ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance

ORACLE instance started.

启动数据库时报错:有废弃的参数指定在实例中

Total System Global Area 417546240 bytes

Fixed Size 2213936 bytes

Variable Size 289408976 bytes

Database Buffers 117440512 bytes

Redo Buffers 8482816 bytes

Database mounted.

Database opened.

检查 tail -100f alert_primary.log

TNS-00511: No listener

nt secondary err code: 111

nt OS err code: 0

Error 12541 received logging on to the standby

备库没有启 listener 导致无法接受主库传递过来的日志文件,这个没有关系等我们配置好备库后自然就恢复正常了

SYS@primary> alter database create standby controlfile as '/home/oracle/control01.ctl';

Database altered.

SYS@primary> alter database create standby controlfile as '/home/oracle/control02.ctl';

Database altered.

[oracle@leonarding2 ~]$ ll

total 19176

-rw-r----- 1 oracle oinstall 9748480 Aug 1 10:55 control01.ctl

-rw-r----- 1 oracle oinstall 9748480 Aug 1 10:55 control02.ctl

[oracle@leonarding2 ~]$ scp control01.ctl control02.ctl oracle@standby:$ORACLE_BASE/oradata/standby

oracle@standby's password:

control01.ctl 100% 9520KB 9.3MB/s 00:01

control02.ctl 100% 9520KB 9.3MB/s 00:00

Standby 端检查

[oracle@leonarding3 standby]$ pwd

/u01/app/oracle/oradata/standby

[oracle@leonarding3 standby]$ ll

total 2245292

-rw-r----- 1 oracle oinstall 9748480 Aug 1 10:57 control01.ctl

-rw-r----- 1 oracle oinstall 9748480 Aug 1 10:57 control02.ctl

9.准备备库的参数文件

修改参数值 (重点注意路径 primary standby)

[oracle@leonarding3 dbs]$ vim initstandby.ora

####################################################

Page 74: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

74

standby.__db_cache_size=117440512

standby.__java_pool_size=4194304

standby.__large_pool_size=4194304

standby.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment

standby.__pga_aggregate_target=146800640

standby.__sga_target=272629760

standby.__shared_io_pool_size=0

standby.__shared_pool_size=134217728

standby.__streams_pool_size=0

*.audit_file_dest='/u01/app/oracle/admin/standby/adump'

*.audit_trail='db'

*.compatible='11.2.0.0.0'

*.control_files='/u01/app/oracle/oradata/standby/control01.ctl','/u01/app/oracle/oradata/standby/control02.ctl'

*.db_block_size=8192

*.db_domain=''

*.db_name='primary'

*.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'

*.db_recovery_file_dest_size=4294967296

*.diagnostic_dest='/u01/app/oracle'

*.memory_target=417333248

*.open_cursors=300

*.processes=150

*.remote_login_passwordfile='EXCLUSIVE'

*.undo_tablespace='UNDOTBS1'

## parameter for Primary Database ##

db_unique_name=standby

log_archive_format=log_%t_%s_%r.arc

log_archive_config='DG_CONFIG=(primary,standby)'

log_archive_dest_1='location=/u01/app/oracle/arch/standby valid_for=(all_logfiles,all_roles) db_unique_name=standby'

log_archive_dest_2='service=primary lgwr async valid_for=(online_logfiles,primary_role) db_unique_name=primary'

log_archive_dest_state_1=enable

log_archive_dest_state_2=enable

## parameter for Standby Database ##

fal_server=primary

fal_client=standby

db_file_name_convert='primary','standby'

log_file_name_convert='primary','standby'

standby_file_management=auto

standby_archive_dest='/u01/app/oracle/arch/standby'

设置 oracle 用户环境变量

[oracle@leonarding3 ~]$ vim .bash_profile

export ORACLE_SID=standby primary standby

[oracle@leonarding3 ~]$ . .bash_profile

[oracle@leonarding3 ~]$ echo $ORACLE_SID 数据库 SID 已经修改完成

standby

Page 75: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

75

[oracle@leonarding3 ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Thu Aug 1 12:19:50 2013

Copyright (c) 1982, 2009, Oracle. All rights reserved.

Connected to an idle instance.

SQL> create spfile from pfile; 生成 spfilestandby.ora

File created.

[oracle@leonarding3 dbs]$ ll

total 20

-rw-r--r-- 1 oracle oinstall 2851 May 15 2009 init.ora

-rw-r--r-- 1 oracle oinstall 1565 Aug 1 12:11 initstandby.ora

-rw-r----- 1 oracle oinstall 5120 Jul 31 13:52 orapwstandby

-rw-r----- 1 oracle oinstall 3584 Aug 1 12:19 spfilestandby.ora

10.启动备库和监听

为什么要先启动备库再启动主库呢?

DG 原理:主库启动后会主动探测备库,如果此时备库没有启动那么主库探测不到备库的存在,就会等待若干分钟

之后再次探测,你会在 alert 日志中看到大量 ORA 报错引起恐慌,为了避免这种情况发生。可以先启动备库,此时

备库会等待来自主库的日志,当备库启动之后主库再启动会在第一时间探测到备库存在,就不会看到大量报错信息

了。

为什么在操作 primary standby 库时建议始终打开 alert 日志

这样可以实时监控数据库启动 关闭 切换 操作的状态,查看到日志是否应用,角色是否切换完毕,数据库是否 read

only 打开等,主要是为了方便我们监控主备库同步状态。

启动备库

[oracle@leonarding3 oracle]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Thu Aug 1 13:44:54 2013

Copyright (c) 1982, 2009, Oracle. All rights reserved.

Connected to an idle instance.

SQL> startup mount

ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance

ORACLE instance started.

Total System Global Area 417546240 bytes

Fixed Size 2213936 bytes

Variable Size 268437456 bytes

Database Buffers 138412032 bytes

Redo Buffers 8482816 bytes

Database mounted.

[oracle@leonarding3 trace]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 01-AUG-2013 13:50:27

Copyright (c) 1991, 2009, Oracle. All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=standby)(PORT=1521)))

Page 76: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

76

TNS-12541: TNS:no listener

TNS-12560: TNS:protocol adapter error

TNS-00511: No listener

Linux Error: 111: Connection refused

没有启动监听所以才报错,我们来启动一下监听 listener

启动监听

[oracle@leonarding3 admin]$ lsnrctl start

Services Summary...

Service "standby_DGMGRL" has 1 instance(s).

Instance "standby", status UNKNOWN, has 1 handler(s) for this service...

The command completed successfully

现在只有 standby 实例静态注册到监听中,服务名为 standby_DGMGRL,稍等一会实例会动态注册到监听

Services Summary...

Service "standby" has 1 instance(s). standby 实例已经动态注册到监听中,服务名为 standby

Instance "standby", status READY, has 1 handler(s) for this service...

Service "standby_DGMGRL" has 1 instance(s).

Instance "standby", status UNKNOWN, has 1 handler(s) for this service...

The command completed successfully

下面来把主库启动一下,观察 alert 日志变化

Primary 库

SYS@primary> startup

Alert 日志

Successful mount of redo thread 1, with mount id 1659787172

Database mounted in Exclusive Mode

Lost write protection disabled

Completed: ALTER DATABASE MOUNT

成功 mount

Destination LOG_ARCHIVE_DEST_2 is UNSYNCHRONIZED

******************************************************************

LGWR: Setting 'active' archival for destination LOG_ARCHIVE_DEST_2

******************************************************************

Error 1017 received logging on to the standby

------------------------------------------------------------

Check that the primary and standby are using a password file

and remote_login_passwordfile is set to SHARED or EXCLUSIVE,

and that the SYS password is same in the password files.

returning error ORA-16191

Error 1017 received logging on to the standby

------------------------------------------------------------

Check that the primary and standby are using a password file

and remote_login_passwordfile is set to SHARED or EXCLUSIVE,

and that the SYS password is same in the password files.

returning error ORA-16191

------------------------------------------------------------

Errors in file /u01/app/oracle/diag/rdbms/primary/primary/trace/primary_arc2_10325.trc:

ORA-16191: Primary log shipping client not logged on standby

PING[ARC2]: Heartbeat failed to connect to standby 'standby'. Error is 16191. 连接备库心跳失败

Page 77: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

77

Thu Aug 01 14:48:28 2013

一直在报错:主库日志无法顺利登陆备库,也就是说两端的密码文件不一致,我们从主库直接拷贝密码文件到备库

主库操作

[oracle@leonarding2 dbs]$ scp orapwprimary oracle@standby:$ORACLE_HOME/dbs

oracle@standby's password:

orapwprimary 100% 1536 1.5KB/s 00:00

备库操作

[oracle@leonarding3 dbs]$ mv orapwprimary orapwstandby

SYS@standby> startup nomount

ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance

ORACLE instance started.

Total System Global Area 417546240 bytes

Fixed Size 2213936 bytes

Variable Size 289408976 bytes

Database Buffers 117440512 bytes

Redo Buffers 8482816 bytes

SYS@standby> alter database mount;

Database altered.

RFS[3]: Assigned to RFS process 11136

RFS[3]: Identified database type as 'physical standby': Client is ARCH pid 10321

RFS[3]: Selected log 5 for thread 1 sequence 77 dbid 1659292248 branch 821809560

Archived Log entry 1 added for thread 1 sequence 77 ID 0x62e67858 dest 1:

已经接收到 77 号归档日志

[oracle@leonarding3 standby]$ ll

total 3040

-rw-r----- 1 oracle oinstall 3109376 Aug 1 15:40 log_1_77_821809560.arc

11.主备库状态检查

主库状态

SYS@primary>

select db_unique_name,open_mode,database_role,switchover_status,dataguard_broker,primary_db_unique_name from

v$database;

DB_UNIQUE_NAME OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS DATAGUAR_BROKER

PRIMARY_DB_UNIQUE_NAME

------------------------------ -------------------- ---------------- -------------------- -------- ------------------------------

primary READ WRITE PRIMARY RESOLVABLE GAP DISABLED

主库:可读写 没有启动 broker 主库角色 还有要解决的 gap

SYS@primary> select group#,bytes,status from v$standby_log;

GROUP# BYTES STATUS

---------- ---------- ----------

4 52428800 UNASSIGNED

5 52428800 UNASSIGNED

6 52428800 UNASSIGNED

7 52428800 UNASSIGNED

主库的 standby_log 没有使用

SYS@primary> select * from v$archive_gap;

no rows selected

Page 78: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

78

主库没有遗漏

col standby_dest for a12

col archived for a10

col applied for a10

col status for a10

SYS@primary> select sequence#,standby_dest,archived,applied,status from v$archived_log;

SEQUENCE# STANDBY_DEST ARCHIVED APPLIED STATUS

---------- ------------ ---------- ---------- -------------- ------------ ---------- ---------- ----------

74 NO YES NO A

75 NO YES NO A

76 NO YES NO A

77 NO YES NO A

77 YES YES NO A

说明:一共 5 个归档日志,只有 77 号传递到了备库,全部归档,全部未应用,状态 A

SYS@primary> select dest_name,database_mode,recovery_mode,archived_seq#,applied_seq# from

v$archive_dest_status;

DEST_NAME DATABASE_MODE RECOVERY_MODE ARCHIVED_SEQ# APPLIED_SEQ#

------------------------- --------------- ----------------------- ------------- ------------ ----------------------- ------------- ------------

LOG_ARCHIVE_DEST_1 OPEN IDLE 77 0

LOG_ARCHIVE_DEST_2 MOUNTED-STANDBY IDLE 77 76

说明:主库归档目录用途,已经生成 77 号日志,应用 76 号,LOG_ARCHIVE_DEST_1 本地目录 LOG_ARCHIVE_DEST_2

远程备库目录

SYS@primary> select process,status,sequence#,delay_mins from v$managed_standby;

PROCESS STATUS SEQUENCE# DELAY_MINS

--------- ---------- ---------- ------------------ ---------- ---------- -----

ARCH CLOSING 77 0

ARCH CLOSING 76 0

ARCH CONNECTED 0 0

ARCH CLOSING 77 0

LGWR WRITING 78 0

说明:主库进程的工作状态,arch 进程已经完成 76 号 77 号日志的归档已关闭,LGWR 等待写 78 号日志

备库状态

SYS@standby>

select db_unique_name,open_mode,database_role,switchover_status,dataguard_broker,primary_db_unique_name from

v$database;

DB_UNIQUE_NAME OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS DATAGUAR

PRIMARY_DB_UNIQUE_NAME

------------------------------ -------------------- ---------------- -------------------- -------- ------------------------------

standby MOUNTED PHYSICAL STANDBY RECOVERY NEEDED DISABLED primary

备库:mount 状态 物理备库角色 没有启动 broker 主库 SID 是 primary

SYS@standby> select group#,bytes,status from v$standby_log;

GROUP# BYTES STATUS

---------- ---------- ----------------- ----------------- -----

4 52428800 ACTIVE

5 52428800 UNASSIGNED

6 52428800 UNASSIGNED

Page 79: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

79

7 52428800 UNASSIGNED

备库的 standby_log 使用了一个

SYS@standby> select * from v$archive_gap;

no rows selected

备库也没有遗漏

col standby_dest for a12

col archived for a10

col applied for a10

col status for a10

SYS@standby> select sequence#,standby_dest,archived,applied,status from v$archived_log;

SEQUENCE# STANDBY_DEST ARCHIVED APPLIED STATUS

---------- ------------ ---------- ---------- -------------- ------------ ---------- ---------- ----------

77 NO YES NO A

说明:目前只有一个归档日志,已经归档,还没有应用,状态 A

SYS@standby>

select dest_name,database_mode,recovery_mode,archived_seq#,applied_seq# from v$archive_dest_status;

DEST_NAME DATABASE_MODE RECOVERY_MODE ARCHIVED_SEQ# APPLIED_SEQ#

------------------------- --------------- ----------------------- ------------- ------------ ----------------------- ------------- ------------

LOG_ARCHIVE_DEST_1 MOUNTED-STANDBY IDLE 77 0

STANDBY_ARCHIVE_DEST UNKNOWN IDLE 77 76

说明:备库归档目录用途,已经接收 77 号日志,应用 76 号,LOG_ARCHIVE_DEST_1 本地备库目录

SYS@standby> select process,status,sequence#,delay_mins from v$managed_standby;

PROCESS STATUS SEQUENCE# DELAY_MINS

--------- ---------- ---------- ------------------ ---------- ---------- -----

ARCH CONNECTED 0 0

ARCH CONNECTED 0 0

ARCH CONNECTED 0 0

ARCH CLOSING 77 0

RFS IDLE 0 0

RFS IDLE 78 0

RFS IDLE 0 0

说明:备库进程的工作状态,arch 进程已经完成 77 号日志归档,RFS 进程等待接收来自主库的日志为空闲状态

12.日志应用与切换

备库启动 MRP 进程进行日志应用

SYS@standby> alter database recover managed standby database disconnect from session parallel 2;

Database altered.

参数说明(如下都是可选参数):

disconnect from session:启动日志应用同时截断所有会话,等同于 nohup 提交后台运行,如果不加鼠标会停留在下

一行开头不动,你只能另开启一个 windows 了。

parallel 2:启动 2 个 MRP slaves 进程进行日志应用操作加快速度

告警日志内容说明(DG 中强力推举一边看 alert 日志一边操作,详细了解 Oracle 运行机制)

Thu Aug 01 20:52:19 2013

alter database recover managed standby database disconnect from session parallel 2

Attempt to start background Managed Standby Recovery process (standby)

Thu Aug 01 20:52:19 2013

MRP0 started with pid=25, OS id=11991

MRP0: Background Managed Standby Recovery process started (standby)

Page 80: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

80

started logmerger process

Thu Aug 01 20:52:24 2013

Managed Standby Recovery not using Real Time Apply 备库恢复不启动实时应用

什么叫 Real Time 应用呢?

“alter database recover managed standby database disconnect from session;”命令上不要加

using current logfile (使用当前日志文件 real-time 应用)

官方文档解释

USING CURRENT LOGFILE Clause 条款注释:Specify USING CURRENT LOGFILE to invoke real-time apply,which recovers

redo from the standby redo log files as soon as they are written,without requiring them to be archived first at the physical

standby database.

指定当前 redo 日志调用实时应用,尽快从备库的 redo 日志中进行恢复,不需要先进行归档

因为我们使用的是“最高性能模式”不需要实时应用日志

Parallel Media Recovery started with 2 slaves 启动 2 个 MRP

Waiting for all non-current ORLs to be archived...

All non-current ORLs have been archived.

Clearing online redo logfile 1 /u01/app/oracle/oradata/standby/redo01.log

Clearing online log 1 of thread 1 sequence number 76

Completed: alter database recover managed standby database disconnect from session parallel 2

Clearing online redo logfile 1 complete

Clearing online redo logfile 2 /u01/app/oracle/oradata/standby/redo02.log

Clearing online log 2 of thread 1 sequence number 78

Clearing online redo logfile 2 complete

Clearing online redo logfile 3 /u01/app/oracle/oradata/standby/redo03.log

Clearing online log 3 of thread 1 sequence number 78

清空 redo 日志,因为现在备库时使用的是 standby log,不需要 redo log,因此需要清空,给切换成主库时做准备

Thu Aug 01 20:52:32 2013

Clearing online redo logfile 3 complete

Media Recovery Waiting for thread 1 sequence 75

Fetching gap sequence in thread 1, gap sequence 75-76 FAL 进程发现有 75 76 号进程被遗漏了,赶紧让主库再传一次

Thu Aug 01 20:52:34 2013

RFS[1]: Opened log for thread 1 sequence 76 dbid 1659292248 branch 821809560 RFS 进程接收 76 号日志

Archived Log entry 2 added for thread 1 sequence 76 rlc 821809560 ID 0x62e67858 dest 2: 已增加 76 号日志

Thu Aug 01 20:52:35 2013

RFS[4]: Assigned to RFS process 11999

RFS[4]: Identified database type as 'physical standby': Client is ARCH pid 10327

RFS[4]: Opened log for thread 1 sequence 75 dbid 1659292248 branch 821809560 RFS 进程接收 75 号日志

Archived Log entry 3 added for thread 1 sequence 75 rlc 821809560 ID 0x62e67858 dest 2: 已增加 75 号日志

Thu Aug 01 20:52:43 2013

Media Recovery Log /u01/app/oracle/arch/standby/log_1_75_821809560.arc MRP 进程应用 75

Media Recovery Log /u01/app/oracle/arch/standby/log_1_76_821809560.arc MRP 进程应用 76

Media Recovery Log /u01/app/oracle/arch/standby/log_1_77_821809560.arc MRP 进程应用 77

Media Recovery Waiting for thread 1 sequence 78 (in transit) MRP 进程等待 78

看备库归档日志目录,刚才没有传过来的日志现在都齐了

[oracle@leonarding3 standby]$ ll

total 27864

-rw-r----- 1 oracle oinstall 19782656 Aug 1 20:52 log_1_75_821809560.arc

-rw-r----- 1 oracle oinstall 5634560 Aug 1 20:52 log_1_76_821809560.arc

Page 81: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

81

-rw-r----- 1 oracle oinstall 3109376 Aug 1 15:40 log_1_77_821809560.arc

SYS@standby> select sequence#,standby_dest,archived,applied,status from v$archived_log;

SEQUENCE# STANDBY_DEST ARCHIVED APPLIED STATUS

---------- ------------ ---------- ---------- -------------- ------------ ---------- ---------- ----------

77 NO YES YES A

76 NO YES YES A

75 NO YES YES A

说明:75 76 77 归档全部应用完毕,状态 A

我们在主库创建一个表空间 test,创建一个用户 leo1,再创建一个表 t1,把日志传送到备库进行应用

实验

SYS@primary> create tablespace leo datafile '/u01/app/oracle/oradata/primary/leo_01.dbf' size 50M; 表空间

Tablespace created.

SYS@primary> create user leo1 identified by leo1 default tablespace leo; 用户

User created.

SYS@primary> grant connect,resource to leo1; 授权

Grant succeeded.

SYS@primary> create table leo1.t1 as select * from dba_objects; 表

Table created.

SYS@primary> select count(*) from leo1.t1;

COUNT(*)

------------------

71658

SYS@primary> alter system archive log current; 切换日志并完成归档

System altered.

SYS@primary> alter system switch logfile; 切换日志还在归档中

System altered.

主库 alert

Fri Aug 02 10:08:27 2013

ALTER SYSTEM ARCHIVE LOG 切换日志

Fri Aug 02 10:08:28 2013

LGWR: Standby redo logfile selected for thread 1 sequence 81 for destination LOG_ARCHIVE_DEST_2

Thread 1 advanced to log sequence 81 (LGWR switch)

Current log# 3 seq# 81 mem# 0: /u01/app/oracle/oradata/primary/redo03.log

Archived Log entry 13 added for thread 1 sequence 80 ID 0x62e67858 dest 1: 第一次切换 80 号日志

Fri Aug 02 10:09:54 2013

LGWR: Standby redo logfile selected for thread 1 sequence 82 for destination LOG_ARCHIVE_DEST_2

Thread 1 advanced to log sequence 82 (LGWR switch) LGWR 触发发送机制给备库传日志

Current log# 1 seq# 82 mem# 0: /u01/app/oracle/oradata/primary/redo01.log

Fri Aug 02 10:09:54 2013

Archived Log entry 15 added for thread 1 sequence 81 ID 0x62e67858 dest 1: 第二次切换 81 号日志

SYS@standby> select sequence#,standby_dest,archived,applied,status from v$archived_log;

SEQUENCE# STANDBY_DEST ARCHIVED APPLIED STATUS

---------- ------------ ---------- ---------- -------------- ------------ ---------- ---------- ----------

80 YES YES YES A

80 NO YES NO A

81 YES YES YES A

Page 82: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

82

81 NO YES NO A

备库 alert

Fri Aug 02 10:08:28 2013

RFS[7]: Selected log 5 for thread 1 sequence 81 dbid 1659292248 branch 821809560 RFS 进程接收 81 号日志

Fri Aug 02 10:08:28 2013

Archived Log entry 6 added for thread 1 sequence 80 ID 0x62e67858 dest 1:

Fri Aug 02 10:08:29 2013

Media Recovery Log /u01/app/oracle/arch/standby/log_1_80_821809560.arc 应用 80 号日志

Recovery created file /u01/app/oracle/oradata/standby/leo_01.dbf 创建表空间 leo

Successfully added datafile 5 to media recovery

Datafile #5: '/u01/app/oracle/oradata/standby/leo_01.dbf'

Media Recovery Waiting for thread 1 sequence 81 (in transit)

Fri Aug 02 10:09:54 2013

Archived Log entry 7 added for thread 1 sequence 81 ID 0x62e67858 dest 1:

Fri Aug 02 10:09:54 2013

RFS[7]: Selected log 4 for thread 1 sequence 82 dbid 1659292248 branch 821809560

Fri Aug 02 10:09:58 2013

Media Recovery Log /u01/app/oracle/arch/standby/log_1_81_821809560.arc 应用 81 号日志

Media Recovery Waiting for thread 1 sequence 82 (in transit) 等待 82 号日志

SYS@standby> select sequence#,standby_dest,archived,applied,status from v$archived_log;

SEQUENCE# STANDBY_DEST ARCHIVED APPLIED STATUS

---------- ------------ ---------- ---------- -------------- ------------ ---------- ---------- ----------

80 NO YES YES A

81 NO YES YES A

SYS@standby> select * from v$tablespace; 新表空间已经恢复到备库啦

TS# NAME INC BIG FLA ENC

---------- -------------------- --- --- --- ---

0 SYSTEM YES NO YES

1 SYSAUX YES NO YES

2 UNDOTBS1 YES NO YES

3 TEMP NO NO YES

4 USERS YES NO YES

5 LEO YES NO YES

如果我们要想看 t1 表内容就需要以 read only 方式打开 standby 库

SYS@standby> alter database recover managed standby database cancel; 取消备库日志应用

Database altered.

SYS@standby> alter database open read only; read only 方式打开备库

Database altered.

SYS@standby> select count(*) from leo1.t1; t1 表也已经 primary->standby 应用过来啦

COUNT(*)

----------------

71658

SYS@standby>

select db_unique_name,open_mode,database_role,switchover_status,dataguard_broker,primary_db_unique_name from

v$database;

DB_UNIQUE_NAME OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS DATAGUAR

Page 83: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

83

PRIMARY_DB_UNIQUE_NAME

------------------------------ -------------------- ---------------- -------------------- -------- ------------------------------

standby READ ONLY PHYSICAL STANDBY NOT ALLOWED DISABLED primary

ACTIVE DATA GUARD 之 ACTIVE STANDBY

大家都知道 Oracle 11g 支持 Active Standby,即允许 Read only 方式打开 standby db 并且实时应用日志

SYS@standby> alter database recover managed standby database disconnect from session; 重新启动日志应用

Database altered.

Fri Aug 02 10:52:51 2013

alter database recover managed standby database disconnect from session

Attempt to start background Managed Standby Recovery process (standby) 启动 MRP 恢复进程

Fri Aug 02 10:52:51 2013

MRP0 started with pid=25, OS id=12645

MRP0: Background Managed Standby Recovery process started (standby)

started logmerger process

Fri Aug 02 10:52:56 2013

Managed Standby Recovery not using Real Time Apply 没有使用 real time

Parallel Media Recovery started with 2 slaves

Waiting for all non-current ORLs to be archived...

All non-current ORLs have been archived.

Media Recovery Waiting for thread 1 sequence 82 (in transit) 正在等待 82 号日志

Completed: alter database recover managed standby database disconnect from session

主库创建 t2 表进行日志切换

SYS@primary> create table leo1.t2 as select * from dba_objects;

Table created.

SYS@primary> alter system archive log current;

System altered.

备库 alert

Fri Aug 02 12:24:07 2013

RFS[7]: Selected log 5 for thread 1 sequence 83 dbid 1659292248 branch 821809560

Fri Aug 02 12:24:07 2013

Archived Log entry 8 added for thread 1 sequence 82 ID 0x62e67858 dest 1: 备库收到 82 号日志

Fri Aug 02 12:24:10 2013

Media Recovery Log /u01/app/oracle/arch/standby/log_1_82_821809560.arc 应用 82 号日志

Media Recovery Waiting for thread 1 sequence 83 (in transit) 等待 83 号日志

SYS@standby> select count(*) from leo1.t2; 备库已经可以查询啦实现 standby 报表系统

COUNT(*)

------------------

71698

实现 standby 报表系统,此时主库负责写,备库负责读,可以一带五实现多台备库提供海量数据查询功能

Page 84: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

84

####################################################################################################

ACTIVE STANDBY 在什么时候操作生效 (1 standby db read only open -> 2 log apply)反之则不成

standby 为 mounted,并且 MRP 日志应用,再进行 read only 方式打开 standby db 会报如下错误

SYS@standby> alter database open read only;

alter database open read only

*

ERROR at line 1:

ORA-10456: cannot open standby database; media recovery session may be in progress

也就是说在日志被应用时不允许 read only 方式打开 standby db,反之而不然

standby 为 read only,并且没有进行 MRP 日志应用,此时打开 MRP 日志应用如上是可行的,大家要了解 ACTIVE

STANDBY 不允许用户修改数据库只允许底层 redo 修改数据库。

SYS@standby> alter database recover managed standby database disconnect from session;

Database altered.

####################################################################################################

ACTIVE DATA GUARD 之 SNAPSHOT STANDBY

实现 standby 应用测试系统

Oracle 10G 支持用 R/W 方式打开 standby db,然后通过 flashback database 将 standby db 恢复到打开前的状态

1)确保 standby 数据库至于 flash back on 的状态

SYS@standby> alter database recover managed standby database cancel; 取消日志应用

Database altered.

SYS@standby> shutdown immediate 关闭数据库

Database closed.

Database dismounted.

ORACLE instance shut down.

SYS@standby> startup mount

ORACLE instance started.

Page 85: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

85

Total System Global Area 417546240 bytes

Fixed Size 2213936 bytes

Variable Size 289408976 bytes

Database Buffers 117440512 bytes

Redo Buffers 8482816 bytes

Database mounted.

SYS@standby> select flashback_on from v$database;

FLASHBACK_ON

------------------

NO

SYS@standby> alter database flashback on; 打开 flash back

Database altered.

SYS@standby> select flashback_on from v$database;

FLASHBACK_ON

------------------

YES

SYS@standby> show parameter db_recovery_file

NAME TYPE VALUE

------------------------------------ -------------------- ------------------------------

db_recovery_file_dest string /u01/app/oracle/flash_recovery_area

db_recovery_file_dest_size big integer 4G

2)确保从 primary 传 standby 的所有日志都应用完毕

SYS@standby> select sequence#,standby_dest,archived,applied,status from v$archived_log;

SEQUENCE# STANDBY_DEST ARCHIVED APPLIED STATUS

---------- ------------ ---------- ---------- ----------

77 NO YES YES A

76 NO YES YES A

75 NO YES YES A

78 NO YES YES A

79 NO YES YES A

80 NO YES YES A

81 NO YES YES A

82 NO YES YES A

83 NO YES YES A

84 NO YES YES A

SYS@standby> alter database recover managed standby database cancel;

Database altered.

3)standby 创建一个还原点

SYS@standby> create restore point leo_restore_point guarantee flashback database;

Restore point created.

4)primary 上将主库传送到备库归档日志目的地状态设置为 defer 延迟,暂时先不传日志了

SYS@primary> alter system set log_archive_dest_state_2=defer;

System altered.

5)激活备库到 read/write 状态

SYS@standby> alter database activate standby database;

Database altered.

SYS@standby> alter database open;

Page 86: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

86

Database altered.

############################################我是分割线##############################################

alter database activate standby database

ALTER DATABASE ACTIVATE [PHYSICAL] STANDBY DATABASE (standby) 激活物理备库

krsv_proc_kill: Killing 4 processes (all RFS)

Begin: Standby Redo Logfile archival

End: Standby Redo Logfile archival

Archived Log entry 11 added for thread 1 sequence 85 ID 0x62e67858 dest 1:

RESETLOGS after incomplete recovery UNTIL CHANGE 993517

Resetting resetlogs activation ID 1659271256 (0x62e67858) 重新使用 redo log

Online log /u01/app/oracle/oradata/standby/redo01.log: Thread 1 Group 1 was previously cleared

Online log /u01/app/oracle/oradata/standby/redo02.log: Thread 1 Group 2 was previously cleared

Online log /u01/app/oracle/oradata/standby/redo03.log: Thread 1 Group 3 was previously cleared

Standby became primary SCN: 993515 备库变成主库 SCN:993515

Fri Aug 02 15:19:17 2013

Setting recovery target incarnation to 2

ACTIVATE STANDBY: Complete - Database mounted as primary 激活备库完成,现在已经变成主库,状态为 mounted

Completed: alter database activate standby database

ri Aug 02 15:20:01 2013

alter database open

Fri Aug 02 15:20:01 2013

Assigning activation ID 1659838845 (0x62ef217d)

Thread 1 advanced to log sequence 2 (thread open)

Fri Aug 02 15:20:01 2013

ARC0: Becoming the 'no SRL' ARCH

Fri Aug 02 15:20:01 2013

ARC2: Becoming the 'no SRL' ARCH

。。。。。。

Fri Aug 02 15:20:05 2013

QMNC started with pid=23, OS id=13530

LOGSTDBY: Validating controlfile with logical metadata

LOGSTDBY: Validation complete

Completed: alter database open R/W 方式打开 standby db

############################################我是分割线##############################################

SYS@standby>

select db_unique_name,open_mode,database_role,switchover_status,dataguard_broker,primary_db_unique_name from

v$database;

DB_UNIQUE_NAME OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS DATAGUAR

PRIMARY_DB_UNIQUE_NAME

------------------------------ -------------------- ---------------- -------------------- -------- ------------------------------

standby READ WRITE PRIMARY FAILED DESTINATION DISABLED

primary

6)standby 库上创建表 t3

SYS@standby> create table leo1.t3 as select * from dba_objects;

Table created.

SYS@standby> select count(*) from leo1.t3;

COUNT(*)

Page 87: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

87

------------------

71699

7)将 standby 数据库 flashback 还原回当初的还原点

SYS@standby> startup mount force; 数据库重启到 mount 状态

Database mounted.

SYS@standby> flashback database to restore point leo_restore_point;

Flashback complete.

############################################我是分割线##############################################

Fri Aug 02 15:50:24 2013

flashback database to restore point leo_restore_point

Flashback Restore Start 启动数据库还原

Flashback Restore Complete

Completed: flashback database to restore point leo_restore_point

############################################我是分割线##############################################

SYS@standby>

select db_unique_name,open_mode,database_role,switchover_status,dataguard_broker,primary_db_unique_name from

v$database;

DB_UNIQUE_NAME OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS DATAGUAR

PRIMARY_DB_UNIQUE_NAME

------------------------------ -------------------- ---------------- -------------------- -------- ------------------------------

standby MOUNTED PRIMARY NOT ALLOWED DISABLED

primary

SYS@standby> alter database convert to physical standby; 将主库角色切换成物理备库角色

Database altered.

############################################我是分割线##############################################

Fri Aug 02 15:54:46 2013

alter database convert to physical standby

ALTER DATABASE CONVERT TO PHYSICAL STANDBY (standby)

Clearing standby activation ID 1659838845 (0x62ef217d)

The primary database controlfile was created using the

'MAXLOGFILES 16' clause.

There is space for up to 13 standby redo logfiles

Use the following SQL commands on the standby database to create

standby redo logfiles that match the primary database:

ALTER DATABASE ADD STANDBY LOGFILE 'srl1.f' SIZE 52428800;

ALTER DATABASE ADD STANDBY LOGFILE 'srl2.f' SIZE 52428800;

ALTER DATABASE ADD STANDBY LOGFILE 'srl3.f' SIZE 52428800;

ALTER DATABASE ADD STANDBY LOGFILE 'srl4.f' SIZE 52428800;

Completed: alter database convert to physical standby

############################################我是分割线##############################################

8)将备库至于自动恢复状态

SYS@standby> startup mount force; 数据库重启到 mount 状态

Database mounted.

SYS@standby>

select db_unique_name,open_mode,database_role,switchover_status,dataguard_broker,primary_db_unique_name from

v$database;

DB_UNIQUE_NAME OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS DATAGUAR

Page 88: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

88

PRIMARY_DB_UNIQUE_NAME

------------------------------ -------------------- ---------------- -------------------- -------- ------------------------------

standby MOUNTED PHYSICAL STANDBY TO PRIMARY DISABLED

primary

standby 成功还原回物理备库角色,并且可以成功切换回 primary

9)primary 上将主库传送到备库归档日志目的地状态设置为 enable 启用,开始传送日志

SYS@primary> alter system set log_archive_dest_state_2=enable;

System altered.

SYS@standby> alter database recover managed standby database disconnect from session;

Database altered.

10)检查主备库日志状态

SYS@primary> select dest_name,status from v$archive_dest;

DEST_NAME STATUS

------------------------- ----------------------

LOG_ARCHIVE_DEST_1 VALID

LOG_ARCHIVE_DEST_2 VALID

SYS@standby> select dest_name,status from v$archive_dest;

DEST_NAME STATUS

------------------------- ---------------------------

LOG_ARCHIVE_DEST_1 VALID

LOG_ARCHIVE_DEST_2 VALID

STANDBY_ARCHIVE_DEST VALID

Oracle 11G 支持用 R/W 方式打开 standby db,然后通过 snapshot standby 将 standby db 恢复到打开前的状态

1)取消日志应用

SYS@standby> alter database recover managed standby database cancel;

Database altered.

2)启动到 mount 状态

SYS@standby> select open_mode from v$database;

OPEN_MODE

--------------------

MOUNTED

3)主库传过来的日志都要应用完毕

SYS@standby> select sequence#,standby_dest,archived,applied,status from v$archived_log;

SEQUENCE# STANDBY_DEST ARCHIVED APPLIED STATUS

---------- ------------ ---------- ---------- ----------

85 NO YES YES A

86 NO YES YES A

4)创建 snapshot standby (给备库做一个快照点)

SYS@standby> alter database convert to snapshot standby;

Database altered.

创建快照 standby 也会产生 flashback 文件

[oracle@leonarding3 flashback]$ pwd

/u01/app/oracle/flash_recovery_area/STANDBY/flashback

[oracle@leonarding3 flashback]$ ll

total 20024

-rw-r----- 1 oracle oinstall 8200192 Aug 2 15:37 o1_mf_8zpo0j9w_.flb

-rw-r----- 1 oracle oinstall 4104192 Aug 2 16:09 o1_mf_8zprfl9c_.flb

Page 89: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

89

-rw-r----- 1 oracle oinstall 8200192 Aug 2 16:42 o1_mf_8zptbn48_.flb 这个即是

############################################我是分割线##############################################

Fri Aug 02 16:42:40 2013

alter database convert to snapshot standby

Created guaranteed restore point SNAPSHOT_STANDBY_REQUIRED_08/02/2013 16:42:40 创建还原点

krsv_proc_kill: Killing 3 processes (all RFS)

Begin: Standby Redo Logfile archival

End: Standby Redo Logfile archival

RESETLOGS after complete recovery through change 1000320

Resetting resetlogs activation ID 1659271256 (0x62e67858) 重新使用 redo log

Online log /u01/app/oracle/oradata/standby/redo01.log: Thread 1 Group 1 was previously cleared

Online log /u01/app/oracle/oradata/standby/redo02.log: Thread 1 Group 2 was previously cleared

Online log /u01/app/oracle/oradata/standby/redo03.log: Thread 1 Group 3 was previously cleared

Standby became primary SCN: 1000318 备库变成主库 SCN:1000318

Fri Aug 02 16:42:42 2013

Setting recovery target incarnation to 3

CONVERT TO SNAPSHOT STANDBY: Complete - Database mounted as snapshot standby 转换成快照备库状态为 mounted

Completed: alter database convert to snapshot standby

############################################我是分割线##############################################

SYS@standby>

select db_unique_name,open_mode,database_role,switchover_status,dataguard_broker,primary_db_unique_name from

v$database;

DB_UNIQUE_NAME OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS DATAGUAR

PRIMARY_DB_UNIQUE_NAME

------------------------------ -------------------- ---------------- -------------------- -------- ------------------------------

standby MOUNTED SNAPSHOT STANDBY NOT ALLOWED DISABLED

primary

请注意:standby 库状态为 SNAPSHOT STANDBY 快照备库的含义就是临时给备库创建一个快照,我们现在只是对这个

快照进行操作,当操作完成之后恢复到快照前的状态即可。

5)R/W 方式打开 standby db

SYS@standby> alter database open;

Database altered.

SYS@standby>

select db_unique_name,open_mode,database_role,switchover_status,dataguard_broker,primary_db_unique_name from

v$database;

DB_UNIQUE_NAME OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS DATAGUAR

PRIMARY_DB_UNIQUE_NAME

------------------------------ -------------------- ---------------- -------------------- -------- ------------------------------

standby READ WRITE SNAPSHOT STANDBY NOT ALLOWED DISABLED

primary

请注意:standby 库状态为 SNAPSHOT STANDBY 快照备库,状态已经成为 READ WRITE

6)创建一个表空间 LEO2

SYS@standby> create tablespace leo2 datafile '/u01/app/oracle/oradata/standby/leo2_01.dbf' size 50M;

Tablespace created.

SYS@standby> select * from v$tablespace where name='LEO2';

TS# NAME INC BIG FLA ENC

---------- -------------------- --- --- --- ---

Page 90: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

90

6 LEO2 YES NO YES

7)将 standby 数据库 convert to physical standby

SYS@standby> startup mount force;

Database mounted.

SYS@standby> alter database convert to physical standby; 将主库角色切换成物理备库角色

Database altered.

############################################我是分割线##############################################

Fri Aug 02 17:16:56 2013

alter database convert to physical standby

ALTER DATABASE CONVERT TO PHYSICAL STANDBY (standby)

krsv_proc_kill: Killing 236223201284 processes (all RFS)

Flashback Restore Start 开始还原到初始状态

Deleted file /u01/app/oracle/oradata/standby/leo2_01.dbf 删除 LEO2 表空间

Flashback: deleted datafile #6 in tablespace #6 from control file. 从控制文件中删除表空间所属数据文件记录

Flashback: dropped tablespace #6: 'LEO2' from the control file. 从控制文件中删除表空间 LEO2 记录

Flashback Restore Complete

Flashback Media Recovery Start

Fri Aug 02 17:17:00 2013

Setting recovery target incarnation to 1

started logmerger process

Parallel Media Recovery started with 2 slaves

Flashback Media Recovery Log /u01/app/oracle/arch/standby/log_1_85_821809560.arc 还原归档日志

Flashback Media Recovery Log /u01/app/oracle/arch/standby/log_1_86_821809560.arc

Fri Aug 02 17:17:02 2013

Incomplete Recovery applied until change 1000320 time 08/02/2013 16:20:31

Flashback Media Recovery Complete

Setting recovery target incarnation to 3

Guaranteed restore point dropped 删除刚才创建的还原点

Clearing standby activation ID 1659907887 (0x62f02f2f)

The primary database controlfile was created using the

'MAXLOGFILES 16' clause.

There is space for up to 13 standby redo logfiles

Use the following SQL commands on the standby database to create

standby redo logfiles that match the primary database:

ALTER DATABASE ADD STANDBY LOGFILE 'srl1.f' SIZE 52428800;

ALTER DATABASE ADD STANDBY LOGFILE 'srl2.f' SIZE 52428800;

ALTER DATABASE ADD STANDBY LOGFILE 'srl3.f' SIZE 52428800;

ALTER DATABASE ADD STANDBY LOGFILE 'srl4.f' SIZE 52428800;

Completed: alter database convert to physical standby

############################################我是分割线##############################################

8)将备库至于自动恢复状态

SYS@standby> startup mount force;

Database mounted.

SYS@standby>

select db_unique_name,open_mode,database_role,switchover_status,dataguard_broker,primary_db_unique_name from

v$database;

DB_UNIQUE_NAME OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS DATAGUAR

Page 91: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

91

PRIMARY_DB_UNIQUE_NAME

------------------------------ -------------------- ---------------- -------------------- -------- ------------------------------

standby MOUNTED PHYSICAL STANDBY RECOVERY NEEDED DISABLED

primary

SYS@standby> alter database recover managed standby database disconnect from session; 开始应用日志

Database altered.

SYS@standby> select sequence#,standby_dest,archived,applied,status from v$archived_log;

SEQUENCE# STANDBY_DEST ARCHIVED APPLIED STATUS

---------- ------------ ---------- ---------- --------------- ------------ ----------

87 NO YES YES A

88 NO YES YES A

89 NO YES YES A

90 NO YES YES A

91 NO YES YES A

92 NO YES YES A

到此用 R/W 方式打开 standby db 并还原回 physical standby 顺利完成

Page 92: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

92

九 实现 SWITCH OVER 无损切换

Data Guard 中分为两种冗余切换,一种是 switchover 无损切换,一种是 failover 丢弃切换。

所谓 switchover 是针对 failover 而言的,它是一种无损切换,切换的过程中不会丢失数据。

可以平滑的使主备互换并且 2 个库都可以正常使用。

切换过程:主库->切换->备库->检查状态->原备库->切换->主库->再检查状态

应用场合:主库需要调整升级,主库性能不佳,这时可以切换后用新主库对外提供服务

是否丢失数据:不会丢失数据

Switchover Role Transition 之前准备工作(标准流程,一般自己建的库最了解就可以 skip)

1.检查主备库参数文件是否配置正确

2.主备库必须为归档模式,要保证两端网络畅通

3.RAC 模式下备库只能有一个实例为 open,其他实例全部为 shutdown,经过角色转换后,重新启动这些实例 open

评估一下备库切换成主库后日志同步时间是否及时,只有备库有信息,主库没有信息

估算 switchover 切换需要的时间(switchover time=apply finish time+estimated startup time)

SYS@standby> set linesize 400

SYS@standby> set pagesize 999

SYS@standby> col value for a15

SYS@standby> select * from v$dataguard_stats;

NAME VALUE UNIT TIME_COMPUTED DATUM_TIME

---------------------------------------- ------------------------------ ------------------------------ -----------------------------------------------

传输延迟时间

transport lag +00 00:00:00 day(2) to second(0) interval 08/05/2013 14:21:37 08/05/2013 14:21:35

redo 日志应用延迟时间

apply lag +00 00:15:09 day(2) to second(0) interval 08/05/2013 14:21:37 08/05/2013 14:21:35

redo 日志应用完成时间

apply finish time day(2) to second(3) interval 08/05/2013 14:21:37

预计启动时间

estimated startup time 11 second 08/05/2013 14:21:37

字段解释:

(1)apply lag:该值表示在通过在备库上应用主库传递过来的重做日志与出库同步所延迟的时间。APPLY LAG: Amount

of time that the application of redo data on the standby database lags behind the primary database。

(2)transport lag:该值表示在单位时间内主库上产生的重做日志还没有传输到备库上,或者主库上产生的重做日

志还没有被备库所应用

(3)apply finish time:该值表示在备库上完成应用重做日志所需要的时间

(4)estimated startup time:该值表示启动和打开物理备库所需要的时间,该字段不是适用于逻辑备库。 An estimate

of the time needed to start and open the database

(5)VALUE:给出各个参数的值。如第 1 个查询中的,apply finish time 值为+00 00:00:00.1,说明该物理备库需要

0.1 秒的时间来完成应用剩余的重做日志数据。

(6)UNIT:各个参数的时间单元。

(7)TIME_COMPUTED:物理备库上估算各个参数的本地时间。 (8)DATUM_TIME:在物理备库上获取元数据来估算 APPLY LAG 和 TRANSPORT LAG 这两个参数值的本地时间。

如果从多次查询中看到该时间值对应的 APPLY LAG 和 TRANSPORT LAG 这两个参数值保持不变的话,那么就说明该

物理备库已经停止从主库接收到重做数据!该字段是 11g 中新出现的

官方文档上,关于 V$DATAGUARD_STATS 是这样描述的:该动态性能视图显示出在主库上产生了多少重做日志数据,

但是还没有被备库所应用。所以,通过查询该视图可以基本确定如果万一主库出现崩溃的话,备库上将丢失多少重

做日志数据。我们可以在一套 Dataguard 环境下的任一备库的实例上从该视图里获取相关信息,然而,在主库的实

Page 93: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

93

例上查询该视图返回的信息都将是空。也就是说,只可以从备库的实例上查询 V$DATAGUARD_STATS,从主库实例上

是看不到任何有用信息的。

实验 switchover 切换

1)主库状态

SYS@primary> select database_role,switchover_status,open_mode from v$database;

DATABASE_ROLE SWITCHOVER_STATUS OPEN_MODE

---------------- -------------------- ---------------------------------------------

PRIMARY TO STANDBY READ WRITE

作用:检查主库切换的可能性

如果“TO STANDBY”值表示主库可以顺利切换到备库

如果“SESSIONS ACTIVE”表示应然存在活动的会话,在切换时可以添加“with session shutdown”关键字在切换时终

止所有存活会话。

如果“RESOLVABLE GAP”表示备库的 standby_log 组状态全部为 UNASSIGNED,可做一次 alter system archive log current;

日志切换来应用一次即可恢复。

2)切换时候注意 primary 的 alert.log 是否有报错信息以便定位问题

SYS@primary> alter database commit to switchover to physical standby with session shutdown;

Database altered.

############################################我是分割线##############################################

********************************************************************

LGWR: Resetting 'active' archival for destination LOG_ARCHIVE_DEST_2

********************************************************************

激活这个参数

Switchover: Primary controlfile converted to standby controlfile succesfully. 主库控制文件转换成备库控制文件

Switchover: Complete - Database shutdown required (primary) 现在主库状态为 shutdown,需要我们重启 mounted

Backup controlfile written to trace file /u01/app/oracle/diag/rdbms/primary/primary/trace/primary_ora_3247.trc

注:在 switchover 之前有一个自动备份控制文件的动作,以便以后重建之用

############################################我是分割线##############################################

3)重启 primary 库

SYS@primary> shutdown immediate

ORA-01507: database not mounted

ORACLE instance shut down.

SYS@primary> startup mount

Database mounted.

4)检查 primary 库 现在 primary 库角色已经成为“PHYSICAL STANDBY”

SYS@primary> select database_role,switchover_status,open_mode from v$database;

DATABASE_ROLE SWITCHOVER_STATUS OPEN_MODE

---------------- -------------------- ----------------------------------------------

PHYSICAL STANDBY TO PRIMARY MOUNTED

5)切换备库为主库 standby -> primary

SYS@standby> select database_role,switchover_status,open_mode from v$database;

DATABASE_ROLE SWITCHOVER_STATUS OPEN_MODE

---------------- -------------------- --------------------- --------------------- -

PHYSICAL STANDBY TO PRIMARY MOUNTED

作用:检查切换的可能性

如果“TO PRIMARY” 备库可以顺利切换到主库

如果“SESSIONS ACTIVE”表示应然存在活动的会话,在切换时可以添加“with session shutdown”关键字在切换时终

止所有存活会话。如果不加你需要等待 900 秒,这只是一个估计值,实际时间会更长。

Page 94: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

94

SYS@standby> alter database commit to switchover to primary with session shutdown;

Database altered.

############################################我是分割线##############################################

Mon Aug 05 15:58:57 2013

alter database commit to switchover to primary with session shutdown

ALTER DATABASE SWITCHOVER TO PRIMARY (standby)

Maximum wait for role transition is 15 minutes.

Backup controlfile written to trace file /u01/app/oracle/diag/rdbms/standby/standby/trace/standby_ora_15923.trc

SwitchOver after complete recovery through change 1034035

切换成主库后需要清空在线 redolog

Online log /u01/app/oracle/oradata/standby/redo01.log: Thread 1 Group 1 was previously cleared

Online log /u01/app/oracle/oradata/standby/redo02.log: Thread 1 Group 2 was previously cleared

Online log /u01/app/oracle/oradata/standby/redo03.log: Thread 1 Group 3 was previously cleared

Standby became primary SCN: 1034033 备库已经成为主库

Switchover: Complete - Database mounted as primary 状态为 mounted

Completed: alter database commit to switchover to primary with session shutdown

Mon Aug 05 15:58:57 2013

ARC2: Becoming the 'no SRL' ARCH

############################################我是分割线##############################################

SYS@standby> select database_role,switchover_status,open_mode from v$database;

DATABASE_ROLE SWITCHOVER_STATUS OPEN_MODE

---------------- -------------------- ---------------------------- ----------------

PRIMARY NOT ALLOWED MOUNTED

角色:primary 不可切换 状态 mounted

6)原备库完成无损切换可以 open 对外提供服务

SYS@standby> alter database open; 如果是 mount 状态我们可以直接打开

Database altered.

SYS@standby> select database_role,switchover_status,open_mode from v$database;

DATABASE_ROLE SWITCHOVER_STATUS OPEN_MODE

---------------- -------------------- ---------------------------- ----------------

PRIMARY TO STANDBY READ WRITE

打开之后数据库状态为 R/W 可读写,现在可以使用新主库对外提供服务了

7)检查新主备库日志是否同步

新主库

SYS@standby> select sequence#,standby_dest,archived,applied,status from v$archived_log;

SEQUENCE# STANDBY_DEST ARCHIVED APPLIED STATUS

---------- ------------ ---------- ---------- --------------- ------------ ----------

101 NO YES NO A

101 YES YES NO A

102 NO YES NO A

102 YES YES NO A

新备库

SYS@primary> select sequence#,standby_dest,archived,applied,status from v$archived_log;

SEQUENCE# STANDBY_DEST ARCHIVED APPLIED STATUS

---------- ------------ ---------- ---------- --------------- ------------ ----------

101 NO YES NO A

102 NO YES NO A

Page 95: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

95

经过对比发现 101 102 号归档日志没有在备库应用

8)新备库开始应用日志

SYS@primary> alter database recover managed standby database disconnect from session parallel 2;

Database altered.

启动 2 个 MRP 恢复进程开始日志应用

############################################我是分割线##############################################

清空所有在线 redo 日志,腾出空间便于重新应用

Clearing online redo logfile 1 /u01/app/oracle/oradata/primary/redo01.log

Clearing online redo logfile 2 /u01/app/oracle/oradata/primary/redo02.log

Clearing online redo logfile 3 /u01/app/oracle/oradata/primary/redo03.log

MRP 进程恢复 101 102 日志完成

Media Recovery Log /u01/app/oracle/arch/primary/log_1_101_821809560.arc

Media Recovery Log /u01/app/oracle/arch/primary/log_1_102_821809560.arc

############################################我是分割线##############################################

小结:到此我们完美的完成了一次 SWITCH OVER,原主库切换成备库,原备库切换成主库,这里不仅仅讲解了如何

使用命令行进行操作还对原理和后台进程分析说明,相信大家这次收获的一定很多,再次强调 SWITCH OVER 就是平

滑的在两个节点之间切换主备,但这点并不是 DG 精髓,FAIL OVER 才是 DG 的主要亮点,敬请期待下集~sleep :)

Page 96: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

96

十 实现 FAIL OVER 丢弃切换

所谓 failover,它是一种丢弃切换,直接把备库切换成主库,原主库自动丢弃,也就是不在属于 DG 架构的一部分了。

切换过程:备库->切换->主库->检查状态,原主库脱离 DG 架构

应用场合:当主库发生严重故障不可逆转的时候可以使用 failover,failover 才是 DataGuard 真正精髓所在,DataGua

rd 真正目的就是在主库发生危险的情况下紧急切换备库,使对系统的影响最小,让用户体验不到系统危机,就跟没

有发生任何事情一样。

例如 我们熟悉纽约双子塔 911 事件,如果你的主库在那里,呵呵那么你就不要在犹豫了,failover 是你最佳之选择 c

ome on

2013 年 6 月 23 日中国工商银行大面积系统瘫痪,导致各个网点无法正常办理业务,如果有备用一套系统完全可以

启动支持。

是否丢失数据:

最大保护模式 maximum protection:failover 不会丢失数据

最大性能模式 maximum performance:

(1)如果主库归档日志和在线 redo 日志没有丢失,则不会丢失数据

(2)如果主库有部分归档或者 redo 丢失,则只能对 standby 进行不完全恢复,丢失 redo 记录的数据将会丢失,我

们的目标就是将损失降到最低

(3)千万不要随意打开 standby,先检查归档和 redo 日志拷贝到备库并恢复,最后才能打开

(4)挽救措施,重建主库 可以使用 broker 工具重新注册主备库角色即可恢复

Failover Role Transition 之前准备工作

maximum protection

maximum availability

maximum performance

注:这三种保护模式的切换语句

alter database set standby database to maximum protection;

alter database set standby database to maximum availability;

alter database set standby database to maximum performance;

实操 failover 丢弃切换

场景:主库 primary 突然宕机发生故障并且有三个归档日志没有传递到 standby,要求备库 failover 切换为主库保证

没有任何数据丢失

1) 使主备库网络断开

我们在备库上采用禁用网卡方式断开网络

[root@leonarding3 ~]# ifdown eth0

[root@leonarding3 ~]# ifconfig

eth0 Link encap:Ethernet HWaddr 08:00:27:F0:A2:FC

inet6 addr: fe80::a00:27ff:fef0:a2fc/64 Scope:Link 没有 IP 地址了

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:3485488 errors:0 dropped:60 overruns:0 frame:0

TX packets:254479 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:2738495583 (2.5 GiB) TX bytes:43595922 (41.5 MiB)

lo Link encap:Local Loopback

inet addr:127.0.0.1 Mask:255.0.0.0

inet6 addr: ::1/128 Scope:Host

UP LOOPBACK RUNNING MTU:16436 Metric:1

RX packets:83813 errors:0 dropped:0 overruns:0 frame:0

Page 97: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

97

TX packets:83813 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX bytes:5417843 (5.1 MiB) TX bytes:5417843 (5.1 MiB)

现在主库已经不可以 ping 通备库了

[oracle@leonarding2 primary]$ ping standby

PING standby (192.168.1.103) 56(84) bytes of data.

From primary (192.168.1.102) icmp_seq=1 Destination Host Unreachable

From primary (192.168.1.102) icmp_seq=3 Destination Host Unreachable

From primary (192.168.1.102) icmp_seq=4 Destination Host Unreachable

From primary (192.168.1.102) icmp_seq=5 Destination Host Unreachable

2)主库切换日志,产生三个归档日志

SYS@primary> alter system archive log current;

System altered.

SYS@primary> alter system archive log current;

System altered.

SYS@primary> alter system archive log current;

System altered.

[oracle@leonarding2 primary]$ ll -t

total 139608

-rw-r----- 1 oracle oinstall 15360 Aug 7 20:42 log_1_103_821809560.arc

-rw-r----- 1 oracle oinstall 291840 Aug 7 20:42 log_1_104_821809560.arc

-rw-r----- 1 oracle oinstall 516096 Aug 7 20:33 log_1_105_821809560.arc

上述 116 117 118 三个归档日志没有传到备库

############################################我是分割线##############################################

主库告警日志

Fatal NI connect error 12543, connecting to:

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=standby)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE

_NAME=standby_DGMGRL)(CID=(PROGRAM=oracle)(HOST=leonarding2.oracle.com)(USER=oracle))))

VERSION INFORMATION:

TNS for Linux: Version 11.2.0.1.0 - Production

TCP/IP NT Protocol Adapter for Linux: Version 11.2.0.1.0 - Production

Time: 07-AUG-2013 20:42:23

Tracing not turned on.

Tns error struct:

ns main err code: 12543

备库网络不可到达

TNS-12543: TNS:destination host unreachable

ns secondary err code: 12560

nt main err code: 513

LGWR: Failed to archive log 1 thread 1 sequence 118 (12543) LGWR 传输失败

############################################我是分割线##############################################

3)模拟主库突然宕机

SYS@primary> shutdown abort

ORACLE instance shut down.

现在我们要尽最大努力恢复备库保证没有任何数据丢失

Page 98: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

98

4)将尚未传递到备库的归档日志手工 COPY 到备库

首先恢复网络

[root@leonarding3 ~]# ifup eth0 重启网卡

[oracle@leonarding2 Desktop]$ ping standby 现在主库与备库网络畅通

PING standby (192.168.1.103) 56(84) bytes of data.

64 bytes from standby (192.168.1.103): icmp_seq=1 ttl=64 time=0.759 ms

64 bytes from standby (192.168.1.103): icmp_seq=2 ttl=64 time=0.236 ms

64 bytes from standby (192.168.1.103): icmp_seq=3 ttl=64 time=0.314 ms

64 bytes from standby (192.168.1.103): icmp_seq=4 ttl=64 time=0.259 ms

[oracle@leonarding2 primary]$ scp log_1_103_821809560.arc oracle@standby:$ORACLE_BASE/arch/standby/

oracle@standby'spassword: log_1_103_821809560.arc 100% 63KB 63.0KB/s 00:00

[oracle@leonarding2 primary]$ scp log_1_104_821809560.arc oracle@standby:$ORACLE_BASE/arch/standby/

oracle@standby's password: log_1_104_821809560.arc 100% 1536 1.5KB/s 00:00

[oracle@leonarding2 primary]$ scp log_1_105_821809560.arc oracle@standby:$ORACLE_BASE/arch/standby/

oracle@standby's password: log_1_105_821809560.arc 100% 2048 2.0KB/s 00:00

现在已经把三个 GAP 日志传递到备库归档目录下

5)将复制过来的归档日志注册到备库控制文件中并恢复

SYS@standby> alter database register logfile '/u01/app/oracle/arch/standby/log_1_103_821809560.arc';

Database altered.

SYS@standby> alter database register logfile '/u01/app/oracle/arch/standby/log_1_104_821809560.arc';

Database altered.

SYS@standby> alter database register logfile '/u01/app/oracle/arch/standby/log_1_105_821809560.arc';

Database altered.

############################################我是分割线##############################################

Thu Aug 08 09:40:06 2013

alter database register logfile '/u01/app/oracle/arch/standby/log_1_103_821809560.arc'

There are 1 logfiles specified.

ALTER DATABASE REGISTER [PHYSICAL] LOGFILE

Completed: alter database register logfile '/u01/app/oracle/arch/standby/log_1_103_821809560.arc'

Thu Aug 08 09:40:29 2013

alter database register logfile '/u01/app/oracle/arch/standby/log_1_104_821809560.arc'

There are 1 logfiles specified.

ALTER DATABASE REGISTER [PHYSICAL] LOGFILE

Resynchronizing thread 1 from sequence 103 to 104 重新注册归档日志

Completed: alter database register logfile '/u01/app/oracle/arch/standby/log_1_104_821809560.arc'

alter database register logfile '/u01/app/oracle/arch/standby/log_1_105_821809560.arc'

There are 1 logfiles specified.

ALTER DATABASE REGISTER [PHYSICAL] LOGFILE

Resynchronizing thread 1 from sequence 104 to 105

Completed: alter database register logfile '/u01/app/oracle/arch/standby/log_1_105_821809560.arc'

突然 晴天霹雳

MRP0: Background Managed Standby Recovery process started (standby)

started logmerger process

Thu Aug 08 10:26:15 2013

Managed Standby Recovery not using Real Time Apply

Parallel Media Recovery started with 2 slaves

Waiting for all non-current ORLs to be archived...

Page 99: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

99

All non-current ORLs have been archived.

Media Recovery Waiting for thread 1 sequence 103 (in transit) 备库等待 103 日志

SYS@standby> select sequence#,standby_dest,archived,applied,status from v$archived_log;

SEQUENCE# STANDBY_DEST ARCHIVED APPLIED STATUS

---------- ------------ ---------- ---------- --------------- ------------ ----------

101 NO YES YES A

102 NO YES YES A

103 NO YES NO A

104 NO YES NO A

105 NO YES NO A

从动态性能视图中可以看到归档日志已经注册到控制文件中了,但没有应用,重新执行应用命令也不成,好像卡住

了不动,想不出什么原因,使用终极大招解决 -> startup mount force

Completed: ALTER DATABASE MOUNT 重启备库

alter database recover managed standby database disconnect from session

Attempt to start background Managed Standby Recovery process (standby)

Thu Aug 08 10:48:52 2013

MRP0 started with pid=23, OS id=15725

MRP0: Background Managed Standby Recovery process started (standby)

started logmerger process

Thu Aug 08 10:48:57 2013

Managed Standby Recovery not using Real Time Apply

Parallel Media Recovery started with 2 slaves

Waiting for all non-current ORLs to be archived...

All non-current ORLs have been archived. 现在 103 104 105 日志已经完全应用了

Media Recovery Log /u01/app/oracle/arch/standby/log_1_103_821809560.arc

Media Recovery Log /u01/app/oracle/arch/standby/log_1_104_821809560.arc

Media Recovery Log /u01/app/oracle/arch/standby/log_1_105_821809560.arc

Media Recovery Waiting for thread 1 sequence 106

Completed: alter database recover managed standby database disconnect from session

############################################我是分割线##############################################

SYS@standby> select sequence#,standby_dest,archived,applied,status from v$archived_log;

SEQUENCE# STANDBY_DEST ARCHIVED APPLIED STATUS

---------- ------------ ---------- ---------- --------------- ------------ ----------

101 NO YES YES A

102 NO YES YES A

103 NO YES YES A

104 NO YES YES A

105 NO YES YES A

6)将主库 REDO LOG 复制到备库中并恢复

[oracle@leonarding2 primary]$ scp redo01.log oracle@standby:~

oracle@standby's password: redo01.log 100% 50MB 50.0MB/s 00:01

[oracle@leonarding2 primary]$ scp redo02.log oracle@standby:~

oracle@standby's password: redo02.log 100% 50MB 12.5MB/s 00:04

[oracle@leonarding2 primary]$ scp redo03.log oracle@standby:~

oracle@standby's password: redo03.log 100% 50MB 25.0MB/s 00:02

[oracle@leonarding2 primary]$

备库先停止归档日志应用

Page 100: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

100

SYS@standby> alter database recover managed standby database cancel;

Database altered.

尽最大努力恢复在线 redo 日志

SYS@standby> recover standby database until cancel;

ORA-00279: change 1027785 generated at 08/08/2013 09:30:25 needed for thread 1

ORA-00289: suggestion : /u01/app/oracle/arch/standby/log_1_106_821809560.arc

ORA-00280: change 1027785 for thread 1 is in sequence #106 当前需要 106 号归档日志,我们知道 106 号还没有从

redo 切换过来,因此需要我们直接恢复在线 redo,现在 redo group 有三组主库也 crash 了我们应该恢复哪个 redo

才是正确的呢?这里有个好方法,看日志文件最后修改日志,我勒个去 全一样 如何抉择

-rw-r----- 1 oracle oinstall 52429312 Aug 8 09:30 redo01.log

-rw-r----- 1 oracle oinstall 52429312 Aug 8 09:30 redo02.log

-rw-r----- 1 oracle oinstall 52429312 Aug 8 09:30 redo03.log

跑去看 alert 日志挖掘线索

Thread 1 advanced to log sequence 106 (LGWR switch)

Current log# 1 seq# 106 mem# 0: /u01/app/oracle/oradata/primary/redo01.log

我们发现 106 号归档日志是由 redo01.log 生成的,很好,顺其自然就应该恢复 redo01.log

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

/home/oracle/redo01.log

Log applied.

Media recovery complete.

7)用 R/W 方式打开备库 open 状态

SYS@standby> select database_role,open_mode from v$database;

DATABASE_ROLE OPEN_MODE

---------------- ------------------------------------

PHYSICAL STANDBY MOUNTED 切换之前“PHYSICAL STANDBY”

SYS@standby> alter database activate standby database; 激活备库为主库

Database altered.

SYS@standby> select database_role,open_mode from v$database;

DATABASE_ROLE OPEN_MODE

---------------- ------------------------------------

PRIMARY MOUNTED 切换之后“PRIMARY”

############################################我是分割线##############################################

Thu Aug 08 12:17:42 2013

alter database activate standby database

ALTER DATABASE ACTIVATE [PHYSICAL] STANDBY DATABASE (standby)

Begin: Standby Redo Logfile archival 备库 redo 开始归档

End: Standby Redo Logfile archival

RESETLOGS after complete recovery through change 1027813

Resetting resetlogs activation ID 1659271256 (0x62e67858) 重置在线 redo

Online log /u01/app/oracle/oradata/standby/redo01.log: Thread 1 Group 1 was previously cleared

Online log /u01/app/oracle/oradata/standby/redo02.log: Thread 1 Group 2 was previously cleared

Online log /u01/app/oracle/oradata/standby/redo03.log: Thread 1 Group 3 was previously cleared

Standby became primary SCN: 1027811 备库成功切换为主库

Thu Aug 08 12:17:42 2013

Setting recovery target incarnation to 4

ACTIVATE STANDBY: Complete - Database mounted as primary 现在主库状态 mounted

Completed: alter database activate standby database

Page 101: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

101

############################################我是分割线##############################################

SYS@standby> alter database open;

Database altered.

SYS@standby> select database_role,open_mode from v$database; 用 R/W 方式打开备库

DATABASE_ROLE OPEN_MODE

---------------- -----------------------------

PRIMARY READ WRITE

注:到此所有 redo 都应用到备库上,没有任何数据丢失,原主库已经脱离 DG 架构,不属于 DG 的一部分了。

小结:惯例往往都是发生严重事故后进行 failover 切换,绝大多数主库已经不能在使用了,那么我们用什么方法恢

复主库呢?

第一,flashback database to restore the failed primary database

第二,利用新主库重新创建新备库

第三,使用 RMAN 备份恢复原主库

第四,使用 DG broker 工具重新注册主备库角色

failover 时一定要想好了主库能否再恢复,数据能否再找回来。一定要检查日志号的连接性,否则切换不能成功。

必须停掉日志接收和应用后在切换,深刻理解 failover 和 switchover 含义与区别。

Page 102: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

102

十一 DG Broker 管理工具

DG Broker 管理工具起源于 Oracle 9i,可以使用 broker 配置 Data Guard 环境以及对整个环境进行监控和故障分析,

支持 Switchover 和 Failover 切换。

DG broker 是使 DG 某些管理过程可以自动化或简化的组件,在 OEM 中建立 DG 要求打开 dg broker,例如 可以使用

一条命令进行主备库切换,比较方便。

优点:

(1)将 primary 数据库与全部 standby 数据库看成一个整体进行管理。

(2)可以通过 OEM 轻松创建一个 standby。

(3)可以在一个地方对所有的数据库进行统一的配置和管理,这些配置会被自动同步到各个数据库中。

(4)使用一个简单的命令进行 switchover 和 failover 操作,通过配置可以自动的进行 failover 操作。

(5)自动持续对数据库配置、状态、参数进行自动管理,提供详细的数据库状态报告和 OEM Events 结果集。

DG Broker 结构

客户端:OEM 或者 Broker 命令行

服务端:DMON 监控进程 和 配置文件

DMON 监控进程:实时监控主库状态,一旦 crash 自动进行 failover 操作,无需人为干预,直接备库接管主库。

Fast Start Failover:快速启动 Failover 当主库出现以下情况,Broker 会自动进行主备库的切换

(1)Instance Failure

(2)Shutdown Abort

(3)Offline Datafiles due to I/O error

(4)Network disconnection

Observer 观察员架构

Page 103: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

103

一个节点为主库 一个节点为备库 一个节点为 Observer

切换时,Observer 会将备库变成主库,同时 Observer 通过应用 Flashback log 将原主库变成备库。所以,DG Broker

必须开启 Flashback ,同时将 DG 设置在 maximum availability 模式。

Broker 会在所有主备库使用自己的 DMON 进程和配置文件,进行通信,当我们将 DG_BROKER_START 设置为 true

之后,DMON 进程就会启动,对于 Broker 配置文件,我们可以通过 Enterprise Manager 或者使用 DGMGRL 命令进行

创建。

Broker 配置文件 有自 己的 参数 和设 置。 Data Guard 允许有多份配置文件,所以我们需要在

DG_BROKER_CONFIG_FILEn 参数里指定正确的配置文件。要注意的是,这个配置文件是二进制文件,不要手动去修

改它,这样会破坏这个文件。

RAC 架构,所有实例共享一份 Broker 配置文件,该文件放在共享存储上。

Broker 实验

1.所有主备库启动 Brober 功能和 Flashback 功能

Primary

SYS@primary> show parameter dg_broker_start

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

dg_broker_start boolean FALSE

SYS@primary> alter system set dg_broker_start=true scope=both;

System altered.

SYS@primary> show parameter dg_broker_start

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

dg_broker_start boolean TRUE

Standby

SYS@standby> show parameter dg_broker_start

NAME TYPE VALUE

------------------------------------ -------------------- ------------------------------

dg_broker_start boolean FALSE

SYS@standby> alter system set dg_broker_start=true scope=both;

System altered.

SYS@standby> show parameter dg_broker_start

NAME TYPE VALUE

------------------------------------ -------------------- ------------------------------

dg_broker_start boolean TRUE

启动 FLASHBACK

主库

SYS@primary> show parameter recovery

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

db_recovery_file_dest string /u01/app/oracle/flash_recovery_area

db_recovery_file_dest_size big integer 4G

recovery_parallelism integer 0

注意一下如果 staretup mount force 在执行 alter database flashback on; 会报错

SYS@primary> alter database flashback on;

alter database flashback on

*

Page 104: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

104

ERROR at line 1:

ORA-38706: Cannot turn on FLASHBACK DATABASE logging.

ORA-38714: Instance recovery required.

因为 staretup mount force 关闭数据时用的是 shutdown abort 启动的时候需要进行 Instance recovery.

所以我们必须正常 shutdown immediate –> startup mount -> alter database flashback on; 才会成功

SYS@primary> alter database flashback on;

Database altered.

SYS@primary> select open_mode,flashback_on from v$database;

OPEN_MODE FLASHBACK_ON

-------------------- ------------------

MOUNTED YES

SYS@primary> alter database open;

Database altered.

2.使用具有 SYSDBA 权限的用户登录 Broker 工具

[oracle@leonarding2 dbs]$ dgmgrl sys/oracle

DGMGRL for Linux: Version 11.2.0.1.0 - 64bit Production

Copyright (c) 2000, 2009, Oracle. All rights reserved.

Welcome to DGMGRL, type "help" for information.

Connected.

DGMGRL>

3.DG Broker 工具必须先 configuration 才能使用

创建连接配置 configuration

主库

DGMGRL> create configuration LEO as primary database is primary connect identifier is primary;

Configuration "leo" created with primary database "primary"

DGMGRL> help create

Syntax:

CREATE CONFIGURATION <configuration name> AS 配置名自己起

PRIMARY DATABASE IS <database name> 数据库实例名

CONNECT IDENTIFIER IS <connect identifier>; 监听连接字符串名

添加一个备库到 broker 工具中

DGMGRL> help add

Adds a standby database to the broker configuration

Syntax:

ADD DATABASE <database name>

[AS CONNECT IDENTIFIER IS <connect identifier>]

[MAINTAINED AS {PHYSICAL|LOGICAL}]

DGMGRL> add database standby as connect identifier is standby maintained as physical;

Database "standby" added

查看 configuration

DGMGRL> show configuration

Configuration – leo 配置名字

Protection Mode: MaxPerformance 最大性能模式

Databases:

primary - Primary database 主备库角色

Page 105: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

105

standby - Physical standby database

Fast-Start Failover: DISABLED 快速启动禁用

Configuration Status:

DISABLED 配置还没有启动

Maximum protection/availability 模式必须满足以下条件

(1)Redo Archive Process:LGWR

(2)Network Tranmission mode:SYNC

(3)Disk Write Option:Affirm 断言

(4)Standby Logfile:YES

(5)Standby database type:Physical Only

即 Standby database 必须配置 Standby Logfile,而 Primary database 必须使用 LGWR SYNC AFFIRM 方式归档到

Standby database。

因为 Primary Database 的 redo 是实时传递过来的,于是 Standby database 端可以使用两种方式应用日志

实时应用(Real-Time Apply)只要 RFS 把日志写入 Standby Logfile 就立刻应用。

归档应用:在完成对 Standby Logfile 归档之后才触发应用。

Primary database 默认使用 ARCH 进程,如果使用 LGWR 进程必须明确指定。使用 LGWR SYNC 方式时,可以同时使

用 NET_TIMEOUT 参数,这个参数单位是秒,代表如果多长时间内网络日志发送没有响应,LGWR 进程会抛出错误。

配置主备库为 SYNC 同步模式

DGMGRL> edit database primary set property logxptmode='sync';

Property "logxptmode" updated

DGMGRL> edit database standby set property logxptmode='sync';

Property "logxptmode" updated

修改保护模式为最大可用模式(默认为最大性能模式 maximum performance)

DGMGRL> edit configuration set protection mode as maxavailability;

Succeeded.

查看 configuration

DGMGRL> show configuration

Configuration – leo 配置名字

Protection Mode: MaxAvailability 已经修改为最大可用模式

Databases:

primary - Primary database

standby - Physical standby database

Fast-Start Failover: DISABLED 快速启动禁用

Configuration Status: 此配置没有启动

DISABLED

还可以使用 alter database set standby database to maximize availability;设置为最大可用 -> 主备库都执行

注意:数据库 mounted 状态下才可执行

主库

SYS@primary> select protection_mode,protection_level from v$database;

PROTECTION_MODE PROTECTION_LEVEL

-------------------- --------------------

Page 106: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

106

MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE

SYS@primary> startup mount

Database mounted.

SYS@primary> alter database set standby database to maximize availability;

Database altered.

SYS@primary> select protection_mode,protection_level from v$database;

PROTECTION_MODE PROTECTION_LEVEL

-------------------- --------------------

MAXIMUM AVAILABILITY UNPROTECTED

SYS@primary> alter database open;

Database altered.

SYS@primary> select protection_mode,protection_level from v$database;

PROTECTION_MODE PROTECTION_LEVEL

-------------------- --------------------

MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY

备库

SYS@standby> select protection_mode,protection_level from v$database;

PROTECTION_MODE PROTECTION_LEVEL

-------------------- --------------------

MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE

SYS@standby> alter database set standby database to maximize availability;

Database altered.

SYS@standby> select protection_mode,protection_level from v$database;

PROTECTION_MODE PROTECTION_LEVEL

-------------------- --------------------

MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY

Broker 配置文件

当配置完 DGMGRL 之后会在$ORACLE_HOME/dbs 下生成 2 个配置文件 dr1primary.dat 和 dr2primary.dat(注意的是,

这个配置文件是二进制文件,不要手动去修改它,这样会破坏这个文件),这 2 个文件的位置有如下参数指定:

SYS@primary> show parameter dg_broker_config_file

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

dg_broker_config_file1 string /u01/app/oracle/product/11.2.0/db_1/dbs/dr1primary.dat

dg_broker_config_file2 string /u01/app/oracle/product/11.2.0/db_1/dbs/dr2primary.dat

[oracle@leonarding2 dbs]$ ll

total 68

-rw-r----- 1 oracle oinstall 16384 Aug 9 12:09 dr1primary.dat

-rw-r----- 1 oracle oinstall 16384 Aug 9 12:14 dr2primary.dat

Broker 日志文件,这个日志文件会记录你的 DGMGRL 操作流程,也会记录配置文件的位置、保护模式、主备库信息

[oracle@leonarding2 trace]$ pwd

/u01/app/oracle/diag/rdbms/primary/primary/trace

[oracle@leonarding2 trace]$ ll | grep drc

-rw-r----- 1 oracle oinstall 37308 Aug 9 13:43 drcprimary.log

现在我们激活配置方案,激活之后会在备库的$ORACLE_HOME/dbs 下生成这 2 个配置文件,在激活之前是不会生成

的。如果没有激活,在备库 DGMGRL>下是看不到 configuration 内容的。

例如

Page 107: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

107

DGMGRL> show configuration

ORA-16532: Data Guard broker configuration does not exist

Configuration details cannot be determined by DGMGR

主库

DGMGRL> enable configuration

Enabled.

备库

[oracle@leonarding3 dbs]$ ll

total 60

-rw-r----- 1 oracle oinstall 16384 Aug 9 14:09 dr1standby.dat

-rw-r----- 1 oracle oinstall 16384 Aug 9 14:09 dr2standby.dat

主库

DGMGRL> show configuration

Configuration - leo

Protection Mode: MaxAvailability 最大可用模式

Databases:

primary - Primary database

standby - Physical standby database

Fast-Start Failover: DISABLED FSFO 禁用

Configuration Status: 配置已经启动

SUCCESS

备库,激活 configuration 之后就有内容了与主库一样

DGMGRL> show configuration

Configuration - leo

Protection Mode: MaxAvailability

Databases:

primary - Primary database

standby - Physical standby database

Fast-Start Failover: DISABLED

Configuration Status:

SUCCESS

检查 primary 属性

DGMGRL> show database verbose primary

Database - primary

Role: PRIMARY 角色为主库

Page 108: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

108

Intended State: TRANSPORT-ON 可切换

Instance(s): 实例名

primary

Properties: 属性列表

DGConnectIdentifier = 'primary'

ObserverConnectIdentifier = ''

LogXptMode = 'sync' 同步模式

DelayMins = '0'

Binding = 'optional'

MaxFailure = '0'

MaxConnections = '1'

ReopenSecs = '300'

NetTimeout = '30'

RedoCompression = 'DISABLE'

LogShipping = 'ON'

PreferredApplyInstance = ''

ApplyInstanceTimeout = '0'

ApplyParallel = 'AUTO'

StandbyFileManagement = 'auto'

ArchiveLagTarget = '0'

LogArchiveMaxProcesses = '4'

LogArchiveMinSucceedDest = '1'

DbFileNameConvert = 'standby, primary'

LogFileNameConvert = 'standby, primary'

FastStartFailoverTarget = ''

StatusReport = '(monitor)'

InconsistentProperties = '(monitor)'

InconsistentLogXptProps = '(monitor)'

SendQEntries = '(monitor)'

LogXptStatus = '(monitor)'

RecvQEntries = '(monitor)'

HostName = 'leonarding2.oracle.com'

SidName = 'primary'

StaticConnectIdentifier =

'(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=leonarding2.oracle.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NA

ME=primary_DGMGRL)(INSTANCE_NAME=primary)(SERVER=DEDICATED)))'

StandbyArchiveLocation = '/u01/app/oracle/arch/primary'

AlternateLocation = ''

LogArchiveTrace = '0'

LogArchiveFormat = 'log_%t_%s_%r.arc'

TopWaitEvents = '(monitor)'

Database Status:

SUCCESS

检查 standby 属性

DGMGRL> show database verbose standby

Page 109: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

109

Database - standby

Role: PHYSICAL STANDBY 角色为物理备库

Intended State: APPLY-ON 启动应用

Transport Lag: 0 seconds 传输延迟 0 秒

Apply Lag: 0 seconds 应用延迟 0 秒

Real Time Query: OFF 实时应用禁止

Instance(s): 实例名

standby

Properties:

DGConnectIdentifier = 'standby'

ObserverConnectIdentifier = ''

LogXptMode = 'sync' 同步模式

DelayMins = '0'

Binding = 'OPTIONAL'

MaxFailure = '0'

MaxConnections = '1'

ReopenSecs = '300'

NetTimeout = '30'

RedoCompression = 'DISABLE'

LogShipping = 'ON'

PreferredApplyInstance = ''

ApplyInstanceTimeout = '0'

ApplyParallel = 'AUTO'

StandbyFileManagement = 'auto'

ArchiveLagTarget = '0'

LogArchiveMaxProcesses = '4'

LogArchiveMinSucceedDest = '1'

DbFileNameConvert = 'primary, standby'

LogFileNameConvert = 'primary, standby'

FastStartFailoverTarget = ''

StatusReport = '(monitor)'

InconsistentProperties = '(monitor)'

InconsistentLogXptProps = '(monitor)'

SendQEntries = '(monitor)'

LogXptStatus = '(monitor)'

RecvQEntries = '(monitor)'

HostName = 'leonarding3.oracle.com'

SidName = 'standby'

StaticConnectIdentifier =

'(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=leonarding3.oracle.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NA

ME=standby_DGMGRL)(INSTANCE_NAME=standby)(SERVER=DEDICATED)))'

StandbyArchiveLocation = '/u01/app/oracle/arch/standby'

AlternateLocation = ''

LogArchiveTrace = '0'

Page 110: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

110

LogArchiveFormat = 'log_%t_%s_%r.arc'

TopWaitEvents = '(monitor)'

Database Status:

SUCCESS

注:在 enable FSFO 之前,需要注意 LogXptMode = 'sync'是必须的,可以使用如下命令修改

edit database primary set property logxptmode='sync';

edit database standby set property logxptmode='sync';

否则会报 ORA-16651:requirements not met for enabling Fast-Start Failover

4.使用 Broker 工具进行 switchover 无损切换

一条命令就完成了 switchover 切换任务

DGMGRL> switchover to standby

Performing switchover NOW, please wait... 执行切换请等待

New primary database "standby" is opening... 新主库(standby)已经打开 状态 oepn

Operation requires shutdown of instance "primary" on database "primary"

Shutting down instance "primary"... 关闭(primary)库

ORA-01109: database not open

Database dismounted.

ORACLE instance shut down.

Operation requires startup of instance "primary" on database "primary"

Starting instance "primary"... 启动(primary)库

ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance

ORACLE instance started.

Database mounted. 状态 mounted

Switchover succeeded, new primary is "standby"

重新查看 configuration 内容

DGMGRL> show configuration

Configuration - leo

Protection Mode: MaxAvailability

Databases: 主备库角色已经转换

standby - Primary database

primary - Physical standby database

Fast-Start Failover: DISABLED

Configuration Status:

SUCCESS

Primary 库

SYS@primary>

select db_unique_name,open_mode,database_role,switchover_status,dataguard_broker,primary_db_unique_name from

v$database;

DB_UNIQUE_NAME OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS DATAGUAR

PRIMARY_DB_UNIQUE_NAME

------------------------------ -------------------- ---------------- -------------------- -------- ---------------------------------------------------

Page 111: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

111

primary MOUNTED PHYSICAL STANDBY NOT ALLOWED ENABLED

standby

Standby 库

SYS@standby>

select db_unique_name,open_mode,database_role,switchover_status,dataguard_broker,primary_db_unique_name from

v$database;

DB_UNIQUE_NAME OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS DATAGUAR

PRIMARY_DB_UNIQUE_NAME

------------------------------ -------------------- ---------------- -------------------- -------- ---------------------------------------------------

standby READ WRITE PRIMARY TO STANDBY ENABLED

primary

使用 Broker 进行 switchover 切换是不是非常省事简单啊一条命令就解决了,为了进行下面 FSFO 实验方便我们还是

先切换回来比较好。

DGMGRL> switchover to primary

Performing switchover NOW, please wait...

New primary database "primary" is opening...

Operation requires shutdown of instance "standby" on database "standby"

Shutting down instance "standby"...

ORA-01109: database not open

Database dismounted.

ORACLE instance shut down.

Operation requires startup of instance "standby" on database "standby"

Starting instance "standby"...

ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance

ORACLE instance started.

Database mounted.

Switchover succeeded, new primary is "primary"

DGMGRL> show configuration

Configuration - leo

Protection Mode: MaxAvailability

Databases: 当前主备库角色

primary - Primary database

standby - Physical standby database

Fast-Start Failover: DISABLED

Configuration Status:

SUCCESS

Primary 库

SYS@primary> select

db_unique_name,open_mode,database_role,switchover_status,dataguard_broker,primary_db_unique_name from

v$database;

Page 112: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

112

DB_UNIQUE_NAME OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS DATAGUAR

PRIMARY_DB_UNIQUE_NAME

------------------------------ -------------------- ---------------- -------------------- -------- ---------------------------------------------------

primary READ WRITE PRIMARY TO STANDBY ENABLED

standby

Standby 库

SYS@standby>

select db_unique_name,open_mode,database_role,switchover_status,dataguard_broker,primary_db_unique_name from

v$database;

DB_UNIQUE_NAME OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS DATAGUAR

PRIMARY_DB_UNIQUE_NAME

------------------------------ -------------------- ---------------- -------------------- -------- ---------------------------------------------------

standby MOUNTED PHYSICAL STANDBY NOT ALLOWED ENABLED

primary

5.启动 FSFO

前提条件检查

(1)主备库都启动 flashback

(2)两端同步模式 SYNC

(3)两端都有 standby log file

DGMGRL> enable fast_start failover

Enabled.

随便启动 observer 观察员,如果不启动会报错 Warning:ORA-16608: one or more databases have warnings

DGMGRL> start observer

Observer started

等待 120 秒之后 failover 切换,默认是 30 秒

DGMGRL> edit configuration set property faststartfailoverthreshold=120;

Property "faststartfailoverthreshold" updated

DGMGRL> show configuration verbose

Configuration - leo

Protection Mode: MaxAvailability

Databases:

primary - Primary database

standby - (*) Physical standby database

(*) Fast-Start Failover target failover 切换目标-> standby

Fast-Start Failover: ENABLED FSFO 已经启动

Threshold: 120 seconds 切换间隔 120 秒

Target: standby 目标 standby

Observer: leonarding2.oracle.com 观察员主机

Lag Limit: 30 seconds (not in use)

Shutdown Primary: TRUE

Auto-reinstate: TRUE

Page 113: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

113

Configuration Status:

SUCCESS

SYS@primary> select fs_failover_observer_present,fs_failover_observer_host,fs_failover_threshold from v$database;

FS_FAIL FS_FAILOVER_OBSERVER_HOST FS_FAILOVER_THRESHOLD

------- ------------------------------ -------------------------------------------- ---------------------

YES leonarding2.oracle.com 120

SYS@standby> select fs_failover_observer_present,fs_failover_observer_host,fs_failover_threshold from v$database;

FS_FAIL FS_FAILOVER_OBSERVER_HOST FS_FAILOVER_THRESHOLD

------- ------------------------------ -------------------------------------- ---------------------------

YES leonarding2.oracle.com 120

6.实现自动 Failover 切换

前面提到当发生以下情况之一时 Observer 会触发 failover 切换

(1)Instance Failure 实例失败

(2)Shutdown Abort 强制关库

(3)Offline Datafiles due to I/O error 数据文件离线

(4)Network disconnection 网络断开

SYS@primary> shutdown abort

ORACLE instance shut down

等待 2 分钟之后 Broker 开始启动切换,注意观察如下日志信息

可以从原来 observer 启动的地方开到提示

16:53:37.86 Friday, August 09, 2013

Initiating Fast-Start Failover to database "standby"... 初始化 FSFO

Performing failover NOW, please wait... 进行 FSFO 请等待

Failover succeeded, new primary is "standby" 新主库为 standby

16:53:44.64 Friday, August 09, 2013

可以查看/u01/app/oracle/diag/rdbms/primary/primary/trace/drcprimary.log Broker 日志

DMON: Deferring associated archivelog destinations of

2013-08-09 16:53:57.780 02001000 420757199 sites permanently disabled due to Failover

2013-08-09 16:53:57.783 DMON: Redo transport to database primary (01001000) has been

deferred

2013-08-09 16:53:57.783 02001000 420757199 DMON: Notifying CRS to buildup

primary database after FAILOVER

2013-08-09 16:53:57.783 CLSR: CRS not configured, config= 2.

2013-08-09 16:53:57.783 02001000 420757199 DMON: Posting DB_DOWN alert ...

2013-08-09 16:53:57.783 ... with reason Data

Guard Fast-Start Failover - Primary Disconnected

2013-08-09 16:53:57.838 02001000 420757199 DMON: posting primary instances for FAILOVER phase 5

2013-08-09 16:53:57.839 02001000 420757199 DMON: status from rfi_post_instances() for CTL_FAIL = ORA-00000

2013-08-09 16:53:57.839 02001000 420757199 DMON: Failover Complete FSFO 完成

2013-08-09 16:53:57.839 INSV: Received message for inter-instance publication

2013-08-09 16:53:57.839 02001000 420757199 New Primary Site is named: standby 新主库为 standby

可以查看 alert 告警日志

Completed: ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH FORCE 停止日志应用

ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WAIT WITH SESSION SHUTDOWN

Page 114: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

114

ALTER DATABASE SWITCHOVER TO PRIMARY (standby) 进行切换

Maximum wait for role transition is 15 minutes. 预估角色转换需要 15 分钟

Backup controlfile written to trace file

/u01/app/oracle/diag/rdbms/standby/standby/trace/standby_rsm0_19275.trc

Standby terminal recovery start SCN: 1058193

RESETLOGS after incomplete recovery UNTIL CHANGE 1058194

Online log /u01/app/oracle/oradata/standby/redo01.log: Thread 1 Group 1 was previously cleared

Online log /u01/app/oracle/oradata/standby/redo02.log: Thread 1 Group 2 was previously cleared

Online log /u01/app/oracle/oradata/standby/redo03.log: Thread 1 Group 3 was previously cleared

Standby became primary SCN: 1058192 备库变成主库

Fri Aug 09 16:53:52 2013

Setting recovery target incarnation to 4

Switchover: Complete - Database mounted as primary 主库当前状态 mounted

Fri Aug 09 16:53:52 2013

ARC0: Becoming the 'no SRL' ARCH

Completed: ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WAIT WITH SESSION

SHUTDOWN

ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE AVAILABILITY 最大可用模式

Completed: ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE AVAILABILITY

7.最后验证切换之后的状态

检查 standby 状态

SYS@standby>

select db_unique_name,open_mode,database_role,switchover_status,dataguard_broker,primary_db_unique_name from

v$database;

DB_UNIQUE_NAME OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS DATAGUAR

PRIMARY_DB_UNIQUE_NAME

------------------------------ -------------------- ---------------- -------------------- -------- ---------------------------------------------------

standby READ WRITE PRIMARY NOT ALLOWED ENABLED

primary

SYS@standby> select fs_failover_status from v$database;

FS_FAILOVER_STATUS

--------------------------------

REINSTATE REQUIRED

检查 primary 库,当前数据库已经不可用

SYS@primary> select open_mode from v$database;

select open_mode from v$database

*

ERROR at line 1:

ORA-01034: ORACLE not available

Process ID: 19895

Session ID: 9 Serial number: 5

Broker 需要 SYSDBA 权限重启数据库,如果没有该权限,Broker 应将完成角色转换,但需要手工重启数据库。

将原主库启动到 mount 状态后,Observer 会使用 Flashback 立刻恢复 primary 为 mounted 状态,使其角色转换为

PHYSICAl STANDBY 并应用服务。过程如下

DGMGRL> show configuration verbose

Configuration - leo

Page 115: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

115

Protection Mode: MaxAvailability

Databases:

standby - Primary database standby 为新主库

Warning: ORA-16817: unsynchronized fast-start failover configuration 不能同步备库

primary - (*) Physical standby database (disabled) primary 为新备库

ORA-16661: the standby database needs to be reinstated 需要恢复(重启即可)

(*) Fast-Start Failover target

Fast-Start Failover: ENABLED

Threshold: 120 seconds

Target: primary

Observer: leonarding2.oracle.com

Lag Limit: 30 seconds (not in use)

Shutdown Primary: TRUE

Auto-reinstate: TRUE

Configuration Status: DGMGRL 有告警信息

WARNING

SYS@primary> startup mount 将 primary 重启到 mounted 状态

Database mounted.

SYS@primary>

select db_unique_name,open_mode,database_role,switchover_status,dataguard_broker,primary_db_unique_name from

v$database;

DB_UNIQUE_NAME OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS DATAGUAR

PRIMARY_DB_UNIQUE_NAME

------------------------------ -------------------- ---------------- -------------------- -------- ---------------------------------------------------

primary MOUNTED PRIMARY NOT ALLOWED ENABLED standby

注:我们说过一旦 failover 之后原主库将会脱离 DG 架构,但 Broker 工具可以使其还原,在 Observer 还没有探测到

新状态之前是这样的,等待几秒钟一旦 Observer 探测到 primary 重启为 mounted 之后便开始恢复还原

17:31:26.42 Friday, August 09, 2013

Initiating reinstatement for database "primary"...

Reinstating database "primary", please wait...

Operation requires shutdown of instance "primary" on database "primary"

Shutting down instance "primary"...

ORA-01109: database not open

Database dismounted.

ORACLE instance shut down.

Operation requires startup of instance "primary" on database "primary"

Starting instance "primary"...

ORA-32004: obsolete or deprecated parameter(s) specified for RDBMS instance

ORACLE instance started.

Database mounted.

Continuing to reinstate database "primary" ...

Page 116: Ê¢¸çÒ»µãÒ»µÎ½²½âData GuardÇ°ÊÀ½ñÉú

116

Reinstatement of database "primary" succeeded

17:32:15.81 Friday, August 09, 2013

又还原成 PHYSICAl STANDBY

SYS@primary>

select db_unique_name,open_mode,database_role,switchover_status,dataguard_broker,primary_db_unique_name from

v$database;

DB_UNIQUE_NAME OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS DATAGUAR

PRIMARY_DB_UNIQUE_NAME

------------------------------ -------------------- ---------------- -------------------- -------- ---------------------------------------------------

primary MOUNTED PHYSICAL STANDBY NOT ALLOWED ENABLED

standby

Standby 库也有变化,从 NOT ALLOWED -> TO STANDBY 现在可以进行切换了

SYS@standby>

select db_unique_name,open_mode,database_role,switchover_status,dataguard_broker,primary_db_unique_name from

v$database;

DB_UNIQUE_NAME OPEN_MODE DATABASE_ROLE SWITCHOVER_STATUS DATAGUAR

PRIMARY_DB_UNIQUE_NAME

------------------------------ -------------------- ---------------- -------------------- -------- ---------------------------------------------------

standby READ WRITE PRIMARY TO STANDBY ENABLED

primary

状态已经从 REINSTATE REQUIRED -> SYNCHRONIZED 需要恢复到已经同步

SYS@standby> select fs_failover_status from v$database;

FS_FAILOVER_STATUS

----------------------

SYNCHRONIZED

小结:到此盛哥一点一滴讲解 Data Guard 前世今生全部完成,这部作品经历了多少个不眠之夜,消耗了作者巨大精

力与体力,作者力求从无到有,从有到精的一点一滴带领大家一起洞穿 Data Guard 前世今生,可以这么说如果把这

里面的理论与实践完全理解与掌握,你将会进阶到一个新高度,向着 DBA 最高王座又近一步,这不仅收获了知识更

证明了你的实力,在攀登的路途上更令人敬畏!

DG broker switchover failover convert

Leonarding

2013.08.09

北京&summer

分享技术~成就梦想

Blog:www.leonarding.com