2011g新特性自动存储管理Word文档下载推荐.docx
《2011g新特性自动存储管理Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《2011g新特性自动存储管理Word文档下载推荐.docx(46页珍藏版)》请在冰点文库上搜索。
sysdba和sysasm角色将分成不同的OS组。
)
以sys用户身份连接到ASM实例后,您可以更新在口令文件中更新的SYS口令:
alterusersysidentifiedbyoracle
2/
Useraltered.
尽管这个ASM实例不带数据库,您仍然可以创建用户:
createuserasmoperidentifiedbydumboper
Usercreated.
现在,您可以将SYSASM角色授予该用户:
grantsysasmtoasmoper;
Grantsucceeded.
进行授权之后,asmoper用户(而非SYS用户)可以执行所有ASM管理功能。
该用户可以通过子句assysasm进行连接,该子句类似于常规数据库中的“assysdba”子句。
$sqlplusasmoper/dumboperassysasm
这个特性实现了迫切需要的ASM和DBA职责分离。
可变的区大小
ASM存储中结构最小的元素是分配单元(AU),与Oracle数据库块的概念类似。
创建表和索引之类的数据库段时,分配的最小单元不是一个块,而是一个包含多个块的区。
您可以更改段的区大小。
ASM中有一个非常类似的概念:
在ASM磁盘组上创建文件时,最小的可寻址单元是区,而不是AU。
在OracleDatabase10g中,AU和区是可互换的;
一个区只包含一个AU。
10g兼容的磁盘组需要共享池为每个区提供内存。
对于大型数据库,这又需要大量内存。
因此,如果AU大小为1MB(默认值),1TB的数据库需要在共享池中管理超过一百万个区。
在OracleDatabase11g中,区大小不再等于AU大小。
创建文件时,区大小从1MB开始。
文件达到某个阈值时,区大小增加至4MB,然后是16MB,最后当达到某个阈值后,区大小为64MB。
您不必担心大小;
ASM实例会自动分配合适的区大小。
由于较少数量的区即可容纳大量数据,因此可以大大减少共享池中的区总数,从而将性能提高数倍。
当文件急剧扩大和缩小时,可变的区大小可能会产生一些碎片。
如果需要进行碎片整理,ASM将自动解决该问题。
可变的AU大小
正如我在前面提到的,AU的默认大小为1MB。
对许多数据库而言,这可能足够大了,但请考虑一个大小超过10TB的大型数据库。
对象可能超过1MB,因此您可能希望扩大AU大小以减少AU数量。
在OracleDatabase10g中,您可以设置一个底线参数来更改AU大小。
然而,这会影响之后创建的所有磁盘组,而且还需要一个ASM实例回收来设置该参数。
在OracleDatabase11g中,只需在创建DG期间设置一个磁盘组属性au_size即可轻松完成此任务,如下所示:
creatediskgroupdg6
externalredundancy
disk
'
/dev/raw/raw13'
attribute'
au_size'
='
2M'
AU_SIZE应为1M、2M、4M、8M、16M、32M或64M(M代表MB)。
您还可以将该值设成一个绝对值(单位为字节):
2097152'
创建磁盘组之后,您可以通过以下查询来查看AU大小:
selectname,allocation_unit_size
fromv$asm_diskgroup
/
NAMEALLOCATION_UNIT_SIZE
---------------------------
DG11048576
DG31048576
DG62097152
DG51048576
DG41048576
DG21048576
注意各个磁盘组名称的AU大小。
现在,您可以创建具有合适AU大小的磁盘组,以满足每个应用程序的需要。
磁盘组属性
ASM是一个适用于从10g到当前版本的Oracle数据库的存储平台。
因此,11g上的ASM实例可以保存10g第1版、10g第2版以及11g第1版(以及更高版本)的数据库。
只要ASM版本与RDBMS的版本相同或者更高,就可以在该ASM实例上创建数据库。
如果ASM和RDBMS实例的版本不同,它们将如何通信呢?
很简单:
ASM将消息转换成适合RDBMS的版本。
默认情况下,ASM实例可以支持10g数据库。
但如果您希望在该ASM实例上仅放置11gRDBMS,该怎么办?
无需进行消息转换来支持版本差异。
但如果可以告诉ASM实例唯一支持的数据库是11g第1版,该怎么办?
这将消除,至少可以减少消息转换。
在OracleDatabase11g中,可以使用ASM兼容性和RDBMS兼容性磁盘组属性实现。
首先,我们将检查磁盘组的当前属性:
selectcompatibility,database_compatibility
2fromv$asm_diskgroup
3wherename='
DG1'
4/
COMPATIBILITYDATABASE_COMPATIBILITY
--------------------------------------------
10.1.0.0.010.1.0.0.0
如您所见,ASM兼容性(由COMPATIBILITY显示)设置为10.1.0.0.0,这意味着该磁盘组最高可支持10.1ASM结构。
因此,该磁盘组可以具有任意RDBMS结构。
另一列DATABASE_COMPATIBILITY显示RDBMS兼容性设置为10.1。
这意味着,ASM磁盘组DG1可用于10.1版的任何RDBMS。
由于您只希望创建11gASM和RDBMS结构,因此无需拥有10g元素。
要将该磁盘组的ASM兼容性属性设置为11.1,您可以执行以下语句(在ASM实例中):
alterdiskgroupdg1setattribute'
compatible.asm'
='
11.1'
;
现在,如果您检查磁盘组的属性:
11.1.0.0.010.1.0.0.0
ASM兼容性设置为11.1;
但RDBMS兼容性仍然设置为10.1。
要将它也更改为11.1,请使用:
compatible.rdbms'
需要特别注意的是:
兼容性是针对磁盘组设置的,而不是针对整个ASM实例。
使用该特性,您只需使用一个ASM实例即可满足所有数据库版本类型的需要。
根据所使用的版本,您可以相应地设置属性,从而减少版本间通信。
首选的镜像读取
在OracleRAC数据库中,多个节点可能指向同一个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。
这在大多数情况下可以正常工作,但有时可能不是所希望的。
在OracleDatabase11g中,您可以将一个节点配置为从特定failgroup中读取。
例如,在上面的示例中,如果您希望将实例1配置为从failgroupDG2_0000中读取,将实例2配置为从DG2_0001中读取,您可以设置这些磁盘组的首选读取组。
在实例1中执行的以下命令导致磁盘组DG2和DG3中的failgroupDG2_0000和DG3_0000分别是实例1上的首选磁盘:
altersystemsetasm_preferred_read_failure_groups='
DG2.DG2_0000'
'
DG3.DG3_0000'
同样,在另一个实例上,您可以执行以下命令使其他failgroup成为首选磁盘:
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
fromv$asm_disk_iostat
orderby1,2,3,4,5,6
示例输出如下:
INSTNAMDBNAMEGROUP_NUMBERFAILGROUPDISK_NUMBERREADSWRITES
--------------------------------------------------------------------
PRONE31PRONE32DG2_000004450910
PRONE32PRONE32DG2_000112256910
PRONE31PRONE33DG3_0000030029
PRONE32PRONE33DG3_0001156029
该输出显示了实例PRONE31和PRONE32的首选failgroup分别为DG2_0000和DG2_0001。
注意WRITES列;
它们在910处相同。
这是因为统一写入到两个磁盘中。
现在,注意READS列。
针对实例PRONE31和PRONE32分别为4450和2256。
为什么?
因为实例PRONE3发出多次读取命令,这些读取均来自于其首选failgroupDG2_0000。
对于磁盘组DG3,实例PRONE32发出多次来自于其首选failgroup(DG3_0001)的读取命令,因此该磁盘显示更多读取。
首选读取在“拉伸”集群(节点之间地理距离较远的集群)中尤为有用。
首选读取通过将读取隔离到特定磁盘,加快了读取速度。
DropDiskgroupForce
当一个磁盘不再可用时(损坏到无法修复的程度)会发生什么?
您希望完全删除该磁盘组然后重新创建,或者将该磁盘组的磁盘添加到其他磁盘组。
该磁盘组尚未挂载。
由于其中一个磁盘缺少,您甚至无法挂载它。
要删除该磁盘组,您必须挂载它,但由于缺少磁盘,您无法进行挂载—绝对是一个“无法摆脱的困境”。
您应该做些什么?
在OracleDatabase10g中,您可以使用一种变通方法—使用dd命令擦除磁盘头:
$ddif=/dev/zeroof=/dev/raw/raw13bs=1024count=4
这将在磁盘/dev/raw/raw13的头中放入零,擦除所有信息。
如果该方法生效,它将完全擦除磁盘头的信息,并删除用作磁盘组一部分的磁盘。
在OracleDatabase11g中,您不必求助于该变通方法。
您只需执行带force选项的drop命令:
dropdiskgroupdg7forceincludingcontents;
使用该命令,即使没有挂载磁盘,也可以删除磁盘组。
可用的磁盘显示为FORMER;
即,它们用作某个磁盘组的一部分。
(注意:
您必须使用“includingcontents”子句。
元数据备份和恢复
许多人将ASM看作一个具有自己的存储的数据库。
事实并非如此,ASM并不存储数据,而是由数据库进行存储。
但ASM实例需要维护磁盘组名称、其中的磁盘、目录等元数据。
这些元数据存储在磁盘头中。
假设所有磁盘都损坏且头信息消失,您该怎么办?
当然,您已经使用RMAN对数据库进行了备份,因此可以恢复。
但您只有在创建了所有磁盘组和目录后才能进行恢复。
希望您保留了所有记录。
(对吗?
)即使您进行了备份,这个过程也需要时间。
如果您进行了备份,该怎么办呢?
在OracleDatabase11g中,您可以使用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'
NAME'
DGNAME'
PATH'
/dev/raw/raw5'
}
},
DGINFO'
DGTORESTORE'
0,
DGCOMPAT'
10.1.0.0.0'
DGDBCOMPAT'
DGTYPE'
EXTERN'
DGAUSZ'
1048576'
ALIASINFO'
{},
TEMPLATEINFO'
6'
STRIPE'
COARSE'
TEMPNAME'
ASM_STALE'
REDUNDANCY'
UNPROT'
SYSTEM'
Y'
...andmore...
它记录了所有磁盘组、磁盘、目录、磁盘属性,等等。
默认情况下,该文件会记录所有磁盘组。
如果您希望仅备份特定磁盘组,可以使用-g选项。
此外,您还可以使用-b选项创建特定的命名文件。
md_backup-gdg1-bprolin3_asm.backup
这会将磁盘组DG1的元数据备份到一个名为prolin3_asm.backup的文件,而不是默认的ambr_backup_intermediate_file。
该文件必须是新建的,如果在生成前该文件已存在,您必须删除它。
现在,让我们看看恢复操作是如何工作的。
恢复有不同的类型。
最简单的用法是恢复一个以前删除的磁盘组及其目录。
首选,在磁盘组上创建一个目录:
cdDG7
ASMCMD[+DG7]>
mkdirTEST
ls
TEST/
该磁盘组有一个名为TEST的目录。
现在,备份该磁盘组:
md_backup-gdg7-bg7.backup
备份之后,假设您删除该磁盘组来模拟一次意外删除:
dropdiskgroupdg7;
Diskgroupdropped.
现在,磁盘组DG7已从ASM实例删除,您希望使用以前的备份恢复它。
可以使用md_restore命令恢复它:
$asmcmdmd_restore-bdg7.backup-tfull
CurrentDiskgroupbeingrestored:
DG7
DiskgroupDG7created!
SystemtemplateTEMPFILEmodified!
SystemtemplateFLASHBACKmodified!
SystemtemplateARCHIVELOGmodified!
SystemtemplateBACKUPSETmodified!
SystemtemplateXTRANSPORTmodified!
SystemtemplateDATAGUARDCONFIGmodified!
SystemtemplateCONTROLFILEmodified!
SystemtemplateAUTOBACKUPmodified!
SystemtemplateDUMPSETmodified!
SystemtemplateONLINELOGmodified!
SystemtemplatePARAMETERFILEmodified!
SystemtemplateASM_STALEmodified!
SystemtemplateCHANGETRACKINGmodified!
SystemtemplateDATAFILEmodified!
Directory+DG7/TESTre-created!
看看输出;
它创建了该磁盘组以及模板和目录。
如果以前有任何数据,当然,这些数据将丢失。
md_backup不是数据的备份,而是ASM实例元数据的备份。
表面上,数据是由RMAN备份的。
创建磁盘组和所有目录之后,您可以将RMAN备份恢复到该磁盘组。
另一个选项-f使您可以将命令放在一个脚本文件中,而不是执行这些命令:
md_restore-bdg7.backup-tfull-fcr_dg7.sql
它会创建一个名为cr_dg7.sql的SQL脚本,该脚本用于创建磁盘组以及所有其他对象。
您可以在ASM实例中手动运行该脚本。
该文件如下所示:
creatediskgroupDG7EXTERNALredundancydisk'
/dev/raw/raw14'
nameDG7_0000size100M;
alterdiskgroup/*ASMCMDAMBR*/DG7altertemplateTEMPFILEattributes(UNPROTECTEDCOARSE);
alterdiskgroup/*ASMCMDAMBR*/DG7altertemplateFLASHBACKattributes(UNPROTECTEDFINE);
alterdiskgroup/*ASMCMDAMBR*/DG7altertemplateARCHIVELOGattributes(UNPROTECTEDCOARSE);
alterdiskgroup/*ASMCMDAMBR*/DG7altertemplateBACKUPSETattributes(UNPROTECTEDCOARSE);
alterdiskgroup/*ASMCMDAMBR*/DG7altertemplateXTRANSPORTattributes(UNPROTECTEDCOARSE);
alterdiskgroup/*ASMCMDAMBR*/DG7altertemplateDATAGUARDCONFIGattributes(UNPROTECTEDCO