ORACLEでテーブルごとのDML回数を取得する
テーブルごとの1時間あたりのDML(INSERT,UPDATE,DELETE)の平均を取得するために考えた方法。
確認手段としてDBA_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のインストールをする
↓を基にインストールまで行う。
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を持った複製データベースを作成したのでメモ。
複製先サーバ側の設定
以下ファイルを複製元から複製先へコピー、配置する。
- 初期化パラメータ(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
さくっとインストールまで
# 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
は各自調整
- 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
- 動的VIEW作成スクリプト実行
$ 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
これでデータベース作成完了。