「Oracle」タグアーカイブ

ORA-01157が発生した場合の対処法

Oracleをキレイにするために、使っていない表領域を整理しました。すると、Oracleのログに以下のエラーが出力されました。

行1でエラーが発生しました。:
ORA-01157: データファイル5を識別/ロックできません –
DBWRトレース・ファイルを参照してください ORA-01110:
データファイル5: ‘/u01/app/oracle/oradata/TS/TS001.dbf’

原因

これはデータファイルがOS的に見えなくなっている場合に発生します。データファイルがOS上から削除されてしまったか、NAS領域なのであればmountが外れてしまっている場合などが考えられます。私は表領域を整理する中で、誤って必要な表領域のデータファイルを物理削除してしまったようです。

ステップ① MOUNTモードで起動

データベースをシャットダウンして、MOUNTモードで起動します。

SQL> shutdown immediate
SQL> startup mount;

ORACLEインスタンスが起動しました。
Total System Global Area 1173240615 bytes
Fixed Size 8635922 bytes
Variable Size 373223054 bytes
Database Buffers 681671552 bytes
Redo Buffers 8120081 bytes
データベースがマウントされました。

MOUNTモードとは、制御ファイルの読み込みまでで、データベースファイルは読み込みません。
MOUNTモードの説明はこちらがわかりやすかったです。
https://sql-oracle.com/?p=56

ステップ② 表領域をdrop offlineする

エラーが発生した表領域を「drop offline」します。「drop offline」することで、指定したデータファイルをオフライン化して、削除対象としてマークします。

SQL> alter database datafile ‘<対象データファイルパス>’ offline drop ;
データベースが変更されました。

(例)alter database datafile ‘/u01/app/oracle/oradata/TS/ts001.dbf’ offline drop ;

ステップ③ データベースをopenする

SQL> alter database open;
データベースが変更されました。

ステップ④ 表領域を削除する

SQL> drop tablespace ‘<対象表領域名>’ including contents;
表領域が削除されました。

(例)drop tablespace ts001 including contents;

この後は、念のため再起動して完了です。

開発環境だからといって派手(雑に)に表領域を整理したせいで、いやー焦った焦った (;´∀`)


Oracleで実行されたDDLをログ出力する(ENABLE_DDL_LOGGING)

Oracleで実行されたDDLをログ出力する方法です。

ENABLE_DDL_LOGGINGという設定をTRUEにすることで、実行されたDDLをOracleのログに出力することができます。

まずは、現在の設定の確認。

FALSEになっているので、TRUEに変更します。

再度、設定を確認する。

TRUEになっています。この状態でなんでもいいので、DDL文を実行します。

記録されるのは、以下のDDL文。

  • ALTER/CREATE/DROP/TRUNCATE CLUSTER
  • ALTER/CREATE/DROP FUNCTION
  • ALTER/CREATE/DROP INDEX
  • ALTER/CREATE/DROP OUTLINE
  • ALTER/CREATE/DROP PACKAGE
  • ALTER/CREATE/DROP PACKAGE BODY
  • ALTER/CREATE/DROP PROCEDURE
  • ALTER/CREATE/DROP PROFILE
  • ALTER/CREATE/DROP SEQUENCE
  • CREATE/DROP SYNONYM
  • ALTER/CREATE/DROP/RENAME/TRUNCATE TABLE
  • ALTER/CREATE/DROP TRIGGER
  • ALTER/CREATE/DROP TYPE
  • ALTER/CREATE/DROP TYPE BODY
  • DROP USER
  • ALTER/CREATE/DROP VIEW

ログは以下のパスに出力されます。↓

例えば、ddl_orcl.logにはこんな感じでDDLがログ出力される。

余談だが、この機能を使った理由。。。。とある製品がDBを内包しており、製品のバージョンアップに伴い、テーブル定義を変更する処理を実行していた。バージョンアップの過程でどう変更しているのか、気になって仕込みました。


Oracelでテーブル一覧とそのテーブル定義を出力する

今の現場でDBクライアントソフト(A5:SQL Mk-2とか)を、端末にインストールしてはいけない状況で、テーブル定義を確認した時の手順。

・テーブル一覧

下記のようなSQLで取得可能。Where句は必要に応じて調整。

・テーブル定義

かなりアナログなやり方ですが。。。
まず、あるテーブルの定義を確認するには、descで確認できる。

例えば、user_usersを見てみる。

でもこれだと、一つずつ「desc ・・・」としなければならないので、Excelにテーブル名を一覧で並べて、横に「= “desc ” & <テーブル名のセル>」を書くと、一応これで全テーブル分のdescができる。これをSQLファイルにして、SQL*Plusで実行して、ゲットした。

だめだ、、、もっといい方法ありそう。。。