文章
![]() | Oracle Database 11g: 作者:Arup Nanda |
用于管理 ASM 实例的新的 SYSASM 角色、用于降低共享池使用的可变的区大小,以及实例能够读取磁盘组的特定磁盘,这些都是 Oracle Database 11g ASM 中引入的一些重要新特性。
自动存储管理 (ASM) 是在 Oracle Database 10g 中引入的,它在某种程度上打破了 DBA 和系统管理员之间在存储分配功能上的界限。ASM 实例由 DBA 管理,正如常规的 DBA 工作需要以 SYSDBA 角色进行连接一样。但是随着时间的推移,角色变得更加清楚,我们看到发生了基本的分工。因此,一些 ASM 操作返还给系统管理员。在某些情况下,会出现单独的一类“ASM 管理员”,他们只进行 ASM 管理,并不涉及数据库管理。
然而,这个新角色的出现引发了一个冲突:需要用 SYSDBA 角色来管理 ASM 实例,但运行在同一台服务器上的生产数据库的许多 DBA 感觉很难共享该角色。
Oracle Database 11g 消除了这个冲突。有一个新角色 SYSASM,只用于管理 ASM 实例。这类似于针对 ASM 实例的 SYSDBA 角色。下面将演示如何连接到 ASM 实例:
$ sqlplus / as sysasm SQL*Plus: Release 11.1.0.6.0 - Production on Fri Sep 28 20:37:39 2007 Copyright (c) 1982, 2007, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production With the Partitioning, Oracle Label Security, OLAP, Data Mining and Real Application Testing options SQL>
以 sys 用户身份连接到 ASM 实例后,您可以更新在口令文件中更新的 SYS 口令:
SQL> alter user sys identified by oracle 2 / User altered.
SQL> create user asmoper identified by dumboper 2 / User created.
SQL> grant sysasm to asmoper; Grant succeeded.
$ sqlplus asmoper/dumboper as sysasm
ASM 存储中结构最小的元素是分配单元 (AU),与 Oracle 数据库块的概念类似。创建表和索引之类的数据库段时,分配的最小单元不是一个块,而是一个包含多个块的区。您可以更改段的区大小。
ASM 中有一个非常类似的概念:在 ASM 磁盘组上创建文件时,最小的可寻址单元是区,而不是 AU。在 Oracle Database 10g 中,AU 和区是可互换的;一个区只包含一个 AU。
10g 兼容的磁盘组需要共享池为每个区提供内存。对于大型数据库,这又需要大量内存。因此,如果 AU 大小为 1MB(默认值),1TB 的数据库需要在共享池中管理超过一百万个区。
在 Oracle Database 11g 中,区大小不再等于 AU 大小。创建文件时,区大小从 1MB 开始。文件达到某个阈值时,区大小增加至 4MB,然后是 16MB,最后当达到某个阈值后,区大小为 64MB。您不必担心大小;ASM 实例会自动分配合适的区大小。由于较少数量的区即可容纳大量数据,因此可以大大减少共享池中的区总数,从而将性能提高数倍。
当文件急剧扩大和缩小时,可变的区大小可能会产生一些碎片。如果需要进行碎片整理,ASM 将自动解决该问题。
正如我在前面提到的,AU 的默认大小为 1MB。对许多数据库而言,这可能足够大了,但请考虑一个大小超过 10TB 的大型数据库。对象可能超过 1MB,因此您可能希望扩大 AU 大小以减少 AU 数量。在 Oracle Database 10g 中,您可以设置一个底线参数来更改 AU 大小。然而,这会影响之后创建的所有磁盘组,而且还需要一个 ASM 实例回收来设置该参数。
在 Oracle Database 11g 中,只需在创建 DG 期间设置一个磁盘组属性 au_size 即可轻松完成此任务,如下所示:
create diskgroup dg6 external redundancy disk '/dev/raw/raw13' attribute 'au_size' = '2M'
attribute 'au_size' = ' 2097152'
select name, allocation_unit_size from v$asm_diskgroup / NAME ALLOCATION_UNIT_SIZE ------- -------------------- DG1 1048576 DG3 1048576 DG6 2097152 DG5 1048576 DG4 1048576 DG2 1048576
ASM 是一个适用于从 10g 到当前版本的 Oracle 数据库的存储平台。因此,11g 上的 ASM 实例可以保存 10g 第 1 版、10g 第 2 版以及 11g 第 1 版(以及更高版本)的数据库。只要 ASM 版本与 RDBMS 的版本相同或者更高,就可以在该 ASM 实例上创建数据库。如果 ASM 和 RDBMS 实例的版本不同,它们将如何通信呢?很简单:ASM 将消息转换成适合 RDBMS 的版本。
默认情况下,ASM 实例可以支持 10g 数据库。但如果您希望在该 ASM 实例上仅放置 11g RDBMS,该怎么办?无需进行消息转换来支持版本差异。但如果可以告诉 ASM 实例唯一支持的数据库是 11g 第 1 版,该怎么办?这将消除,至少可以减少消息转换。在 Oracle Database 11g 中,可以使用 ASM 兼容性和 RDBMS 兼容性磁盘组属性实现。
首先,我们将检查磁盘组的当前属性:
SQL> select compatibility, database_compatibility 2 from v$asm_diskgroup 3 where name = 'DG1' 4 / COMPATIBILITY DATABASE_COMPATIBILITY ---------------------- ---------------------- 10.1.0.0.0 10.1.0.0.0
由于您只希望创建 11g ASM 和 RDBMS 结构,因此无需拥有 10g 元素。要将该磁盘组的 ASM 兼容性属性设置为 11.1,您可以执行以下语句(在 ASM 实例中):
SQL> alter diskgroup dg1 set attribute 'compatible.asm'='11.1';
COMPATIBILITY DATABASE_COMPATIBILITY ---------------------- ---------------------- 11.1.0.0.0 10.1.0.0.0
SQL> alter diskgroup dg1 set attribute 'compatible.rdbms'='11.1';
在 Oracle RAC 数据库中,多个节点可能指向同一个 ASM 实例。如果您在一个 ASM 磁盘组中使用正常镜像,访问磁盘的行为可能并不像您预想的那样。
假设您有一个名为 DG2 的磁盘组,它包含两个 failgroup(DG2_0000 和 DG2_0001),每个具有一个单独的磁盘,如下图所示:

但是在读取这些区时,始终从主 failgroup(在本例中为 DG2_0000)中读取,而不是从辅助 failgroup (DG2_0001) 中读取。仅当主 failgroup 不可用时才读取辅助 failgroup。
SQL> alter system set asm_preferred_read_failure_groups = 'DG2.DG2_0000','DG3.DG3_0000'
SQL> alter system set asm_preferred_read_failure_groups = 'DG2.DG2_0001','DG3.DG3_0001'
如果您要检查磁盘组中不同磁盘的使用情况,可以参考一个新的字典视图 V$ASM_DISK_IOSTAT,它模拟了 UNIX 系统中的 IOSTAT 实用程序:
select instname, dbname, group_number, failgroup, disk_number, reads, writes from v$asm_disk_iostat order by 1,2,3,4,5,6 /
INSTNAM DBNAME GROUP_NUMBER FAILGROUP DISK_NUMBER READS WRITES
------- -------- ------------ ---------- ----------- ---------- ----------
PRONE31 PRONE3 2 DG2_0000 0 4450 910
PRONE32 PRONE3 2 DG2_0001 1 2256 910
PRONE31 PRONE3 3 DG3_0000 0 300 29
PRONE32 PRONE3 3 DG3_0001 1 560 29
首选读取在“拉伸”集群(节点之间地理距离较远的集群)中尤为有用。首选读取通过将读取隔离到特定磁盘,加快了读取速度。
当一个磁盘不再可用时(损坏到无法修复的程度)会发生什么?您希望完全删除该磁盘组然后重新创建,或者将该磁盘组的磁盘添加到其他磁盘组。该磁盘组尚未挂载。由于其中一个磁盘缺少,您甚至无法挂载它。要删除该磁盘组,您必须挂载它,但由于缺少磁盘,您无法进行挂载 — 绝对是一个“无法摆脱的困境”。您应该做些什么?
在 Oracle Database 10g 中,您可以使用一种变通方法 — 使用 dd 命令擦除磁盘头:$ dd if=/dev/zero of=/dev/raw/raw13 bs=1024 count=4
在 Oracle Database 11g 中,您不必求助于该变通方法。您只需执行带 force 选项的 drop 命令:
SQL> drop diskgroup dg7 force including contents;
许多人将 ASM 看作一个具有自己的存储的数据库。事实并非如此,ASM 并不存储数据,而是由数据库进行存储。但 ASM 实例需要维护磁盘组名称、其中的磁盘、目录等元数据。这些元数据存储在磁盘头中。
假设所有磁盘都损坏且头信息消失,您该怎么办?当然,您已经使用 RMAN 对数据库进行了备份,因此可以恢复。但您只有在创建了所有磁盘组和目录后才能进行恢复。希望您保留了所有记录。(对吗?)即使您进行了备份,这个过程也需要时间。
如果您进行了备份,该怎么办呢?在 Oracle Database 11g 中,您可以使用 md_backup 命令通过 ASM 命令行选项 (ASMCMD) 备份 ASM 实例的元数据。
$ asmcmd -p ASMCMD [+] > md_backup
@diskgroup_set = (
{
'DISKSINFO' => {
DG1_0000' => {
'DG1_0000' => {
'TOTAL_MB' => '103',
'FAILGROUP' => 'DG1_0000',
'NAME' => 'DG1_0000',
'DGNAME' => 'DG1',
'PATH' => '/dev/raw/raw5'
}
}
},
'DGINFO' => {
'DGTORESTORE' => 0,
'DGCOMPAT' => '10.1.0.0.0',
'DGNAME' => 'DG1',
'DGDBCOMPAT' => '10.1.0.0.0',
'DGTYPE' => 'EXTERN',
'DGAUSZ' => '1048576'
},
'ALIASINFO' => {},
'TEMPLATEINFO' => {
'6' => {
'DGNAME' => 'DG1',
'STRIPE' => 'COARSE',
'TEMPNAME' => 'ASM_STALE',
'REDUNDANCY' => 'UNPROT',
'SYSTEM' => 'Y'
... and more ...
ASMCMD [+] > md_backup -g dg1 -b prolin3_asm.backup
现在,让我们看看恢复操作是如何工作的。恢复有不同的类型。最简单的用法是恢复一个以前删除的磁盘组及其目录。首选,在磁盘组上创建一个目录:
ASMCMD [+] > cd DG7 ASMCMD [+DG7] > mkdir TEST ASMCMD [+DG7] > ls TEST/
ASMCMD [+] > md_backup -g dg7 -b g7.backup
SQL> drop diskgroup dg7; Diskgroup dropped.
$ asmcmd md_restore -b dg7.backup -t full Current Diskgroup being restored: DG7 Diskgroup DG7 created! System template TEMPFILE modified! System template FLASHBACK modified! System template ARCHIVELOG modified! System template BACKUPSET modified! System template XTRANSPORT modified! System template DATAGUARDCONFIG modified! System template CONTROLFILE modified! System template AUTOBACKUP modified! System template DUMPSET modified! System template ONLINELOG modified! System template PARAMETERFILE modified! System template ASM_STALE modified! System template CHANGETRACKING modified! System template DATAFILE modified! Directory +DG7/TEST re-created!
另一个选项 -f 使您可以将命令放在一个脚本文件中,而不是执行这些命令:
ASMCMD [+] > md_restore -b dg7.backup -t full -f cr_dg7.sql
create diskgroup DG7 EXTERNAL redundancy disk '/dev/raw/raw14' name DG7_0000 size 100M ;
alter diskgroup /*ASMCMD AMBR*/DG7 alter template TEMPFILE attributes (UNPROTECTED COARSE);
alter diskgroup /*ASMCMD AMBR*/DG7 alter template FLASHBACK attributes (UNPROTECTED FINE);
alter diskgroup /*ASMCMD AMBR*/DG7 alter template ARCHIVELOG attributes (UNPROTECTED COARSE);
alter diskgroup /*ASMCMD AMBR*/DG7 alter template BACKUPSET attributes (UNPROTECTED COARSE);
alter diskgroup /*ASMCMD AMBR*/DG7 alter template XTRANSPORT attributes (UNPROTECTED COARSE);
alter diskgroup /*ASMCMD AMBR*/DG7 alter template DATAGUARDCONFIG attributes (UNPROTECTED COARSE);
alter diskgroup /*ASMCMD AMBR*/DG7 alter template CONTROLFILE attributes (UNPROTECTED FINE);
alter diskgroup /*ASMCMD AMBR*/DG7 alter template AUTOBACKUP attributes (UNPROTECTED COARSE);
alter diskgroup /*ASMCMD AMBR*/DG7 alter template DUMPSET attributes (UNPROTECTED COARSE);
alter diskgroup /*ASMCMD AMBR*/DG7 alter template ONLINELOG attributes (UNPROTECTED FINE);
alter diskgroup /*ASMCMD AMBR*/DG7 alter template PARAMETERFILE attributes (UNPROTECTED COARSE);
alter diskgroup /*ASMCMD AMBR*/DG7 alter template ASM_STALE attributes (UNPROTECTED COARSE);
alter diskgroup /*ASMCMD AMBR*/DG7 alter template CHANGETRACKING attributes (UNPROTECTED COARSE);
alter diskgroup /*ASMCMD AMBR*/DG7 alter template DATAFILE attributes (UNPROTECTED COARSE);
alter diskgroup /*ASMCMD AMBR */ DG7 add directory '+DG7/TEST';
ASM 用户对传统卷管理器最大的抱怨之一是其通过命令行进行诸多检查的能力。ASM 命令行选项 (ASMCMD) 在很大程度上弥补了这个空白。在 Oracle Database 11g 中,ASMCMD 提示符中的一些其他命令可以使 ASM 实例的管理变得极其简单。示例之一就是您在前面看到的元数据备份。另一点值得关注的是用于检查实例管理的磁盘的命令。该命令为 lsdsk。
ASMCMD> lsdsk Path /dev/raw/raw10 /dev/raw/raw11 /dev/raw/raw13 ... snipped ...
ASMCMD> lsdsk -k
Total_MB Free_MB OS_MB Name Failgroup Library Label UDID Product Redund Path
103 41 103 DG4_0000 DG4_0000 System UNKNOWN /dev/raw/raw10
103 41 103 DG5_0000 DG5_0000 System UNKNOWN /dev/raw/raw11
... snipped ...
ASMCMD> lsdsk -s
Reads Write Read_Errs Write_Errs Read_time Write_Time Bytes_Read Bytes_Written Path
207485 207916 0 0 245.820323 159.634398 851251200 /dev/raw/raw10
207481 207912 0 0 229.996931 144.73954 851234816 /dev/raw/raw11
ASMCMD> lsdsk -p
Group_Num Disk_Num Incarn Mount_Stat Header_Stat Mode_Stat State Path
4 0 3915926174 CACHED MEMBER ONLINE NORMAL /dev/raw/raw10
5 0 3915926175 CACHED MEMBER ONLINE NORMAL /dev/raw/raw11
6 0 3915926193 CACHED MEMBER ONLINE NORMAL /dev/raw/raw13
ASMCMD> lsdsk -t Create_Date Mount_Date Repair_Timer Path 27-SEP-07 28-SEP-07 0 /dev/raw/raw10 27-SEP-07 28-SEP-07 0 /dev/raw/raw11 28-SEP-07 28-SEP-07 0 /dev/raw/raw13
ASMCMD> lsdsk -Ik Total_MB Name Failgroup Path 103 DG4_0000 DG4_0000 /dev/raw/raw10 103 DG5_0000 DG5_0000 /dev/raw/raw11 102 DG6_0000 DG6_0000 /dev/raw/raw13
ASMCMD> lsdsk -t -d dg1 Create_Date Mount_Date Repair_Timer Path 28-SEP-07 28-SEP-07 0 /dev/raw/raw5
ASMCMD> lsdsk -t /dev/raw/raw1* Create_Date Mount_Date Repair_Timer Path 27-SEP-07 28-SEP-07 0 /dev/raw/raw10 27-SEP-07 28-SEP-07 0 /dev/raw/raw11 28-SEP-07 28-SEP-07 0 /dev/raw/raw13 28-SEP-07 05-OCT-07 0 /dev/raw/raw14
ASMCMD> help lsdsk lsdsk [-ksptcgHI] [-d <diskgroup_name>] [pattern]
假设您向某个磁盘组添加了一个磁盘。ASM 会立即启动重新平衡操作。该操作联机进行,因此 ASM 必须通过一个复杂的锁定系统与块访问和更改的 RDBMS 实例协调。在 RAC 数据库中,该过程很棘手,因为不仅要在数据库中管理锁定,还要跨多个实例管理锁定。
如果将磁盘添加到一个现在无人使用的磁盘组,将会怎样呢?如果 ASM 可以通过某种方式了解到该情况,它可以消除锁定机制,从而加快该过程。
在 Oracle Database 11g 中,一种新的磁盘组挂载方式使得这一切得以实现。可以使用 RESTRICT 子句挂载磁盘组,如下所示:
alter diskgroup dg7 mount restricted;
考虑一个具有两个 failgroup 的磁盘组 DG2,每个 failgroup 有一个磁盘。当其中一个磁盘的某个区域损坏时,对该磁盘组而言并不是致命的打击。由于进行了镜像,因此可以从另一个磁盘读取损坏的区,从而使磁盘和操作能够继续进行。但是磁盘损坏的部分发生了什么?
在 Oracle Database 10g 中,损坏的磁盘会脱机,它或另一个磁盘必须出现在磁盘组中。如果添加了新磁盘,必须要从用作镜像的其余磁盘完全克隆。但如果只有几个块损坏,复制(例如)34GB 磁盘的内容并不是一个高效的方法。
因此,在 Oracle Database 11g 中,修复磁盘损坏的部分,而不是复制整个磁盘。该特性使用磁盘组的一个新属性 disk_repair_time,该属性指定 ASM 实例容许出错的磁盘在多长时间内从磁盘组中删除。下面演示了如何将磁盘组 DG2 的属性设为两个小时:SQL> alter diskgroup dg2 set attribute 'disk_repair_time'='2H';
我们来看一个示例。假设磁盘组 DG2 有两个 failgroup。首先,检查磁盘组配置:
ASMCMD [+dg2] > lsdg dg2
State Type Rebal Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Name
MOUNTED NORMAL N 512 4096 1048576 206 78 0 39 0 DG2/
ASMCMD [+dg2] > du Used_MB Mirror_used_MB 11 22
ASMCMD [+dg2] > lsdsk -d dg2 Path /dev/raw/raw6 /dev/raw/raw7
SQL> select name, path 2 from v$asm_disk 3 where group_number = 2 4 / NAME PATH -------- ----------------------------- DG2_0000 /dev/raw/raw7 DG2_0001 /dev/raw/raw6
$ dd if=/dev/zero of=/dev/raw/raw7 bs=1024 skip=10 count=1
SQL> alter diskgroup dg2 check
... NOTE: starting check of diskgroup DG2 WARNING: cache read a corrupted block gn=2 fn=3 indblk=1 from disk 0 ... NOTE: cache successfully reads gn 2 fn 3 indblk 1 count 15 from one mirror side kfdp_checkDsk(): 89 ... NOTE: cache initiating offline of disk 0 group 2 WARNING: initiating offline of disk 0.3915926170 (DG2_0000) with mask 0x7e ... WARNING: Disk (DG2_0000) will be dropped in: (7200) secs on ASM inst: (1) ...
... WARNING: Disk (DG2_0000) will be dropped in: (5550) secs on ASM inst: (1) GMON SlaveB: Deferred DG Ops completed. Sat Oct 06 00:25:52 2007 WARNING: Disk (DG2_0000) will be dropped in: (5366) secs on ASM inst: (1) GMON SlaveB: Deferred DG Ops completed. Sat Oct 06 00:28:55 2007 WARNING: Disk (DG2_0000) will be dropped in: (5183) secs on ASM inst: (1) GMON SlaveB: Deferred DG Ops completed. Sat Oct 06 00:31:59 2007 WARNING: Disk (DG2_0000) will be dropped in: (5000) secs on ASM inst: (1) GMON SlaveB: Deferred DG Ops completed. ...最后,当计时为 0 时,磁盘将被删除,除非您修复了问题并且磁盘经过了快速故障修复。如果您知道磁盘不可修复,则应尽快删除,您可以执行以下命令来加速磁盘的淘汰:
SQL> alter diskgroup dg2 offline disks in failgroup dg2_0000 drop after 1m
SQL> alter diskgroup dg2 drop disks in failgroup dg2_0001 force;
SQL> alter diskgroup dg2 online disks in failgroup dg2_0001;
回到到 ASM 之前的日子,我们常常在很老的文件系统上创建数据库文件(即“熟”文件)。尽管它提供了足够的灵活性(用户可以对文件进行移动、调整大小、重命名以及众多其他操作),但并非性能最佳。相比之下,原始设备(又称作原始文件)通过消除文件系统缓存和同步 I/O 这两大主要性能杀手可提供足够的性能。但是,原始设备缺少熟文件的灵活性。
ASM 本质上是一个专为 Oracle Database 设计的卷管理器,为我们提供了一个两全其美之计:文件的灵活性和原始设备的性能。然而,某些人继续创建原始文件,因为这些原始文件具备一些优点,比如,通过 dd 之类的命令直接访问数据库文件,有些时候这对于备份很有用。
在 Oracle Database 11g 第 2 版中,原始设备选项完全消失;您无法再通过原始设备来创建数据文件,而是必须使用熟文件或 ASM 文件。在那些仍使用 dd 命令作为备份方法的地方,这可能会导致一定的惊慌。如果您面临这种情况,应立即转换到 Oracle RMAN。对于 Oracle 数据库备份,没有比 RMAN 更好的方法,并且没有理由不使用 RMAN - 无论是对于熟文件系统、ASM 磁盘组,还是与此有关的原始设备。
ASM 已经发展成为非常具有革命性的组件:ASM 设备上的熟文件系统。是的,您没有看错,熟 文件系统。而且,由于 ASM 可识别集群,因此文件系统也将集群化。在本文后面的部分中,您将详细了解这一令人激动的新特性。
在先前的版本中,至少有两个不同的主目录:用于集群件和数据库。数据库主目录包含可执行文件和 ASM 的代码路径;ASM 是数据库的一部分,而非集群件的一部分。在 11g 第 2 版中,有一个被称作 Grid Infrastructure 的新概念,它将集群件和 ASM 合并到一个主目录中。您现在针对集群数据库体系的不同部分具有不同的安装和下载。(对于 ASM 及其他可选组件,如 Clusterware、Oracle Restart 等,Grid Infrastructure 是必需的。对于数据库,Database 是必需的。)
即使您不使用 RAC(因此没有集群件),单实例 11g 第 2 版数据库也可具有 Oracle Restart 特性,该特性监视数据库进程并在某个数据库进程终止的情况下重新启动数据库进程。Grid Infrastructure 实现了 Restart 特性;即使您决定不使用此特性,您仍必须对 ASM 的 Oracle Grid Infrastructure 单独使用不同主目录。
现在,当您首次安装 Oracle 时,必须先安装 Grid Infrastructure,然后才能创建 ASM 实例、发现 ASM 磁盘以及创建磁盘组。如果您打算在该服务器上安装数据库,则必须下载并安装 Oracle RDBMS 软件(独立于 Grid Infrastructure)。如果您需要的只是创建集群化 ASM 文件系统(后面将对此进行说明)而非数据库,那么您可以止步于 Grid Infrastructure 主目录。如果您也要创建数据库,则必须下载并安装 Database 软件。在某个补丁可用时,您必须在相应主目录中应用这个补丁。
ASM 与 RDBMS 分离是非常合理的。从根本上来说,ASM 实际是一个基础架构组件,而不是数据库的一部分。在 Oracle 11.2 中,ASM 已获得更多功能 — 其中一个功能是创建熟文件系统(将在本文的后面进行说明)。这意味着,ASM 的存在可以不依赖于数据库。此外,作为基础架构组件的一部分,它可以有不同的一组管理员,而非 DBA。将 RDBMS 与 ASM 分离可解决所有这些新要求。
继续以上讨论,您现在意识到 ASM 在基础架构体系中有自己的位置,独立于数据库。因此,具有一组不同的管理员是合乎逻辑的。由于历史原因,可能已将管理责任赋予 DBA,但这没有必要。对此,合乎逻辑的选择是该服务器的系统管理员,因为它现在与其说是应用程序,不如说是一个基础架构。为了满足这些独特的需求,第 2 版引入了一个名为 SYSASM 的角色,它类似于数据库中的 SYSDBA。
为了顺利过渡到 11g,ASM 命令过去通常通过 SYSDBA 角色获得支持。现在不再需要这样了:在第 2 版中,您必须以 SYSASM 角色进行连接才能操作 ASM 组件。以下命令将在第 1 版中生效:
$ sqlplus / as sysdba SQL> alter diskgroup data dismount;
在第 2 版中,您仍可作为 SYSDBA 连接;但上述 alter 命令将抛出错误:
SQL> alter diskgroup data dismount; alter diskgroup data dismount * ERROR at line 1: ORA-15032: not all alterations performed ORA-15260: permission denied on ASM disk group
您必须通过以下角色进行连接
$ sqlplus / as sysasm
因此:
如果您要从 10g 升级到 11g 第 2 版,那么必须在安装过程中创建一个 sysasm 组并提及该组。
如果您要从 11g 第 1 版进行升级,那么您很有可能在使用一个 sysasm 组;但可能已分配给用户“oracle”,该用户还用于 RDBMS 安装。以下是 oracle 用户的组分配方式:
$ id
uid=600(oracle) gid=502(oinstall) groups=501(dba),502(oinstall),503(gridadmin),504(asmadmin)
对于该组,无需执行任何其他操作。
确定您是否希望一个 unix 用户 ID 能够同时管理数据库和 ASM。出于安全原因,您可能希望选择另一个用户来管理 ASM 实例。尽管同一组人员将同时管理数据库和 ASM,但用户 ID 的区分将允许您区分权限(如果您将来选择这样做)。在这种情况下,只需创建一个新的用户 ID,如“asmdba”,并使其成为“asmadmin”组中的一员。
无论作何决定,您可能都必须对以前通过“connect / as sysdba”管理 ASM 组件的脚本进行修改,将其替换为“/as sysasm”。“/ as sysdba”将不再有效。
如果使用 ASMCMD 命令行管理 ASM 组件,则不必进行更改;但如果您已创建了另一个用户 ID(例如,“asmdba”)作为“asmadmin”组的一部分,请确保通过该用户 ID 调用 ASMCMD。
假设您要尝试用生产环境中的数据刷新开发数据库,并且能够承受生产环境停机。最好的实现方法是什么?最快速的方法是将生产环境中的磁盘挂载到开发服务器上,然后使用直接路径插入之类的方法复制数据。您只需将物理设备挂载到开发服务器上,然后更改 asm_diskstring 参数以包括来自生产环境的新磁盘。例如,假设磁盘为“/dev/sda*”,asm 字符串如下所示:
asm_diskstring = '/dev/sda*'
更改为 /dev/sdb* 后将包括来自生产环境的新的磁盘和磁盘组。但是,可能有一个问题。如果您在开发环境和生产环境中均有一个名为 +DG2 的磁盘组,情况将如何?当您引入生产环境的磁盘时,磁盘组挂载将失败,因为磁盘组 +DG2 已存在。您必须先删除该磁盘组,然后才能读取生产环境的磁盘。如您所见,用于删除磁盘组的选项将意味着丢失开发环境中的所有数据 — 这显然不是一个好主意,多半无法接受。那么,您有什么办法吗?
在第 2 版中,有一个用于重命名磁盘组的新功能。现在您可以更改磁盘组的名称。在上述示例中,您可以在引入生产环境的磁盘之前,将开发环境中的 DG2 磁盘组重命名为 ORIG_DG2。“renamedg”命令可执行此操作。
我们先查看开发环境中的磁盘组。
<SQL> select name from v$asm_diskgroup; NAME ------------------------------ DATA DG2
我们将使用 renamedg 命令重命名 DG2 磁盘组。可通过两个阶段来完成该命令。下面介绍了您如何进行第一阶段。verbose 选项是可选的;但是可以让您看到命令的复杂细节。
oracle@oradba1 ~# renamedg dgname=dg2 newdgname=orig_dg2 verbose=true phase=one
Parsing parameters..
Parameters in effect:
Old DG name : DG2
New DG name : ORIG_DG2
Phases :
Phase 1
Discovery str : (null)
Check : FALSE
Clean : TRUE
Raw only : TRUE
renamedg operation: dgname=dg2 newdgname=orig_dg2 verbose=true phase=one
Executing phase 1
Discovering the group
Performing discovery with string:
Identified disk UFS:/dev/raw/raw5 with disk number:0 and timestamp (32937942 404239360)
Checking for hearbeat...
Re-discovering the group
Performing discovery with string:
Identified disk UFS:/dev/raw/raw5 with disk number:0 and timestamp (32937942 404239360)
Checking if the diskgroup is mounted
Checking disk number:0
Checking if diskgroup is used by CSS
Generating configuration file..
Completed phase 1
Terminating kgfd context 0xb7f07050
然后转到第 2 阶段。
oracle@oradba1 ~# renamedg dgname=dg2 newdgname=orig_dg2 verbose=true phase=two
Parsing parameters..
Parameters in effect:
Old DG name : DG2
New DG name : ORIG_DG2
Phases : Phase 2
Discovery str : (null)
Clean : TRUE
Raw only : TRUE
renamedg operation: dgname=dg2 newdgname=orig_dg2 verbose=true phase=two
Executing phase 2
Looking for /dev/raw/raw5
Modifying the header
Completed phase 2
Terminating kgfd context 0xb7f4c050
此时,如果您查看 ASM 磁盘组,将不会再看到 DG2 磁盘组,而是新增了一个名为 ORIG_DG2 的磁盘组。
SQL> select name from v$asm_diskgroup;
NAME ------------------------------ DATA ORIG_DG2
注意磁盘组的名称已从 DG2 更改为 ORIG_DG2。顺便说下,在上述示例中,我们调用了 renamedg 命令两次。在第 1 阶段中,创建了一个配置文件,在第 2 阶段中,该文件用于实际修改磁盘组名称。但是,不必调用该命令两次。也可以在一个步骤中调用这两个阶段。这样的话,调用将如下所示:
$ renamedg dgname=dg2 newdgname=orig_dg2 verbose=true phase=both
这里可能会出现一个有趣的问题:磁盘组 DG2 上的数据文件 会发生什么变化?它们是否将自动重命名以反映新名称 ORIG_DG2?答案是不。必须使用 ALTER DATABASE RENAME FILE 语句手动重命名数据文件。
假设您有一组计算机都在运行某个应用程序,您想要一个集群 文件系统。请注意关键词 — 集群和文件系统。默认情况下,熟文件系统在在多台服务器间不可见。在集群文件系统中,集群必须确保每次只能由一台服务器写入一个文件;否则每台服务器都可能独立写入到该文件,而不会意识到集群中的其他服务器的存在,这会损坏文件。如果需要一个在集群的所有服务器间均可见的文件系统,您有几种选择:
投资购买一个集群文件系统,这通常成本高昂,适于企业级的集群文件系统成本更高
在 NFS 上挂载文件系统,通常速度较慢
在 11g 第 2 版中,有另外一个选择 — ASM 磁盘组上的文件系统 — ASM 集群文件系统 (ACFS)。由于默认情况下 ASM 支持集群,因此该文件系统也支持集群。而且这是一个熟文件系统,就像 /usr 或 /home,仅集群化。
熟文件系统是基于物理卷构建的。11g 第 2 版允许您创建动态卷,即,以动态方式向底层操作系统显示的卷,它的下面没有真实的设备(即物理设备)。
例如,考虑一个典型的 Linux 系统。使用 mount 命令,您可以了解文件系统及底层设备。
$ mount /dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw) proc on /proc type proc (rw) sysfs on /sys type sysfs (rw) devpts on /dev/pts type devpts (rw,gid=5,mode=620) /dev/sda1 on /boot type ext3 (rw) tmpfs on /dev/shm type tmpfs (rw)
请考虑文件系统 /boot。以上输出清楚地显示,文件系统是在一个类型为 ext3(Linux 中典型的文件系统类型)的设备 /dev/sda1(“s”意味着它可能是一个 SCSI 磁盘)上构建的。如果是 ACFS,那么底层设备不是物理设备;而是由一个特殊软件体系向操作系统显示的设备。这个特殊的软件就是 ASM Dynamic Volume Manager (ADVM)。ADVM 将系统调用转换为底层设备。以下是 ACFS 组件的示意图:

在这里,我们看到一个名为 ACFSDG1 的 ASM 磁盘组,它基于 Disk1、Disk2 和 Disk3 这三个磁盘构建而成这些磁盘是实际物理设备。ASM 卷就是在此磁盘组上创建的。在此示例中,已创建了两个卷:acfsvol1 和 acfsvol2。这些卷作为常规卷显示给操作系统。有了卷之后,将在这些卷上创建和挂载文件系统。在此示例中,已分别在 acfsvol1 和 acfsvol2 上创建了两个文件系统 /acfsdir1 和 /acfsdir2。用户在这些文件系统上创建和访问文件时,ADVM 组件将这些调用转换为实际设备上对应的位置。可以在磁盘组中扩展卷,这也将扩展文件系统。
现在,我们来看一下如何创建这些文件系统。我们将需要从一个卷开始。首先,我们当然必须找到一个具有一些可用空间的磁盘组来创建卷。您可以在同一个磁盘组上创建多个卷。为简便起见,我们从一个新磁盘组开始(注意,无需创建新磁盘组;您可以在有可用空间的现有磁盘组上创建卷)。
SQL> create diskgroup dg1 external redundancy disk '/dev/sdb5','/dev/sdb3'; Diskgroup created.
磁盘组的兼容性至少须为 11.2;因此您必须设置兼容性标志。
SQL> alter diskgroup dg1 set attribute 'compatible.asm' = '11.2.0.0'; Diskgroup altered.
SQL> alter diskgroup dg1 set attribute 'compatible.rdbms' = '11.2.0.0' Diskgroup altered.
SQL> alter diskgroup dg1 set attribute 'compatible.advm' = '11.2.0.0'; Diskgroup altered.
SQL> alter diskgroup dg1 add volume acfsvol1 size 256M; Diskgroup altered.
创建完卷之后,您可以查看磁盘组 DG1 中是否存在卷,如下所示:
select v.volume_device, v.volume_name from v$asm_volume v, v$asm_diskgroup g where v.group_number = g.group_number and g.name = 'DG1' / VOLUME_DEVICE VOLUME_NAM ------------------------- ---------- /dev/asm/acfsvol1-106 ACFSVOL1
成功创建卷之后,使用 Linux 中常用的 mkfs 命令准备文件系统。此命令不是特定于 Oracle 的;它是一个通用 Linux 命令。唯一特殊的地方是“-t”选项,用于将文件系统指定为 ACFS 类型。
[oracle@oradba2 ~]$ /sbin/mkfs -t acfs /dev/asm/acfsvol1-106 mkfs.acfs: version = 11.2.0.1.0.0 mkfs.acfs: on-disk version = 39.0 mkfs.acfs: volume = /dev/asm/acfsvol1-106 mkfs.acfs: volume size = 268435456 mkfs.acfs: Format complete.
现在,我们可以创建文件系统了。假设您要在此卷上创建文件系统 /home/oracle/acfsdir1,需要先创建目录:
[oracle@oradba2 ~]$ mkdir -p /home/oracle/acfsdir1
然后,您将使用通用 Linux 命令“mount”将新创建的卷挂载在此文件系统上。必须由 root 用户发出此命令。
[root@oradba2 ~]# mount -t acfs /dev/asm/acfsvol1-106 /home/oracle/acfsdir1
要确认实际上已创建了文件系统,可以使用“mount”命令:
[oracle@oradba2 ~]$ mount /dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw) proc on /proc type proc (rw) sysfs on /sys type sysfs (rw) devpts on /dev/pts type devpts (rw,gid=5,mode=620) /dev/sda1 on /boot type ext3 (rw) tmpfs on /dev/shm type tmpfs (rw) none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw) sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw) /dev/asm/acfsvol1-273 on /acfsdir1 type acfs (rw) /dev/asm/acfsvol2a-273 on /acfsdir2 type acfs (rw) /dev/asm/acfsvol1-106 on /home/oracle/acfsdir1 type acfs (rw)
此文件系统即可用于常规文件。我们先在该文件系统上创建一个简单的文件来测试其是否能正常工作。
[oracle@oradba2 acfsdir1]$ echo "Original File" > myfile.txt
检查该文件是否存在:
[oracle@oradba2 acfsdir1]$ ls -l total 68 drwx------ 2 root root 65536 May 29 23:04 lost+found -rw-r--r-- 1 oracle oinstall 127 May 30 22:15 myfile.txt
系统下次重新启动时,将不会自动挂载该文件系统。要自动挂载该文件系统,必须向 Oracle Grid Infrastucture 体系注册此挂载点。
[oracle@oradba2 ~]$ /sbin/acfsutil registry -a /dev/asm/acfsvol1-106 /home/oracle/acfsdir1
acfsutil registry: mount point /home/oracle/acfsdir1 successfully added to Oracle Registry
还可使用 ASMCMD 命令行选项来管理 ASM 卷和文件系统。下面是一些示例:
创建一个名为 ACFDVOL2 的 256MB 的卷:
ASMCMD [+] > volcreate -G dg1 -s 256M acfdvol2
查看该卷上的信息:
ASMCMD [+] > volinfo –a Diskgroup Name: DG1 Volume Name: ACFDVOL2 Volume Device: /dev/asm/acfdvol2-106 State: ENABLED Size (MB): 256 Resize Unit (MB): 256 Redundancy: UNPROT Stripe Columns: 4 Stripe Width (K): 128 Usage: Mountpath: Volume Name: ACFSVOL1 Volume Device: /dev/asm/acfsvol1-106 State: ENABLED Size (MB): 256 Resize Unit (MB): 256 Redundancy: UNPROT Stripe Columns: 4 Stripe Width (K): 128 Usage: ACFS Mountpath: /home/oracle/acfsdir1
volstat 是一个非常重要的命令,它显示卷的性能统计信息。对于特定的磁盘组,该命令会显示所有卷及统计信息,如调用读/写的方式、已写入/读取的字节数、每种类型的操作中所花费的时间以及遇到的错误数量。
ASMCMD [+] > volstat -G dg1 DISKGROUP NUMBER / NAME: 2 / DG1 --------------------------------------- VOLUME_NAME READS BYTES_READ READ_TIME READ_ERRS WRITES BYTES_WRITTEN WRITE_TIME WRITE_ERRS ---------------------------------------------------------------------------------------------------------------------------- ACFDVOL2 0 0 0 0 0 0 0 0 ACFSVOL1 150 205824 284 0 454 1611776 649 0
ASMCMD 中提供了一些与卷管理相关的命令。我要向您演示的是最常用的命令,而非所有命令。其他命令,请参阅手册。以下是这些命令的摘要
volcreate | 创建卷 |
voldelete | 删除卷 |
voldisable | 禁用卷组 |
volenable | 启用卷 |
volinfo | 获取有关卷以及挂载该卷的文件系统的信息。 |
volresize | 更改卷的大小 |
volset | 设置卷的使用属性,实际未由 ADVM 使用;但以后可能对管理员有帮助。 |
volstat | 有关卷的统计信息,例如,输入/输出比率 |
ACFS 一个很有用的特性是“快照”特性。它创建指针,指向 ACFS 文件系统上的文件。文件发生更改时,会将更改的块复制到快照。这就允许对文件进行像“撤销表空间”这样的操作。使用这些块可自特定时间起重新创建文件。下面显示了如何在 /home/oracle/acfsdir1 目录中创建一个名为“backup1”的快照。
[oracle@oradba2 acfsdir1]$ /sbin/acfsutil snap create backup1 /home/oracle/acfsdir1 acfsutil snap create: Snapshot operation is complete.
如果您在创建快照之后检查目录,特别是在名为“ACFS”的隐藏目录中,您将看到一个名为“backup1”的目录位于目录结构深处。这就是存储更改块的位置。
[oracle@oradba2 acfsdir1]$ pwd /home/oracle/acfsdir1 [oracle@oradba2 acfsdir1]$ cd .ACFS [oracle@oradba2 .ACFS]$ ls repl snaps [oracle@oradba2 .ACFS]$ cd snaps [oracle@oradba2 snaps]$ ls backup1
我们来看看您在文件系统 acfsdir1 上删除某个文件时所发生的情况。切记,文件系统上有快照。
[oracle@oradba2 acfsdir1] rm myfile.txt
现在,如果您查看“backup1”目录:
[oracle@oradba2 snaps]$ cd backup1 [oracle@oradba2 backup1]$ ls lost+found myfile.txt [oracle@oradba2 backup1]$ cat myfile.txt This is a file
文件仍可用,如果需要的话,可从该位置恢复。以下是有关快照的一些要点:
快照在同一文件系统上创建。因此,不需要其他的专门位置。
快照不会占据任何空间。文件发生更改时,仅将更改的块存储在快照中。当然,在完全删除文件时,将存储所有块。
快照允许“一致”备份,即,自特定时间起的备份。因此,如果文件不断更改,您可以创建一个快照,比如说,名称为“snap1”,它将包含指向自该时间以来的所有文件的指针。
您是否注意到有关 ACFS 的一些有趣事实?我们来看看其中一些:
文件系统为 /home/oracle/acfsdir1,它挂载在不同于“/”的挂载点上;对于 ACFS,是否位于“/”结构上并不重要。
文件系统创建 (mkfs) 命令由“oracle”用户(而非 root 用户)发出。这至关重要,因为 ACFS 也可以由非 root 用户管理。
mount 命令是唯一需要 root 权限的命令。
挂载点 /acfsdir1 没有放在 /etc/fstab 文件中,与其他典型挂载点不同。为什么?因为这个挂载点是由 Grid Infrastructure 体系自动放置的(如果已注册)。
这些使得 ACFS 很特殊。不仅易于管理,而且您无需任何其他软件即可获得集群文件系统。此文件系统继承了 ASM 磁盘组的优势 — 性能和可伸缩性。您可以向底层磁盘组添加磁盘,从而为联机文件系统的扩展腾出更多空间。
何种情况下可以使用此功能?下面是一些示例用法:
您需要一个集群文件系统来存储供 RAC 集群中任何节点访问的图像文件。
您需要为中间件工具的跟踪文件和日志文件设置一个通用位置。在这种情况下,甚至不需要数据库,只要 Grid Infrastructure 就够了。
您不想投资于介质管理库以使 RMAN 从 ASM 磁盘组读取文件。在这种情况下,只需为所有备份和存档日志位置创建一个公共 ACFS 文件系统,并使用正常磁盘命令从这些文件系统中读取。
您有一个 RAC 数据库用于数据仓库,您希望为 ETL 作业的数据文件创建一个通用位置。
可能性是无限的,只要您想象得到。就可用性指数而言,此特性分数为 10。
ASM 是一个卷管理器;但它也可存储与数据库相关的文件:数据文件、存档日志、控制文件、备份文件和导出转储。当然,使用 ACFS(先前已说明),您可以存储更多类型的文件;但是现在,让我们仅关注 ASM 中存储的文件。允许哪些人访问这些文件?这些文件由用户“oracle”或者服务器上 Oracle 软件的任何所有者拥有。如果您希望提供一个类似于 unix 用户+组+其他权限的细粒度访问控制,那该怎么办?在之前版本中,这是不可能的。
在 11g 第 2 版中,创建细粒度访问结构是非常有可能的。我们通过一个示例来了解具体创建过程。
假定您有两个 unix 用户 — appuser1 和 appuser2,他们应对磁盘组 ORIG_DG2 具有某些特定类型的权限。首先,我们来创建操作系统用户和组:
[root@oradba1 ~]# groupadd appgroup1 [root@oradba1 ~]# groupadd appgroup2 [root@oradba1 ~]# useradd appuser1 [root@oradba1 ~]# useradd appuser2 [root@oradba1 ~]# usermod -G appgroup1 appuser1 [root@oradba1 ~]# usermod -G appgroup2 appuser2 [root@oradba1 ~]# passwd appuser1
Changing password for user appuser1.
New UNIX password:
BAD PASSWORD: it is based on a dictionary word
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
[root@oradba1 ~]# passwd appuser2
Changing password for user appuser2.
New UNIX password:
BAD PASSWORD: it is based on a dictionary word
Retype new UNIX password:
passwd: all authentication tokens updated successfully
既然 unix 级别用户创建已完成,我们来为此访问控制准备磁盘组 ORIG_DG2:
alter diskgroup ORIG_DG2 set attribute 'ACCESS_CONTROL.ENABLED' = 'TRUE’ /
现在可以将之前创建的 Unix 用户置于访问控制下。为此,我们必须为该磁盘组注册用户。可以使用 ASMCMD 命令行工具执行该操作。
ASMCMD> mkusr orig_dg2 appuser1 ASMCMD> mkusr orig_dg2 appuser2
可以确认已创建了这些用户:
ASMCMD> lsusr DG_Name User_Num OS_ID OS_Name ORIG_DG2 1 502 appuser1 ORIG_DG2 2 503 appuser2
如果您仔细留意便会发现,以上显示的用户编号与 Unix 用户编号相同。
现在,为这些用户创建组,再次位于磁盘组的范围中。
ASMCMD> mkgrp orig_dg2 appgroup1 appuser1 ASMCMD> mkgrp orig_dg2 appgroup2 appuser2
确认已创建组:
ASMCMD> lsgrp DG_Name Grp_Name Owner ORIG_DG2 appgroup1 oracle ORIG_DG2 appgroup2 oracle
正确设置了用户及其组之后,现在可以关注如何更改文件的权限级别了。我们以一个文件为例 — ORIG_DG2/D112D1/DATAFILE/TS2.256.720399549,将其设置为 640(用户可进行读写,组可进行读,其他用户无权限):
ASMCMD [+] > chmod 640 +ORIG_DG2/D112D1/DATAFILE/TS2.256.720399549
使用带有 --permission 选项的 ls 命令确认许可权已正确更改(注意,在“permission”之前有两个短横线):
ASMCMD [+] > ls --permission +ORIG_DG2/D112D1/DATAFILE/TS2.256.720399549 User Group Permission Name appuser1 appgroup1 rw-r----- TS2.256.720399549
现在,此文件将由属于 appgroup1 的 appuser1“拥有”。appgroup1 的其他用户可以读取此文件;但无法对其进行修改。使用此命令,您可以为文件建立细粒度访问控制。
假设您要为某个磁盘组下的所有文件设置特定权限级别,并且您不希望每次授予权限更改命令 chmod。可以使用一个名为“mask”的磁盘组属性来执行此操作:
alter diskgroup DG1 set attribute 'ACCESS_CONTROL.UMASK' = '026' /
这类似于 Unix,并且在案例定位中是相似的:第一个位置是针对所有者,第二个位置是针对组,第三个位置是针对其他用户。但是请注意,与 Unix 不同的是,这是一个 mask;而非 permission 设置。因此,会从 6 中减去数字以达到结果权限。掩码中的数字 4、2 和 0 分别意味着读、写和无权限。因此,如果您使用“0”,它意味着您希望 6 - 0 = 6,即,该位置的读和写。类似的,4 意味着 6 – 4 = 2,即,读。因此掩码中的 026 意味着该磁盘组中创建的文件对所有者具有完整权限,对组具有写 (6-2=4) 权限,对其他用户无权限 (6-6=0)。
熟悉磁盘技术的人都知道,数据传输时间会根据磁盘的位置而有所不同,磁盘外围速度最快,到磁盘中心便会逐渐降低速度。自然,了解了这一点,您可能希望以智能方式放置文件。访问最多的表空间将因放在磁盘边缘或边缘附近而受益,而使用最少的(或者对 I/O 不怎么敏感的文件,如存档日志)可以放在磁盘中心附近。
如何完成该任务呢?如果您有复杂的 SAN,您可以在这些特定磁盘位置上创建 LUN,并使用这些 LUN 来创建磁盘组。如果您具有 JBOD,该怎么办 — 是否仍可使用 LUN?而且,这可能不是一次性活动;文件可能更改行为,从而使其被更多或更少地访问。因此,您必须随着时间的推移进行某些调整。
在 11g 第 2 版中,可以使用磁盘组的一个新属性来执行该操作,这个新属性允许两个值:“hot”和“cold”。前一个值将数据放在边缘附近,而后一个值将数据放在靠近中心的位置。这通过模板来完成。我们来为这些访问最多的文件定义一个模板 — hot_files。
alter diskgroup dg1 add template hot_files attributes (hot) /
Diskgroup altered.
一旦创建了模板,即可使用该模板创建使用该模板的数据文件:
create tablespace hot_ts datafile '+DATA(hot_files)/hot_ts_01.dbf' size 1M /
请注意 (hot_files) 子句,该子句让 ASM 知道此文件应具有 hot 属性,并且应被放在尽可能靠近磁盘边缘的位置。
如果数据文件已存在,情况会怎样?您仍可通过发出以下 SQL 将文件移到热点区域:
SQL> alter diskgroup data 2 modify file '+data/D112D1/datafile/ABCD_DATA.272.697114011' 3 attributes (hot) 4 /
Diskgroup altered.
此操作实际上不会将文件移到热点区域。它只是标记了一个事实:该文件的新区应进入热点区域。在再平衡操作期间,现有区将被重新定位到热点区域。如果您希望现有区立即进入热点区域,那会怎样?在此情况下,可通过执行以下语句来强制手动再平衡:
SQL> alter diskgroup data rebalance power 11;
Diskgroup altered.
请牢记一点,手动再平衡可能会花费很长时间,具体取决于将需要进行再平衡的数据量。尽管这是一个联机操作,但是再平衡将占用 CPU 周期并将导致对系统操作造成一定程度的压力。在先前的示例中,我们使用了占用完整 CPU 周期的 power 11;如果您要限制 CPU 使用(由此会延长完成时间),您可以使用更小的 power 数字。
Oracle Database 10g 第 2 版包括一个名为 ASMCMD 的新工具,用于通过命令(而非 SQL)来管理 ASM 实例。对于不熟悉 SQL 语言的系统管理员群体,这尤为受欢迎。即便对于熟悉 SQL 界面的人来说,该命令行界面也简化了工具和脚本的构建。在之后的 Oracle 版本中,该工具添加了越来越多的功能。
在 11g 第 2 版中,已添加了更多功能使 ASMCMD 完整。某些功能在前面中已进行了说明,例如,与命令相关的卷管理,如 volstat 和 volcreate。我们来看看另外一些添加的特性:
模板管理
现在有几个命令可用于管理模板,使用这些命令无需依赖 SQL。新命令 mktmpl 允许您创建一个经过稀疏条带化且经过镜像的名为 hot_coarse_mirr 的模板。
ASMCMD> mktmpl -G data --striping coarse --redundancy mirror --primary hot hot_coarse_mirr
要了解某个特定模板,请使用 lstmpl 命令:
ASMCMD> lstmpl -l hot_coarse_mirr Group_Name Group_Num Name Stripe Sys Redund PriReg MirrReg DATA 1 HOT_COARSE_MIRR COARSE N MIRROR HOT COLD
如果要更改某个模板的属性,请使用 chtmpl 命令:
ASMCMD> chtmpl -G data --striping fine hot_coarse_mirr
最后,要删除模板,请使用 rmtmpl 命令:
ASMCMD> rmtmpl -G data hot_coarse_mirr
命令 lsattr 的功能很强大。可以使用此命令了解磁盘组的属性:
ASMCMD> lsattr -l -G orig_dg2 Name Value access_control.enabled true access_control.umask 066 au_size 1048576 cell.smart_scan_capable FALSE compatible.asm 11.2.0.0.0 compatible.rdbms 11.2 disk_repair_time 3.6h sector_size 512
但最有用的可能是 iostat 命令。可以使用该命令显示有关磁盘组的 I/O 特征的一些重要指标,如读/写速率。
ASMCMD> iostat --region -t -G orig_dg2 5
Group_Name Dsk_Name Reads Writes Cold_Reads Cold_Writes Hot_Reads Hot_Writes Read_Time Write_Time
ORIG_DG2 DG2_0000 290816 35979264 65536 11558912 0 0 .815435 40.712632
Group_Name Dsk_Name Reads Writes Cold_Reads Cold_Writes Hot_Reads Hot_Writes Read_Time Write_Time
ORIG_DG2 DG2_0000 0.00 819.20 65536 11558912 0 0 0.00 0.00
… output truncated …
您是否注意到了 Cold_Reads 和 Hot_Reads 列?这两列对于数据的 ASM 布置特别有用。如果您在一个磁盘组上创建了两个文件 — 一个是热门文件,另一个是冷门文件,您将如何知道这两种类型的读/写速率如何?有关磁盘组的全面统计信息帮助不大。要了解每种文件类型(hot 或 cold)的速率,可使用 iostat。这极大地帮助您确定文件的热门和冷门布置是否与您期望的一致。
我已演示了几个很有用的命令的示例。还有更多的命令可用于管理 ASM 实例、磁盘组等等。这些附加的命令使 ASMCMD 对于 ASM 基础架构的管理而言相当完整。
如何创建和管理 ASM 实例及其他组件?ASMCMD 是一种选择。Oracle Enterprise Manager(独立版或者 Grid Control)是另外一种选择。在这一版本的 Oracle 中,还有另一种工具:ASMCA (ASM Configuration Assistant)。它使您可以在一个 GUI 前端中创建 ASM 实例并对其进行管理。可以通过发出命令 asmca 来调用该工具。以下是初始屏幕。
第一个选项卡显示磁盘组信息,后续选项卡显示卷(如果已定义)以及这些卷上的 ACFS 文件系统(如果已定义)。本文之前的部分中对卷和 ACFS 均已进行了说明。

如果您右键单击磁盘名称,将获得一个弹出式菜单,其中包含其他活动,如添加磁盘和管理模板,如图中所示。要添加模板,单击 Manage Templates 并在下一个屏幕中输入有关模板的信息,如下所示。

在这里,我已经创建了一个名为 HOT_UNPROT_COARSE 的模板(名称在域中部分隐藏),使镜像处于未保护状态,稀疏条带化并且将 HOT 作为区位置。单击 Save 保存此模板。
如本文前面所示,ASM 配置还可用于创建卷和 ACFS 挂载点(而不必使用 ASMCMD 或 SQL 方法)。ASMCA 的 GUI 界面使此过程更具直观性。为节省空间,未显示屏幕截图。
返回系列目录