Home
About UsTechnologyMusicCharactersEconomyForum

Oracle少女 リリカルなのは『一時表領域が縮小不可能なの?』

前提知識解説

 本技術資料に登場するキャラクターは、都築真紀『魔法少女 リリカルなのは』を元ネタとしている。この作品では魔法が一種のプログラムとして解釈され、合成音声を発する魔法の杖もメカニカルなインテリジェント・デバイスの形をとっている。そのためIT系オタク層にとってこの作品は非常に親しみやすいものに仕上がっている。ただし変身時に主人公の上着だけでなく下着までとれて全裸になってしまうところが、視聴者を選ぶ演出ではある。(←ヲイ)
参考リンク:
 魔法少女 リリカルなのは オフィシャルサイト
 原作者 都築真紀氏のホームページ



プロローグ

 わたし、高町なのは。いつもは平凡な小学三年生なのですが、最近はこう、いろいろありまして、今日も深夜出動です。


「なのは! リソースを圧迫しているセッションが分かったよ!」

 足もとのフェレットみたいな動物が声をあげた。彼の名はユーノ君。こんな姿だけど実は異世界からやってきた天才プログラマーなんだよ…ってそんなこと言っている場合じゃない。
 わたしはあわてて両手にステッキを構えた。

「Setup. Ready.」

 魔法の発動体、レイジングハートがくぐもったボイスで私に応える。先端に嵌め込まれた赤い宝石に、『Sealing』の文字が浮かび上がる。


C:\> sqlplus nanoha/takamachi@KIKANDB.seisho.ac.jp

SQL*Plus: Release 9.2.0.1.0 - Production on 水 Jan 5 03:22:13 2005

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.


Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning option
JServer Release 9.2.0.1.0 - Production
に接続されました。
SQL>

 わたしはレイジングハートを振りかざし、呪文を唱えた。

「リリカル Oracle(オラクル)! ジュエルシード、セッションID:10、シリアル:21、封印!」


SQL> ALTER SYSTEM KILL SESSION '10,21'
  2  ;

セッションが切断されました。

SQL>


 システムの中で悪さをしていたジュエルシードがゆっくりとひっぱりだされてくる。魔法の力を使ったわたしは肩で息をつぎながらもなんとかそれを受け止めた。

「なのは、おつかれさま。」

「…うん、今回もなんとかなったよね。いちおう、セッション一覧を確認しておこう。」

 Object Browserのセッションウィンドウを開いてあのセッションがいなくなっていることを確かめる。それからほかにもロック情報、表領域情報、データファイル情報……

「どうしたの、なのは、もう遅いから帰ろうよ。」

「……ここのデータベースって、どのデータファイルも自動拡張(AUTOEXTEND)がONになってる。」

「普通はAUTOEXTENDはOFFにするものだけどね。なにか理由があってそうしているんだろうけど……気になるところ、ある?」

「え? えーと、いや、特に何もないよ。じゃ、帰ろうか。」


 こんな感じでわたしは、『DBA(DataBase Administrator:データベース管理者)』とかやっています。強大なITの力を秘めたジュエルシードは、こちらの世界のデータベースに入り込んでシステム障害を引き起こしたりします。そんなときにわたしとユーノ君でジュエルシードを封印しにゆくのです。
 封印したジュエルシードはこれで5つめ。このごろはOracleのアーキテクチャもだいぶわかってきて、DBAとしてさまになってきたかな、なんて思ったりします。


本編

 携帯の着メロの音で目が覚める。時刻は11時20分。きのうは夜3時半まで仕事だったので午前中は爆睡していたかったのだけど……、あ、すずかちゃんからだ。

「はい、なのはですけど…」

「なのはちゃん? ごめんね。昨日徹夜だったのに…でもいま大変な事件がおこっちゃって。登録系の機能が全部データベースでエラーになっちゃうの。「ORA-01237 データ・ファイル(データファイル名)は拡張できません」っていうエラー・メッセージがでているんだけど……」

 いつもはおっとりしたすずかちゃんの声がすっかりうわずっている。大変なトラブルが発生しちゃったのかも……

「すずかちゃん、落ち着いて。 えーと、普通にデータファイルを追加するか、リサイズで大きくしたらどうかな。」

「それが、ディスクに空き領域がないの。昨日までは10GB以上の空きがあったはずなのに、いつのまにか一時表領域が10GB近くに膨れ上がっちゃって、他のデータファイルが拡張できない状態なの。」

 すずかちゃんは泣き出しそうな声でも自分を抑えて一生けんめい事態を説明してくれました。

「一時表領域が! やっぱり……」

 あとは任せて、と言って電話を置き、あわててパソコンを立ち上げる。リモートデスクトップでログインしてディスク領域の使用状況を確認する、やっぱりGドライブがいっぱいになっている。一時表領域を含めてすべての表領域のデータファイルたちが置かれている場所だ。

 コンソールを心配そうな顔で覗き込んでいるユーノ君に向かって私はつぶやいた。

「わたし、気づいていたのに……」

「なのは……」

「……ユーノ君。こういうときは、どうすればいいの?」

「一時表領域のデータファイル、正確には一時ファイル(TEMPFILE)についても普通のデータファイルと同じようにALTER DATABASE 〜 RESIZEで縮小できるよ。」

「そうなんだ、すぐに小さくしないと。」

 わたしは胸にかけている宝石をとりだした。

「あ、まって! まずはデータセンターにいかないと。ここだとSYSDBAの力が使えないよ。」

「ううん、できるよ……そうだよね。レイジングハート!」

 宝石に語りかけたわたしはそれを高く掲げた。レイジングハートが杖状に変化する。それから……

「Shooting Mode Setup... 」

 杖の根元のピンク色の部分が大きくスライドし、先端の金色の部分が矛のように湾曲する。

「REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE NANOHA IDENTIFIED BY TAKAMACHI AS SYSDBA...CONNECT 」

「つながったよ!」

「ま、まさか、僕でも使えない遠距離魔法を……」

「縮める大きさはどうしようか?」

「あ、ああ。そうだな、2GBもあれば十分だよ。」

 すかさずわたしは呪文を唱える。

「ALTER DATABASE...」


SQL> ALTER DATABASE TEMPFILE 'G:\ORACLE\KIKANDB\ORADATA\DBF\TEMP01.DBF' RESIZE 2048M;
ALTER DATABASE TEMPFILE 'G:\ORACLE\KIKANDB\ORADATA\DBF\TEMP01.DBF' RESIZE 2048M;
*
1行でエラーが発生しました。
ORA-03297:
ファイルには、要求したRESIZE値を超える使用中のデータが含まれています。 

SQL>


「えっ! 使用中ってそんなに大きなソート処理がいま走っている?」

「…いや、走ってないよ。どうしたんだろう。いったん割り当てられた一時セグメントは処理が終ったら解放されるはずなのに……そうか! Oracle9iのローカル管理表領域の場合、一時セグメントにいったん割り当てられたエクステントは解放されないんだった! だから一時ファイルを縮小できないんだ。」

参考資料:Oracle Internet Support Centerより
KROWN:49204 ローカル管理一時表領域のファイルサイズの縮小
[問題]
ローカル管理一時表領域のファイルサイズを変更すると、ORA-3297が発生致します。

SQL> alter database tempfile '/home2/test/app/oracle/oradata/test817/temp00.dbf'
2 resize 1m;
ORA-03297: file contains used data beyond requested RESIZE value

[原因]
ローカル管理一時表領域のファイルのサイズの縮小は、実際ブロックが割り当てられた範囲
以下のサイズに変更することはできません。
(略)
KROWN:44545 SORTオペレーションが発生した時の一時セグメントの動作
(略)
*** エクステントの解放 ***
一時セグメントに割当て済みのエクステントの解放は、ディクショナリ管理の一時表領域とローカル管理の一時表領域で異なります。

[ディクショナリ管理の一時表領域]
一時セグメントを解放するタイミングはデータベースがオープンした直後になります。
よって、データベースがオープンした直後に大きな一時セグメントの削除の為にCPUが大量に消費される場合があります。表領域のデフォルト記憶域の設定でINITIALとNEXTの設定を不適切に小さくしていると、エクステントの数が多く作成される為に、エクステントの解放に時間がかかります。一時セグメントの削除によってFREEになった領域はコアレスして大きな空き領域として返されます。

[ローカル管理の一時表領域]
一時セグメントに割当て済みのエクステントの実質的な解放処理は行いません。データベース停止時に上記で解説をしたSEPは(SGAが解放されるので)解放されますが、それ以外の処理は行われません。
すなわち、一時エクステント解放によるデータベース起動直後のCPUの消費は発生しません。
(略)

「そ、そんな。じゃあどうやって小さくすればいいの?」

「一時ファイルを物理削除して再作成するしかない。」

「でも! いきなりそんなことしたら今システムを使っているユーザーに迷惑がかかっちゃうよ。」

「……Cドライブに二つめの一時ファイルを作るんだ。そうすればGドライブの一時ファイルを消している間もユーザーセッションは自動的にそちらにまわされる。」

「でもでも、CドライブはOSとかの実行ファイルが入っている大切なところだよ。もしCドライブもGドライブみたいにいっぱいになっちゃったら大変なことになっちゃう!」

「自動拡張(AUTOEXTEND)をOFFにして作れば大丈夫。なのは、DBAはこんな厳しい状況こそ勝負どころだよ。」

「う、うん。わかった。 じゃあ、はじめるよ。ALTER TABLESPACE!」


SQL> ALTER TABLESPACE TEMP ADD TEMPFILE
  2   'C:\ORACLE\KIKANDB\ORADATA\DBF\TEMP02.DBF' SIZE 512M AUTOEXTEND OFF
  3  ;

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

SQL>


「よし。次は「TEMP01.DBF」の削除だ。まずOFFLINEにすることを忘れないで!」

「OK!」


SQL> ALTER DATABASE TEMPFILE 'G:\ORACLE\KIKANDB\ORADATA\DBF\TEMP01.DBF' OFFLINE
  2  ;

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

SQL> ALTER DATABASE TEMPFILE 'G:\ORACLE\KIKANDB\ORADATA\DBF\TEMP01.DBF'
  2   DROP INCLUDING DATAFILES
  3  ;

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

SQL>


「やった!」

「これで一安心。空き領域ができたから他のデータファイルが拡張できる、つまり登録系の処理がうまく動作するはずだ。」

「うん、あとは「TEMP01.DBF」の作り直しだよね。それから「TEMP02.DBF」はちゃんと削除しないと…」


SQL> ALTER TABLESPACE TEMP ADD TEMPFILE
  2   'G:\ORACLE\KIKANDB\ORADATA\DBF\TEMP01.DBF' SIZE 2048M AUTOEXTEND OFF
  3  ;

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

SQL> ALTER DATABASE TEMPFILE 'C:\ORACLE\KIKANDB\ORADATA\DBF\TEMP02.DBF' OFFLINE
  2  ;

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

SQL> ALTER DATABASE TEMPFILE 'C:\ORACLE\KIKANDB\ORADATA\DBF\TEMP02.DBF'
  2   DROP INCLUDING DATAFILES
  3  ;

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

SQL>


「終わった……」

 いっきに緊張感が解けたわたしはひざをついてパソコンの前で倒れこんでしまいました。


エピローグ

「わたしね、気づいていたんだよ……」

 その日の夕方、暮れなずむ空をちらっと見上げてからわたしはうつむいて、ユーノ君に声をかけました。

「AUTOEXTENDがONになっているのを知って、こんなときはあらかじめ、それぞれのデータファイルのMAXSIZEを確かめておかなきゃいけないって、分かっていたんだ。でもめんどうで、早く帰りたいなって思って確かめなかったんだ。もしあのときに一時ファイルのMAXSIZEを絞っておいたら、こんなことにならなかったかもしれないのに。」

「なのは……」

「わたし、いろんな人に迷惑かけちゃったね。」

「なのは! お願い、悲しい顔をしないで! なのははちゃんとやってくれてるよ。」

 DBAになって、はじめての失敗……自分のせいで誰かに迷惑がかかるのは、とても辛いです。

 自分なりの精一杯じゃなく、本当の全力で、ユーノ君のお手伝いではなく、自分の意志で、データベース管理をしていこうと思いました。もう絶対、こんなことにならないように。