このブログを検索

2011年6月15日水曜日

ASMディスクグループの容量や使用率を調べる

v$asm_diskgroupでディスクグループの情報を得られます。
RATIOが一定量を超えないように監視スクリプトを作成しています。
set pages 10000
set linesize 100
col name format a20
col total_mb for 999,999,999
col free_mb for 999,999,999
col ratio for 999.99
col state for a10
select group_number, name, total_mb, free_mb,
  round(((total_mb-free_mb)/total_mb)*100 ,2) as ratio,
  state
from v$asm_diskgroup;
実行結果は次の通り。
GROUP_NUMBER NAME                     TOTAL_MB      FREE_MB   RATIO STATE
------------ -------------------- ------------ ------------ ------- -----------
           1 DATA                      708,468      500,535   29.35 CONNECTED
           2 LOG                       493,804      481,292    2.53 CONNECTED

2011年6月14日火曜日

表領域にオブジェクトが残っているか調べる

使っていない表領域のはずなのに何かが残ってる・・・というときの調査です。
セグメントのサイズを確認するの応用です。

Oracleは、スキーマのデフォルト表領域とは別の表領域にオブジェクトを作成することができます。
そのため、うっかりミス等でこういうことが起こりえます。

dba_segmentsを表領域で検索し、スキーマ(OWNER)およびセグメント名を表示します。
set pages 10000
set lines 100
col owner for a30
col segment_name for a30
col type for a10
select owner,segment_name,segment_type as type from dba_segments
where tablespace_name='SSS01_S_DATA'
order by owner,segment_name;

実行例は次の通りです。
一番下のTESTUSERは、テスト用スキーマなのですが、誤ってこの表領域に作られてしまっています。
(人名や日付がついていたり酷いですね・・・)
OWNER                          SEGMENT_NAME                   TYPE
------------------------------ ------------------------------ ----------
SSS01D01USER                   BAK_FILE2_20101220             TABLE
SSS01D01USER                   M01_BATCHSTATE                 TABLE
SSS01D01USER                   SYS_C00157262                  INDEX
SSS01D01USER                   T01_FILEACCESSBATCH2_M         TABLE
SSS01D01USER                   T01_MAGICAPPITEM2_KEN          TABLE
SSS01D01USER                   T01_MAGIC_APPITEM_LIMIT2_KEN   TABLE
TESTUSER                       TEMP_USERLIST                  TABLE

シングルDBでサービスを追加する

Oracle RACではサービスという論理的な接続先を作ることにより、ノードごとに負荷特性の分離をすることができます。
例えば、APPサービスでWebサイトの処理、BATCHサービスで夜間バッチの処理、などです。
※物理的なノードとはレイヤが少し違います。

シングルDBでもサービスを追加することができます。
用途としては次のようなことが考えられますが、たぶん他にもあるでしょう。
(専用サーバ接続と共用サーバ接続を使い分けるとかできるんでしょうか)
・AWR(STATSPACKのようなもの)をサービスごとに分ける(EEなのでやったことありません)
・再インストールしたら、インスタンス名を間違えた

以前、やってしまったのが2番目。
サービス名は、デフォルトではインスタンス名を引き継ぎます。
そのため、サービス名が変わってしまったためクライアントから接続エラーが発生しました。
クライアント側は変更したくないとの要望があったため、サービス名を追加しました。

手順は次にようにします。

まずはサービス名を確認します。
SQL> show parameter service_name
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
service_names                        string      SSS01DB2

次に、サービス名を追加します。
今回は、間違えてしまったサービス名は残したまま、OODEVを追加します。
ALTER SYSTEM SET service_names='SSS01DB2','OODEV' SCOPE=BOTH;

追加されたかどうか確認します。
SQL> show parameter service_name

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
service_names                        string      SSS01DB2, OODEV


余談ですが、RACでのサービス追加コマンドsrvctl start serviceは、内部的にalter system setしているだけです。
(アラートログを見るとわかります)

LIKE句でアンダースコアをマッチングさせる

OracleのLIKE句では、'_'(アンダースコア)は任意の1文字でマッチングします。
アンダースコアそのものをマッチングしたい場合は、ESCAPE句を使います。

例として表領域のデータファイル情報を取得します。
SQL> set pages 10000
set lines 120
col tablespace_name for a20
col file_name for a50
col bytes for 999,999,999,999
select tablespace_name,file_name,bytes,status from DBA_DATA_FILES
where tablespace_name like 'SSS01+_S+_%' escape '+'
order by tablespace_name,file_name;
実行結果は次の通りです。
TABLESPACE_NAME   FILE_NAME                                      BYTES STATUS
----------------- ----------------------------------- ---------------- ---------
SSS01_S_DATA      +DATA/database/sss01_s_data_01.dbf     2,147,483,648 AVAILABLE
SSS01_S_DATA      +DATA/database/sss01_s_data_02.dbf     2,147,483,648 AVAILABLE
SSS01_S_IDX       +DATA/database/sss01_s_idx_01.dbf      1,589,641,216 AVAILABLE
SSS01_S_IDX       +DATA/database/sss01_s_idx_02.dbf      1,588,592,640 AVAILABLE
SSS01_S_IDX       +DATA/database/sss01_s_idx_03.dbf      1,073,741,824 AVAILABLE
SSS01_S_IDX       +DATA/database/sss01_s_idx_04.dbf      1,073,741,824 AVAILABLE

6行が選択されました。

2011年4月27日水曜日

Oracle RAC Standard Edition(SE)を使ってみて気づいたこと

※個人の感想に基づいています・・・

まずは、ストレージ共有型クラスタであること。
MySQL Clusterとは違い、データを1箇所に保管するストレージ共有型です。
ストレージの冗長化をストレージ側でしなければならないのが、最大の弱点だと思ってます。
代替ストレージ機を用意しておけばダウンタイムを減らせますが、ハードウェア交換が必要なので1時間単位のダウンは避けられません。
そもそもSEを買うような案件ではそこまで予算がありません。
EEはライセンスおよびサポート費用だけで価格がひと桁変わりますからね・・・。

スタンバイDBにレプリケーションしようにも、Enterprise Edition(EE)でなければできません。
増分バックアップやアーカイブREDOログファイルバックアップをするにしても、分単位でのバックアップは現実的ではないと思います


次、ライセンスのCPU制限
SE RACでは、物理CPUの最大数が4つまでです。ライセンス
いまどき1CPUのサーバはあまり使わないので、2CPUだとノードの最大数が2つまで。
これが何を意味するかというと、failoverが運任せになりうることです。

RACは、ノード間の通信可否結果を投票ディスクというファイルとして共有型ストレージに格納しています。
クラスタソフトウェアは、この投票ディスクを元に多数決で孤立=ネットワーク障害サーバを検知します。
ノードが2台だと多数決にならずどちらか一方をOS再起動します。
そのため、正常稼動しているノードを再起動してしまう可能性があります。

RACは3ノード以上で使うのがお薦めです。


最後に、商用であること。
SEだけの話ではありませんが、購入してみないとサポートを受けられない、購入してみないとどんな特性の製品かわからないことです。
SQL文の数が多すぎるとラッチ待機のせいでSGAを増やせば増やすほどパフォーマンスが落ちる、など買う前にはわからなかったことが多いです。


まとめると、EEでない限りOracle RACは使いたくないな、と。
今の案件、MySQLに移設したいなー。

2011年4月22日金曜日

ASMのファイルシステムを直接操作する

ASMにはASMのファイルシステムを操作するシェル、asmcmdが用意されています。
使い方はORACLE_SIDをASMにしてasmcmdを起動するだけ。
cdやlsだけでなくrmやduもあって非常に便利。
ASMCMD> help
       :
        commands:
        --------
        cd
        du
        find
        help
        ls
        lsct
        lsdg
        mkalias
        mkdir
        pwd
        rm
        rmalias
ASMディスクグループへディスクを追加するではSQLで確認していますが、容量確認だけであればasmcmdの方が楽です。
$ export ORACLE_SID=+sss01
$ asmcmd
ASMCMD> lsdg
State    Type    Rebal  Unbal  Sector  Block       AU  Total_MB  Free_MB  Req_mir_free_MB  Usable_file_MB  Offline_disks  Name
MOUNTED  EXTERN  N      N         512   4096  1048576    476843   334069                0          334069              0  DATA/
MOUNTED  EXTERN  N      N         512   4096  1048576    143055   130125                0          130125              0  LOG/

findも使えます。
要らないオンラインREDOログを削除する前の確認くらいにしか使いませんが。
ASMCMD> find -t ONLINELOG log redo1*.dbf  
+log/REDO/REDO1012.DBF
+log/REDO/REDO1022.DBF
+log/REDO/REDO1032.DBF
+log/REDO/REDO1042.DBF
+log/REDO/REDO1052.DBF
+log/REDO/REDO1062.DBF

2011年4月21日木曜日

ASMディスクグループへディスクを追加する

ASMはディスクグループという仮想的なディスクで管理しています。
それによりRAWデバイスの追加を容易にしています。

ここでは、データ領域用のディスクグループを拡張します。

まず、RAWデバイスを作成し、パーミッションを設定します。
この例ではDevice-Mapperを使っていますが説明は省きますが、環境によってはdmのパーミッション設定は要らないかもしれません。
# vi /etc/rc.d/rc.local
(下記追記)
chown oracle:oracle /dev/mapper/dm002
chmod 660 /dev/mapper/dm002

raw /dev/raw/raw9 /dev/mapper/dm002
chown oracle:oracle /dev/raw/raw9
chmod 660 /dev/raw/raw9

次に、パラメータasm_diskstringに追加したいRAWデバイス名が含まれているか確認します。
asm_diskstringは、アクセス許可するRAWデバイス名を記述します。
注意として、OracleインスタンスではなくASMインスタンスに接続する必要があります。
$ export ORACLE_SID=+sss01
$ sqlplus sys as sysdba
SQL> show parameter asm_diskstring

NAME                                 TYPE
------------------------------------ ---------------------------------
VALUE
------------------------------
asm_diskstring                       string
/dev/raw/raw[6-7]

raw9にはアクセスできない設定になっているので、ASMインスタンスの初期化パラメータファイルに追記します。
ASMを再起動すると、設定が有効になります。
asm_diskstring='/dev/raw/raw[6-7]'
        ↓
asm_diskstring='/dev/raw/raw[6-9]'

ASMからRAWデバイスにアクセスできるようになりました。
次のように追加したいディスクグループを確認します。
GNAMEがディスクグループ名、DNAMEが各RAWデバイスにつけられた論理ディスク名です。
$ export ORACLE_SID=+sss01
$ sqlplus sys as sysdba
SQL>
column GNAME FORMAT a15
column DNAME FORMAT a15
select g.name as gname,d.name as dname
 from v$asm_disk d,v$asm_diskgroup g
 where d.group_number=g.group_number order by g.name,d.name

GNAME           DNAME
--------------- ---------------
DATA            DATA_DG1
DATA            DATA_DG2
LOG             LOG_DG1
LOG             LOG_DG2

ディスクグループへの追加は次の通りです。
$ export ORACLE_SID=+sss01
$ sqlplus sys as sysdba
SQL> ALTER DISKGROUP DATA ADD DISK '/dev/raw/raw9' NAME DATA_DG3


GNAME           DNAME
--------------- ---------------
DATA            DATA_DG1
DATA            DATA_DG2
DATA            DATA_DG3
LOG             LOG_DG1
LOG             LOG_DG2