今回は小ネタ。オラクルDBにおけるログライタープロセスの役割を実感してみる。

環境

oracle 12c ( Single Instance )

0. 事前準備

oracle$ sqlplus / as sysdba

SQL> create tablespace test_tblsp datafile '/tmp/test_tblsp.dbf' size 1m;

表領域が作成されました。

-- テストユーザーの作成
SQL> create user testuser identified by testuser default tablespace test_tblsp;
ユーザーが作成されました。

SQL> grant dba to testuser;
権限付与が成功しました。

SQL> connect testuser/testuser
接続されました。
SQL> show user;
ユーザーは"TESTUSER"です。
SQL>

1. 表の作成、レコードの挿入

作成した表領域上に表を作成し、レコードを挿入する。

SQL> set time on;
22:42:21 SQL> set timing on;

22:42:42 SQL> show user
ユーザーは"TESTUSER"です。
22:42:45 SQL> create table test2 ( c1 number(1) );

表が作成されました。

経過: 00:00:00.18
22:43:08 SQL> insert into test2 values ( 1 );

1行が作成されました。

経過: 00:00:00.18
22:43:20 SQL> commit;

コミットが完了しました。

経過: 00:00:00.16
22:43:21 SQL>


SQL>

さて、ここからが本題。
オラクルDBにはバックグラウンドプロセスの一つにログライタープロセスがある。

出典:Oracle® Databaseリファレンス12c リリース1 (12.1) : バックグラウンド・プロセス

これはREDOログバッファの内容をオンラインREDOログに書き出すプロセスである。
そのため、このプロセスを停止させると、更新系の処理が止まる。
たとえばcommitの処理が完了しない。

ではそれを実感してみる。

2. ログライタープロセスの停止

ログライタープロセスを停止する。 停止するにはkillコマンドのSTOPオプションを使用する。

[root@test1 ~]# ps -ef | grep lgwr
oracle   14239     1  0 22:35 ?        00:00:00 ora_lgwr_testdb    <-- これがログライタープロセス
root     15675 15071  0 22:44 pts/2    00:00:00 grep lgwr

# ログライタープロセスの停止
[root@test1 ~]# kill -s STOP 14239

3. 更新系の処理の実施

この状態でレコードを挿入しcommitを試みる。

22:43:59 SQL> insert into test2 values ( 2 );

1行が作成されました。

経過: 00:00:00.00
22:44:09 SQL> commit;

-- 分かりにくいがプロンプトが返らず、commit処理が完了しない。。。

ログライタープロセスが停止しているため、commitが完了しない。

なお、この状態ではアラートログに特段エラーは出ていなかった。

4. ログライタープロセスの再開

以下のコマンドでログライタープロセスを再開する。

[root@test1 ~]# kill -s CONT 14239

再開するやいなや、即座にcommitが完了した。

22:44:09 SQL> commit;

コミットが完了しました。

経過: 00:00:44.38
22:45:18 SQL>

まとめ

今回はログライタープロセスの役割を実感してみた。
この他にも、オラクルには様々なバックグラウンドプロセスが存在する。
それらの役割を、基本的には本やドキュメントを通して頭で理解して済ませていたが
たまにはこうして各プロセスの役割を実感しておくことも知識の定着に良い気がした。
また、プロセスの停止はプロセス障害のシミュレートとして使うのも良さそう。