Oracle ASM 詳解

us_yunleiwang發表於2013-12-05

ASM:Automatic Storage Management是Oracle 主推的一種面向Oracle的儲存解決方案, ASM 和 RDBMS 非常相似,ASM 也是由例項和檔案組成, 也可以透過sqlplus 工具來維護。 

 

 

ASM 例項的建立和刪除也可以用DBCA 這個命令來操作在dbca 的第一個介面選擇配置自動儲存管理就可以了。 ASM 例項需要CSS 程式, 如果是非RAC 環境, 在啟動ASM 例項之前會提示用指令碼 

$ORACLE_HOME/bin/localconfig add 啟動CSS。 

 

 

 

1. ASM 例項由SGA 和後臺程式組成。

 

1.1 SGA 組成:

ASM 例項的SGA包括Buffer Cache, Share Pool, Large Pool等。 需要注意的是Share Pool, 因為Extent Map 要放在這部分的記憶體中,需要更具資料量來估計Extent Map 的大小做相應的調整。 

Extent Map 的大小可以根據所有檔案大小的和來估算,使用下面的語句來計算所有檔案和:

 

Select sum(bytes)/(1024*1024*1024) from v$datafile;

Select sum(bytes)/(1024*1024*1024) from v$logfile a, v$log b where a.Group#=b.Group#;

Select sum(bytes)/(1024*1024*1024) from v$tempfile where status='ONLINE';

 

這3sum 的總和對應著資料庫存放ASM中所有檔案大小總和, 對於使用External Redundancy 的磁碟組, 每100G 需要1MB Extent Map, 根據這個比例計算Extent Map 所需要的空間,在加上額外的2MB就可以了。 在實際工作中一般不需要考慮ASM SGA的配置, 使用Oracle 提供的預設值就可以了。

 

1.2 後臺程式

 

ASM 例項比RDBMS 例項多2個程式: RBAL 和 ABRn

RBAL: 這個程式也叫Rebalancer程式, 負責規劃ASM 磁碟組的Reblance活動。

ABRn:是RBAL程式的子程式,這個程式在數量上可以有多個, n1~9, 這組程式負責真正完成Reblance活動。

 

使用ASM 作為儲存的RDBMS 例項也會多出2個程式: RBAL 和 ASMB

RBAL: 這個程式的主要功能是開啟每個磁碟的所有磁碟和資料的Rebalance

ASMB: 這個程式作為ASM 例項和資料庫例項之間的資訊通道。 這個程式負責與ASM 例項的通訊, 它先利用Diskgroup Name CSS 獲得管理該Diskgroup ASM 例項的連線串, 然後建立到ASM 的持久連線, 兩個例項之間透過這條連線定期交換資訊,同時也是一種心跳機制。

 

RDBMS 例項要想使用ASM 作為儲存, RDBMS 例項必須在啟動時從ASM 例項獲得Extent Map, 以後發生磁碟組的維護操作, ASM 例項還要把Extent Map的更新資訊通知給RDBMS 例項, 這2個例項間的資訊交換就是他你哦剛過ASMB 程式完成的。 這也就為什麼: ASM 例項必須要先於資料庫例項啟動,和資料庫例項同步執行,遲於資料庫例項關閉。

 

 

注意: ASM 例項和資料庫例項的關係可以是11, 也可以是1n。如果是1n, 最好為ASM 安裝單獨的ASM_HOME

 

2. ASM 配置

 

ASM 可以使用裸裝置 或者ASMLib 方式, 因為裸設別的維護比較複雜,在此只講解ASMLib 方式。 

 

對應不同的作業系統, 需要不同的包,下載的時候一定要和作業系統核心一致。 我的作業系統是 Red hat 4 update 7. 核心版本是2.6.9-78.ELSMP

 

oracleasmlib-2.0.4-1.el4.i386.rpm

oracleasm-support-2.1.3-1.el4.i386.rpm

oracleasm-2.6.9-78.EL-2.0.5-1.el4.i686.rpm

 

該頁面有下載地址,注意選擇CPU 型別。 asmlib 和 support,在同一個頁面下載。

 

安裝包:

#rpm -ivh *.rpm

 

安裝完之後進行配置:

#/etc/init.d/oracleasm configure

會有相應的提示, 回答 oracle , dba, y, y 就可以了 

分別對應預設使用者, 預設組,隨系統自啟動, 啟動時設定許可權。

 

/etc/init.d/oracleasm createdisk VOL1 /dev/sdc1 

/etc/init.d/oracleasm scandisks 

/etc/init.d/oracleasm listdisks  

 

關於oracleasm 的更多用法參考help

[root@node1 ~]# /etc/init.d/oracleasm --help

Usage: /etc/init.d/oracleasm {start|stop|restart|enable|disable|configure

             |createdisk|deletedisk|querydisk|listdisks|scandisks|status}

 

 

3. ASM 例項配置

 

3.1 初始化引數

[oracle@node1 bin]$ export ORACLE_SID=+ASM1

[oracle@node1 bin]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Sun Feb 21 19:10:51 2010

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

With the Partitioning, Real Application Clusters, OLAP and Data Mining options

SQL> create pfile from spfile;

File created.

SQL> show parameter asm

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

asm_diskgroups                       string      FLASH_RECOVERY_AREA, DATA

asm_diskstring                       string

asm_power_limit                      integer     1

 

[oracle@node2 dbs]$ pwd

/u01/app/oracle/product/10.2.0/db_1/dbs

[oracle@node2 dbs]$ ls

ab_+ASM2.dat  hc_rac2.dat    initrac2.ora  orapwrac2

hc_+ASM2.dat  init+ASM2.ora  orapw+ASM2

[oracle@node2 dbs]$ more init+ASM1.ora

+ASM2.asm_diskgroups='FLASH_RECOVERY_AREA'#Manual Dismount

+ASM1.asm_diskgroups='FLASH_RECOVERY_AREA','DATA'#Manual Mount

*.asm_diskgroups='FLASH_RECOVERY_AREA','DATA'

*.background_dump_dest='/u01/app/oracle/admin/+ASM/bdump'

*.cluster_database=true

*.core_dump_dest='/u01/app/oracle/admin/+ASM/cdump'

+ASM2.instance_number=2

+ASM1.instance_number=1

*.instance_type='asm'

*.large_pool_size=12M

*.remote_login_passwordfile='exclusive'

*.user_dump_dest='/u01/app/oracle/admin/+ASM/udump'

 

相關說明:

ASM 例項的SGA 需要的記憶體很小, 一般預設值即可, 無需修改。 ASM SGA的預設值如下:

SHARED_POOL_SIZE = 48M

LARGE_POOL_SIZE = 12M

SHARED_POOL_RESERVED_SIZE = 24M

SGA_MAX_SIZE = 88M

  這些預設值可以在sqlplus 中透過show parameter 檢視。

 

Instance_type: 對於ASM 例項, 這個應該設定成ASM, 如果是資料庫例項,則是RDBMS.

DB_UNIQUE_NAME: 這個引數使用預設值+ASM即可

 

 

SQL> show parameter asm_power_limit

NAME            TYPE   VALUE

----------------------- --------- ---------------

asm_power_limit   integer    1

ASM_POWER_LIMIT: 當在磁碟組中新增刪除磁碟時,磁碟組會自動對資料在新舊磁碟間重新分配, 從而實現分散IO, 這個過程就叫再平衡(Rebalance);

 

這個動作會在磁碟間移動資料,因此雖然是聯機操作,仍然會影響部分效能,所以要在系統空閒的時候進行。  該引數控制Rebalance速度, 取值範圍0-11. 最小值代表不做Rebalance, 最大值11 代表最快的速度,也意味著嚴重影響效能, 代表最慢的速度和最小的效能影響。 除了在初始化引數中定義該引數, 也可以在操作時指定。 

 

比如:

SQL> alter diskgroup DATA rebalance power 5;

Disk groups can be rebalanced manually using the REBALANCE clause of the ALTER DISKGROUP statement. If the POWER clause is omitted the ASM_POWER_LIMIT parameter value is used. Rebalancing is only needed when the speed of the automatic rebalancing is not appropriate.

 

ASM_DISKSTRING: 定義哪些磁碟可以被ASM 使用, ASM 例項啟動時就根據這個引數值掃描發現ASM磁碟,配置了這個引數以後,還必須確認ORACLE 使用者對這些磁碟有操作的許可權

1. 如果使用裸裝置, 用逗號分隔每個裝置名:

  Asm_diskstring='/dev/raw/raw1','/dev/raw/raw2','/dev/raw/raw3'

     2. 如果使用ASMLib時,就需要使用"ORCL:磁碟名"

Asm_diskstring='ORCL:VOL1'

     3. 使用ASMLib 時, 也可以使用萬用字元

Asm_diskstring='ORCL:VOL*'

 

ASM_DISKGROUPS: 這個引數用於定義ASM 例項啟動後自動掛載的磁碟組, 如果不自動掛載, 也可以使用命令掛載。

 

注意: ASM 例項啟動即可以透過pfile, 也可以透過spfile,如果使用spfile啟動,那麼如果建立新的磁碟組, 這個引數會被自動修改, 下次啟動時會自動掛載這個新建的磁碟組,如果是使用pfile, 這個引數不會自動更新, 需要手工的更新。

 

3.2 CSS 程式

無論是否在RAC 環境下, ASM 例項都是需要CSS 程式的, 所以,如果是非RAC 環境, 在啟動ASM 例項之前用指令碼 

$ORACLE_HOME/bin/localconfig add 啟動CSS, 否則ASM 例項啟動時會報ORA-29701: unable to connect to Cluster Manager, 並提示執行該指令碼

 

 

3.3 ASM 例項的相關操作

 

ASM 管理 登入啟動關閉:

[oracle@node2 dbs]$ export ORACLE_SID=+ASM2

[oracle@node2 dbs]$ sqlplus / as sysdba

SQL> startup

SQL> shutdown immediate;

 

檢查disk group資訊的SQL

SQL> col state format a10

SQL> col name format a15

SQL> col failgroup format a20  

SQL> set line 200

SQL> select  STATE,REDUNDANCY,TOTAL_MB,FREE_MB,NAME,FAILGROUP

 from v$asm_disk;

SQL>select  GROUP_NUMBER,NAME,STATE,TYPE,TOTAL_MB,FREE_MB,

UNBALANCED  from v$asm_diskgroup;

 

建立新的diskgroup

SQL> create diskgroup dgtest normal redundancy

  2  failgroup DATA1 disk '/dev/oracleasm/VOL5' name DATA1

  3  failgroup DATA2 disk '/dev/oracleasm/VOL6' name DATA2;

 

刪除diskgroup

SQL> drop diskgroup DATA including contents;

 

-- 對於多結點的diskgroup, 只能有在一個asm例項上掛載之後才能被dorp, 其他結點必須dismount

 

手動mount命令

ALTER DISKGROUP ALL DISMOUNT;

ALTER DISKGROUP ALL MOUNT;

ALTER DISKGROUP DATA DISMOUNT;

ALTER DISKGROUP DATA MOUNT;

 

為diskgroup增加disk

SQL> alter diskgroup DATA add disk '/dev/oracleasm/VOL5' name

VOL5,'/dev/oracleasm/VOL6' name VOL6;

 

從diskgroup刪除disk

SQL> alter diskgroup DATA drop disk VOL5;

 

取消刪除disk的命令,只能在上述命令沒執行完成的時候有效

ALTER DISKGROUP DATA UNDROP DISKS;

 

The UNDROP DISKS clause of the ALTER DISKGROUP statement allows pending disk drops to be undone. It will not revert drops that have completed, or disk drops associated with the

dropping of a disk group.

 

 

資料檔案的管理

Aliases allow you to reference ASM files using user-friendly names, rather than the fully

qualified ASM filenames.

 

-- Create an alias using the fully qualified filename.

ALTER DISKGROUP disk_group_1 ADD ALIAS '+disk_group_1/my_dir/my_file.dbf'

  FOR '+disk_group_1/mydb/datafile/my_ts.342.3';

 

-- Create an alias using the numeric form filename.

ALTER DISKGROUP disk_group_1 ADD ALIAS '+disk_group_1/my_dir/my_file.dbf'

  FOR '+disk_group_1.342.3';

 

-- Rename an alias.

ALTER DISKGROUP disk_group_1 RENAME ALIAS '+disk_group_1/my_dir/my_file.dbf'

  TO '+disk_group_1/my_dir/my_file2.dbf';

 

-- Delete an alias.

ALTER DISKGROUP disk_group_1 DELETE ALIAS '+disk_group_1/my_dir/my_file.dbf';

 

-- Drop file using an alias.

ALTER DISKGROUP disk_group_1 DROP FILE '+disk_group_1/my_dir/my_file.dbf';

 

-- Drop file using a numeric form filename.

ALTER DISKGROUP disk_group_1 DROP FILE '+disk_group_1.342.3';

 

-- Drop file using a fully qualified filename.

ALTER DISKGROUP disk_group_1 DROP FILE '+disk_group_1/mydb/datafile/my_ts.342.3';

 

-- create datafile

SQL> create tablespace users2 datafile '+TESTDB_DATA1' size 100m;

 

注意事項: 

1. ASM 例項在配置好並且建立了ASM磁碟組之後,還必須保證已經註冊到Listener後才能在資料庫例項中使用,否則就需要手工註冊ASM 例項:

SQL>alter system register;

2. 一旦資料庫例項使用ASM 作為儲存, 那麼在資料庫例項執行時是無法關閉ASM例項的。 否則會報 ORA-15097cannot SHUTDOWN ASM instance with connected RDBMS instance. 錯誤。

 

4. Oracle 中刪除 ASM 例項

刪除自動儲存管理例項+ASM例項+ASM的刪除是在資料庫被解除安裝之後完成的,並刪除/ORACLE_HOME/dbs目錄下的所有檔案(除了與ASM相關的)。因此必須完成下列步驟:

4.1在命令提示符中,設定oracle_sid環境變數為+ASM例項:
# export oracle_sid=+ASM

4.2啟動SQL*Plus並以sys使用者連線到自動儲存管理+ASM例項:
# sqlplus / as sysdba

4.3使用下列命令來確定是否有資料庫例項正在使用自動儲存管理例項+ASM
SQL>select instance_name from v$asm_client;
該命令結果列出所有正在執行並使用+ASM例項的資料庫例項。只要+ASM包含正在支援的資料庫例項,就不能刪除該+ASM例項。(其實可以先shutdown對應的資料庫例項,然後從asmcmd進入磁碟組所在目錄,刪掉對應的資料庫目錄和檔案就可以了)。

4.4 如果沒有與+ASM相關聯的資料庫例項,則刪除與該例項相關聯的磁碟組。
首先,識別與+ASM相關聯的磁碟組:
SQL>select name from v$asm_diskgroup;
其次,用下列命令刪除每個要刪除的磁碟組:
SQL>drop diskgroupincluding contents;

4.5 關閉+ASM例項並退出SQL*Plus
SQL>shutdown
SQL>exit

4.6 在命令提示符中輸入下列命令,刪除+ASM服務(我沒找到這個命令,所以沒有執行):
oradim -delete -asmsid +ASM

 

 

 

5.  ASMCMD 工具

ASM 例項的管理除了sqlplus, Oracle 還提供了asmcmd 命令, 具體參考help

 

[oracle@node1 bin]$ which asmcmd

/u01/app/oracle/product/10.2.0/db_1/bin/asmcmd

[oracle@node1 bin]$ cd /u01/app/oracle/product/10.2.0/db_1/bin/

[oracle@node1 bin]$ ./asmcmd

ASMCMD> ls

DATA/

FLASH_RECOVERY_AREA/

ASMCMD> help

        asmcmd [-p] [command]

 

        The environment variables ORACLE_HOME and ORACLE_SID determine the

        instance to which the program connects, and ASMCMD establishes a

        bequeath connection to it, in the same manner as a SQLPLUS / AS

        SYSDBA.  The user must be a member of the SYSDBA group.

 

        Specifying the -p option allows the current directory to be displayed

        in the command prompt, like so:

 

        ASMCMD [+DATAFILE/ORCL/CONTROLFILE] >

 

        [command] specifies one of the following commands, along with its

        parameters.

 

        Type "help [command]" to get help on a specific ASMCMD command.

 

        commands:

        --------

        cd

        du

        find

        help

        ls

        lsct

        lsdg

        mkalias

        mkdir

        pwd

        rm

        rmalias

ASMCMD>

 

 

----- 2010年9月23日補充--------

裡面有刪除別名的語法, 現在已經不支援了。 之前沒有測試,寫文章不嚴禁。 在google上搜這個問題的時候,發現有人轉載了我的文章,但是這個錯誤還是沒有發現。

 

剛查閱了一下Oracle 的聯機文件, 刪除別名用的也是drop。

Example 7-5 Dropping an alias name for an Oracle ASM filename

ALTER DISKGROUP data DROP ALIAS '+data/payroll/compensation.dbf';

 

地址:

 

 

這裡面有對ASM 有詳細的說明。 可以參考。

 

 

順便補充一點知識:

 

C:/Users/Administrator.DavidDai>sqlplus /nolog

SQL*Plus: Release 11.2.0.1.0 Production on 星期四 9

Copyright (c) 1982, 2010, Oracle.  All rights reserved

SQL> conn sys/oracle@rac2 as sysdba;

已連線。

SQL> select file_name from dba_data_files;

FILE_NAME

------------------------------------------------------

+DATA/orcl/datafile/users.279.730181053

+DATA/orcl/datafile/sysaux.277.730181053

+DATA/orcl/datafile/undotbs1.278.730181053

+DATA/orcl/datafile/system.276.730181051

+DATA/orcl/datafile/undotbs2.284.730181347

 

 

ASM檔名字的格式是固定的:+group/dbname/file type/tag.file.incarnation

 

在建立db時系統自動建立的幾個表空間(system,undotbs,sysaux,users)對應的都是真實的資料檔案,即ASM 檔案預設的命名格式。而且這個資訊都寫到了控制檔案裡。 如果我們使用別名的話,會方便很多。 對於這些建立資料庫時自動建立的表空間,我們要他們使用別名,除了手工建立對應別名外,還需要重建控制檔案,並且在重建時,datafile 裡寫別名的資訊。 這樣資料庫也就使用別名了。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23490154/viewspace-1062338/,如需轉載,請註明出處,否則將追究法律責任。

相關文章