kenken0807_DBメモ

つば九郎が好きなDBAです。Oracle Standard Editionでの運用やツールとかとかの備忘録。特に記載がない場合はoracle11gR2です。時々MySQL

ORACLEでテーブルごとのDML回数を取得する

テーブルごとの1時間あたりのDML(INSERT,UPDATE,DELETE)の平均を取得するために考えた方法。
確認手段としてDBA_TAB_MODIFICATIONSを使用する。

ALL_TAB_MODIFICATIONS

以下のように確認できる。

SELECT
   table_name,inserts,updates,deletes,to_char(timestamp,'YYYY-MM-DD HH24:MI:SS') as timestamp
FROM
   dba_tab_modifications
WHERE
   TABLE_OWNER in ('USER') 
   and TABLE_NAME not like 'BIN$%';

TABLE_N    INSERTS    UPDATES    DELETES TIMESTAMP
------- ---------- ---------- ---------- -------------------
TABLE00        868       2446       1974 2016-04-26 18:00:01
TABLE01        445          0         10 2016-04-26 17:15:28
TABLE02          1          1          0 2016-02-22 18:06:50
TABLE03      16635          0      16635 2016-04-26 18:00:01
TABLE04          6          0          4 2016-04-26 15:54:26
TABLE05          0        124          0 2016-04-26 18:00:01
TABLE06        335       3071          0 2016-04-26 18:00:01
TABLE07         12          0          0 2016-04-06 17:29:01
TABLE08      58694          0      40023 2016-04-26 18:00:01
TABLE09     131440          0     102863 2016-04-26 18:00:01

マニュアルによると、

前回、表の統計情報を収集した時点から変更されている

とあるので、統計情報を取得したタイミングで更新される模様。

これを定期的に更新してあげるには↓を実行する。

begin DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO; end;

そうすると実行したタイミングで更新がある場合はTIMESTAMPが書き換えられ、更新回数が累積される。
前回との差分を比較することでDML回数がわかる。
1時間置き実行して結果をfluentdで送ったり、グラフ化することができる。

うちでは
1. 1時間置きにFLUSH_DATABASE_MONITORING_INFOを実行
2. SELECT FROM dba_tab_modificationsを実行しMySQLに格納
3. Muninでグラフ化
みたいにしている。

直接グラフでもいいけど、MySQLに入れておけばSQLでいろいろ拡張やら調査が可能なので。

注意としては統計情報を取得したタイミングで更新情報がリセットされるのでその時は差分を取得するのではなくその値を初期値にする。 MySQLで取得しているデータはこんな感じ↓

カラム名 説明
TABLE_NAME テーブル名
INSERTS 前回との差分insert回数
SUM_INSERTS 累積insert回数
UPDATES 前回との差分update回数
SUM_UPDATES 累積update回数
DELETES 前回との差分delete回数
SUM_DELETES 累積delete回数
TIMESTAMP Oracle側の更新時間
+-----------+---------+-------------+---------+-------------+---------+-------------+---------------------+
| TABLE_NAME| INSERTS | SUM_INSERTS | UPDATES | SUM_UPDATES | DELETES | SUM_DELETES | TIMESTAMP           |
+-----------+---------+-------------+---------+-------------+---------+-------------+---------------------+
| TABLE00   |      14 |       88710 |      64 |      118695 |       0 |           0 | 2016-03-31 13:53:11 |↑
| TABLE00   |       5 |       88715 |      24 |      118719 |       0 |           0 | 2016-03-31 15:00:02 |
| TABLE00   |      17 |       88732 |      57 |      118776 |       0 |           0 | 2016-03-31 15:57:26 |
| TABLE00   |      18 |       88750 |     228 |      119004 |       0 |           0 | 2016-03-31 17:00:02 |
| TABLE00   |     726 |       89476 |     325 |      119329 |       0 |           0 | 2016-03-31 18:00:01 |累積値
| TABLE00   |     483 |       89959 |     299 |      119628 |       0 |           0 | 2016-03-31 19:00:01 |
| TABLE00   |      49 |       90008 |      11 |      119639 |       0 |           0 | 2016-03-31 20:00:01 |
| TABLE00   |       8 |       90016 |      31 |      119670 |       0 |           0 | 2016-03-31 20:58:26 |
| TABLE00   |      16 |       90032 |      22 |      119692 |       0 |           0 | 2016-03-31 22:00:01 |↓
| TABLE00   |      19 |          19 |      13 |          13 |       0 |           0 | 2016-03-31 23:00:01 |←統計情報が取得されたのでリセットされた
| TABLE00   |      28 |          47 |      17 |          30 |       0 |           0 | 2016-03-31 23:59:41 |↑
| TABLE00   |       8 |          55 |      10 |          40 |       0 |           0 | 2016-04-01 01:00:01 |
| TABLE00   |       7 |          62 |       5 |          45 |       0 |           0 | 2016-04-01 01:51:06 |
| TABLE00   |       4 |          66 |       2 |          47 |       0 |           0 | 2016-04-01 02:42:32 |
| TABLE00   |       2 |          68 |       2 |          49 |       0 |           0 | 2016-04-01 03:46:31 |
| TABLE00   |       1 |          69 |       1 |          50 |       0 |           0 | 2016-04-01 04:25:24 |累積値
| TABLE00   |       4 |          73 |       4 |          54 |       0 |           0 | 2016-04-01 06:00:01 |
| TABLE00   |       4 |          77 |       2 |          56 |       0 |           0 | 2016-04-01 06:36:07 |
| TABLE00   |       8 |          85 |       2 |          58 |       0 |           0 | 2016-04-01 07:56:18 |
| TABLE00   |       3 |          88 |       1 |          59 |       0 |           0 | 2016-04-01 08:46:48 |↓

OracleSERAC+ASMのRMANバックアップから非ASMのシングル環境へリストア

OracleSERAC+ASMのRMANバックアップから非ASM(ファイルシステム)のシングル環境へリストアしたのでメモ。

環境

  • Oracle11.2.0.4
  • DB_NAME:orcl

前提

  • RMANバックアップは毎日0時にフルバックアップを取得(backupset plus archivelog)
  • delete noprompt obsolete;で削除している。
  • RMANバックアップセットはファイルシステムに出力している。
  • リカバリカタログは使用しない。制御ファイルで管理。

リストア手順

  • 4/11の13:00までの不完全リカバリを行う。

別サーバを用意しOracleのインストールをする

↓を基にインストールまで行う。

kenken0807.hatenablog.com

PSUや個別パッチを適用している場合はRAC環境と同等にしておく。

初期化ファイル作成

vim $ORACLE_HOME/dbs/initorcl.ora

db_name='orcl'
processes = 300
audit_file_dest='/opt/app/oracle/admin/orcl/adump'
audit_trail ='none'
db_block_size=8192
db_domain=''
db_recovery_file_dest='/opt/app/oracle/flash_recovery_area'
db_recovery_file_dest_size=700G
log_archive_dest_1='LOCATION=/opt/app/oracle/archivelog'
diagnostic_dest='/opt/app/oracle'
dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
open_cursors=300
remote_login_passwordfile='EXCLUSIVE'
undo_tablespace='UNDOTBS1'
control_files = '/opt/app/oracle/control01.ctl'
compatible='11.2.0.4.0'
sga_target=5G
pga_aggregate_target=1G

RMANから戻す

使用するもの

  • 4/11 0:00に取得したフルバックアップ
  • 4/11 0:00~4/11 13:00のアーカイブログ(すでにバックアップ済みであればアーカイブログのバックアップセット)

4/11 0:00に取得したバックアップを使用するので、4/11 0:00時点の制御ファイルしかない。
その制御ファイルをリストアすると4/11 0:00~4/11 13:00までのアーカイブ情報を保持していないことになる。
よって、4/11 0:00~4/11 13:00までのアーカイブをカタログ追加し、
RAC環境のlist backupで確認した必要なアーカイブログをリストアしてあげる必要あり。

                 4/13 0:00                                        4/13 13:00
時系列--------------|--------------------------------------------------|--------------------
              フルバックアップ                                     ここに戻す
                   取得
                      ←         この間のアーカイブログが必要         →

どのアーカイブログのバックアップが必要か順序番号を確認する

確認すると2016/04/12に取得したanr2qu6c_1_1このバックアップが必要だということがわかる。

RMAN>list backup;
・
・
BSキー  サイズ       デバイス・タイプ経過時間終了時間
------- ---------- ----------- ------------ -------------------
3407    11.79G     DISK        00:01:06     2016/04/12 00:01:37
        BPキー: 3407   ステータス: AVAILABLE  圧縮: NO  タグ: TAG20160412T060030
        ピース名: /backup/anr2qu6c_1_1

  バックアップ・セット3407のアーカイブ・ログのリスト
  Thrd Seq     Low SCN    Low時間             Next SCN   Next Time
  ---- ------- ---------- ------------------- ---------- ---------
  1    46255   34194183819 2016/04/11 00:00:00 34194503257 2016/04/11 07:23:50
  1    46256   34194503257 2016/04/11 07:23:50 34194522990 2016/04/11 10:24:11
  1    46257   34194522990 2016/04/11 10:24:11 34194542840 2016/04/11 15:24:32
  ・
  ・
  2    17526   34194183858 2016/04/11 00:00:02 34194543930 2016/04/11 07:24:33
  2    17527   34194543930 2016/04/11 07:24:33 34194632204 2016/04/11 12:30:12
  2    17528   34194632204 2016/04/11 12:30:12 34195546508 2016/04/11 13:24:32
  ・
  ・
・
・

RAC環境に出力しているバックアップファイルを同じディレクトリを作成してにコピーし、配置する

mkdir -p /backup
chown -R oracle. /backup
mv (4/11のフルバックアップ) (4/12に取得したアーカイブログ[anr2qu6c_1_1]) /backup

初期化パラメータで指定したアーカイブログの出力先作成

mkdir -p /opt/app/oracle/archivelog

インスタンス起動

startup nomount;

制御ファイルリストア

 RESTORE CONTROLFILE FROM '/backup/c-2096898227-20160411-00';

→4/11 0:00時点の制御ファイル

データベースマウント

 ALTER DATABASE MOUNT;

制御ファイルで認識されていないアーカイブログのバックアップセットをカタログ追加

 CATALOG BACKUPPIECE '/backup/anr2qu6c_1_1';

→4/11 0:00~4/11 13:00までのアーカイブログ

アーカイブログのリストア

run {                                                          
  set archivelog destination to '/opt/app/oracle/archivelog';           
  restore archivelog sequence between 46255 and 46257 thread 1;
  restore archivelog sequence between 17526 and 17528 thread 2;
} 

→4/11 0:00~4/11 13:00までのアーカイブを初期化ファイルのlog_archive_dest_1にリストアする。じゃないとリカバリできないみたい 。

リストア

  • 本番でディスクグループ確認
SELECT FILE# AS "File/Grp#", NAME FROM   V$DATAFILE;
  
         1 +DATA/orcl/datafile/system.264.861799709
         2 +DATA/orcl/datafile/sysaux.260.861799709
         3 +DATA/orcl/datafile/undotbs1.261.861799709
         4 +DATA/orcl/datafile/data.257.861799709
         5 +DATA/orcl/datafile/idx.258.861799709
         6 +DATA/orcl/datafile/undotbs2.262.861799709
         7 +DATA/orcl/datafile/users.265.861799723
         8 +DATA/orcl/datafile/perfstat.259.861799709
run {
  set newname for datafile  1 to '/opt/app/oracle/oradata/system1.dbf'; 
  set newname for datafile  2 to '/opt/app/oracle/oradata/sysaux1.dbf'; 
  set newname for datafile  3 to '/opt/app/oracle/oradata/undotbs1.dbf';
  set newname for datafile  4 to '/opt/app/oracle/oradata/data1.dbf';
  set newname for datafile  5 to '/opt/app/oracle/oradata/idx1.dbf';
  set newname for datafile  6 to '/opt/app/oracle/oradata/undotbs2.dbf';
  set newname for datafile  7 to '/opt/app/oracle/oradata/users1.dbf';
  set newname for datafile  8 to '/opt/app/oracle/oradata/perfstat.dbf';
  restore database;                                                    
  switch datafile all;
}

リカバリ

run {
  SET UNTIL TIME "TO_DATE('2016-04-11 13:00:00','YYYY-MM-DD HH24:MI:SS')";
  RECOVER DATABASE ;                                                
}   

オンラインREDOログをリネームする

  • RAC環境を確認
GROUP# THREAD# MEMBERS MEMBER                                             BYTES  SEQUENCE# STATUS
------ ------- ------- --------------------------------------------- ---------- ---------- ----------
     1       1       2 +DATA/onlinelog/group_1.257.861799869     524288000      46586 ACTIVE
     1       1       2 +DATA/onlinelog/group_1.257.861799869     524288000      46586 ACTIVE
     2       1       2 +DATA/onlinelog/group_2.258.861799869     524288000      46587 CURRENT
     2       1       2 +DATA/onlinelog/group_2.258.861799871     524288000      46587 CURRENT
     3       2       2 +DATA/onlinelog/group_3.259.861799873     524288000      17651 ACTIVE
     3       2       2 +DATA/onlinelog/group_3.259.861799875     524288000      17651 ACTIVE
     4       2       2 +DATA/onlinelog/group_4.260.861799875     524288000      17652 CURRENT
     4       2       2 +DATA/onlinelog/group_4.260.861799875     524288000      17652 CURRENT
  • オンラインREDO用のディレクトリ作成
mkdir -p /opt/app/oracle/redo 
  • リネームする
alter database rename file '+DATA/onlinelog/group_1.257.861799869' to '/opt/app/oracle/redo/redo01.log';    
alter database rename file '+DATA/onlinelog/group_1.257.861799869' to '/opt/app/oracle/redo/redo11.log';  
alter database rename file '+DATA/onlinelog/group_2.258.861799869' to '/opt/app/oracle/redo/redo02.log';  
alter database rename file '+DATA/onlinelog/group_2.258.861799871' to '/opt/app/oracle/redo/redo12.log';  
alter database rename file '+DATA/onlinelog/group_3.259.861799873' to '/opt/app/oracle/redo/redo03.log';  
alter database rename file '+DATA/onlinelog/group_3.259.861799875' to '/opt/app/oracle/redo/redo13.log';  
alter database rename file '+DATA/onlinelog/group_4.260.861799875' to '/opt/app/oracle/redo/redo04.log';  
alter database rename file '+DATA/onlinelog/group_4.260.861799875' to '/opt/app/oracle/redo/redo14.log';     

データベースオープン

ALTER DATABASE OPEN resetlogs;

この時点でデータベースにアクセス可能。。

一時表領域再作成

create temporary tablespace temp1 tempfile '/opt/app/oracle/oradata/temp11.dbf' size 10M;
alter database default temporary tablespace temp1; 
drop tablespace temp;
create temporary tablespace temp tempfile '/opt/app/oracle/oradata/temp02.dbf' size 5000M;
alter database default temporary tablespace temp; 
drop tablespace temp1;

thread2のredolog消す

ALTER DATABASE DISABLE THREAD 2;
alter database drop logfile group 6;
alter database drop logfile group 7;
alter database drop logfile group 8;
alter database drop logfile group 9;
alter database drop logfile group 10;

これで完了。おしまい。

ORACLE RMANで複製データベースの作成

RMANでアクティブなデータベースから同じSIDを持った複製データベースを作成したのでメモ。

複製先サーバ側の設定

  • 複製先サーバでOracleインスタンスが起動できる状態にしておく

    • 同じバージョンORACLEソフトウェアのインストールをしておく
    • 環境変数も設定する
    • データファイルや高速リカバリエリアなどのフォルダ構成を同様にしておく
  • 以下ファイルを複製元から複製先へコピー、配置する。

    • 初期化パラメータ(initSID.ora)
    • パスワードファイル(orapwSID)
    • リスナー構成ファイル(listener.ora)
  • 静的リスナーを設定

$ vim $ORACLE_HOME/network/admin/listener.ora

 LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 複製先サーバIP)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

SID_LIST_LISTENER=
  (SID_LIST=
    (SID_DESC=
      (SID_NAME=orcl)
      (ORACLE_HOME=/opt/app/oracle/product/11.2.0/dbhome_1)
    )
  )
  • リスナー起動
$ lsnrctl start

複製元サーバでの作業

$ sqlplus sys/oraora@複製先IP:1521/orcl as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on 木 4月 7 14:03:52 2016

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

アイドル・インスタンスに接続しました。

sql>startup nomount

RMANからデータベースの複製を行う。

  • RMAN接続
$ rman target /

Recovery Manager: Release 11.2.0.4.0 - Production on 金 4月 8 15:28:01 2016

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

ターゲット・データベース: ORCL (データベースID=3408942822)に接続されました
  • RMANから複製先へ接続
RMAN>  connect auxiliary sys/oraora@複製先IP:1521/orcl 

補助データベース: ORCLに接続されました(マウントされていません)
  • 複製データベース作成する
RMAN>  duplicate target database to orcl
       from active database 
       spfile
       NOFILENAMECHECK;

これで完了。

標準出力からわかるざっくりな流れとして、
1. SPFILEのコピー
2. 制御ファイルのコピー
3. データファイルのリストア
4. アーカイブログを使用したリカバリ
5. resetlogしてデータベースOPEN

  • どの時点のデータまで複製されるのか。
    アクティブなデータベースから作成しているので、どの時点のデータまでが複製されるのか気になった。

複製元データベースで↓実施しながら複製開始。

$ watch -n 1 "echo \"insert into duplicate_test values (1,sysdate);\" | sqlplus orcl/orcl"

複製が完了した時点でのデータ

        ID D
---------- -------------------
         1 2016/04/08 18:33:43
         1 2016/04/08 18:33:44
         1 2016/04/08 18:33:45
         1 2016/04/08 18:33:46
         1 2016/04/08 18:33:47
         1 2016/04/08 18:33:48 ←ここまで反映

duplicateコマンドのログ情報

チャネルORA_DISK_1: データファイルのコピーを開始しています
入力データファイル・ファイル番号=00004 名前=/opt/app/oracle/oradata/orcl/users01.dbf
出力ファイル名=/opt/app/oracle/oradata/orcl/users01.dbf タグ=TAG20160408T181846
チャネルORA_DISK_1: データファイルのコピーが終了しました。経過時間: 00:00:01
backupが完了しました(完了時間: 2016-04-08 18:33:48)    ←リストア完了時刻

SQL文: alter system archive log current    ←ログスイッチ実行

メモリー・スクリプトの内容:
{
   backup as copy reuse
   archivelog like  "/opt/app/oracle/fast_recovery_area/ORCL/archivelog/2016_04_08/o1_mf_1_12114_cjgyknf3_.arc" auxiliary format
 "/opt/app/oracle/fast_recovery_area/ORCL/archivelog/2016_04_08/o1_mf_1_12114_%u_.arc"   archivelog like
 "/opt/app/oracle/fast_recovery_area/ORCL/archivelog/2016_04_08/o1_mf_1_12115_cjgyqwxc_.arc" auxiliary format
 "/opt/app/oracle/fast_recovery_area/ORCL/archivelog/2016_04_08/o1_mf_1_12115_%u_.arc"   ;
   catalog clone recovery area;
   switch clone datafile all;
}
メモリー・スクリプトを実行しています

backupが開始されました(開始時間: 2016-04-08 18:33:49)
・
・
・
Duplicate Dbが完了しました(完了時間: 2016-04-08 18:34:33)    ←Duplicateコマンド完了時刻

というようにデータ登録時刻とリストア完了の時刻はほぼ一緒で、
リストア完了後にログのスイッチが行われている。
そこで生成されたアーカイブログまで適用されているよう。

SQL文: alter system archive log current

複製されたデータベースで一時表領域がエラー

一時表領域のデータファイルを確認しようするとエラーが発生。

SQL> select * from dba_temp_files;
select * from dba_temp_files
*
行1でエラーが発生しました。:
ORA-01187:
ファイルが検査を通過しなかったため、このファイルから読み込むことができません。
ORA-01110: データファイル201: '/opt/app/oracle/oradata/orcl/temp01.dbf'

ステータスはオンライン

SQL> select tablespace_name, status from dba_tablespaces;

TABLESPACE_NAME                STATUS
------------------------------ ---------
TEMP                           ONLINE

ファイルはちゃんと複製されていたので一時表領域から一度dropしてaddしてあげることで直った。

SQL> alter database tempfile '/opt/app/oracle/oradata/orcl/temp01.dbf' drop;

データベースが変更されました。

SQL> alter tablespace TEMP add tempfile '/opt/app/oracle/oradata/orcl/temp01.dbf' REUSE;

表領域が変更されました。

SQL> select * from dba_temp_files;

FILE_NAME
--------------------------------------------------------------------------------
   FILE_ID TABLESPACE_NAME                     BYTES     BLOCKS STATUS
---------- ------------------------------ ---------- ---------- -------
RELATIVE_FNO AUT   MAXBYTES  MAXBLOCKS INCREMENT_BY USER_BYTES USER_BLOCKS
------------ --- ---------- ---------- ------------ ---------- -----------
/opt/app/oracle/oradata/orcl/temp01.dbf
         1 TEMP                           3.4359E+10    4194176 ONLINE
           1 NO           0          0            0 3.4358E+10     4194048

データリカバリアドバイザを使用したRMANリカバリ方法(ユーザ表領域)

データリカバリアドバイザを使用してリカバリを行うと楽に復旧可能だったのでメモ。
Oracle RACでは対応してないみたい、シングルインスタンスのみ対応。
環境はOracle database 11.2.0.4 SEone。

以下条件で実施している。
1. 高速リカバリ領域の有効化(バックアップセットとアーカイブログを含む)
2. 自動診断レポジトリ(ADR)の有効化
3. 事前にフルバックアップを取得済み

表領域障害からの完全リカバリ

準備

  • 確認用データの追加
SQL> insert into rmant values (1,sysdate,'first');
SQL> commit;
SQL> alter system switch logfile; 
SQL> alter system checkpoint; 
SQL> insert into rmant values (2,sysdate,'onlineredo');
SQL> commit;
SQL> select * from rmant;

ID INS_TIME            TX
-- ------------------- -----------
 1 2015/06/24 17:36:41 first         ←このデータはアーカイブログ化されている
 2 2015/06/24 17:37:59 onlineredo    ←このデータはデータファイルに書き込まれていない状態
  • 表領域を強制的に壊す
# dd if=/dev/zero of=/opt/app/oracle/oradata/orcl/data/data05.dbf bs=500M count=1
  • Oracleに表領域が壊れたことを気づかせてあげる
 RMAN> VALIDATE DATABASE;

validateが開始されました(開始時間: 2015/06/24 17:38:55)
リカバリ・カタログのかわりにターゲット・データベース制御ファイルを使用しています
チャネル: ORA_DISK_1が割り当てられました
チャネルORA_DISK_1: SID=1640 デバイス・タイプ=DISK
RMAN-06169: データファイル9のファイル・ヘッダーを読み込めません。エラー理由: 7
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: validateコマンドが06/24/2015 17:38:56で失敗しました
RMAN-06056: データファイル9にアクセスできませんでした


SQL> alter system checkpoint;
alter system checkpoint
*
行1でエラーが発生しました。:
ORA-03113: 通信チャネルでend-of-fileが検出されました プロセスID:
29124
セッションID: 1136、シリアル番号: 247

データリカバリアドバイザを使用して復旧

  • 障害情報確認(list failure)
RMAN> list failure;

リカバリ・カタログのかわりにターゲット・データベース制御ファイルを使用しています
データベース障害のリスト
=========================

障害ID 優先度ステータス    検出時間            サマリー
------ -------- --------- ------------------- -------
314    HIGH     OPEN      2015/06/24 17:46:37 SYSTEM以外のデータファイルが1つ以上破損しています

データファイルが壊れていることが 表示される。

  • 対応方法確認(advise failure)
RMAN> advise failure;

データベース障害のリスト
=========================

障害ID 優先度ステータス    検出時間            サマリー
------ -------- --------- ------------------- -------
314    HIGH     OPEN      2015/06/24 17:46:37 SYSTEM以外のデータファイルが1つ以上破損しています

自動修復オプションを分析中です。これには少し時間がかかる場合があります
チャネル: ORA_DISK_1が割り当てられました
チャネルORA_DISK_1: SID=2899 デバイス・タイプ=DISK
自動修復オプションの分析が完了しました

必須の手動アクション
========================
使用可能な手動アクションがありません

オプションの手動アクション
=======================
使用可能な手動アクションがありません

自動修復オプション
========================
オプション 修復 説明
------ ------------------
1      データファイル9をリストアおよびリカバリします
  計画: 修復には、データが損失しない完全なメディア・リカバリが含まれます
  修復スクリプト: /opt/oracle/diag/rdbms/orcl/ORCL/hm/reco_877293002.hm
  • 自動作成された修復方法の確認(repair failure preview) これは実行してもしなくてもどちらでも良い。
RMAN> repair failure preview;

計画: 修復には、データが損失しない完全なメディア・リカバリが含まれます
修復スクリプト: /opt/oracle/diag/rdbms/ptdb/PTDB/hm/reco_877293002.hm

修復スクリプトの内容:
   # restore and recover datafile
   restore datafile 9;
   recover datafile 9;
   sql 'alter database datafile 9 online';

実行する最善の手段をを作成してくれる。

  • 修復実施(repair failure)
RMAN> repair failure ;

計画: 修復には、データが損失しない完全なメディア・リカバリが含まれます
修復スクリプト: /opt/oracle/diag/rdbms/orcl/ORCL/hm/reco_877293002.hm

修復スクリプトの内容:
   # restore and recover datafile
   restore datafile 9;
   recover datafile 9;
   sql 'alter database datafile 9 online';

この修復を実行しますか(YESまたはNOを入力してください)。 YES
修復スクリプトを実行しています

restoreが開始されました(開始時間: 2015/06/24 17:51:41)
チャネルORA_DISK_1の使用

チャネルORA_DISK_1: データファイル・バックアップ・セットのリストアを開始しています
チャネルORA_DISK_1: バックアップ・セットからリストアするデータファイルを指定しています
チャネルORA_DISK_1: データファイル00009を/opt/app/oracle/oradata/orcl/data/data05.dbfにリストアしています
チャネルORA_DISK_1: バックアップ・ピース/opt/oracle/fast_recovery_area/ORCL/backupset/2015_06_24/o1_mf_nnndf_TAG20150624T115106_brn6rtp4_.bkpから読取り中です
チャネルORA_DISK_1: バックアップ・ピース1がリストアされました
チャネルORA_DISK_1: リストアが完了しました。経過時間: 00:27:05
restoreが完了しました(完了時間: 2015/06/24 18:18:46)

recoverが開始されました(開始時間: 2015/06/24 18:18:46)
チャネルORA_DISK_1の使用

メディア・リカバリを開始しています
メディア・リカバリが完了しました。経過時間: 00:00:01

recoverが完了しました(完了時間: 2015/06/24 18:18:47)

SQL文: alter database datafile 9 online
障害の修復が完了しました

データベースをオープンしますか(YESまたはNOを入力してください)。 YES
データベースがオープンしました。
  • データの確認 完全リカバリされている。
SQL> select * from rmant;

ID INS_TIME            TX
-- ------------------- -----------
 1 2015/06/24 17:36:41 first         
 2 2015/06/24 17:37:59 onlineredo    

以上で完了となる。
1. list failure;
2. advise failure;
3. repair failure;

単純な障害であればたった3つの処理でリカバリ可能となっている。

Centos7にORACLE database11.2.0.4 SEoneをさくっとサイレントインストールしてみる

GUIを使用せずに簡単にORACLE DATABASEを作成する。 SIDはorclで作成。

環境

今回はdockerを使用する。
dockerのデフォルトshmsizeが64MBで小さすぎてORACLEインスタンス起動できなかったので
--shm-sizeを指定できるversion1.10を使用。

# docker --version
Docker version 1.10.3, build 20f81dd

とりあえずcentos7立ち上げる

docker run --privileged -it --shm-size=512m   centos  bash

パッケージ取得

yum -y install wget vim sudo epel-release rlwrap vim sudo

さくっとインストールまで

  • ユーザグループ作成
    ORACLE preinstallRPMを使用するので作成する必要はないがuid、gid決める場合は先に作成。
# groupadd -g 501 oinstall 
# groupadd -g 502 dba
# useradd -u 501 -g oinstall -G dba oracle
# mkdir -p /opt/app/oracle
# chown -R oracle. /opt/app/oracle
# chown -R oracle. /opt/app
# mkdir -p /opt/app/oraInventory
# chown -R oracle. /opt/app/oraInventory
# chown -R oracle. /data/orabin
                     ↑ (ここにPSRを置く予定)
# wget http://public-yum.oracle.com/RPM-GPG-KEY-oracle-ol7 -O /etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
# cd /etc/yum.repos.d/
# wget http://public-yum.oracle.com/public-yum-ol7.repo
# yum -y install oracle-rdbms-server-11gR2-preinstall

preinstallRPMのログはここ /var/log/oracle-rdbms-server-11gR2-preinstall/results ↓のようなログ

Adding group oinstall with gid 54321
groupadd: group 'oinstall' already exists
Adding group dba
groupadd: group 'dba' already exists
User oracle is already present
uid=501(oracle) gid=501(oinstall) groups=501(oinstall),502(dba)
Creating oracle user passed

Verifying  kernel parameters as per Oracle recommendations...
Adding fs.file-max = 6815744
Adding kernel.sem = 250 32000 100 128
Adding kernel.shmmni = 4096
Adding kernel.shmall = 1073741824
Adding kernel.shmmax = 4398046511104
Adding kernel.panic_on_oops = 1
Adding net.core.rmem_default = 262144
Adding net.core.rmem_max = 4194304
Adding net.core.wmem_default = 262144
Adding net.core.wmem_max = 1048576
Adding net.ipv4.conf.all.rp_filter = 2
Adding net.ipv4.conf.default.rp_filter = 2
Adding fs.aio-max-nr = 1048576
Adding net.ipv4.ip_local_port_range = 9000 65500
Setting kernel parameters as per oracle recommendations...
Altered file /etc/sysctl.conf
Original file backed up at /etc/sysctl.conf.orabackup
Verifying & setting of kernel parameters passed
・
・
・
Adding kernel.shmall = 1073741824  
Adding kernel.shmmax = 4398046511104  

は各自調整

  • PSRのダウンロード
    ORACLE SUPPORTからダウンロードする。
    ↓がすごい便利だった。MOSから直接ダウンロードできるスクリプト

github.com

  • getMOSPatch.sh取得
# cd /data/orabin
# wget --no-check-certificate -nv https://raw.github.com/MarisElsins/TOOLS/master/Shell/getMOSPatch.sh 
               && chmod 755 getMOSPatch.sh
  • 11.2.0.4のPSRをダウンロード
# ./getMOSPatch.sh  patch=13390677 ←パッチ番号を指定する(13390677は11.2.0.4.0 PATCH SET FOR ORACLE DATABASE SERVER)
Oracle Support Userid: xxxx@gmail.com  ←サポートのユーザID入力
Oracle Support Password:               ←サポートのパスワード入力

Getting the Platform/Language list
Available Platforms and Languages:
537P - Acme Packet 1100
529P - Acme Packet 3820
・
・
46P - Linux x86
226P - Linux x86-64
912P - Microsoft Windows (32-bit)
208P - Microsoft Windows Itanium (64-bit)
・
・
106L - Icelandic (IS)
46L - Indonesian (IN)
108L - Italian (I)
15L - Japanese (JA)
16L - Korean (KO)
43L - Vietnamese (VN)
999L - Worldwide Spanish (ESW)
Comma-delimited list of required platform and language codes: 226P,15L ←プラットフォームと言語を選択
Configuration saved

Getting list of files for patch 13390677 for "Linux x86-64"
1 - p13390677_112040_Linux-x86-64_1of7.zip
2 - p13390677_112040_Linux-x86-64_2of7.zip
3 - p13390677_112040_Linux-x86-64_3of7.zip
4 - p13390677_112040_Linux-x86-64_4of7.zip
5 - p13390677_112040_Linux-x86-64_5of7.zip
6 - p13390677_112040_Linux-x86-64_6of7.zip
7 - p13390677_112040_Linux-x86-64_7of7.zip
Comma-delimited list of files to download: 1,2  ←ダウンロードするものを選択
Files to download:
  p13390677_112040_Linux-x86-64_1of7.zip
  p13390677_112040_Linux-x86-64_2of7.zip

Downloading the patches:
Downloading file p13390677_112040_Linux-x86-64_1of7.zip ...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 1330M  100 1330M    0     0  5230k      0  0:04:20  0:04:20 --:--:-- 3534k
p13390677_112040_Linux-x86-64_1of7.zip completed with status: 0
Downloading file p13390677_112040_Linux-x86-64_2of7.zip ...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 1097M  100 1097M    0     0  2362k      0  0:07:55  0:07:55 --:--:-- 2500k
p13390677_112040_Linux-x86-64_2of7.zip completed with status: 0


# unzip p13390677_112040_Linux-x86-64_1of7.zip && unzip p13390677_112040_Linux-x86-64_2of7.zip
# ls
database  getMOSPatch.sh  p13390677_112040_Linux-x86-64_1of7.zip  p13390677_112040_Linux-x86-64_2of7.zip

ダウンロード完了。

  • サイレントインストール
    • レスポンスファイル作成
# su - oracle
$ cat << EOS  > ~/ora.rsp
oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v11_2_0
oracle.install.option=INSTALL_DB_SWONLY
ORACLE_HOSTNAME=
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/opt/app/oraInventory
SELECTED_LANGUAGES=en,ja
ORACLE_HOME=/opt/app/oracle/product/11.2.0.4/dbhome_1
ORACLE_BASE=/opt/app/oracle
oracle.install.db.InstallEdition=SEONE
oracle.install.db.EEOptionsSelection=false
oracle.install.db.optionalComponents=oracle.rdbms.partitioning:11.2.0.4.0,oracle.oraolap:11.2.0.4.0,oracle.rdbms.dm:11.2.0.4.0,oracle.rdbms.dv:11.2.0.4.0,oracle.rdbms.lbac: 1.2.0.4.0,oracle.rdbms.rat:11.2.0.4.0
oracle.install.db.DBA_GROUP=oinstall
oracle.install.db.OPER_GROUP=oinstall
oracle.install.db.CLUSTER_NODES=
oracle.install.db.isRACOneInstall=
oracle.install.db.racOneServiceName=
oracle.install.db.config.starterdb.type=
oracle.install.db.config.starterdb.globalDBName=
oracle.install.db.config.starterdb.SID=
oracle.install.db.config.starterdb.characterSet=AL32UTF8
oracle.install.db.config.starterdb.memoryOption=true
oracle.install.db.config.starterdb.memoryLimit=
oracle.install.db.config.starterdb.installExampleSchemas=false
oracle.install.db.config.starterdb.enableSecuritySettings=true
oracle.install.db.config.starterdb.password.ALL=
oracle.install.db.config.starterdb.password.SYS=
oracle.install.db.config.starterdb.password.SYSTEM=
oracle.install.db.config.starterdb.password.SYSMAN=
oracle.install.db.config.starterdb.password.DBSNMP=
oracle.install.db.config.starterdb.control=DB_CONTROL
oracle.install.db.config.starterdb.gridcontrol.gridControlServiceURL=
oracle.install.db.config.starterdb.automatedBackup.enable=false
oracle.install.db.config.starterdb.automatedBackup.osuid=
oracle.install.db.config.starterdb.automatedBackup.ospwd=
oracle.install.db.config.starterdb.storageType=
oracle.install.db.config.starterdb.fileSystemStorage.dataLocation=
oracle.install.db.config.starterdb.fileSystemStorage.recoveryLocation=
oracle.install.db.config.asm.diskGroup=
oracle.install.db.config.asm.ASMSNMPPassword=
MYORACLESUPPORT_USERNAME=
MYORACLESUPPORT_PASSWORD=
SECURITY_UPDATES_VIA_MYORACLESUPPORT=true
DECLINE_SECURITY_UPDATES=true
PROXY_HOST=
PROXY_PORT=
PROXY_USER=
PROXY_PWD=
PROXY_REALM=
COLLECTOR_SUPPORTHUB_URL=
oracle.installer.autoupdates.option=
oracle.installer.autoupdates.downloadUpdatesLoc=
AUTOUPDATES_MYORACLESUPPORT_USERNAME=
AUTOUPDATES_MYORACLESUPPORT_PASSWORD=
EOS
$ /data/orabin/database/runInstaller -silent -responseFile ~/ora.rsp 
                                -ignoresysprereqs -ignoreprereq -force -waitforcompletion

Starting Oracle Universal Installer...

Checking Temp space: must be greater than 120 MB.   Actual 94285 MB    Passed
Checking swap space: must be greater than 150 MB.   Actual 2047 MB    Passed
Preparing to launch Oracle Universal Installer from /tmp/OraInstall2016-03-25_10-12-37AM. Please wait ...[WARNING] - My Oracle Support Username/Email Address Not Specified
You can find the log of this install session at:
 /opt/app/oraInventory/logs/installActions2016-03-25_10-12-37AM.log
The installation of Oracle Database 11g was successful.
Please check '/opt/app/oraInventory/logs/silentInstall2016-03-25_10-12-37AM.log' for more details.

As a root user, execute the following script(s):
        1. /opt/app/oraInventory/orainstRoot.sh
        2. /opt/app/oracle/product/11.2.0.4/dbhome_1/root.sh


Successfully Setup Software.

dockerであると事前チェックエラーがいくつか発生してインストールできないので-ignoresysprereqs-ignoreprereqを追加してインストールしている。

# /opt/app/oraInventory/orainstRoot.sh
# /opt/app/oracle/product/11.2.0.4/dbhome_1/root.sh

これでインストールは完了。

データベースを作成する

  • bash_profile編集
# su - oracle
$ cat << EOS >> ~/.bash_profile
export ORACLE_BASE=/opt/app/oracle
export ORACLE_SID=orcl
export ORACLE_HOME=\$ORACLE_BASE/product/11.2.0.4/dbhome_1
export NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS'
export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:\$ORACLE_HOME/lib
export PATH=\$PATH:\$ORACLE_HOME/bin:\$ORACLE_HOME/OPatch
export NLS_LANG=Japanese_Japan.AL32UTF8
export LANG=ja_JP.UTF-8
EOS

$ source ~/.bash_profile
$ mkdir -p ${ORACLE_BASE}/admin/${ORACLE_SID}/adump
$ mkdir -p ${ORACLE_BASE}/flash_recovery_area
$ mkdir -p ${ORACLE_BASE}/oradata/${ORACLE_SID}/
  • 初期化ファイル作成
$ cat << EOS >> $ORACLE_HOME/dbs/init${ORACLE_SID}.ora
db_name='${ORACLE_SID}'
memory_target=512M
processes = 150
audit_file_dest='${ORACLE_BASE}/admin/${ORACLE_SID}/adump'
audit_trail ='none'
db_block_size=8192
db_domain=''
db_recovery_file_dest='${ORACLE_BASE}/flash_recovery_area'
db_recovery_file_dest_size=2G
diagnostic_dest='${ORACLE_BASE}'
dispatchers='(PROTOCOL=TCP) (SERVICE=ORCLXDB)'
open_cursors=300
remote_login_passwordfile='EXCLUSIVE'
undo_tablespace='UNDOTBS1'
control_files = '${ORACLE_BASE}/control01.ctl'
compatible ='11.2.0'
EOS
  • ORACLE起動し、データベース作成
$ echo "startup nomount" | sqlplus / as sysdba 
$ echo "create spfile from pfile;" | sqlplus / as sysdba 

$ echo  -e "CREATE DATABASE orcl
    USER SYS IDENTIFIED BY oracle
    USER SYSTEM IDENTIFIED BY oracle
    LOGFILE GROUP 1 ('/opt/app/oracle/oradata/orcl/redo01.log') SIZE 10M,
            GROUP 2 ('/opt/app/oracle/oradata/orcl/redo02.log') SIZE 10M,
            GROUP 3 ('/opt/app/oracle/oradata/orcl/redo03.log') SIZE 10M
    MAXLOGFILES 5
    MAXLOGMEMBERS 5
    MAXLOGHISTORY 1
    MAXDATAFILES 1024
    CHARACTER SET AL32UTF8
    NATIONAL CHARACTER SET AL16UTF16
    EXTENT MANAGEMENT LOCAL
    DATAFILE '/opt/app/oracle/oradata/orcl/system01.dbf' SIZE 325M REUSE
    SYSAUX DATAFILE '/opt/app/oracle/oradata/orcl/sysaux01.dbf' SIZE 325M REUSE
    DEFAULT TABLESPACE users
       DATAFILE '/opt/app/oracle/oradata/orcl/users01.dbf'
       SIZE 50M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED
    DEFAULT TEMPORARY TABLESPACE temp1
       TEMPFILE '/opt/app/oracle/oradata/orcl/temp01.dbf'
       SIZE 20M REUSE
    UNDO TABLESPACE undotbs1
       DATAFILE '/opt/app/oracle/oradata/orcl/undotbs01.dbf'
       SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;" | sqlplus / as sysdba
$ echo -e "@?/rdbms/admin/catalog.sql;"  | sqlplus / as sysdba
$ echo -e " @?/rdbms/admin/catproc.sql; " | sqlplus / as sysdba
$ echo -e "@?/sqlplus/admin/pupbld.sql;"  | sqlplus / as sysdba
$ echo -e "@?/rdbms/admin/utlrp.sql"  | sqlplus / as sysdba
$ echo -e "@?/sqlplus/admin/pupbld.sql" | sqlplus system/oracle

これでデータベース作成完了。