オラクる。

oracle専門ブログにしてみようかな~っと

2016年09月

ASMのリバランス機能を確認してみましょう。

[oracle@DB01 ~]$ sqlplus / as sysdba

SQL> drop tablespace TBS2 including contents and datafiles;

表領域が削除されました。

[grid@DB01 ~]$ sqlplus / as sysasm

SQL> drop diskgroup DG_HIGH;

Diskgroup dropped.

まずは既に作成してあった高冗長性のASMディスクグループを削除します。
ディスクグループに含まれている表領域も事前に削除しておきます。

set linesize 150 pages 500
col NAME for a12
col HEADER_STATUS for a14
col PATH for a40
select GROUP_NUMBER, DISK_NUMBER, NAME, HEADER_STATUS, PATH
from V$ASM_DISK
where GROUP_NUMBER = 0;

GROUP_NUMBER DISK_NUMBER NAME         HEADER_STATUS  PATH
------------ ----------- ------------ -------------- ----------------------------------------
           0           0              FORMER         /dev/sdg1
           0           3              FORMER         /dev/sdf1
           0           2              FORMER         /dev/sdh1


削除したディスクグループに含まれるディスクのHEADER_STATUSがFORMERに変わりました。
以前ディスクグループに含まれていた名残です。

create diskgroup DG_NORMAL
  normal redundancy
    regular failgroup FG1 disk '/dev/sdf1' name DG_NORMAL_DISK1
    regular failgroup FG2 disk '/dev/sdg1' name DG_NORMAL_DISK2
    regular failgroup FG3 disk '/dev/sdh1' name DG_NORMAL_DISK3
  attribute
    'COMPATIBLE.ASM'   = '11.2.0.2',
    'COMPATIBLE.RDBMS' = '11.2';

Diskgroup created.


そのディスクを利用して新しく標準冗長性のディスクグループを作成します。

set lines 110 pages 500
col NAME for a10
col STATE for a10
col TYPE for a8
col COMPATIBILITY for a15
col DATABASE_COMPATIBILITY for a15
select GROUP_NUMBER,
       NAME,
       TYPE,
       TOTAL_MB,
       FREE_MB,
       HOT_USED_MB + COLD_USED_MB "USED_MB",
       REQUIRED_MIRROR_FREE_MB,
       USABLE_FILE_MB
  from V$ASM_DISKGROUP
 where NAME = 'DG_NORMAL' ;

GROUP_NUMBER NAME       TYPE       TOTAL_MB    FREE_MB    USED_MB REQUIRED_MIRROR_FREE_MB USABLE_FILE_MB
------------ ---------- -------- ---------- ---------- ---------- ----------------------- --------------
           2 DG_NORMAL  NORMAL         3069       2910        159                    1023            943


作成したディスクグループのグループナンバーを確認します。

set lines 110 pages 500
col NAME for a15
col HEADER_STATUS for a14
col PATH for a12
col FAILGROUP for a16
select GROUP_NUMBER, DISK_NUMBER, HEADER_STATUS, PATH, NAME, TOTAL_MB, FREE_MB
  from V$ASM_DISK
 where GROUP_NUMBER = 2
 order by 2 ;

GROUP_NUMBER DISK_NUMBER HEADER_STATUS  PATH         NAME              TOTAL_MB    FREE_MB
------------ ----------- -------------- ------------ --------------- ---------- ----------
           2           0 MEMBER         /dev/sdf1    DG_NORMAL_DISK1       1023        963
           2           1 MEMBER         /dev/sdg1    DG_NORMAL_DISK2       1023        963
           2           2 MEMBER         /dev/sdh1    DG_NORMAL_DISK3       1023        963


確認したグループナンバーをキーにして、ディスクグループに含まれる各ディスクの利用容量を確認します。

create bigfile tablespace TBS3
datafile '+DG_NORMAL(DATAFILE)' size 1200M;


作成したディスクグループに新しく1.2GBの表領域を作成します。

set lines 110 pages 500
col NAME for a15
col HEADER_STATUS for a14
col PATH for a12
col FAILGROUP for a16
select GROUP_NUMBER, DISK_NUMBER, HEADER_STATUS, PATH, NAME, TOTAL_MB, FREE_MB
  from V$ASM_DISK
 where GROUP_NUMBER = 2
 order by 2 ;

GROUP_NUMBER DISK_NUMBER HEADER_STATUS  PATH         NAME              TOTAL_MB    FREE_MB
------------ ----------- -------------- ------------ --------------- ---------- ----------
           2           0 MEMBER         /dev/sdf1    DG_NORMAL_DISK1       1023        161
           2           1 MEMBER         /dev/sdg1    DG_NORMAL_DISK2       1023        161
           2           2 MEMBER         /dev/sdh1    DG_NORMAL_DISK3       1023        162


再度、ディスクの空き容量を確認してみると、均等に減っていることがわかります。
これがリバランスです。
次回はここに新しくディスクを追加したときのリバランスを確認してみます。

作成したASMディスクグループを利用して表領域を作成してみましょう。

[oracle@DB01 ~]$ sqlplus / as sysdba

SQL> CREATE TABLESPACE TBS2 datafile '+DG_NORMAL(DATAFILE)' size 100m;

表領域が作成されました。


ORACLEユーザーでログインし、sqlplusを実行します。
+ドライブグループ名を指定して、表領域を作成します。
カッコ内はASMテンプレートというものです。

set linesize 150
col FILE_NAME for a48
select FILE_NAME, BYTES/1024/1024
  from DBA_DATA_FILES
where TABLESPACE_NAME = 'TBS2';

FILE_NAME                                        BYTES/1024/1024
------------------------------------------------ ---------------
+DG_NORMAL/ORCL2/DATAFILE/tbs2.256.922927853                 100


DATA_FILESビューより表領域がASM上に作成されたことを確認できます。

GROUP_NUMBER NAME       SECTOR_SIZE BLOCK_SIZE ALLOCATION_UNIT_SIZE STATE      TYPE       TOTAL_MB    FREE_MB
------------ ---------- ----------- ---------- -------------------- ---------- -------- ---------- ----------
HOT_USED_MB COLD_USED_MB REQUIRED_MIRROR_FREE_MB USABLE_FILE_MB OFFLINE_DISKS COMPATIBILITY   DATABASE_COMPAT
----------- ------------ ----------------------- -------------- ------------- --------------- ---------------
V     CON_ID
- ----------
           3 DG_NORMAL          512       4096              1048576 CONNECTED  NORMAL         4000       3613
          0          387                    1000           1306             0 11.2.0.2.0      11.2.0.0.0
N          0


改めてディスクグループの使用容量を見ると200MB程度増加していることがわかります。
これは2方向にミラー化されているからです。

[grid@DB01 ~]$ sqlplus / as sysasm

SQL> drop diskgroup DG_NORMAL;

ERROR at line 1:
ORA-15039: diskgroup not dropped
ORA-15053: diskgroup "DG_NORMAL" contains existing files

作成したドライブグループを削除してみましょう。
ファイルが含まれている場合は削除できません。

[oracle@DB01 ~]$ sqlplus / as sysdba

SQL> drop tablespace TBS2;

表領域が削除されました。


作成した表領域を削除すると・・・

[grid@DB01 ~]$ sqlplus / as sysasm

SQL> drop diskgroup DG_NORMAL;

Diskgroup dropped.


ディスクグループも削除できました。

昨日はASMディスクグループ用のディスクを作成しました。
今日はそのディスクを使用してディスクグループを作成してみます。

create diskgroup DG_NORMAL
  normal redundancy
    regular failgroup FG1 disk '/dev/sdf1' name DG_NORMAL_DISK1 size 1000m
    regular failgroup FG2 disk '/dev/sdg1' name DG_NORMAL_DISK2 size 1000m
    regular failgroup FG3 disk '/dev/sdh1' name DG_NORMAL_DISK3 size 1000m
    regular failgroup FG4 disk '/dev/sdi1' name DG_NORMAL_DISK4 size 1000m
  attribute
    'COMPATIBLE.ASM'   = '11.2.0.2',
    'COMPATIBLE.RDBMS' = '11.2';

Diskgroup created.


ASMのインスタンスに接続して、sqlplusからcreate diskgroupを実行します。
normal redundancyを指定しているので2方向にミラーされる指定です。
またfailgroupがそれぞれのディスクで異なるので、1つのディスクに書き込まれれば、残り3つのいずれかにミラーされます。

set lines 110 pages 500
col NAME for a10
col STATE for a10
col TYPE for a8
col COMPATIBILITY for a15
col DATABASE_COMPATIBILITY for a15
select * from V$ASM_DISKGROUP where NAME = 'DG_NORMAL';


GROUP_NUMBER NAME       SECTOR_SIZE BLOCK_SIZE ALLOCATION_UNIT_SIZE STATE      TYPE       TOTAL_MB    FREE_MB
------------ ---------- ----------- ---------- -------------------- ---------- -------- ---------- ----------
HOT_USED_MB COLD_USED_MB REQUIRED_MIRROR_FREE_MB USABLE_FILE_MB OFFLINE_DISKS COMPATIBILITY   DATABASE_COMPAT
----------- ------------ ----------------------- -------------- ------------- --------------- ---------------
V     CON_ID
- ----------
           3 DG_NORMAL          512       4096              1048576 MOUNTED    NORMAL         4000       3839
          0          161                    1000           1419             0 11.2.0.2.0      11.2.0.0.0
N          0


作成したディスクグループをV$ASM_DISKGROUPビューで確認します。
全体の容量と使用容量がわかります。

set linesize 150 pages 500
col NAME for a20
col HEADER_STATUS for a14
col PATH for a40
select GROUP_NUMBER, DISK_NUMBER, NAME, HEADER_STATUS, PATH
from V$ASM_DISK
where GROUP_NUMBER = 3;

GROUP_NUMBER DISK_NUMBER NAME                 HEADER_STATUS  PATH
------------ ----------- -------------------- -------------- ----------------------------------------
           3           3 DG_NORMAL_DISK4      MEMBER         /dev/sdi1
           3           2 DG_NORMAL_DISK3      MEMBER         /dev/sdh1
           3           1 DG_NORMAL_DISK2      MEMBER         /dev/sdg1
           3           0 DG_NORMAL_DISK1      MEMBER         /dev/sdf1


V$ASM_DISKビューからHEADER_STATUSがCANDIDATEからMEMBERに変わっていることがわかります。

次回はこのディスクグループを利用してファイルを作成してみます。

ASMのディスクグループを作成してみましょう。
今回は仮想環境としてvSphereを利用しています。

000002

1GのVMFSを4個作成しました。

[root@DB01 ~]# fdisk -l



ディスク /dev/sdf: 1073 MB, 1073741824 バイト
ヘッド 34, セクタ 61, シリンダ 1011
Units = シリンダ数 of 2074 * 512 = 1061888 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00000000


ディスク /dev/sdh: 1073 MB, 1073741824 バイト
ヘッド 34, セクタ 61, シリンダ 1011
Units = シリンダ数 of 2074 * 512 = 1061888 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00000000


ディスク /dev/sdi: 1073 MB, 1073741824 バイト
ヘッド 34, セクタ 61, シリンダ 1011
Units = シリンダ数 of 2074 * 512 = 1061888 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00000000


ディスク /dev/sdg: 1073 MB, 1073741824 バイト
ヘッド 34, セクタ 61, シリンダ 1011
Units = シリンダ数 of 2074 * 512 = 1061888 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00000000


作成したVMFSが新しいディスクと認識されていることをfdisk -lコマンドで確認します。

[root@DB01 ~]# fdisk /dev/sdf
デバイスは正常な DOS 領域テーブルも、Sun, SGI や OSF ディスクラベルも
含んでいません
新たに DOS ディスクラベルをディスク識別子 0xcd9b3e15 で作成します。
あなたが書き込みを決定するまで、変更はメモリ内だけに残します。
その後はもちろん以前の内容は修復不可能になります。
警告: 領域テーブル 4 の不正なフラグ 0x0000 は w(書き込み)によって
正常になります

警告: DOS互換モードは廃止予定です。このモード (コマンド 'c') を止めることを
      強く推奨します。 and change display units to
         sectors (command 'u').

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本パーティション (1-4)
p
パーティション番号 (1-4): 1
最初 シリンダ (1-1011, 初期値 1):
初期値 1 を使います
Last シリンダ, +シリンダ数 or +size{K,M,G} (1-1011, 初期値 1011):
初期値 1011 を使います

コマンド (m でヘルプ): w
パーティションテーブルは変更されました!

ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。


それぞれのディスクに対して、fdiskコマンドを利用して、新規パーティションを作成します。

[root@DB01 ~]# cat /etc/udev/rules.d/99-oracle.rules
KERNEL=="sd[b-z]1",ACTION=="add|change",OWNER="grid",GROUP="asmadmin",MODE="0660"

デバイスルールから、今回作成したディスクのパーティションが含まれているかを確認します。

[root@DB01 ~]# udevadm control --reload-rules

[root@DB01 ~]# start_udev
udev を起動中:                                             [  OK  ]

[root@DB01 ~]# ls -al /dev/sd*



brw-rw---- 1 root disk     8,  80  9月 17 01:42 2016 /dev/sdf
brw-rw---- 1 grid asmadmin 8,  81  9月 17 01:42 2016 /dev/sdf1
brw-rw---- 1 root disk     8,  96  9月 17 01:42 2016 /dev/sdg
brw-rw---- 1 grid asmadmin 8,  97  9月 17 01:42 2016 /dev/sdg1
brw-rw---- 1 root disk     8, 112  9月 17 01:42 2016 /dev/sdh
brw-rw---- 1 grid asmadmin 8, 113  9月 17 01:42 2016 /dev/sdh1
brw-rw---- 1 root disk     8, 128  9月 17 01:42 2016 /dev/sdi
brw-rw---- 1 grid asmadmin 8, 129  9月 17 01:42 2016 /dev/sdi1


startudevでルールを適用し、デバイスの権限情報が正しくなっていることを確認します。

[root@DB01 ~]# su - grid
[grid@DB01 ~]$ ps -ef | grep [a]sm_pmon
grid      3030     1  0 01:36 ?        00:00:00 asm_pmon_+ASM

[grid@DB01 ~]$ sqlplus / as sysasm

SQL*Plus: Release 12.1.0.2.0 Production on Sat Sep 17 01:51:17 2016

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


Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Automatic Storage Management option

SQL> set linesize 150 pages 500
SQL> col NAME for a12
SQL> col HEADER_STATUS for a14
SQL> col PATH for a40
SQL> select GROUP_NUMBER, DISK_NUMBER, NAME, HEADER_STATUS, PATH
  2  from V$ASM_DISK
  3  where GROUP_NUMBER = 0;

GROUP_NUMBER DISK_NUMBER NAME         HEADER_STATUS  PATH
------------ ----------- ------------ -------------- --------------------
           0           0              CANDIDATE      /dev/sdg1
           0           3              CANDIDATE      /dev/sdi1
           0           2              CANDIDATE      /dev/sdf1
           0           1              CANDIDATE      /dev/sdh1


gridユーザーにsuし、sqlplusコマンドから、作成したディスクがASMの候補ディスクとなっていることを確認します。
これでASMのディスクグループを作成する準備が整いました。

ACFSとは「Oracle自動ストレージ管理クラスタ・ファイルシステム」のことで、簡単に言えばASMを利用したoracle独自のファイルシステムです。
ASMの利点を活かしながら、extのような使い慣れたファイルシステムを利用することが出来ます。

[root@DB01 ~]# lsmod | grep oracle
oracleacfs           3484641  0
oracleadvm            624264  0
oracleoks             514812  2 oracleacfs,oracleadvm


acfsのドライバが読み込みまれていることを確認します。

[grid@DB01 grid]$ asmcmd
ASMCMD> ls
DATA/
FRA/


gridのユーザーでasmのコマンドラインに入ります。

ASMCMD> volcreate -G data -s 1G volume10

ドライブグループのDATAに対して1Gのボリュームを作成します。

ASMCMD> volinfo -G data volume10
Diskgroup Name: DATA

         Volume Name: VOLUME10
         Volume Device: /dev/asm/volume10-306
         State: ENABLED
         Size (MB): 1024
         Resize Unit (MB): 64
         Redundancy: MIRROR
         Stripe Columns: 8
         Stripe Width (K): 1024
         Usage:
         Mountpath:


作成したボリュームの情報はvolinfoコマンドで確認できます。

SQL> column VOLUME_DEVICE format a20
SQL> SELECT volume_name,volume_device FROM v$asm_volume
  2  WHERE volume_name='VOLUME10';


VOLUME_NAME                    VOLUME_DEVICE
------------------------------ --------------------
VOLUME10                       /dev/asm/volume10-306


さらに、v$asm_volumeビューからも作成したボリュームを確認できます。

[grid@DB01 grid]$ mkfs -t acfs /dev/asm/volume10-306
mkfs.acfs: version                   = 12.1.0.2.0
mkfs.acfs: on-disk version           = 39.0
mkfs.acfs: volume                    = /dev/asm/volume10-306
mkfs.acfs: volume size               = 1073741824  (   1.00 GB )
mkfs.acfs: Format complete.


[root@DB01 ~]# mount -t acfs /dev/asm/volume10-306 /u01/app/acfsmounts/myacfs


extのようにファイルシステムを作成して、マウントします。

[root@DB01 ~]# chown -R grid:oinstall /u01/app/acfsmounts/myacfs

[root@DB01 ~]# su - grid
[grid@DB01 ~]$ echo "test" > /u01/app/acfsmounts/myacfs/myfile
[grid@DB01 ~]$ cat /u01/app/acfsmounts/myacfs/myfile
test


適切な権限を設定して、ファイルの書き込みを行ってみます。
見た目はextのファイルシステムと変わりません。

[grid@DB01 ~]$ acfsutil snap create mysnapshot_20160915 /u01/app/acfsmounts/myacfs
acfsutil snap create: Snapshot operation is complete.


acfsらしいことを1つ
作成したボリュームのスナップショットを作成します。

[grid@DB01 ~]$ echo "test_after" > /u01/app/acfsmounts/myacfs/myfile
[grid@DB01 ~]$ cat /u01/app/acfsmounts/myacfs/myfile
test_after


ボリューム内のファイルを更新します。

[grid@DB01 ~]$ cat /u01/app/acfsmounts/myacfs/.ACFS/snaps/mysnapshot_20160915/myfile
test


スナップショット内のファイルは変更されていないことを確認できました。

このページのトップヘ