おらくるのいる生活

OracleのDBAとしての、障害対応やらパフォーマンス・チューニングやらの日々を綴っています

ORA-01157が発生し、テーブルにアクセスできない

ある年の冬の事、「UNDO領域拡張に失敗し、テーブルにアクセスできなくなったので対処法を教えてほしい」との連絡がありました。

リリース前の新本番環境で、構成は以下の通りです。

Oracle RAC(2ノード) EE 12.1.0.2

RHEL Version 7.3 

 連絡と共に、OEM(EM Express)上で表示されているエラーが送られてきていました。

ORA-01157: データファイル368を識別/ロックできません - DBWRトレース・ファイルを参照してください
ORA-01110: データファイル368: '/u01/app/oracle/product/12.1.0/dbhome_1/dbs/DATA'
ORA-06512: "SYS.PRVTEMX_DBHOME", 行1207
ORA-06512: "SYS.PRVTEMX_DBHOME", 行150
ORA-06512: "SYS.WRI$_REPT_DBHOME", 行91
ORA-06512: "SYS.DBMS_REPORT", 行898
ORA-06512: 行1

これはもう、一目瞭然ですね。

+DATAというASMのディスク・グループ上に作るべきファイルを、誤って2号機のローカル・ファイルシステムに作成してしまった為、1号機のインスタンスからアクセスできずにエラーになっています。

念のため、v$datafileの出力結果とDBWRトレース・ファイルも送って貰って状況を確認しました。

DBWRトレース・ファイルにはこんな風に出力されています。

ORA-01157: ???????368???/???????? - DBWR??????????????????
ORA-01110: ???????368: '/u01/app/oracle/product/12.1.0/dbhome_1/dbs/DATA'
ORA-27037: ???????????????????
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3

間違いに気づいて削除しようとしたが、できなかったとの事。既に使用されてしまっているようです。

 

12cではデータファイルをオンラインで移動できる便利な機能があるので、それを使用します。

検証の為、ノード2でローカル・ファイルシステム上にデータファイルを作成します。

SQL> alter tablespace undotbs2 add datafile '/u01/app/oracle/product/12.1.0/dbhome_1/dbs/DATA2' size 1M;

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

SQL> select name,file# from v$datafile;

NAME
--------------------------------------------------------------------------------
FILE#
----------
/u01/app/oracle/product/12.1.0/dbhome_1/dbs/DATA2
9
(略)

SQL> !ls -l /u01/app/oracle/product/12.1.0/dbhome_1/dbs/DATA2
-rw-r----- 1 oracle dba 1056768 Feb 14 17:48 /u01/app/oracle/product/12.1.0/dbhome_1/dbs/DATA22

alter database move datafileで移動させます。

SQL> alter database move datafile '/u01/app/oracle/product/12.1.0/dbhome_1/dbs/DATA2' to '+DATA';

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

SQL> select name,file# from v$datafile;

NAME
--------------------------------------------------------------------------------
FILE#
----------
+DATA/ORCL/DATAFILE/undotbs2.294.1032368207
9
(略)

SQL> !ls -l /u01/app/oracle/product/12.1.0/dbhome_1/dbs/DATA2
ls: cannot access /u01/app/oracle/product/12.1.0/dbhome_1/dbs/DATA2: No such file or directory

ASMからも確認します。

$ asmcmd ls -l DATA/ORCL/DATAFILE/undotbs2.294.1032368207
Type Redund Striped Time Sys Name
DATAFILE UNPROT COARSE FEB 14 16:00:00 Y undotbs2.294.1032368207

以前のバージョンのrename datafileだとDB停止してOSコマンド等で移動させ、DBをマウントしてrename・・・と面倒だったので、かなり便利になりました。

但し、これだけだとノード1でdba_data_filesにアクセスした時にエラーが発生します。

SQL> select FILE_ID,FILE_NAME from dba_data_files;
select FILE_ID,FILE_NAME from dba_data_files
*
行1でエラーが発生しました。:
ORA-01157: データファイル9を識別/ロックできません -
DBWRトレース・ファイルを参照してください ORA-01110:
データファイル9: '+DATA/ORCL/DATAFILE/undotbs2.294.1032368207'

 

ファイルシステムからASMに移動されたファイルに対して、RAC内の特定のインスタンスでdba_datafilesへの問合せを実行するとORA-01157が発生します (ドキュメントID 2566246.1)

上記、ドキュメントに対処策が載っているので、その通りに対処します。

SQL> alter system check datafiles;

システムが変更されました。

SQL> alter system flush shared_pool;

システムが変更されました。

SQL> select FILE_ID,FILE_NAME from dba_data_files;

FILE_ID
----------
FILE_NAME
--------------------------------------------------------------------------------

9
+DATA/ORCL/DATAFILE/undotbs2.294.1032368207

(略)

 

12c以前だとこの便利なコマンドは使えません。

ASM上にOSコマンドでコピーはできないし、asmcmd のcpコマンドだとエイリアスが必要になってしまったり、DB_UNKNOWNディレクトリ配下に実体が作られてしまったりします。

それは避けたいので、RMANを使用してリストアします。

手順は以下の通りです。

(1)sqlplus で1号機に接続し、インスタンスを停止します。

※1号機で確認すると、問題のファイルはサイズが0になっています。

$ sqlplus / as sysdba

SQL> select name,bytes from v$datafile where file#=368;

NAME
--------------------------------------------------------------------------------
BYTES
----------
/u01/app/oracle/product/12.1.0/dbhome_1/dbs/DATA
0

SQL> shutdown immediate
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
SQL> exit

(2)ノード2側でバックアップを取得します。

$ rman target /

RMAN> backup datafile '/u01/app/oracle/product/12.1.0/dbhome_1/dbs/DATA' format '/work/data.back';

backupが開始されました(開始時間: 18-11-29)
チャネル: ORA_DISK_1が割り当てられました
チャネルORA_DISK_1: SID=80 インスタンス=orcl2 デバイス・タイプ=DISK
チャネルORA_DISK_1: フル・データファイル・バックアップ・セットを開始しています
チャネルORA_DISK_1: バックアップ・セットにデータファイルを指定しています
入力データファイル・ファイル番号=00002 名前=/u01/app/oracle/product/12.1.0/dbhome_1/dbs/DATA
チャネルORA_DISK_1: ピース1(18-11-29)を起動します
チャネルORA_DISK_1: ピース1(18-11-29)が完了しました
ピース・ハンドル=/work/data.back タグ=TAG20181129T172709 コメント=NONE
チャネルORA_DISK_1: バックアップ・セットが完了しました。経過時間: 00:00:01
backupが完了しました(完了時間: 18-11-29)

(3)DBを停止し、マウントモードで再起動します。

RMAN> shutdown immediate

データベースがクローズしました
データベースがディスマウントされました。
Oracleインスタンスがシャットダウンしました

RMAN> startup mount

ターゲット・データベースに接続しました(起動していません)。
Oracleインスタンスが起動しました
データベースがマウントされました。

(4)リストア先にディスク・グループ名を指定して、バックアップからリストアします。

RMAN> run{
2> set newname for datafile 368 to '+DATA';
3> restore datafile 368;
4> }

実行コマンド: SET NEWNAME

restoreが開始されました(開始時間: 18-11-29)
チャネルORA_DISK_1の使用

チャネルORA_DISK_1: データファイル・バックアップ・セットのリストアを開始しています
チャネルORA_DISK_1: バックアップ・セットからリストアするデータファイルを指定しています
チャネルORA_DISK_1: データファイル00002を+DATAにリストアしています
チャネルORA_DISK_1: バックアップ・ピース/work/data.backから読取り中です
チャネルORA_DISK_1: ピース・ハンドル=/work/data.back タグ=TAG20181129T172709
チャネルORA_DISK_1: バックアップ・ピース1がリストアされました
チャネルORA_DISK_1: リストアが完了しました。経過時間: 00:00:01
restoreが完了しました(完了時間: 18-11-29)

RMAN> exit

(5)ASMに接続し、ファイルがASM上にリストアされた事を確認します。

$ asmcmd
ASMCMD> ls -l DATA/orcl/datafile
Type Redund Striped Time Sys Name

(略)
DATAFILE UNPROT COARSE NOV 29 17:00:00 Y UNDOTBS2.266.992269763
DATAFILE UNPROT COARSE NOV 29 17:00:00 Y UNDOTBS2.270.993490589
(略)
ASMCMD> exit

(6)sql*plusで接続し、データファイルをリネームします。

※toの後ろは、上記で確認した名前を指定します。

SQL> alter database rename file '/u01/app/oracle/product/12.1.0/dbhome_1/dbs/DATA' to '+DATA/orcl/DATAFILE/270.993490589';

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

(7)リカバリを実行し、DBをオープンします。

SQL> recover database;
メディア・リカバリが完了しました。

SQL> alter database open;

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

(8)名前とサイズを確認します。

SQL> select name,bytes from v$datafile where file#=368;

NAME
--------------------------------------------------------------------------------
BYTES
----------
+DATA/orcl/DATAFILE/270.993490589
5242880

(9)1号機のインスタンスを起動し、名前とサイズが2号機と同じになっている事を確認します。

SQL> startup

SQL> select name,bytes from v$datafile where file#=368;

NAME
--------------------------------------------------------------------------------
BYTES
----------
+DATA/orcl/DATAFILE/270.993490589
5242880

 

 オンライン・データファイルの移動の便利さが良く分かりますね。

でもどうやってオンラインの移動が可能なのか、いずれ検証したいと思います。