SUMSEN

Oracle&Sql爱好者,用友NC管理员

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

asm=cluster+omf+raid+vm

ASM学习- Windows平台

自动存储管理(ASM)通过创建磁盘组减少了人们手工管理成千上万个数据文件方面的潜在负担。磁盘组由一系列磁盘设备以及其上驻留的文件组成,可以作为一个逻辑单元来管理。ASM具有如下优点:
1)ASM能够利用OMF,并且将它与镜像功能和条带技术结合起来,形成一种强健的文件系统和逻辑管理器,甚至可以支持RAC中的多个节点。
2)ASM不再要求人们购买第三方逻辑管理器软件
3)ASM能够自动负载平衡文件的分发,能够对文件进行条带化处理

 ASM结构
ASM将数据文件以及其它数据库结构分解成区(extent),再将区分解为磁盘组中的各个磁盘,以提高性能和可用性。ASM并不是对整个磁盘进行镜像,而是对数据库对象进行镜像处理。自动负载平衡是ASM另一个关键功能。当人们需要增加磁盘空间时,你可以向磁盘组中添加磁盘设备,ASM会把一定比例的文件从一个或多个现有的磁盘中转移到新的磁盘中,并保持所有磁盘在总体I/O上的负载平衡。ASM使用一种特殊类型的Oracle实例来提供传统Oracle实例与文件系统之间的接口。有两个新的后台进程支持ASM实例:RBAL和ORBn。RBAL用于协调磁盘组中各个磁盘之间的活动,而ORBn用于在实际磁盘之间执行实际的区移动。N可以从0到9。对于使用ASM的数据库,也有两个新的后台进程:OSMB和RBAL。OSMB负责数据库与ASM实例之间的通讯。

磁盘组特点:

磁盘组动态负载平衡
每当磁盘组的配置发生改变时,不论是向其中加入、删除一个失效组还是在一个失效组中添加、删除一块磁盘,系统都会自动进行动态负载平衡处理。这种负载平衡处理是在数据库联机状态下进行的,而且始终保持对用于的可用性。可以通过调整ASM_POWER_LIMIT参数的值来改变负载平衡操作对系统的影响。

 

1 创建ASM实例
要注意要有裸设备。如果是WINDOWS平台,要求磁盘是基本磁盘,不要升级成动态磁盘,创建扩展分区,然后创建逻辑分区,但是一定不要格式化,否则创建ASM的过程中将无法找到设备。

在虚拟机安装oracle10G 

虚拟机vmware新建4个1G的磁盘(之后增加了2个2G的虚拟磁盘)

选择这个,建立裸设备

 2013-01-25 10:58:17 更新

最后还是通过导入的方式建立数据库nc3,在上面安装的时候选择了em。

1.1 和手工建库一样,首先创建管理目录(dump目录)

mkdir %ORACLE_BASE%\admin\+ASM2\bdump
mkdir %ORACLE_BASE%\admin\+ASM2\cdump
mkdir %ORACLE_BASE%\admin\+ASM2\hdump
mkdir %ORACLE_BASE%\admin\+ASM2\udump

注意文件夹名称需要是+asm2 --与后面的实例sid对应

1.2 创建asm的pfile --和实例的pfile一样放在@?/database下,命名为init+asm2.ora

# _asm_allow_only_raw_disks=false
# asm_diskgroups='gdata'

background_dump_dest=C:\oracle\product\10.2.0\admin\+ASM2\bdump
core_dump_dest=C:\oracle\product\10.2.0\admin\+ASM2\cdump
user_dump_dest=C:\oracle\product\10.2.0\admin\+ASM2\udump

###########################################
# Miscellaneous
###########################################
instance_type=asm
compatible=10.2.0

###########################################
# Pools
###########################################
large_pool_size=12M

###########################################
# Security and Auditing
###########################################
remote_login_passwordfile=exclusive

补充:INSTANCE_TYPE

对于ASM实例而言,这个参数值是ASM。对于传统的Oracle实例,值是RDBMS

1.3 cmd下输入localconfig add,添加css服务

C:\oracle\product\10.2.0\db_1\BIN下有localconfig.bat

1.4 识别裸设备

cmd 运行asmtoolg

一次修改一个未格式化的裸设备,这里需要修改6个,4个1g,2个2g

asmtool -list 查看 

1.5 创建asm实例 --这里需要有“+”号


C:\Documents and Settings\Administrator>oradim -new -asmsid +asm2

startup

ASM实例的启动和关闭
ASM实例上运行与其它数据库相似,不过用默认的STARTUP MOUNT命令代替了STARTUP命令。此外,我们还可以用STARTUP RESTRICT来暂时阻止数据库实例连接到ASM实例上并安装磁盘组。如果人们在ASM实例上使用SHUTDOWN命令,在ASM完成关机操作之前,他会等待所有的相关的数据库都关闭。唯一的例外是,如果使用SHUTDOWN ABORT,则ASM实例并不将ABORT命令传送到相关的数据库,而是所有的相关数据库都会立即执行一条SHUTDOWN ABORT命令。

1.6 创建磁盘组

SYS@+asm2>select group_number,disk_number,mount_status from v$asm_disk; --系统已经识别了裸设备

 

CREATE DISKGROUP gdata NORMAL REDUNDANCY
    FAILGROUP controller1 DISK '\\.\ORCLDISKD1','\\.\ORCLDISKD3'
    FAILGROUP controller2 DISK '\\.\ORCLDISKD2','\\.\ORCLDISKD4';

这里的ORCLDISKD1就是asmtoolg修改的裸设备link name

在定义磁盘组的镜像处理类型之前,必须将磁盘组成失效组(failure group)。失效组是指属于一个磁盘组的一块活多块磁盘组成的一部分资源,例如磁盘控制器。它如果失效将引起磁盘组的一部分磁盘不可用。大多数情况下,ASM实例不知道某个磁盘的硬件和软件的依赖关系。因此,除非人们明确将一个磁盘指定到一个失效组,否则磁盘组的每一个磁盘都属于只包含自身的一个失效组。
定义了失效组之后,我们就可以定义磁盘组的镜像处理了。磁盘组中可用失效组数量会限制该磁盘组可用的镜像类型,下面是三中可用的类型:
1)外部冗余:
External redundancy要求只有一个失效组,并且认为该磁盘组对于数据库运行并不重要,或者改磁盘由外部的一个高可用性硬件,如RAID控制器管理
2)普通冗余
普通冗余要求有两个失效组,提供双路镜像。
3)高冗余
高冗余要求至少三个失效组,提供三路镜像,即使有两路失效,仍然可以使用。

 

select group_number, name, total_mb, free_mb, state, type from v$asm_diskgroup; 

目前查询只有一个2,需要mount磁盘组

 

mount(或open后)

select group_number, disk_number, mount_status, header_status, state, path, failgroup from v$asm_disk;

目前查询为空

1.7 使用磁盘组创建表空间--连接到数据库实例

SYS@nc3>create tablespace tams3 datafile '+gdata' size 10m;

在磁盘组创建表空间需要在磁盘组名称前面加“+”,否则就到了C:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\路径(不知道原因),比如上面的tasm2表空间

创建在磁盘组的表空间路径为“+GDATA/nc3/datafile/tams3.256.805645313”(有点乱)

所有的ASM文件都是OMF,因此在大多数管理工作中不用关心使用的实际文件名是什么。当人们从一个ASM磁盘删除对象时,对应的文件也会删除。

向磁盘组中添加裸设备,增大容量

alter DISKGROUP gdata add disk '\\.\ORCLDISKD5','\\.\ORCLDISKD6'; --这里不需要指定FAILGROUP controller1,增加的磁盘是成对的

容量变成了1+1+1+1+2+2=8G

 

二、将数据库从文件系统迁移到ASM

 

create spfile from pfile之后,重启Oracle,系统从spfile启动,之后

SYS@nc3>alter database backup controlfile to 'c:\ctbackup.ctl'; --备份控制文件(疑问:controlfile不是一直在记录在数据文件的scn号,现在备份,稍后rman还原为什么可以用它)

数据库已更改。(这一步不是必须的,可以直接使用已有的控制文件)

SYS@nc3>alter system set control_files='+gdata' scope=spfile;

系统已更改。

SYS@nc3>alter system set db_recovery_file_dest='+gdata';

系统已更改。

关闭数据库

rman下 启动到nomount,将控制文件还原到磁盘组

RMAN> restore controlfile from 'C:\CTBACKUP.CTL';

启动 restore 于 25-1月 -13
使用通道 ORA_DISK_1

通道 ORA_DISK_1: 已复制控制文件副本
输出文件名=+GDATA/nc3/controlfile/current.256.805656163
完成 restore 于 25-1月 -13

补充:恢复刚才备份的控制文件,由于我们设置了初始化参数control_files,将其指向了磁盘组gdata,因此恢复出来的控制文件会存放在gdata里。

rman下mount数据库 

通过拷贝的方式,将所有的数据文件全都迁移到ASM磁盘组(gdata)里。
RMAN> backup as copy database format '+gdata';  --copy的,真心不怎么懂

悲剧,还是失败了,gdata磁盘组8G还是不够大

 

2013-01-28 15:16:57 更新:

网友上海digoss操作了以下命令

 连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SYS@+ASM2>alter  diskgroup gdata mount;

磁盘组已变更。

SYS@+ASM2>exit
从 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options 断开

C:\>asmcmd
ASMCMD> ls
GDATA/
ASMCMD> cd gdata
ASMCMD> ls
NC3/
ASMCMD> rm -rf *
ASMCMD> ls
ASMCMD> pwd
+gdata
ASMCMD> exit
C:\>gao   ding   le
'gao' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

2013-01-29 11:20:00 更新

3,rman nomount下还原控制文件到磁盘组

RMAN> startup nomount;

Oracle 实例已启动

系统全局区域总计 293601280 字节

Fixed Size 1248624 字节
Variable Size 79692432 字节
Database Buffers 209715200 字节
Redo Buffers 2945024 字节

RMAN> restore controlfile from 'C:\oracle\product\10.2.0\oradata\nc3\CONTROL01.CTL'; --使用已有的控制文件,随便其中一个(恢复刚才备份的控制文件,由于我们设置了初始化参数control_files,将其指向了磁盘组DgroupA,因此恢复出来的控制文件会存放在gdata里。)

 

启动 restore 于 29-1月 -13
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=157 devtype=DISK

通道 ORA_DISK_1: 已复制控制文件副本
输出文件名=+GDATA/nc3/controlfile/backup.256.805979179
完成 restore 于 29-1月 -13

4,mount数据库,做数据文件转移到磁盘组

RMAN> alter database mount;

数据库已装载
释放的通道: ORA_DISK_1

RMAN> backup as copy database format '+gdata';

启动 backup 于 29-1月 -13
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=153 devtype=DISK
通道 ORA_DISK_1: 启动数据文件副本
输入数据文件 fno=00001 name=C:\SENDB\SYSTEM01.DBF
输出文件名 = +GDATA/nc3/datafile/system.257.805979241 标记 = TAG20130129T110720
recid = 1 时间戳 = 805979262
通道 ORA_DISK_1: 数据文件复制完毕, 经过时间: 00:00:25
通道 ORA_DISK_1: 启动数据文件副本
输入数据文件 fno=00002 name=C:\SENDB\UNDOTBS01.DBF
输出文件名 = +GDATA/nc3/datafile/undotbs1.258.805979265 标记 = TAG20130129T11072
0 recid = 2 时间戳 = 805979284
通道 ORA_DISK_1: 数据文件复制完毕, 经过时间: 00:00:25
通道 ORA_DISK_1: 启动数据文件副本
输入数据文件 fno=00003 name=C:\SENDB\SYSAUX01.DBF
输出文件名 = +GDATA/nc3/datafile/sysaux.259.805979291 标记 = TAG20130129T110720
recid = 3 时间戳 = 805979300
通道 ORA_DISK_1: 数据文件复制完毕, 经过时间: 00:00:16
通道 ORA_DISK_1: 启动数据文件副本
复制当前控制文件
输出文件名 = +GDATA/nc3/controlfile/backup.260.805979307 标记 = TAG20130129T1107
20 recid = 4 时间戳 = 805979307
通道 ORA_DISK_1: 数据文件复制完毕, 经过时间: 00:00:03
通道 ORA_DISK_1: 启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
在备份集中包含当前的 SPFILE
通道 ORA_DISK_1: 正在启动段 1 于 29-1月 -13
通道 ORA_DISK_1: 已完成段 1 于 29-1月 -13
段句柄=+GDATA/nc3/backupset/2013_01_29/nnsnf0_tag20130129t110720_0.261.805979311
标记=TAG20130129T110720 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:02
完成 backup 于 29-1月 -13

RMAN>

5,切换成数据文件副本

RMAN> switch database to copy;

数据文件 1 已切换成数据文件副本 "+GDATA/nc3/datafile/system.257.805979241"
数据文件 2 已切换成数据文件副本 "+GDATA/nc3/datafile/undotbs1.258.805979265"
数据文件 3 已切换成数据文件副本 "+GDATA/nc3/datafile/sysaux.259.805979291"

6,开始恢复数据库。
RMAN> recover database;

 

7,将临时表空间所包含的临时文件迁移到磁盘组gdata里。
RMAN> run{
switch tempfile 1 to '+gdata';
}

8,通过SQL*Plus连入数据库实例,将控制文件里记录的联机日志文件的路径修改为磁盘组gdata。
SQL> alter database rename file '/u01/app/oracle/oradata/ora10g/redo01.log' to '+gdata';
SQL> alter database rename file '/u01/app/oracle/oradata/ora10g/redo02.log' to '+gdata';
SQL> alter database rename file '/u01/app/oracle/oradata/ora10g/redo03.log' to '+gdata';

(群里说是mount状态rman下直接操作上面的代码,有机会试下 )

 mount下操作

SYS@nc3>select status from v$instance;

STATUS
------------------------
MOUNTED

SYS@nc3>select member from v$logfile;

MEMBER
----------------------------------------

C:\SENDB\REDO01.LOG
C:\SENDB\REDO02.LOG
C:\SENDB\REDO03.LOG

每次都是这个错误

回顾redo log的迁移

 将REDO01.LOG移动到一个新地方
( 日志文件的移动或重命名:
1. 关闭数据库
2. 使用操作系统的命令拷贝、移动或重命名重做日志文件
3. 启动 mount下 使用 rename to 

 是不是因为我步骤2没有做,就是事先在asm磁盘组中没有联机日志

在mount下增加了两个联机日志组,每组两个成员,都是150M

SYS@nc3>alter database add logfile group 5 '+gdata' size 150m;

SYS@nc3>alter database add logfile member '+gdata' to group 5;

下一步打算切换了日志状态之后,drop掉物理磁盘,保留磁盘组

SYS@nc3>alter system switch logfile;
alter system switch logfile
*
ERROR at line 1:
ORA-01109: database not open

open 数据库

 


SYS@nc3>select status, GROUP#, MEMBERS from v$log;

STATUS GROUP# MEMBERS
-------------------------------- ---------- ----------
INACTIVE 1 1
INACTIVE 2 1
ACTIVE 3 1
CURRENT 4 2
UNUSED 5 2

SYS@nc3>alter database drop logfile group 1;--删除了第一个

Database altered.

看位置

 

 看磁盘组的使用情况:

select group_number, name, total_mb, free_mb,type, state from v$asm_diskgroup;

9, 在RMAN中以resetlogs选项打开数据库,从而根据控制文件里记录的联机日志文件的路径(这里也就是DgroupA),自动在DgroupA里创建联机日志文件。
RMAN> alter database open resetlogs;--这一步不需要操作了

 

posted on 2013-01-22 21:00  sumsen  阅读(660)  评论(0编辑  收藏  举报