如何使用ASM

更新时间:2024-05-28 20:24:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

如何使用ASM

——ASM学习随笔

摘要: 在ORACLE10G中推出了ASM的概念,ORACLE可以自动管理磁盘数据。在实际工作中如何正常使用ASM,在这里做一小节。现在在客户的生产环境下还是习惯于使用逻辑卷进行数据库的管理。但是在ORACLE的新的数据库版本例如11.2,12版本中将不再对裸设备提供支持。具体文档细节参考:

Doc ID: 578455.1 Doc ID: 754305.1 关键词:ASM,DISKGROUP

1 什么是ASM

ASM(Automatic Storage Management),在以往的工作过程中,经常使用裸设备的概念,例如数据库的控制文件,数据文件,日志文件使用裸设备,在数据库规划和管理过程中,相对比较繁琐。

ASM推出了磁盘组(disk groups)的概念。将一些可用的磁盘设备创建为一些相应的磁盘组。将数据库的三大物理文件放到相应的磁盘组中。简化了数据库的管理。

1.1 镜像和条带

ASM本身可以提供条带功能,ASM按128k或1M大小在整个磁盘组上的所有磁盘设备进行相关的条带化。

- 1 -

ASM本身也能提供相关的镜像功能,提供数据的最大安全性。

1.2 动态数据配置

在对磁盘组添加新的磁盘设备时,ASM可以使用自动rebalances进行数据文件的重新分布以便达到最好的I/O分布。如果一块磁盘设备损坏后,ASM会自动调整冗余设备进行数据的重新分布。当你添加新设备后,ASM也会再自动进行数据分布。

1.3 ASM实例

ASM本身有自己的参数文件启动ASM实例,分配相关的SGA区和后台进程。

2 了解ASM的组成

在ASM的体系框架中,主要有下列概念 1) disk groups 2) disks

3) failure groups 4) files 5) templates

2.1 Disk Groups

磁盘组是由一些磁盘设备构成。磁盘组定义了不同的镜像级别

Disk Group Type Normal redundancy High redundancy External redundancy Supported Mirroring Levels 2-way 3-way 3-way unprotected - 2 - Default Mirroring Level 2-way 3-way unprotected

如果在创建磁盘组的使用没有指定默认冗余级别,默认使用normal redundancy。

2.2 Disks

不建议在操作系统卷管理模式上再使用ASM进行管理。但是在测试环境上也可以使用逻辑卷进行测试。

2.3 Files

可以给ASM创建的文件起别名进行相关的管理。

3 管理ASM

3.1 参数文件

$ORACLE_HOME/dbs/spfile+ASM.ora *.asm_diskgroups='DSKGRP1' +ASM.asm_diskgroups='DSKGRP1' *.asm_diskstring='/dev/raw/raw*' *.background_dump_dest='/oracle1/app/oracle/admin/+ASM/bdump' *.core_dump_dest='/oracle1/app/oracle/admin/+ASM/cdump' *.instance_type='asm' *.large_pool_size=12M *.remote_login_passwordfile='SHARED' *.user_dump_dest='/oracle1/app/oracle/admin/+ASM/udump' #Manual Mount

ASM_POWER_LIMIT参数设置了具体磁盘数据重新分布时具体速度,具体范围在0-11之间。

- 3 -

3.2 启动ASM实例

$export ORACLE_SID=+ASM $sqlplus “/ as sysdba” SQL>startup 3.2.1 确定css进程

在使用ASM的时候,ASM实例需要和数据库实例进行相关的通讯,那么ORACLE需要一个后台进程来管理,这个进程就是css进程。

确定操作系统在重新启动后,css进程自动启动,用root用户执行下面的命令,添加cssd进程

í $ORACLE_HOME/bin %localconfig add 判断css进程是否正常,使用

[root@server bin]# crsctl check cssd CSS appears healthy 3.2.2 SGA大小

一般ASM SGA大小在64M-100M之间,根据事情情况再调整。

4 管理磁盘组

4.1 容量

Disk Group Type

Maximum File Size - 4 -

External redundancy 35 TB Normal redundancy 5.8 TB High redundancy 3.9 TB 4.2 创建磁盘组

由于硬件条件,这里使用虚拟机器设置两块10G的磁盘,/dev/sdb,/dev/sdc,在这两块盘上创建对应的逻辑卷,然后使用逻辑卷来测试ASM。

pvcreate /dev/sdb vgcreate vg_asmgp1 /dev/sdb lvcreate -L 200M -n lvasmdisk1 vg_asmgp1 lvcreate -L 200M -n lvasmdisk2 vg_asmgp1 lvcreate -L 200M -n lvasmdisk3 vg_asmgp1 lvcreate -L 200M -n lvasmdisk4 vg_asmgp1 lvcreate -L 200M -n lvasmdisk5 vg_asmgp1 lvcreate -L 200M -n lvasmdisk6 vg_asmgp1 lvcreate -L 200M -n lvasmdisk7 vg_asmgp1 lvcreate -L 200M -n lvasmdisk8 vg_asmgp1 mknod /etc/udev/devices/rlvasmdisk1 c 162 1 mknod /etc/udev/devices/rlvasmdisk2 c 162 2

- 5 -

mknod /etc/udev/devices/rlvasmdisk3 c 162 3 mknod /etc/udev/devices/rlvasmdisk4 c 162 4 mknod /etc/udev/devices/rlvasmdisk5 c 162 5 mknod /etc/udev/devices/rlvasmdisk6 c 162 6 mknod /etc/udev/devices/rlvasmdisk7 c 162 7 mknod /etc/udev/devices/rlvasmdisk8 c 162 8 chown -R oracle:dba /etc/udev/devices/rlvasm* start_udev raw /dev/rlvasmdisk1 /dev/vg_asmgp1/lvasmdisk1 raw /dev/rlvasmdisk2 /dev/vg_asmgp1/lvasmdisk2 raw /dev/rlvasmdisk3 /dev/vg_asmgp1/lvasmdisk3 raw /dev/rlvasmdisk4 /dev/vg_asmgp1/lvasmdisk4 raw /dev/rlvasmdisk5 /dev/vg_asmgp1/lvasmdisk5 raw /dev/rlvasmdisk6 /dev/vg_asmgp1/lvasmdisk6 raw /dev/rlvasmdisk7 /dev/vg_asmgp1/lvasmdisk7 raw /dev/rlvasmdisk8 /dev/vg_asmgp1/lvasmdisk8 - 6 -

SQL> show parameter asm NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ asm_diskgroups string asm_diskstring string /dev/rlvasm* asm_power_limit integer 1 CREATE DISKGROUP DSKGRP1 NORMAL REDUNDANCY FAILGROUP controller1 DISK '/dev/rlvasmdisk1', '/dev/rlvasmdisk2' FAILGROUP controller2 DISK '/dev/rlvasmdisk3', '/dev/rlvasmdisk4'; SQL> show parameter asm NAME TYPE VALUE ------------------------------------ ----------- ------------------------------

- 7 -

asm_diskgroups string DSKGRP1 asm_diskstring string /dev/rlvasm* asm_power_limit integer 1 在这里创建了一个磁盘组DSKGRP1,设置了对应的磁盘镜像。在组controller1上写数据的同时,相同的数据被复制到组controller2上。保证数据有冗余备份。避免了数据丢失。

[oracle@server bdump]$ ps -ef|grep asm oracle 4235 1 0 20:49 ? 00:00:00 asm_pmon_+ASM oracle 4237 1 0 20:49 ? 00:00:00 asm_psp0_+ASM oracle 4239 1 0 20:49 ? 00:00:00 asm_mman_+ASM oracle 4241 1 0 20:49 ? 00:00:00 asm_dbw0_+ASM oracle 4243 1 0 20:49 ? 00:00:00 asm_lgwr_+ASM oracle 4245 1 0 20:49 ? 00:00:00 asm_ckpt_+ASM oracle 4247 1 0 20:49 ? 00:00:00 asm_smon_+ASM oracle 4249 1 0 20:49 ? 00:00:00 asm_rbal_+ASM oracle 4251 1 0 20:49 ? 00:00:00 asm_gmon_+ASM 4.3 修改磁盘组

在工作过程中,需要给磁盘组添加或删除磁盘,在添加或删除过程中,ASM会重新自动平衡数据的分布。在整个平衡过程中,可以通过查看V$ASM_OPERATION视图。

alter system set asm_diskstring='/dev/rlvasm*' 4.3.1 给一个磁盘组添加设备

SQL> ALTER DISKGROUP DSKGRP1 ADD FAILGROUP controller1 DISK '/dev/rlvasmdisk5' NAME asmdisk5; SQL> ALTER DISKGROUP DSKGRP1 ADD FAILGROUP controller2 DISK '/dev/rlvasmdisk6' NAME asmdisk6; - 8 -

4.3.2 删除设备

当一个磁盘设备被删除的时候,磁盘组数据会重新分布,将被删除磁盘上的数据从新分布到现存的磁盘设备上。如果现有的磁盘设备空间不足,删除操作会失败。所以在删除磁盘设备前要先确定磁盘空间足够使用。

SQL> select name, type, total_mb, free_mb, required_mirror_free_mb,usable_file_mb from v$asm_diskgroup; NAME TYPE TOTAL_MB FREE_MB REQUIRED_MIRROR_FREE_MB USABLE_FILE_MB ------------------------------ ------ ---------- ---------- ----------------------- DSKGRP1 NORMAL 1200 1090 200 445 删除一个sdd1,sdd2的设备

SQL> ALTER DISKGROUP DSKGRP1 DROP DISK asmdisk5; SQL> select name, type, total_mb, free_mb, required_mirror_free_mb,usable_file_mb from v$asm_diskgroup; NAME TYPE TOTAL_MB FREE_MB REQUIRED_MIRROR_FREE_MB USABLE_FILE_MB ------------------------------ ------ ---------- ---------- ----------------------- DSKGRP1 NORMAL 1000 892 200 346 SQL> ALTER DISKGROUP DSKGRP1 DROP DISK asmdisk6; SQL> select name, type, total_mb, free_mb, required_mirror_free_mb,usable_file_mb from v$asm_diskgroup; NAME TYPE TOTAL_MB FREE_MB REQUIRED_MIRROR_FREE_MB USABLE_FILE_MB ------------------------------ ------ ---------- ---------- ----------------------- DSKGRP1 NORMAL 800 694 200 247

4.3.3 修改磁盘空间大小

ALTER DISKGROUP DSKGRP1 RESIZE DISKS IN FAILGROUP controller1 SIZE 200M; 在操作系统扩容后,数据库不能直接认到磁盘发生了变化,需要手工调整磁盘的大小。

- 9 -

4.3.4 取消磁盘删除

ALTER DISKGROUP DSKGRP1 UNDROP DISKS;

4.3.5 手工重新分布数据

asm_power_limit参数可以设置为0-11,如果设置为0,那么ASM自动重新分布数据功能会被关闭。

SQL> alter system set asm_power_limit = 0; SQL> show parameter asm_power_limit NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ asm_power_limit integer 0 手工分布数据

SQL> ALTER DISKGROUP DSKGRP1 REBALANCE POWER 2 WAIT; 查看数据分布需要多长时间

SQL>select operation,est_minutes from v$asm_operation;

4.3.6 手工mount,dismount磁盘组

SQL> ALTER DISKGROUP DSKGRP1 DISMOUNT; SQL> ALTER DISKGROUP DSKGRP1 MOUNT;

4.4 检查磁盘设备一致性

ALTER DISKGROUP DSKGRP1 CHECK ALL; ALTER DISKGROUP DSKGRP1 CHECK ALL repair;(删除完FAILGROUP磁盘组后,需要手工CHECK所有的磁盘信息)

- 10 -

4.5 删除磁盘组

DROP DISKGROUP dgroup1; 4.6 管理目录

在使用ASM创建文件时,默认格式不是很好辨别,在日常工作中,创建容易理解的目录 4.6.1 创建新目录

ALTER DISKGROUP DSKGRP1 ADD DIRECTORY '+DSKGRP1/tbstest1'; create tablespace test1 datafile '+DSKGRP1/tbstest1/test1_001.dbf' size 100M autoextent off; extent management local uniform size 1M segment space management auto; 4.6.2 修改目录名

ALTER DISKGROUP DSKGRP1 RENAME DIRECTORY '+DSKGRP1/tbstest1' TO '+DSKGRP1/tbspacetest1'; alter database rename file '+DSKGRP1/tbstest1/test1_001.dbf' to '+DSKGRP1/tbspacetest1/test1_001.dbf'; 4.6.3 删除目录

ALTER DISKGROUP DSKGRP1 DROP DIRECTORY '+DSKGRP1/tbspacetest1';

4.7 管理ASM文件别名

了解通过V$ASM_ALIAS可以查看所有的别名

- 11 -

4.7.1 添加ASM文件别名

ALTER DISKGROUP DSKGRP1 ADD ALIAS '+DSKGRP1/tbspacetest1/test1_001.dbf' FOR '+DSKGRP1/DB10G/DATAFILE/TEST1.256.681689095'; 4.7.2 修改ASM文件别名

ALTER DISKGROUP DSKGRP1 RENAME ALIAS '+dgroup1/mydir/datafile.dbf' TO '+dgroup1/payroll/compensation.dbf'; 4.7.3 删除文件别名

特别注意删除一个文件别名不过是类似删除了一个软连接,如果发现删除错误了,还可以通过重新创建这个文件别名来恢复。

ALTER DISKGROUP DSKGRP1 DROP ALIAS '+DSKGRP1/tbspacetest1/test1_001.dbf';

4.8 删除ASM文件

删除文件的时候确定该文件数据库已经不再使用,如果将数据库down掉,直接删除asm文件,数据库不能正常启动。

ALTER DISKGROUP dgroup1 DROP FILE '+dgroup1/payroll/compensation.dbf';

4.9 管理磁盘组模板

ORACLE系统自动创建了一些模板来控制创建的不同类型的文件的镜像和条带化的具体参数。可以通过V$ASM_TEMPLATE查看ORACLE预先定义的模板。

SQL> select * from v$asm_template GROUP_NUMBER ENTRY_NUMBER REDUND STRIPE S NAME 1 0 MIRROR COARSE Y PARAMETERFILE 1 1 MIRROR COARSE Y DUMPSET

- 12 -

1 2 HIGH FINE Y CONTROLFILE 1 3 MIRROR COARSE Y ARCHIVELOG 1 4 MIRROR FINE Y ONLINELOG 1 5 MIRROR COARSE Y DATAFILE 1 6 MIRROR COARSE Y TEMPFILE 1 7 MIRROR COARSE Y BACKUPSET 1 8 MIRROR COARSE Y AUTOBACKUP 1 9 MIRROR COARSE Y XTRANSPORT 1 10 MIRROR COARSE Y CHANGETRACKING 1 11 MIRROR FINE Y FLASHBACK 1 12 MIRROR COARSE Y DATAGUARDCONFIG

Striping Attribute Value FINE Description Striping in 128KB chunks. Striping in 1MB chunks. COARSE 4.9.1 添加新模板

ALTER DISKGROUP dgroup2 ADD TEMPLATE reliable ATTRIBUTES (HIGH FINE); 4.9.2 修改模板

ALTER DISKGROUP dgroup2 ADD TEMPLATE reliable ATTRIBUTES (HIGH FINE); 4.9.3 删除模板

ALTER DISKGROUP dgroup2 DROP TEMPLATE unreliable;

- 13 -

5 数据库中使用ASM

当使用ASM的时候,数据文件存储在ASM磁盘组中。由于数据文件存放在ASM磁盘组中,对操作系统不可见。通过使用RMAN,ASMCMD可以访问对应的文件。

5.1 ASM支持那些文件类型

数据库的控制文件,数据文件,日志文件,归档日志,RMAN备份,数据文件copy,spfile,flashback logs等多种数据库文件都可以存放在磁盘组中。

5.2 创建表空间

SQL> alter system set DB_CREATE_FILE_DEST='+DSKGRP1'; SQL> CREATE TABLESPACE tspace1 datafile size 20M autoextend off extent management local uniform size 1M segment space management auto;

SQL> select file_name from dba_data_files; FILE_NAME -------------------------------------------------------------------------------- /oracle1/oradata/ora10g/system01.dbf /oracle1/oradata/ora10g/undotbs01.dbf /oracle1/oradata/ora10g/sysaux01.dbf /oracle1/oradata/ora10g/users01.dbf /oracle1/oradata/ora10g/test01.dbf +DSKGRP1/ora10g/datafile/tspace1.256.647700289 - 14 -

5.3 ASM有用的视图

V$ASM_DISKGROUP V$ASM_DISK V$ASM_DISKGROUP_STAT V$ASM_DISK_STAT V$ASM_FILE V$ASM_TEMPLATE V$ASM_ALIAS V$ASM_OPERATION V$ASM_CLIENT

6 将数据库迁移到ASM中

在这里测试将一个非ASM管理的数据库迁移到ASM管理中

6.1 查看当前数据库结构

SQL> set lines 200 SQL> set pages 80 SQL> col name for a40 SQL> select * from v$controlfile; STATUS NAME IS_ BLOCK_SIZE FILE_SIZE_BLKS ------- ---------------------------------------- --- ---------- -------------- /oracle1/oradata/ora10g/control01.ctl NO 16384 430 /oracle1/oradata/ora10g/control02.ctl NO 16384 430 /oracle1/oradata/ora10g/control03.ctl NO 16384 430 SQL> select file_name from dba_data_files; FILE_NAME

- 15 -

------------------------------------------------------------ /oracle1/oradata/ora10g/system01.dbf /oracle1/oradata/ora10g/undotbs01.dbf /oracle1/oradata/ora10g/sysaux01.dbf /oracle1/oradata/ora10g/users01.dbf /oracle1/oradata/ora10g/test01.dbf +DSKGRP1/ora10g/datafile/tspace1.256.647700289 SQL> select * from v$logfile; GROUP# STATUS TYPE MEMBER IS_ ---------- ------- ------- ---------------------------------------- --- 1 ONLINE /oracle1/oradata/ora10g/redo01.log NO 2 STALE ONLINE /oracle1/oradata/ora10g/redo02.log NO 3 ONLINE /oracle1/oradata/ora10g/redo03.log NO 6.2 修改数据库为归档模式

SQL> alter system set db_recovery_file_dest_size=500M; SQL> alter system set db_recovery_file_dest='/oracle1/flasharea/ora10g'; SQL> shutdown immediate SQL> startup mount; SQL> alter database archivelog; SQL> alter database open; SQL> archive log list; Database log mode Archive Mode Automatic archival Enabled Archive destination USE_DB_RECOVERY_FILE_DEST Oldest online log sequence 50 Next log sequence to archive 52 Current log sequence 52 - 16 -

6.3 备份数据库

6.3.1 备份数据文件

[oracle1@server ~]$ rman target / nocatalog Recovery Manager: Release 10.2.0.2.0 - Production on Tue Feb 26 19:51:28 2008 Copyright (c) 1982, 2005, Oracle. All rights reserved. connected to target database: ORA10G (DBID=3966404995) using target database control file instead of recovery catalog RMAN> show all; RMAN configuration parameters are: CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default CONFIGURE BACKUP OPTIMIZATION OFF; # default CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default CONFIGURE MAXSETSIZE TO UNLIMITED; # default CONFIGURE ENCRYPTION FOR DATABASE OFF; # default CONFIGURE ENCRYPTION ALGORITHM 'AES128'; # default CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/oracle1/app/oracle/product/10.2/dbs/snapcf_ora10g.f'; # default RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;

- 17 -

run { allocate channel dev1 type disk; allocate channel dev2 type disk; allocate channel dev3 type disk; allocate channel dev4 type disk; BACKUP AS COPY INCREMENTAL LEVEL 0 DATABASE FORMAT '+DSKGRP1' TAG 'ORA_ASM_MIGRATION'; } allocated channel: dev1 channel dev1: sid=138 devtype=DISK allocated channel: dev2 channel dev2: sid=137 devtype=DISK allocated channel: dev3 channel dev3: sid=136 devtype=DISK allocated channel: dev4 channel dev4: sid=135 devtype=DISK Starting backup at 26-FEB-08 channel dev1: starting datafile copy input datafile fno=00002 name=/oracle1/oradata/ora10g/undotbs01.dbf channel dev2: starting datafile copy input datafile fno=00001 name=/oracle1/oradata/ora10g/system01.dbf channel dev3: starting datafile copy input datafile fno=00004 name=/oracle1/oradata/ora10g/users01.dbf channel dev4: starting datafile copy input datafile fno=00003 name=/oracle1/oradata/ora10g/sysaux01.dbf

- 18 -

output filename=+DSKGRP1/ora10g/datafile/sysaux.258.647726823 tag=ORA_ASM_MIGRATION recid=7 stamp=647726917 channel dev4: datafile copy complete, elapsed time: 00:01:46 channel dev4: starting datafile copy input datafile fno=00005 name=/oracle1/oradata/ora10g/test01.dbf output filename=+DSKGRP1/ora10g/datafile/users.261.647726827 tag=ORA_ASM_MIGRATION recid=8 stamp=647726970 channel dev3: datafile copy complete, elapsed time: 00:02:35 channel dev3: starting datafile copy input datafile fno=00006 name=+DSKGRP1/ora10g/datafile/tspace1.256.647700289 output filename=+DSKGRP1/ora10g/datafile/system.259.647726825 tag=ORA_ASM_MIGRATION recid=9 stamp=647726992 channel dev2: datafile copy complete, elapsed time: 00:03:00 output filename=+DSKGRP1/ora10g/datafile/test.262.647726933 tag=ORA_ASM_MIGRATION recid=10 stamp=647726993 channel dev4: datafile copy complete, elapsed time: 00:01:11 output filename=+DSKGRP1/ora10g/datafile/undotbs.260.647726825 tag=ORA_ASM_MIGRATION recid=12 stamp=647727013 channel dev1: datafile copy complete, elapsed time: 00:03:15 output filename=+DSKGRP1/ora10g/datafile/tspace1.263.647726977 tag=ORA_ASM_MIGRATION recid=11 stamp=647727013 channel dev3: datafile copy complete, elapsed time: 00:00:40 Finished backup at 26-FEB-08 Starting Control File and SPFILE Autobackup at 26-FEB-08 piece handle=/oracle1/flasharea/ora10g/ORA10G/autobackup/2008_02_26/o1_mf_s_647727017_3w80fd1z_.bkp comment=NONE Finished Control File and SPFILE Autobackup at 26-FEB-08 released channel: dev1

- 19 -

released channel: dev2 released channel: dev3 released channel: dev4 切换当前日志 RMAN> sql 'alter system archive log current'; 6.3.2 备份spfile

RMAN> run { BACKUP AS BACKUPSET SPFILE; RESTORE SPFILE TO \} Starting backup at 26-FEB-08 allocated channel: ORA_DISK_1 channel ORA_DISK_1: sid=149 devtype=DISK channel ORA_DISK_1: starting full datafile backupset channel ORA_DISK_1: specifying datafile(s) in backupset including current SPFILE in backupset channel ORA_DISK_1: starting piece 1 at 26-FEB-08 channel ORA_DISK_1: finished piece 1 at 26-FEB-08 piece handle=/oracle1/flasharea/ora10g/ORA10G/backupset/2008_02_26/o1_mf_nnsnf_TAG20080226T200104_3w7zw1bt_.bkp tag=TAG20080226T200104 comment=NONE channel ORA_DISK_1: backup set complete, elapsed time: 00:00:02 Finished backup at 26-FEB-08 Starting Control File and SPFILE Autobackup at 26-FEB-08 piece handle=/oracle1/flasharea/ora10g/ORA10G/autobackup/2008_02_26/o1_mf_s_647726466_3w7zw2yj_.bkp comment=NONE

- 20 -

Finished Control File and SPFILE Autobackup at 26-FEB-08 Starting restore at 26-FEB-08 using channel ORA_DISK_1 channel ORA_DISK_1: starting datafile backupset restore channel ORA_DISK_1: restoring SPFILE output filename=+DSKGRP1/spfile channel ORA_DISK_1: reading from backup piece /oracle1/flasharea/ora10g/ORA10G/autobackup/2008_02_26/o1_mf_s_647726466_3w7zw2yj_.bkp channel ORA_DISK_1: restored backup piece 1 piece handle=/oracle1/flasharea/ora10g/ORA10G/autobackup/2008_02_26/o1_mf_s_647726466_3w7zw2yj_.bkp tag=TAG20080226T200106 channel ORA_DISK_1: restore complete, elapsed time: 00:00:04 Finished restore at 26-FEB-08

6.3.3 备份控制文件

RMAN> run { 2> BACKUP AS COPY CURRENT CONTROLFILE FORMAT '/oracle1/rmanbak/pre-ASM-controfile.cf'; 3> } Starting backup at 26-FEB-08 allocated channel: ORA_DISK_1 channel ORA_DISK_1: sid=139 devtype=DISK channel ORA_DISK_1: starting datafile copy copying current control file output filename=/oracle1/rmanbak/pre-ASM-controfile.cf tag=TAG20080226T201631 recid=13 stamp=647727393 - 21 -

channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:03 Finished backup at 26-FEB-08 Starting Control File and SPFILE Autobackup at 26-FEB-08 piece handle=/oracle1/flasharea/ora10g/ORA10G/autobackup/2008_02_26/o1_mf_s_647727395_3w80s4r4_.bkp comment=NONE Finished Control File and SPFILE Autobackup at 26-FEB-08

6.4 修改参数文件启动数据库

[oracle1@server ora10g]$ cat /tmp/pfile.ora SPFILE=+DSKGRP1/spfile SQL>shutdown immediate SQL>startup nomount PFILE=\SQL> alter system set control_files='+DSKGRP1/ct1.f','+DSKGRP1/ct2.f' scope=spfile sid='*'; 6.5 恢复数据库

[oracle1@server ~]$ rman target / nocatalog; Recovery Manager: Release 10.2.0.2.0 - Production on Tue Feb 26 20:20:46 2008 Copyright (c) 1982, 2005, Oracle. All rights reserved. connected to target database (not started) RMAN> startup nomount PFILE=\

- 22 -

Oracle instance started Total System Global Area 314572800 bytes Fixed Size 1260588 bytes Variable Size 138413012 bytes Database Buffers 171966464 bytes Redo Buffers 2932736 bytes RMAN> restore controlfile from '/oracle1/oradata/ora10g/control01.ctl'; Starting restore at 26-FEB-08 allocated channel: ORA_DISK_1 channel ORA_DISK_1: sid=156 devtype=DISK channel ORA_DISK_1: copied control file copy output filename=+DSKGRP1/ct1.f output filename=+DSKGRP1/ct2.f Finished restore at 26-FEB-08 RMAN> alter database mount; database mounted released channel: ORA_DISK_1 RMAN> switch database to copy; datafile 1 switched to datafile copy \ datafile 2 switched to datafile copy \ datafile 3 switched to datafile copy \ datafile 4 switched to datafile copy \ datafile 5 switched to datafile copy \ datafile 6 switched to datafile copy \ RMAN> recover database;

- 23 -

Starting recover at 26-FEB-08 allocated channel: ORA_DISK_1 channel ORA_DISK_1: sid=156 devtype=DISK starting media recovery media recovery complete, elapsed time: 00:00:06 Finished recover at 26-FEB-08 RMAN> run { set newname for tempfile 1 to '+DSKGRP1'; switch tempfile all; } 6.6 打开数据库

SQL> alter database disable block change tracking; SQL> ALTER DATABASE ENABLE BLOCK CHANGE TRACKING USING FILE '+DSKGRP1'; SQL> ALTER DATABASE OPEN; 6.7 添加新的日志文件

SQL> alter database add logfile '+DSKGRP1' size 50M; SQL> alter database add logfile '+DSKGRP1' size 50M; SQL> alter database add logfile '+DSKGRP1' size 50M; 7 ASM数据分布的一个例子

在很多文档里提到过ASM可以实现数据平均分布,尽量避免数据热块。在这里做一个例子说明。

- 24 -

7.1 查看ASM实例的参数设置

SQL> show parameter asm NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ asm_diskgroups string DSKGRP1 asm_diskstring string /dev/sdd*, /dev/sde*, /dev/sdf* asm_power_limit integer 0 注意这里我已经将asm_power_limit参数设置为0,这样屏蔽了ASM自动重新分布数据的功能。

7.2 查看所有磁盘状态

添加两块磁盘

SQL> ALTER DISKGROUP DSKGRP1 ADD FAILGROUP controller1 DISK '/dev/sdd1' NAME sdd1; SQL> ALTER DISKGROUP DSKGRP1 ADD FAILGROUP controller2 DISK '/dev/sdd2' NAME sdd2; SQL> select name,path,state,total_mb,free_mb,failgroup from v$asm_disk NAME PATH TOTAL_MB FREE_MB FAILGROUP SDD1 /dev/sdd1 109 107 CONTROLLER1 SDD2 /dev/sdd2 109 107 CONTROLLER2 DSKGRP1_0000 /dev/sde1 980 638 CONTROLLER1 DSKGRP1_0001 /dev/sde2 980 636 CONTROLLER1 DSKGRP1_0002 /dev/sde3 980 632 CONTROLLER1 DSKGRP1_0003 /dev/sde4 980 632 CONTROLLER1 DSKGRP1_0004 /dev/sdf1 980 628 CONTROLLER2 DSKGRP1_0005 /dev/sdf2 980 638 CONTROLLER2 DSKGRP1_0006 /dev/sdf3 980 636 CONTROLLER2 - 25 -

DSKGRP1_0007 /dev/sdf4 980 636 CONTROLLER2 可以看到这些磁盘上初了写入部分头信息后,空间几乎没有使用。

7.3 手工做一次REBALANCE

SQL> ALTER DISKGROUP DSKGRP1 REBALANCE POWER 2 WAIT; 再查看磁盘状态

SQL> select name,path,total_mb,free_mb,failgroup from v$asm_disk NAME PATH TOTAL_MB FREE_MB FAILGROUP SDD1 /dev/sdd1 109 67 CONTROLLER1 SDD2 /dev/sdd2 109 67 CONTROLLER2 DSKGRP1_0000 /dev/sde1 980 646 CONTROLLER1 DSKGRP1_0001 /dev/sde2 980 644 CONTROLLER1 DSKGRP1_0002 /dev/sde3 980 645 CONTROLLER1 DSKGRP1_0003 /dev/sde4 980 643 CONTROLLER1 DSKGRP1_0004 /dev/sdf1 980 644 CONTROLLER2 DSKGRP1_0005 /dev/sdf2 980 645 CONTROLLER2 DSKGRP1_0006 /dev/sdf3 980 644 CONTROLLER2 DSKGRP1_0007 /dev/sdf4 980 645 CONTROLLER2 具体比较发现每块盘上的数据量真正发生了变化。说明ASM确实做了数据的重新分布。

8 ASM数据镜像的功能

前面提到了ASM提供镜像功能,那么在实际工作中是不是这么回事呢?下面做一个测试。 破坏一个磁盘数据

- 26 -

[oracle1@server orainstall]$ dd if=README.html of=/dev/sde1 216+1 records in 216+1 records out 查看磁盘状态

SQL> select name,path,total_mb,free_mb,failgroup from v$asm_disk NAME PATH TOTAL_MB FREE_MB FAILGROUP -------------------- -------------------- ---------- ---------- ------------------------------ SDD1 /dev/sdd1 109 67 CONTROLLER1 SDD2 /dev/sdd2 109 67 CONTROLLER2 SDE1 /dev/sde1 980 0 DSKGRP1_0001 /dev/sde2 980 643 CONTROLLER1 DSKGRP1_0002 /dev/sde3 980 645 CONTROLLER1 DSKGRP1_0003 /dev/sde4 980 644 CONTROLLER1 DSKGRP1_0004 /dev/sdf1 980 644 CONTROLLER2 DSKGRP1_0005 /dev/sdf2 980 645 CONTROLLER2 DSKGRP1_0006 /dev/sdf3 980 644 CONTROLLER2 DSKGRP1_0007 /dev/sdf4 980 645 CONTROLLER2 确定/dev/sde1确实已经被破坏,手工再做一次REBALANCE

SQL> ALTER DISKGROUP DSKGRP1 REBALANCE POWER 2 NOWAIT; SQL> select name,path,total_mb,free_mb,failgroup from v$asm_disk NAME PATH TOTAL_MB FREE_MB FAILGROUP -------------------- -------------------- ---------- ---------- ------------------------------ SDD1 /dev/sdd1 109 67 CONTROLLER1 SDD2 /dev/sdd2 109 67 CONTROLLER2 SDE1 /dev/sde1 980 0 DSKGRP1_0001 /dev/sde2 980 643 CONTROLLER1 DSKGRP1_0002 /dev/sde3 980 645 CONTROLLER1

- 27 -

DSKGRP1_0003 /dev/sde4 980 644 CONTROLLER1 DSKGRP1_0004 /dev/sdf1 980 644 CONTROLLER2 DSKGRP1_0005 /dev/sdf2 980 645 CONTROLLER2 DSKGRP1_0006 /dev/sdf3 980 644 CONTROLLER2 DSKGRP1_0007 /dev/sdf4 980 645 CONTROLLER2 查看数据文件的状态

SQL> select name,status from v$datafile NAME STATUS +DSKGRP1/ora10g/datafile/system.259.647726825 SYSTEM +DSKGRP1/ora10g/datafile/undotbs.260.647726825 ONLINE +DSKGRP1/ora10g/datafile/sysaux.258.647726823 ONLINE +DSKGRP1/ora10g/datafile/users.261.647726827 ONLINE +DSKGRP1/ora10g/datafile/test.262.647726933 ONLINE +DSKGRP1/ora10g/datafile/tspace1.263.647726977 ONLINE 可以看到虽然/dev/sde1数据头被覆盖后,ASM不能正常识别该文件,认为其是一个新的文件,可以通过手工重新添加该文件

SQL> alter diskgroup DSKGRP1 DROP DISK sde1; 这里注意,如果将asm_power_limit设置为0后,磁盘数据库不能rebalance,所以从v$asm_disk里还能看到sde1这块盘,如果手工调用ALTER DISKGROUP DSKGRP1 REBALANCE POWER 2 NOWAIT后,数据进行平均分布,该盘才能从磁盘组中删除。 SQL> ALTER DISKGROUP DSKGRP1 ADD FAILGROUP controller1 DISK '/dev/sde1' NAME newsde1; Sql> ALTER DISKGROUP DSKGRP1 REBALANCE POWER 2 NOWAIT; SQL> select * from v$asm_operation; GROUP_NUMBER OPERA STAT POWER ACTUAL SOFAR EST_WORK EST_RATE EST_MINUTES ------------ ----- ---- ---------- ---------- ---------- ---------- ---------- ----------- 1 REBAL RUN 2 2 60 802 176 4 - 28 -

9 迁移控制文件(Note:345180.1)

创建一个DSKSYSGRP1磁盘组,将控制文件迁移到该磁盘组上

vmware-vdiskmanager -c -s 2Gb -a lsilogic -t 3 \vmware-vdiskmanager -c -s 2Gb -a lsilogic -t 3 \vmware-vdiskmanager -c -s 2Gb -a lsilogic -t 3 \vmware-vdiskmanager -c -s 2Gb -a lsilogic -t 3 \vmware-vdiskmanager -c -s 2Gb -a lsilogic -t 3 \vmware-vdiskmanager -c -s 2Gb -a lsilogic -t 3 \vmware-vdiskmanager -c -s 2Gb -a lsilogic -t 3 \vmware-vdiskmanager -c -s 2Gb -a lsilogic -t 3 \vmware-vdiskmanager -c -s 2Gb -a lsilogic -t 3 \vmware-vdiskmanager -c -s 2Gb -a lsilogic -t 3 \

chown -R oracle:dba /dev/sdc chown -R oracle:dba /dev/sdd chown -R oracle:dba /dev/sde chown -R oracle:dba /dev/sdf chown -R oracle:dba /dev/sdg chown -R oracle:dba /dev/sdh chown -R oracle:dba /dev/sdi chown -R oracle:dba /dev/sdj chown -R oracle:dba /dev/sdk chown -R oracle:dba /dev/sdl

CREATE DISKGROUP DSKSYSGRP1 NORMAL REDUNDANCY FAILGROUP controller1 DISK '/dev/sdc',

- 29 -

FAILGROUP controller2 DISK '/dev/sdd';

9.1 Duplicating a controlfile into ASM when original controlfile

is stored on a file system

SQL> select name from v$controlfile; NAME

------------------------------------------------------------ /oradata/orcl/control01.ctl /oradata/orcl/control02.ctl /oradata/orcl/control03.ctl

SQL> shutdown immediate; SQL> startup nomount;

[oracle@server1 ~]$ rman nocatalog RMAN> connect target

RMAN> restore controlfile to '+DSKSYSGRP1' from '/oradata/orcl/control01.ctl'; [oracle@server1 ~]$ export ORACLE_SID=+ASM1 [oracle@server1 ~]$ asmcmd ASMCMD> cd DSKSYSGRP1

ASMCMD> find -t controlfile . *

+DSKSYSGRP1/ORCL/CONTROLFILE/current.256.667654799

[oracle@server1 ~]$ export ORACLE_SID=orcl1 [oracle@server1 ~]$ sqlplus \alter

system

set

control_files='+DSKSYSGRP1/ORCL/CONTROLFILE/current.256.667654799'

scope=spfile sid='*'; SQL> show parameter control

- 30 -

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------ control_file_record_keep_time integer 7 control_files string

/oradata/orcl/control01.ctl, /oradata/orcl/control02.ctl, /oradata/orcl/control03.ctl SQL> shutdown immediate; SQL> startup nomount;

SQL> show parameter control_files

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------ control_files string +DSKSYSGRP1/orcl/controlfile/c urrent.256.667654799 SQL> alter database mount; SQL> alter database open;

9.2 Duplicating a controlfile into file system when original

controlfile is stored on ASM

SQL> select name from v$controlfile; NAME

-------------------------------------------------------------------------------- +DSKSYSGRP1/orcl/controlfile/current.256.667654799 +DSKSYSGRP1/orcl/controlfile/current.257.667656389

SQL> alter system set control_files='/oradata/orcl/control01.ctl','/oradata/orcl/control02.ctl ', '/oradata/orcl/control03.ctl' scope=spfile sid='*'; SQL> shutdown immediate; SQL> startup nomount;

- 31 -

SQL> show parameter contro

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------ control_file_record_keep_time integer 7

control_files string /oradata/orcl/control01.ctl, / oradata/orcl/control02.ctl , / oradata/orcl/control03.ctl [oracle@server1 ~]$ rman nocatalog RMAN> connect target

RMAN> restore controlfile from '+DSKSYSGRP1/orcl/controlfile/current.256.667654799'; Starting restore at 02-NOV-08 using channel ORA_DISK_1

channel ORA_DISK_1: copied control file copy output filename=/oradata/orcl/control01.ctl output filename=/oradata/orcl/control02.ctl output filename=/oradata/orcl/control03.ctl Finished restore at 02-NOV-08

RMAN> sql 'alter database mount'; RMAN> sql 'alter database open'; SQL> select name from v$controlfile; NAME

-------------------------------------------------------------------------------- /oradata/orcl/control01.ctl /oradata/orcl/control02.ctl /oradata/orcl/control03.ctl SQL> shutdown immediate; SQL> startup

- 32 -

9.3 Duplicating a controlfile into ASM when original controlfile

is stored on ASM

SQL> select name from v$controlfile; NAME

-------------------------------------------------------------------------------- +DSKSYSGRP1/orcl/controlfile/current.256.667654799 SQL>

alter

system

set

control_files='+DSKSYSGRP1/orcl/controlfile/current.256.667654799','+DSKSYSGRP1' scope=spfile sid='*';

SQL> shutdown immediate; SQL> startup nomount;

[oracle@server1 ~]$ rman nocatalog RMAN> connect target

RMAN> restore controlfile from '+DSKSYSGRP1/orcl/controlfile/current.256.667654799'; Starting restore at 09-OCT-08 allocated channel: ORA_DISK_1

channel ORA_DISK_1: sid=150 instance=orcl1 devtype=DISK channel ORA_DISK_1: copied control file copy

output filename=+DSKSYSGRP1/orcl/controlfile/current.256.667654799 output filename=+DSKSYSGRP1/orcl/controlfile/current.257.667656389 Finished restore at 09-OCT-08 RMAN> sql 'alter database mount'; RMAN> sql 'alter database open; SQL> select name from v$controlfile; NAME

-------------------------------------------------------------------------------- +DSKSYSGRP1/orcl/controlfile/current.256.667654799 +DSKSYSGRP1/orcl/controlfile/current.257.667656389

- 33 -

sql>

alter

system

set

control_files='+DSKSYSGRP1/orcl/controlfile/current.256.667654799','+DSKSYSGRP1/orcl/controlfile/current.257.667656389' scope=spfile sid='*'; SQL> shutdown immediate; SQL> startup

10 ASMCMD

理解如何使用asmcmd

11 磁盘组损坏模拟

11.1 假设创建一个磁盘组

CREATE DISKGROUP DSKGRP1 EXTERNAL REDUNDANCY DISK '/dev/sdc', '/dev/sdd';

SQL> select name,total_mb,free_mb from v$asm_diskgroup;

NAME TOTAL_MB FREE_MB ------------------------------ ---------- ---------- DSKGRP1 4096 4044

SQL> select name,path,total_mb,free_mb,failgroup from v$asm_disk

NAME PATH TOTAL_MB FREE_MB FAILGROUP /dev/sde 2048 0 /dev/sdf 2048 0 /dev/sdg 2048 0 /dev/sdh 2048 0 /dev/sdi 2048 0 /dev/sdl 2048 0

- 34 -

/dev/sdj 2048 0 /dev/sdk 2048 0

DSKGRP1_0000 /dev/sdc 2048 2021 DSKGRP1_0000 DSKGRP1_0001 /dev/sdd 2048 2023 DSKGRP1_0001

11.2 配置数据库为归档模式

SQL> alter system set db_recovery_file_dest_size=4096M;

SQL> alter system set db_recovery_file_dest='/oradata/flashbackarea'; SQL> shutdown immediate; SQL> startup mount;

SQL> alter database archivelog; SQL> alter database open;

11.3 创建一个表空间

SQL> create tablespace asmtest datafile '+DSKGRP1' size 200M autoextend off;

查看磁盘组使用情况

NAME PATH TOTAL_MB FREE_MB FAILGROUP /dev/sde 2048 0 /dev/sdf 2048 0 /dev/sdg 2048 0 /dev/sdh 2048 0 /dev/sdi 2048 0 /dev/sdl 2048 0 /dev/sdj 2048 0 /dev/sdk 2048 0

DSKGRP1_0000 /dev/sdc 2048 1919 DSKGRP1_0000 DSKGRP1_0001 /dev/sdd 2048 1922 DSKGRP1_0001

- 35 -

11.4 创建部分表

SQL> grant dba to test; SQL> conn test/test

SQL> create table testseg tablespace asmtest as select * from dba_segments tablespace; SQL> select count(*) from testseg; COUNT(*) ---------- 3796

11.5 数据库做备份

[oracle@server1 bdump]$ rman target / nocatalog RMAN> CONFIGURE CONTROLFILE AUTOBACKUP on; run {

allocate channel 'dev_1' type disk; backup incremental level 0 tag node1_full_back_sun

(database include current controlfile channel 'dev_1'); sql 'alter system archive log current'; backup

(archivelog until time 'SYSDATE' delete input channel 'dev_1'); release channel 'dev_1'; }

11.6 使用kfed实用程序来查看ASM Disk header

cd $ORACLE_HOME/rdbms/lib make -f ins_rdbms.mk ikfed

- 36 -

kfed read /dev/sdc text=/tmp/sdc1.out

我们来破坏一个磁盘设备

有时候一个ASM Disk由于故障,导致我们删也删不掉,加也加不进去,通常现象是磁盘的header status状态不正确但是disk header中仍然保留了部分磁盘组的信息。此时我们就需要clear这个磁盘,然后再将它重新加入磁盘组中。

[oracle@server1 tmp]$ dd if=/dev/zero of=/dev/sdc bs=8k count=100000 [oracle@server1 tmp]$ kfed read /dev/sdc text=/tmp/sdc2.out

比较两个文件内容

SQL> drop tablespace asmtest including contents and datafiles; drop tablespace asmtest including contents and datafiles *

ERROR at line 1:

ORA-01122: database file 10 failed verification check

ORA-01110: data file 10: '+DSKGRP1/orcl/datafile/asmtest.256.669772693' ORA-01251: Unknown File Header Version read for file number 10 SQL> select file#,recover,error from v$datafile_header;

FILE# REC ERROR

---------- --- ----------------------------------------------------------------- 1 NO 2 NO 3 NO

- 37 -

4 NO 5 NO 6 NO 7 NO 8 NO 9 NO

10 WRONG FILE TYPE

SQL> ALTER DISKGROUP DSKGRP1 drop disk 'DSKGRP1_0000';

SQL> alter database datafile '+DSKGRP1/orcl/datafile/asmtest.256.669772693' offline; [oracle@server1 ~]$ rman target / nocatalog RMAN> restore datafile 10; RMAN> recover datafile 10;

SQL> select file_name from dba_data_files;

FILE_NAME

-------------------------------------------------------------------------------- /oradata/orcl/system01.dbf /oradata/orcl/undotbs01.dbf /oradata/orcl/sysaux01.dbf /oradata/orcl/undotbs02.dbf /oradata/orcl/users01.dbf /oradata/orcl/tbsdata101.dbf /oradata/orcl/tbsdata201.dbf /oradata/orcl/tbsdata301.dbf /oradata/orcl/tbsdata401.dbf

+DSKGRP1/orcl/datafile/asmtest.256.669775875

SQL> alter database datafile '+DSKGRP1/orcl/datafile/asmtest.256.669775875' online;

- 38 -

12 解决一个ORA-15063问题

先前通过dd命令破坏了一个磁盘设备信息。

[oracle@server1 tmp]$ dd if=/dev/zero of=/dev/sdc bs=8k count=100000

创建了磁盘组DSKGRP1使用了设备/dev/sdc,/dev/sdd,由于/dev/sdc被破坏,在MOUNT磁盘组的时候报下列错误

SQL> alter diskgroup dskgrp1 mount; alter diskgroup dskgrp1 mount *

ERROR at line 1:

ORA-15032: not all alterations performed

ORA-15063: ASM discovered an insufficient number of disks for diskgroup \

表空间asmtest使用了DSKGRP1,查询时报下列错误

SQL> conn test/test Connected.

SQL> select * from testseg; select * from testseg * ERROR at line 1:

ORA-01115: IO error reading block from file 10 (block # 81)

ORA-01110: data file 10: '+DSKGRP1/orcl/datafile/asmtest.256.669775875' ORA-15078: ASM diskgroup was forcibly dismounted

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

- 39 -

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

13 参数考虑

db_cache_size shared_pool large_pool processes = 25 + (10 + [max number of concurrent database file creations,and file extend operations possible])*n 14 如何使用kfed

14.1 prepare

参考文档284646.1,417687.1,553639.1,551257.1

为了进一步了解asm内部结构,这里简单介绍学习下kfed的时候和分析kfed分析结果

编译kfed

cd $ORACLE_HOME/rdbms/lib make -f ins_rdbms.mk ikfed

select name,path,total_mb,free_mb,failgroup from v$asm_disk order by name

查询有哪些磁盘

SQL> select name,path,total_mb,free_mb,failgroup from v$asm_disk order by name;

[oracle@server1 lib]$ which kfed

~/app/oracle/product/10.2.0/db_1/bin/kfed

读取磁盘头信息

- 40 -

本文来源:https://www.bwwdw.com/article/9w37.html

Top