熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

創建Oracle10gASM數據庫

2013-11-13 15:43:11  來源: Oracle 
概述

  在真正的海量數據庫環境中DBA可能會花費很多的時間來作磁盤管理比如一個表空間將占滿整個磁盤DBA就需要再添加一塊磁盤到操作系統中然後再在新的磁盤上創建新的數據文件如果是單個磁盤這倒不是很繁瑣問題是如果原先我們使用的是RAID或者說是LVM那麼現在大量的數據仍然是分布在以前的那些磁盤上如果我們想讓這些數據均勻地分布在以前的磁盤和新增加的磁盤上我們可能就要耗費一天甚至幾天的時間來作原先數據的導出導入那麼如果有一種方法能實現我們就把一塊磁盤加到系統裡然後告訴Oracle我們要用這塊盤了剩下的工作全部由Oracle來完成該是多好的一件事情!幸運的是Oracleg已經提供了這個功能這就是ASM(Automatic Storage Management)我們稱為自動存儲管理Oracleg的ASM不但幫助DBA從繁瑣的磁盤空間管理中解脫出來而且更值得關注的是ASM同時提供了條帶和鏡像的功能而這些功能原先需要通過單獨地配置RAID來實現

  本文通過vmware安裝RHEL + Oracleg來體驗ASM數據庫的強大功能為什麼要使用vmware?因為在vmware中我們可以隨意地添加或者刪除虛擬磁盤(Virtual Disk)這樣可以更方便地測試ASM數據庫我想不是誰都可以順手抓出五六塊硬盤來作這樣的測試的J

   

硬件配置

  IBM R GC

  迅馳GG內存G硬盤

   

軟件配置

  WindowsXP Pro SPVMware GSX Server RHELOracleg for Linux

   

安裝VMware

  這一步就不多說了我安裝的是VMware GSX Server沒有測試過VMware Workstation所以不保證可以實現本文中的步驟

   

在VMware中安裝RHEL

  <![if !supportLists]>.   <![endif]>安裝RHEL

  這個過程也不多說了跟實際環境中安裝RHEL一樣值得注意的是由於通過Vmware所以可能在安裝時無法正常啟動Xwindow那麼在字符界面下安裝就可以了安裝完畢重新啟動系統Xwindow會自動啟動的記住安裝所有的開發包即可這將會盡量避免以後可能出現的link錯誤我的測試環境中給了RHEL總共M的內存

   

  <![if !supportLists]>.   <![endif]>添加塊虛擬磁盤

  按照如下操作在虛擬機的屬性中選擇添加硬件然後添加一個Virtual Disk

  下一步由於我們創建的虛擬磁盤只是用來放置Oracle的數據文件而且我們將使用ASM中的failgroup的條帶功能所以設置最大size是G就足夠了

  

  下一步指定虛擬磁盤文件的名稱和存放位置默認存放在虛擬機的相同目錄下這裡我們指定文件名為physical

  

  點擊Advanced按鈕設置虛擬磁盤的物理掛載點通常我們選擇和虛擬機已有的系統盤在不同的SCSI端口上比如我們虛擬機的系統盤是SCSI:那麼就設置這個磁盤為SCSI:即將添加的另外三塊磁盤依次為SCSI:SCSI:和SCSI:

  

  由於Virtual Disk的特點在新創建這個磁盤文件的時候並不會用到最大的size所以即使整個分區的空閒容量沒有G(我們要創建個最大size是G的虛擬磁盤)也不會有問題虛擬磁盤文件的大小是隨著需要而持續增加的最大增加到指定的max size當然這種特性也就導致了使用Virtual Disk比使用Plain Disk(創建時即占用max size大小的磁盤空間)的I/O效率要低所以如果有足夠的磁盤空間那麼建議使用Plain Disk創建Plain Disk的方法是在上面的第二步時Allocate all disk space now的復選框前面打勾這樣將會創建一個以pln和dat為擴展名的虛擬磁盤文件Plain Disk的好處還在於可以模擬RAC環境中的共享磁盤這是Virtual Disk無法作到的模擬RAC不在本文敘述的范圍內

   

  <![if !supportLists]>.   <![endif]>更新內核

  >uname a

  RHEL默認安裝的linux內核版本是為了能夠正確的地安裝oracleasm lib我們需要將內核升級到EL否則將無法正常啟用oracleasm

  原因是我們安裝的oracleasmlib是已經編譯好的rpm包而我們當前操作系統的內核必須和編譯時候的系統內核版本一樣否則即使看上去安裝正常但是在啟動oracleasm時候會在/var/log/messages文件中發現類似如下的報錯信息

  kernelmodule version mismatch

  ^I/lib/modules/ELABI/oracleasm/oracleasmo was compiled for kernel version EL ^Iwhile this kernel is version EL

   

  從這個報錯信息中我們也可以知道應該安裝的內核版本為了更確切地知道下載的oracleasm包需要哪個版本的內核我們也可以先下載oracleasm安裝啟動然後查看這個報錯信息之後再升級內核到相應的版本

   

  注意本文中提到的EL內核是本文編寫時oracleasm編譯使用的內核隨著oracle不斷地推出asmlib的新版本需要的內核版本可能也在不斷變化

   

  下載新內核

  kernelELi: pm

   

  安裝新內核

  # rpm –ivh –nodeps kernelELirpm

   

  安裝完畢以後修改/boot/grub/nfrpm安裝完畢以後應該已經自動在nf文件中添加了新版kernel啟動的段落我們需要將default=修改為default=這樣保證每次啟動都用新的內核啟動當測試沒有問題之後我們也可以直接刪除nf文件中的title Red Hat Enterprise Linux AS (EL)部分防止因錯誤操作而使用了原有的系統內核啟動系統

   

  # cat /boot/grub/nf

  # nf generated by anaconda

  #

  # Note that you do not have to rerun grub after making changes to this file

  # NOTICE:  You do not have a /boot partition  This means that

  #          all kernel and initrd paths are relative to / eg

  #          root (hd)

  #          kernel /boot/vmlinuzversion ro root=/dev/sda

  #          initrd /boot/initrdversionimg

  #boot=/dev/sda

  default=

  timeout=

  splashimage=(hd)/boot/grub/splashxpmgz

  title Red Hat Enterprise Linux AS (EL)

  root (hd)

  kernel /boot/vmlinuzEL ro root=LABEL=/

  initrd /boot/initrdELimg

  title Red Hat Enterprise Linux AS (EL)

  root (hd)

  kernel /boot/vmlinuzEL ro root=LABEL=/

  initrd /boot/initrdELimg

   

  修改完畢以後重新啟動系統保證使用了新內核

  # uname –a

  Linux LinuxNode EL # Thu Apr :: EDT i i i GNU/Linux

安裝Oracle ASMLib

  下載ASMLib需要的三個文件

  asmlib:/oracleasmlibirpm

  asmsupport:/oracleasmsupportirpm

  asmkernel:/oracleasmELirpm

   

  如果是多處理器的版本那麼可以下載下面這個文件替換上面的第三個文件

  asmsmpkernel:/oracleasmELsmpirpm

   

  安裝

  $su –

  # rpm Uvh oracleasmsupportirpm \

  oracleasmlibirpm \

  oracleasmELirpm

  

  配置ASMLib

  # /etc/initd/oracleasm configure

  Configuring the Oracle ASM library driver

  

  This will configure the onboot properties of the Oracle ASM library

  driver  The following questions will determine whether the driver is

  loaded on boot and what permissions it will have  The current values

  will be shown in brackets ([])  Hitting  without typing an

  answer will keep that current value  CtrlC will abort

   

  Default user to own the driver interface []: oracle

  Default group to own the driver interface []: dba

  Start Oracle ASM library driver on boot (y/n) [n]: y

  Fix permissions of Oracle ASM disks on boot (y/n) [y]: y

  Writing Oracle ASM library driver configuration               [  OK  ]

  Creating /dev/oracleasm mount point                       [  OK  ]

  Loading module oracleasm                                [  OK  ]

  Mounting ASMlib driver filesystem                           [  OK  ]

  Scanning system for ASM disks                             [  OK  ]

   

  以上操作將加載oracleasmo驅動並且mount上ASM文件系統同時我們可以通過以下命令來手工的卸載和加載ASMLib

  # /etc/initd/oracleasm disable

  Writing Oracle ASM library driver configuration              [  OK  ]

  Unmounting ASMlib driver filesystem                       [  OK  ]

  Unloading module oracleasm                             [  OK  ]

   

  # /etc/initd/oracleasm enable

  Writing Oracle ASM library driver configuration              [  OK  ]

  Loading module oracleasm                                [  OK  ]

  Mounting ASMlib driver filesystem                           [  OK  ]

  Scanning system for ASM disks                             [  OK  ]

   

  如果當前操作系統的內核和編譯ASMLib的內核不同那麼上面的操作將會出錯請檢查/var/log/messages文件確認需要更新的系統內核版本

   

  添加init文件使系統啟動時自動加載ASMLib

  $ su –

  # cd /etc/rcd

  # ln s /initd/oracleasm Soracleasm

  # ln s /initd/oracleasm Koracleasm

   

  注意如果系統啟動是自動進入圖形界面也就是系統的init level是那麼上面生成鏈接的命令應該在/etc/rcd目錄中操作

   

  重新啟動系統確認ASMLib已經可以自動加載

  #lsmod | grep oracleasm

  oracleasm                

   

  #dmesg | grep oracleasm

  ASM: oracleasmfs mounted with options:

   

  創建ASM磁盤

  # /etc/initd/oracleasm createdisk VOL /dev/sdb

  Marking disk /dev/sdb as an ASM disk [  OK  ]

  # /etc/initd/oracleasm createdisk VOL /dev/sdc

  Marking disk /dev/sdc as an ASM disk [  OK  ]

  # /etc/initd/oracleasm createdisk VOL /dev/sdd

  Marking disk /dev/sdd as an ASM disk [  OK  ]

  #/etc/initd/oracleasm createdisk VOL /dev/sde

  Marking disk /dev/sde as an ASM disk [  OK  ]

   

  # /etc/initd/oracleasm listdisks

  VOL

  VOL

  VOL

  VOL

   

  如果要刪除ASM磁盤通過以下命令

  # /etc/initd/oracleasm deletedisk VOL

  Removing ASM disk VOL [  OK  ]

   

  注意如果是在RAC環境中的某一個節點中添加了ASM磁盤那麼需要在其它的節點上運行scandisk來獲取這種變化

  # /etc/initd/oracleasm scandisks

  Scanning system for ASM disks [  OK  ]

   

  詳細的安裝文檔可以通過以下連接查看

  

   

  現在我們已經完成了創建ASM實例的物理基礎下面開始安裝數據庫

   

安裝Oracleg

  在RHEL上安裝Oracleg已經是非常簡單的操作了只要系統內核參數設置正確幾乎不會碰到任何問題

  從以下連接可以得到在RHEL上安裝Oracleg的詳細步驟本文不再贅述

  

   

  在安裝Oracleg的時候我們選擇不創建數據庫只安裝軟件的方式在軟件安裝結束以後再通過dbca來創建ASM實例和數據庫

   

創建ASM實例

  <![if !supportLists]>.  <![endif]>創建初始化文件

  $ su – oracle

  $ cd $ORACLE_HOME/dbs

  $ vi init+ASMora

  創建asm實例的初始化腳本腳本內容如下所示

  # ******Below is init script for asm instance******

  *asm_diskstring=ORCL:VOL*

  *background_dump_dest=/oracle/admin/+ASM/bdump

  re_dump_dest=/oracle/admin/+ASM/cdump

  *instance_type=asm

  *large_pool_size=M

  *remote_login_passwordfile=SHARED

  *user_dump_dest=/oracle/admin/+ASM/udump

  # ******Above is init script for asm instance******

   

  說明

  <![if !supportLists]>.   <![endif]>dump目錄指向$ORACLE_BASE/本文中ASM實例的SID是+ASM最好不要修改這個實例名否則在下一步用dbca創建數據庫的時候dbca將找不到可用的磁盤組我想這應該是dbca的一個bug手工創建ASM類型的數據庫就應該沒有這個限制了

  <![if !supportLists]>.   <![endif]>asm_diskstring用於實例啟動的時候檢查可用的ASM磁盤由於我們前面創建ASM磁盤的名稱是VOL到VOL所以我們此處使用*通配符前面的ORCL:不可以省略否則ASM實例將無法檢查到磁盤

   

  <![if !supportLists]>.  <![endif]>創建密碼文件

  $ su – oracle

  $ cd $ORACLE_HOME/dbs

  $ orapwd file=orapw+ASM password=dba

   

  <![if !supportLists]>.  <![endif]>創建目錄結構

  $ su – oracle

  $ cd $ORACLE_HOME/dbs

  $ mkdir –p $ORALCE_BASE/admin/+ASM/udump

  $ mkdir –p $ORALCE_BASE/admin/+ASM/bdump

  $ mkdir –p $ORALCE_BASE/admin/+ASM/cdump

   

  <![if !supportLists]>.  <![endif]>啟動實例

  $ export ORACLE_SID=+ASM

  $ sqlplus / as sysdba

  SQL> startup

  ASM instance started

   

  Total System Global Area  bytes

  Fixed Size                   bytes

  Variable Size              bytes

  Database Buffers                  bytes

  Redo Buffers                      bytes

  ORA: no diskgroups mounted

   

  因為我們是首次啟動asm實例還沒有創建diskgroup所以顯示錯誤是正常的

   

  如果啟動實例的時候碰到如下報錯

  ORA: unable to connect to Cluster Manager

  那麼請檢查/etc/inittab文件看看是否有下面這行

  h::respawn:/etc/initd/initcssd run >/dev/null >&

  如果沒有請添加,如果被注釋了請取消注釋。tw.wiNgWit.COM

   

  <!--[if !supportLists]-->5.  <!--[endif]-->創建spfile,重新啟動

  SQL> create spfile from pfile;

  SQL> shutdown immediate;

  SQL> startup;

   

  <!--[if !supportLists]-->6.  <!--[endif]-->創建diskgroup

  SQL> create diskgroup dgroup1 normal redundancy

  2  failgroup fgroup1 disk 'ORCL:VOL1','ORCL:VOL2'

  3  failgroup fgroup2 disk 'ORCL:VOL3','ORCL:VOL4';

   

  Diskgroup created.

   

  SQL> col name for a10

  SQL> select name,state from v$asm_diskgroup;

   

  NAME       STATE

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

  DGROUP1    MOUNTED

   

  如果上述命令返回的state是DISMOUNTED,那麼我們需要手工將掛載diskgroup

  SQL> ALTER DISKGROUP dgroup1 MOUNT;

   

  Diskgroup altered.

   

  此時檢查數據庫初始化參數,發現asm_diskgroups參數值已經自動設置為DGROUP1,這表明在下次啟動asm實例的時候,這個diskgroup會被自動掛載。

  SQL> col name for a10

  SQL> col type for a10

  SQL> col value for a20

  SQL> show parameter asm_diskgroups

   

  NAME                                 TYPE       VALUE

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

  asm_diskgroups                       string     DGROUP1

   

  如果要卸載diskgroup,使用下面的命令:

  ALTER DISKGROUP ALL DISMOUNT;

   

   

創建ASM數據庫

  用dbca創建數據庫,一直到選擇數據類型的畫面以前都跟創建普通數據庫沒有區別。

  下面是dbca創建數據庫的第6步畫面,普通的數據庫我們通常選擇File System,而ASM類型的數據庫我們則要選擇“Automatic Storage Management”。


下一步,oracle將自動檢查出已經加載的Diskgroup,在這個界面我們可以通過Create New按鈕創建新的Diskgroup,也可以通過Add Disks按鈕向當前的磁盤組中添加額外的磁盤,當然這些磁盤必須是先用oracleasm createdisk過的(在第4章節的創建ASM磁盤部分有所敘述)。



在數據文件的位置管理設定界面,通常應該使用OMF,由oracle自己管理數據文件的命名,這樣才算是進一步解放了DBA對於物理存儲方面的繁瑣工作。



  繼續往下的步驟,跟創建普通數據庫已經沒有什麼區別了。不再贅述。

   

啟動ASM數據庫的步驟

  由於啟動ASM數據庫必須要先啟動ASM實例,所以基本上啟動步驟如下。

  <!--[if !supportLists]-->1.             <!--[endif]-->以oracle用戶進入操作系統

  <!--[if !supportLists]-->2.             <!--[endif]-->$ export ORACLE_SID=+ASM

  <!--[if !supportLists]-->3.             <!--[endif]-->SQL> sqlplus / as sysdba

  <!--[if !supportLists]-->4.             <!--[endif]-->SQL> startup

  <!--[if !supportLists]-->5.             <!--[endif]-->SQL> exit

  <!--[if !supportLists]-->6.             <!--[endif]-->$ export ORACLE_SID=

  <!--[if !supportLists]-->7.             <!--[endif]-->SQL> sqlplus / as sysdba

  <!--[if !supportLists]-->8.             <!--[endif]-->SQL> startup

   

ASM數據庫的簡單測試

  測試ASM數據庫的automatic rebalance功能

   

  添加兩個虛擬硬盤,分別是sdf和sdg,大小500M

  啟動系統,啟動ASM實例,啟動數據庫實例

   

  創建ASM磁盤

  #/etc/init.d/oracleasm createdisk VOL5 /dev/sdf

  #/etc/init.d/oracleasm createdisk VOL6 /dev/sdg

   

  登入ASM實例檢查v$asm_disk視圖,發現這兩個新加的硬盤已經找到了

  將硬盤添加到磁盤組中

  SQL> ALTER DISKGROUP DGROUP1 ADD FAILGROUP FGROUP1 DISK 'ORCL:VOL5' FAILGROUP FGROUP2 DISK 'ORCL:VOL6';

   

  Diskgroup altered.

   

  檢查數據庫的auto rebalance工作進度,數據庫正在將原來分布在兩個磁盤上的數據平均分配到三個磁盤上

   

  SQL> SELECT group_number, operation, state, est_work, sofar, est_rate, est_minutes FROM v$asm_operation;

   

  GROUP_NUMBER OPERATION  STATE      EST_WORK      SOFAR   EST_RATE EST_MINUTES

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

  1 REBAL      RUN             416          0          0           0

  

  SQL> /

   

  GROUP_NUMBER OPERATION  STATE      EST_WORK      SOFAR   EST_RATE EST_MINUTES

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

  1 REBAL      RUN             275         39        148           1

   

  SQL> /

   

  以上表示數據重新分配的工作已經成功完成

   

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

   

  NAME                           ALLOCATION_UNIT_SIZE   TOTAL_MB

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

  DGROUP1                                     1048576       5120

   

  現在磁盤組空間總共是5120M

   

  登入數據庫實例

  創建一個自己的表空間,創建一個用戶,創建一個表

   

  SQL> create tablespace ts_test datafile '+DGROUP1' size 200M;

   

  Tablespace created.

   

  SQL> create user kamus identified by pass default tablespace ts_test;

   

  User created.

   

  SQL> grant dba to kamus;

   

  Grant succeeded.

   

  SQL> conn kamus/pass

  Connected.

  SQL> create table t_test as select * from dba_objects;

   

  Table created.

   

  SQL> select count(*) from t_test;

   

  COUNT(*)

  ----------

  10319

   

  登入ASM實例,將磁盤從磁盤組中刪除

   

  SQL> alter diskgroup dgroup1 drop disk VOL4;

   

  Diskgroup altered.

   

  SQL> SELECT group_number, operation, state, est_work, sofar, est_rate, est_minutes FROM v$asm_operation;

   

  GROUP_NUMBER OPERATION  STATE      EST_WORK      SOFAR   EST_RATE EST_MINUTES

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

  1 REBAL      RUN             566         46        151           3

   

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

   

  NAME                           ALLOCATION_UNIT_SIZE   TOTAL_MB

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

  DGROUP1                                     1048576       4096

   

  Executed in 0.13 seconds

   

  SQL> select label,failgroup from v$asm_disk;

   

  LABEL                           FAILGROUP

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

  VOL1                            FGROUP1

  VOL2                            FGROUP1

  VOL3                            FGROUP2

  VOL5                            FGROUP1

  VOL6                            FGROUP2

   

  可以看到磁盤組的總容量已經減少了,磁盤數目也減少了

  有些文檔上說刪除了磁盤之後要執行:ALTER DISKGROUP REBALANCE

  但是發現不需要手動執行,整個REBALANCE的工作確實是自動的,當刪除磁盤以後,數據庫自動開始作REBALANCE了

   

  為了兩個FAILGROUP的大小相同,再刪除一個磁盤

   

  SQL> alter diskgroup dgroup1 drop disk VOL2;

   

  Diskgroup altered.

  我們可以從下面的SQL知道在ASM實例中可以查詢到所有可以用的磁盤,而在數據庫實例中只可以查詢到讓自己使用的磁盤

  ASM實例:

  SQL> SELECT disk_number, label FROM V$asm_disk;

   

  DISK_NUMBER LABEL

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

  0 VOL4

  1 VOL2

  0 VOL1

  2 VOL3

  4 VOL5

  5 VOL6

   

  數據庫實例:

  SQL> SELECT disk_number, label FROM V$asm_disk;

   

  DISK_NUMBER LABEL

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

  0 VOL1

  2 VOL3

  4 VOL5

  5 VOL6

   

總結

  通過上面簡單的測試,我們已經可以基本領略到ASM數據庫在數據文件存儲方面的強大功能,歡迎大家對於ASM數據庫進行更深入的討論。

如果有任何問題,可以到的Oracle10g和新技術板塊進行討論,也可以給我發郵件,郵件地址: 。


From:http://tw.wingwit.com/Article/program/Oracle/201311/17190.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.