このブログを検索

ラベル データファイル の投稿を表示しています。 すべての投稿を表示
ラベル データファイル の投稿を表示しています。 すべての投稿を表示

2011年8月22日月曜日

REDOログファイルのサイズ変更をする

REDOログファイルのサイズ変更の基本的な考え方は次の通りです。
・REDOログファイルのサイズ変更は不可
・変更は、新規追加(別ファイル)し、不要のものを削除する
・削除は、STATUS=ACTIVEだとできない
・削除は、内容がアーカイブREDOファイルとして出力されていないとできない
・OMF(Oracle Managed Files)を未使用の場合、物理削除も必要
・RACの場合、インスタンス単位でサイズや個数を変えることはできる

まず、REDOログファイルを確認します。
   THREAD#     GROUP#     MBYTES STATUS     MEMBER
---------- ---------- ---------- ---------- ------------------------------
         1          1       1024 INACTIVE   +DATA/redo/redo111.dbf
         1          1       1024 INACTIVE   +LOG/redo/redo112.dbf
         1          2       1024 ACTIVE     +DATA/redo/redo121.dbf
         1          2       1024 ACTIVE     +LOG/redo/redo122.dbf
         1          3       1024 CURRENT    +DATA/redo/redo131.dbf
         1          3       1024 CURRENT    +LOG/redo/redo132.dbf
         2          4       1024 INACTIVE   +LOG/redo/redo212.dbf
         2          4       1024 INACTIVE   +DATA/redo/redo211.dbf
         2          5       1024 ACTIVE     +LOG/redo/redo222.dbf
         2          5       1024 ACTIVE     +DATA/redo/redo221.dbf
         2          6       1024 CURRENT    +LOG/redo/redo232.dbf
         2          6       1024 CURRENT    +DATA/redo/redo231.dbf

次に、新規REDOログファイルを追加します。
ここでは、2ノードRACを想定し、1GB→2GBのサイズ変更を行います。
$ sqlplus sys as sysdba
SQL> ALTER DATABASE ADD LOGFILE THREAD 1 GROUP 7 ('+DATA/redo/redo141.dbf', '+LOG/redo/redo142.dbf') SIZE 2G;
SQL> ALTER DATABASE ADD LOGFILE THREAD 1 GROUP 8 ('+DATA/redo/redo151.dbf', '+LOG/redo/redo152.dbf') SIZE 2G;
SQL> ALTER DATABASE ADD LOGFILE THREAD 1 GROUP 9 ('+DATA/redo/redo161.dbf', '+LOG/redo/redo162.dbf') SIZE 2G;

SQL> ALTER DATABASE ADD LOGFILE THREAD 2 GROUP 10 ('+DATA/redo/redo241.dbf', '+LOG/redo/redo242.dbf') SIZE 2G;
SQL> ALTER DATABASE ADD LOGFILE THREAD 2 GROUP 11 ('+DATA/redo/redo251.dbf', '+LOG/redo/redo252.dbf') SIZE 2G;
SQL> ALTER DATABASE ADD LOGFILE THREAD 2 GROUP 12 ('+DATA/redo/redo261.dbf', '+LOG/redo/redo262.dbf') SIZE 2G;

追加したら、REDOログファイルを強制的にローテートし、追加したREDOログがCURRENTになるまで繰り返します。
REDOログファイルはノードごとにあるので各ノードで実行します。
[oracle@sssdb1 ~]$ sqlplus sys as sysdba
SQL> alter system switch logfile;

[oracle@sssdb1 ~]$ sqlplus sys as sysdba
SQL> alter system switch logfile;

削除したいREDOログファイルをINACTIVEにし、アーカイブREDOログファイルを出力します。
SQL> ALTER SYSTEM CHECKPOINT;

不要になったREDOログファイルを削除します。
SQL> ALTER DATABASE DROP LOGFILE GROUP 1;
SQL> ALTER DATABASE DROP LOGFILE GROUP 2;
SQL> ALTER DATABASE DROP LOGFILE GROUP 3;

SQL> ALTER DATABASE DROP LOGFILE GROUP 4;
SQL> ALTER DATABASE DROP LOGFILE GROUP 5;
SQL> ALTER DATABASE DROP LOGFILE GROUP 6;

OMF(Oracle Managed Files)を利用していない場合、物理ファイルの削除をします。
この例では、ASMのファイルを削除します。
$ export ORACLE_SID=+sss011
$ asmcmd
ASMCMD> cd DATA/REDO
ASMCMD> rm REDO111.DBF
ASMCMD> rm REDO122.DBF
ASMCMD> rm REDO133.DBF
ASMCMD> rm REDO211.DBF
ASMCMD> rm REDO222.DBF
ASMCMD> rm REDO233.DBF

ASMCMD> cd ../../LOG/REDO
ASMCMD> rm REDO112.DBF
ASMCMD> rm REDO122.DBF
ASMCMD> rm REDO132.DBF
ASMCMD> rm REDO212.DBF
ASMCMD> rm REDO222.DBF
ASMCMD> rm REDO233.DBF

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

2011年3月3日木曜日

データベースファイルのサイズを縮小する

NOMOUNT状態で作業します。
ただし、ASMはOPEN状態でできます。
縮小できるのは連続領域のみで、最後のBLOCK_ID以降が縮小可能領域です。
まずはデータファイル名を調べます。
$ sqlplus sys as sysdba
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='SSS01_I_DATA'
order by tablespace_name,file_name;

TABLESPACE_NAME  FILE_NAME                            BYTES          STATUS
---------------- ------------------------------------ -------------- ---------
SSS01_I_DATA     /DATA/DATABASE/SSS01_I_DATA_01.DBF    2,147,483,648 AVAILABLE
SSS01_I_DATA     /DATA/DATABASE/SSS01_I_DATA_02.DBF    2,147,483,648 AVAILABLE
SSS01_I_DATA     /DATA/DATABASE/SSS01_I_DATA_03.DBF    2,147,483,648 AVAILABLE
SSS01_I_DATA     /DATA/DATABASE/SSS01_I_DATA_04.DBF    2,147,483,648 AVAILABLE
データファイルの最終ブロックを検索します。
col TABLESPACE_NAME for a20
select * from dba_free_space where tablespace_name = 'SSS01_I_DATA'
order by file_id,block_id;

TABLESPACE_NAME         FILE_ID   BLOCK_ID      BYTES     BLOCKS RELATIVE_FNO
-------------------- ---------- ---------- ---------- ---------- ------------
SSS01_I_DATA                  4          9    8388608       1024            4
SSS01_I_DATA                  4      24201    1048576        128            4
SSS01_I_DATA                  4      25353 1938817024     236672            4
SSS01_I_DATA                  5       3465 2118123520     258560            5
SSS01_I_DATA                  6       1929   65011712       7936            6
SSS01_I_DATA                  6      33801 1869611008     228224            6 
SSS01_I_DATA                  7        137    1048576        128            7
SSS01_I_DATA                  7       1417 2134900736     260608            7
これは、BLOCK_IDから始まる空き連続領域を意味します。
FILE_ID = 4のデータファイルを例にとると、25353 - 1 = 25352ブロックまでは最低限必要なデータファイルのサイズです。
この例では1ブロック = 4KBの環境なので、25353 x 4KB = 約100MBまで縮小ができます。
縮小手順は次の通り。
alter database datafile '/DATA/DATABASE/SSS01_I_DATA_01.DBF' resize 100M

追記:2011/04/28
ASMでなくても、nomountではなくOPEN状態で実行できました。
10gとかからそうなったんでしょうか・・・。

2011年2月20日日曜日

データベースファイルを追加し表領域を拡張する

1.データベースファイル名を確認する
$ sqlplus sys as sysdba
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='SSS01_I_DATA'
order by tablespace_name,file_name;

TABLESPACE_NAME  FILE_NAME                            BYTES          STATUS
---------------- ------------------------------------ -------------- ---------
SSS01_I_DATA     /DATA/DATABASE/SSS01_I_DATA_01.DBF    2,147,483,648 AVAILABLE
SSS01_I_DATA     /DATA/DATABASE/SSS01_I_DATA_02.DBF    2,147,483,648 AVAILABLE
SSS01_I_DATA     /DATA/DATABASE/SSS01_I_DATA_03.DBF    2,147,483,648 AVAILABLE
SSS01_I_DATA     /DATA/DATABASE/SSS01_I_DATA_04.DBF    2,147,483,648 AVAILABLE
2.データベースファイルを追加する
A)ASMの場合(SE RACなど)
※ASM(RAW)はパスが1文字違うので注意。
$ sqlplus sys as sysdba
ALTER TABLESPACE SSS01_I_DATA
  ADD DATAFILE '+DATA/DATABASE/SSS01_I_DATA_05.DBF' SIZE 2048M AUTOEXTEND ON;
B)ファイルシステムの場合
$ sqlplus sys as sysdba
ALTER TABLESPACE SSS01_I_DATA
  ADD DATAFILE '/DATA/DATABASE/SSS01_I_DATA_05.DBF' SIZE 2048M AUTOEXTEND ON;