11g 徽标

Oracle Database 11g
面向 DBA 和开发人员的重要特性

作者:Arup Nanda Oracle ACE 总监

自动存储管理

用于管理 ASM 实例的新的 SYSASM 角色、用于降低共享池使用的可变的区大小,以及实例能够读取磁盘组的特定磁盘,这些都是 Oracle Database 11g ASM 中引入的一些重要新特性。

参见系列目录

SYSASM 角色

自动存储管理 (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>

注意连接子句“as sysasm”。在 Oracle Database 11g 第 1 版中,该 SYSASM 角色被授予具有 SYSDBA 权限的操作系统组(大多数情况下为“dba”)。换言之,Unix 中属于 dba 组的用户也可以作为 SYSASM 进行连接。(今后的版本会更改这种安排;sysdba 和 sysasm 角色将分成不同的 OS 组。)


以 sys 用户身份连接到 ASM 实例后,您可以更新在口令文件中更新的 SYS 口令:

SQL> alter user sys identified by oracle
  2  /
 
User altered.

尽管这个 ASM 实例不带数据库,您仍然可以创建用户:

SQL> create user asmoper identified by dumboper
  2  /
 
User created.

现在,您可以将 SYSASM 角色授予该用户:

SQL> grant sysasm to asmoper;
 
Grant succeeded.

进行授权之后,asmoper 用户(而非 SYS 用户)可以执行所有 ASM 管理功能。该用户可以通过子句 as sysasm 进行连接,该子句类似于常规数据库中的“as sysdba”子句。

$ sqlplus asmoper/dumboper as sysasm

这个特性实现了迫切需要的 ASM 和 DBA 职责分离。

 
可变的区大小

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 大小

正如我在前面提到的,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'

AU_SIZE 应为 1M、2M、4M、8M、16M、32M 或 64M(M 代表 MB)。您还可以将该值设成一个绝对值(单位为字节):

attribute 'au_size' = ' 2097152'

创建磁盘组之后,您可以通过以下查询来查看 AU 大小:

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

注意各个磁盘组名称的 AU 大小。现在,您可以创建具有合适 AU 大小的磁盘组,以满足每个应用程序的需要。

磁盘组属性

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

如您所见,ASM 兼容性(由 COMPATIBILITY 显示)设置为 10.1.0.0.0,这意味着该磁盘组最高可支持 10.1 ASM 结构。因此,该磁盘组可以具有任意 RDBMS 结构。另一列 DATABASE_COMPATIBILITY 显示 RDBMS 兼容性设置为 10.1。这意味着,ASM 磁盘组 DG1 可用于 10.1 版的任何 RDBMS。


由于您只希望创建 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

ASM 兼容性设置为 11.1;但 RDBMS 兼容性仍然设置为 10.1。要将它也更改为 11.1,请使用:

SQL> alter diskgroup dg1 set attribute 'compatible.rdbms'='11.1';

需要特别注意的是:兼容性是针对磁盘组设置的,而不是针对整个 ASM 实例。使用该特性,您只需使用一个 ASM 实例即可满足所有数据库版本类型的需要。根据所使用的版本,您可以相应地设置属性,从而减少版本间通信。

首选的镜像读取

在 Oracle RAC 数据库中,多个节点可能指向同一个 ASM 实例。如果您在一个 ASM 磁盘组中使用正常镜像,访问磁盘的行为可能并不像您预想的那样。

假设您有一个名为 DG2 的磁盘组,它包含两个 failgroup(DG2_0000 和 DG2_0001),每个具有一个单独的磁盘,如下图所示:

 



向磁盘组 DG2 写入某些内容时,会以循环方式写入区中:第一个进入 DG2_0000,副本进入 DG2_0001,第二个进入 DG2_0001,副本在 DG2_0000 上,第三个进入 DG2_0000,副本在 DG2_0001 上,依此类推。ASM 以这种方式在一个磁盘上维护另一个磁盘的备份。


但是在读取这些区时,始终从主 failgroup(在本例中为 DG2_0000)中读取,而不是从辅助 failgroup (DG2_0001) 中读取。仅当主 failgroup 不可用时才读取辅助 failgroup。

这在大多数情况下可以正常工作,但有时可能不是所希望的。在 Oracle Database 11g 中,您可以将一个节点配置为从特定 failgroup 中读取。例如,在上面的示例中,如果您希望将实例 1 配置为从 failgroup DG2_0000 中读取,将实例 2 配置为从 DG2_0001 中读取,您可以设置这些磁盘组的首选读取组。在实例 1 中执行的以下命令导致磁盘组 DG2 和 DG3 中的 failgroup DG2_0000 和 DG3_0000 分别是实例 1 上的首选磁盘:

SQL> alter system set asm_preferred_read_failure_groups = 'DG2.DG2_0000','DG3.DG3_0000'

同样,在另一个实例上,您可以执行以下命令使其他 failgroup 成为首选磁盘:

SQL> alter system set asm_preferred_read_failure_groups = 'DG2.DG2_0001','DG3.DG3_0001'        

执行这些语句后,当来自实例 1 的某个会话希望从磁盘组 DG2 中读取时,将读取磁盘 DG2_0000。如果该磁盘不可用,则读取另一个磁盘 DG2_0001。同样,当某个连接到实例 2 的会话读取数据时,将读取磁盘 DG2_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

该输出显示了实例 PRONE31 和 PRONE32 的首选 failgroup 分别为 DG2_0000 和 DG2_0001。注意 WRITES 列;它们在 910 处相同。这是因为统一写入到两个磁盘中。现在,注意 READS 列。针对实例 PRONE31 和 PRONE32 分别为 4450 和 2256。为什么?因为实例 PRONE3 发出多次读取命令,这些读取均来自于其首选 failgroup DG2_0000。对于磁盘组 DG3,实例 PRONE32 发出多次来自于其首选 failgroup (DG3_0001) 的读取命令,因此该磁盘显示更多读取。


首选读取在“拉伸”集群(节点之间地理距离较远的集群)中尤为有用。首选读取通过将读取隔离到特定磁盘,加快了读取速度。

Drop Diskgroup Force

当一个磁盘不再可用时(损坏到无法修复的程度)会发生什么?您希望完全删除该磁盘组然后重新创建,或者将该磁盘组的磁盘添加到其他磁盘组。该磁盘组尚未挂载。由于其中一个磁盘缺少,您甚至无法挂载它。要删除该磁盘组,您必须挂载它,但由于缺少磁盘,您无法进行挂载 — 绝对是一个“无法摆脱的困境”。您应该做些什么?

在 Oracle Database 10g 中,您可以使用一种变通方法 — 使用 dd 命令擦除磁盘头:

$ dd if=/dev/zero of=/dev/raw/raw13 bs=1024 count=4

这将在磁盘 /dev/raw/raw13 的头中放入零,擦除所有信息。如果该方法生效,它将完全擦除磁盘头的信息,并删除用作磁盘组一部分的磁盘。


在 Oracle Database 11g 中,您不必求助于该变通方法。您只需执行带 force 选项的 drop 命令:

SQL> drop diskgroup dg7 force including contents;

使用该命令,即使没有挂载磁盘,也可以删除磁盘组。可用的磁盘显示为 FORMER;即,它们用作某个磁盘组的一部分。(注意:您必须使用“including contents”子句。)

 

元数据备份和恢复

许多人将 ASM 看作一个具有自己的存储的数据库。事实并非如此,ASM 并不存储数据,而是由数据库进行存储。但 ASM 实例需要维护磁盘组名称、其中的磁盘、目录等元数据。这些元数据存储在磁盘头中。

假设所有磁盘都损坏且头信息消失,您该怎么办?当然,您已经使用 RMAN 对数据库进行了备份,因此可以恢复。但您只有在创建了所有磁盘组和目录后才能进行恢复。希望您保留了所有记录。(对吗?)即使您进行了备份,这个过程也需要时间。

如果您进行了备份,该怎么办呢?在 Oracle Database 11g 中,您可以使用 md_backup 命令通过 ASM 命令行选项 (ASMCMD) 备份 ASM 实例的元数据。

$ asmcmd -p

ASMCMD [+] > md_backup

该命令将创建一个名为 ambr_backup_intermediate_file 的文件。以下是该文件从顶部开始的一部分:

@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 ...

它记录了所有磁盘组、磁盘、目录、磁盘属性,等等。默认情况下,该文件会记录所有磁盘组。如果您希望仅备份特定磁盘组,可以使用 -g 选项。此外,您还可以使用 -b 选项创建特定的命名文件。

ASMCMD [+] > md_backup -g dg1 -b prolin3_asm.backup

这会将磁盘组 DG1 的元数据备份到一个名为 prolin3_asm.backup 的文件,而不是默认的 ambr_backup_intermediate_file。该文件必须是新建的,如果在生成前该文件已存在,您必须删除它。


现在,让我们看看恢复操作是如何工作的。恢复有不同的类型。最简单的用法是恢复一个以前删除的磁盘组及其目录。首选,在磁盘组上创建一个目录:

ASMCMD [+] > cd DG7
ASMCMD [+DG7] > mkdir TEST
ASMCMD [+DG7] > ls
TEST/

该磁盘组有一个名为 TEST 的目录。现在,备份该磁盘组:

ASMCMD [+] > md_backup -g dg7 -b g7.backup

备份之后,假设您删除该磁盘组来模拟一次意外删除:

SQL> drop diskgroup dg7;     
 
Diskgroup dropped.

现在,磁盘组 DG7 已从 ASM 实例删除,您希望使用以前的备份恢复它。可以使用 md_restore 命令恢复它:

$ 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!

看看输出;它创建了该磁盘组以及模板和目录。如果以前有任何数据,当然,这些数据将丢失。md_backup 不是数据的备份,而是 ASM 实例元数据的备份。表面上,数据是由 RMAN 备份的。创建磁盘组和所有目录之后,您可以将 RMAN 备份恢复到该磁盘组。


另一个选项 -f 使您可以将命令放在一个脚本文件中,而不是执行这些命令:

ASMCMD [+] > md_restore -b dg7.backup -t full -f cr_dg7.sql

它会创建一个名为 cr_dg7.sql 的 SQL 脚本,该脚本用于创建磁盘组以及所有其他对象。您可以在 ASM 实例中手动运行该脚本。该文件如下所示:

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 用户对传统卷管理器最大的抱怨之一是其通过命令行进行诸多检查的能力。ASM 命令行选项 (ASMCMD) 在很大程度上弥补了这个空白。在 Oracle Database 11g 中,ASMCMD 提示符中的一些其他命令可以使 ASM 实例的管理变得极其简单。示例之一就是您在前面看到的元数据备份。另一点值得关注的是用于检查实例管理的磁盘的命令。该命令为 lsdsk

ASMCMD> lsdsk
Path
/dev/raw/raw10
/dev/raw/raw11
/dev/raw/raw13
... snipped ...

没有任何标志,该命令仅列出实例所有可用的磁盘。有几个可以对输出进行修改的标志。最常用的是 -k,如下所示:

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 ...

另一个标志 -s 显示了磁盘与 I/O 有关的各种统计信息:

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

要快速检查磁盘的状态,使用 -p 标志:

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

最后,-t 标志显示与修复相关的信息(将在本文后面进行介绍):

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 选项提取了 ASM 实例中各个 V$ 视图的值。但元数据存储在磁盘中。如果实例不可用,应该有一种方法可以从磁盘中提取这些信息。在 Oracle Database 11g 中,lsdsk 命令有一个标志“I”(大写的“I”,不是小写的“L”),它可以提取磁盘头(而非 V$ 视图)的信息。以下是 -k 标志从磁盘头提取信息的一个示例。

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

要列出特定磁盘组(例如,DG1)中的磁盘,您可以使用 -d 标志,如下所示:

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

该命令仅显示与该模式匹配的磁盘。最后,无需记住这些选项;help 命令可以显示所有选项:

ASMCMD> help lsdsk
        lsdsk [-ksptcgHI] [-d <diskgroup_name>] [pattern]

lsdsk 命令为 ASM 领域提供了更高级的卷管理(类似于功能)。

 

受限制的挂载

假设您向某个磁盘组添加了一个磁盘。ASM 会立即启动重新平衡操作。该操作联机进行,因此 ASM 必须通过一个复杂的锁定系统与块访问和更改的 RDBMS 实例协调。在 RAC 数据库中,该过程很棘手,因为不仅要在数据库中管理锁定,还要跨多个实例管理锁定。

如果将磁盘添加到一个现在无人使用的磁盘组,将会怎样呢?如果 ASM 可以通过某种方式了解到该情况,它可以消除锁定机制,从而加快该过程。

在 Oracle Database 11g 中,一种新的磁盘组挂载方式使得这一切得以实现。可以使用 RESTRICT 子句挂载磁盘组,如下所示:

alter diskgroup dg7 mount restricted;

以这种方式挂载磁盘组之后,ASM 实例可以知道底层磁盘上操作的互斥性,从而可以将锁定机制的影响降至最小。这反过来又会影响磁盘操作,例如,可以加快重新平衡的速度。


快速故障修复

考虑一个具有两个 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 有两个磁盘 DISK1 和 DISK2,DISK2 上的几个块突然损坏了。由于修复时间为两小时,因此 ASM 实例不会立即删除该磁盘,而是等待。如果您修复了 DISK2 上的问题并再次将其联机,这些故障磁盘将通过其余磁盘进行修复。


我们来看一个示例。假设磁盘组 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/

您也可以使用 du 命令进行确认:

ASMCMD [+dg2] > du  
Used_MB      Mirror_used_MB
     11                  22

du 命令将确认该磁盘组有 22MB,但只有 11MB 有用。现在,检查磁盘组 dg2 的磁盘:

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

这将使磁盘组中的一个磁盘损坏。现在,使用新命令 ALTER DISKGROUP ...CHECK 对磁盘组进行检查。
SQL> alter diskgroup dg2 check

如果您检查 ASM 实例的警报日志,除其他几行外,您还会注意到以下内容:

...
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)
...

最后一行说明了一切。刚刚损坏的磁盘将在 7200 秒内从磁盘组中删除,这符合您之前在修复计时器中设置的两个小时。删除时,该消息将在警报日志中重复显示:

...
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

这将在 1 分钟后删除 failgroup dg2_0000,从而允许您以物理方式将其取出或者将其他磁盘移到磁盘组中。强制删除磁盘:

SQL> alter diskgroup dg2 drop disks in failgroup dg2_0001 force;

磁盘故障解决后,您可以通过执行以下命令来启动快速修复:

SQL> alter diskgroup dg2 online disks in failgroup dg2_0001;

这将启动将 failgroup DG2_0001 磁盘上损坏和更改的块与其他磁盘组同步的过程。由于只复制几个块而非整个磁盘,这将大大减少发生小故障后同步磁盘所需的时间。

第 2 版中消失的原始设备选项

回到到 ASM 之前的日子,我们常常在很老的文件系统上创建数据库文件(即“熟”文件)。尽管它提供了足够的灵活性(用户可以对文件进行移动、调整大小、重命名以及众多其他操作),但并非性能最佳。相比之下,原始设备(又称作原始文件)通过消除文件系统缓存和同步 I/O 这两大主要性能杀手可提供足够的性能。但是,原始设备缺少熟文件的灵活性。

ASM 本质上是一个专为 Oracle Database 设计的卷管理器,为我们提供了一个两全其美之计:文件的灵活性和原始设备的性能。然而,某些人继续创建原始文件,因为这些原始文件具备一些优点,比如,通过 dd 之类的命令直接访问数据库文件,有些时候这对于备份很有用。

在 Oracle Database 11g 第 2 版中,原始设备选项完全消失;您无法再通过原始设备来创建数据文件,而是必须使用熟文件或 ASM 文件。在那些仍使用 dd 命令作为备份方法的地方,这可能会导致一定的惊慌。如果您面临这种情况,应立即转换到 Oracle RMAN。对于 Oracle 数据库备份,没有比 RMAN 更好的方法,并且没有理由不使用 RMAN - 无论是对于熟文件系统、ASM 磁盘组,还是与此有关的原始设备。

ASM 已经发展成为非常具有革命性的组件:ASM 设备上的熟文件系统。是的,您没有看错, 文件系统。而且,由于 ASM 可识别集群,因此文件系统也将集群化。在本文后面的部分中,您将详细了解这一令人激动的新特性。

CRS 和 ASM 主目录相同(仅限第 2 版)

在先前的版本中,至少有两个不同的主目录:用于集群件和数据库。数据库主目录包含可执行文件和 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 分离可解决所有这些新要求。

将 SYSDBA 替换为 SYSASM(仅限第 2 版)

继续以上讨论,您现在意识到 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。

重命名磁盘组(仅限第 2 版)

假设您要尝试用生产环境中的数据刷新开发数据库,并且能够承受生产环境停机。最好的实现方法是什么?最快速的方法是将生产环境中的磁盘挂载到开发服务器上,然后使用直接路径插入之类的方法复制数据。您只需将物理设备挂载到开发服务器上,然后更改 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 语句手动重命名数据文件。

ASM 文件系统和 ASM Dynamic Volume Manager(仅限第 2 版)

 

假设您有一组计算机都在运行某个应用程序,您想要一个集群 文件系统。请注意关键词 — 集群和文件系统。默认情况下,熟文件系统在在多台服务器间不可见。在集群文件系统中,集群必须确保每次只能由一台服务器写入一个文件;否则每台服务器都可能独立写入到该文件,而不会意识到集群中的其他服务器的存在,这会损坏文件。如果需要一个在集群的所有服务器间均可见的文件系统,您有几种选择:

  • 投资购买一个集群文件系统,这通常成本高昂,适于企业级的集群文件系统成本更高

  • 在 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 组件的示意图:

nanda-asm11gr2-f1

 

在这里,我们看到一个名为 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.                      

现在添加卷。在此示例中,我们将创建一个名为 ACFSVOL1 的 256MB 的卷。

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

有关卷的统计信息,例如,输入/输出比率

 

快照(仅限第 2 版)

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。

访问控制(仅限第 2 版)

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)。

ASM 的最佳布置(仅限第 2 版)

熟悉磁盘技术的人都知道,数据传输时间会根据磁盘的位置而有所不同,磁盘外围速度最快,到磁盘中心便会逐渐降低速度。自然,了解了这一点,您可能希望以智能方式放置文件。访问最多的表空间将因放在磁盘边缘或边缘附近而受益,而使用最少的(或者对 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 数字。

ASMCMD 增加的功能(仅限第 2 版)

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 Configuration Assistant(仅限第 2 版)

如何创建和管理 ASM 实例及其他组件?ASMCMD 是一种选择。Oracle Enterprise Manager(独立版或者 Grid Control)是另外一种选择。在这一版本的 Oracle 中,还有另一种工具:ASMCA (ASM Configuration Assistant)。它使您可以在一个 GUI 前端中创建 ASM 实例并对其进行管理。可以通过发出命令 asmca 来调用该工具。以下是初始屏幕。

第一个选项卡显示磁盘组信息,后续选项卡显示卷(如果已定义)以及这些卷上的 ACFS 文件系统(如果已定义)。本文之前的部分中对卷和 ACFS 均已进行了说明。

nanda-asm11gr2-f2

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

nanda-asm11gr2-f3

在这里,我已经创建了一个名为 HOT_UNPROT_COARSE 的模板(名称在域中部分隐藏),使镜像处于未保护状态,稀疏条带化并且将 HOT 作为区位置。单击 Save 保存此模板。

如本文前面所示,ASM 配置还可用于创建卷和 ACFS 挂载点(而不必使用 ASMCMD 或 SQL 方法)。ASMCA 的 GUI 界面使此过程更具直观性。为节省空间,未显示屏幕截图。

返回系列目录