常駐先で、ORACLEデータベースの管理やってます。ORACLE Platinum10g、データベーススペシャリスト保有してます。データベースの話をメインにしたいです

【小説 エンジニアの事故記録】第十一話 切羽詰まった時のデータポンプ講座

»

 心の中で溜息をついた。
 怒りに燃えるお客の顔と、眉間にしわを寄せ幸一郎の代わりに頭を下げる吉田課長の姿が脳裏に浮かんだ。
 小山の予言は当たった。
 縁起でもない予言ほど良く当たるものだと、心底実感した。

 恐る恐るもう一度、売上履歴データテーブル(URIAGE_RIREKI)の容量を確認するSQLを実行した。

「SELECT BYTES/1024/1024 FROM USER_SEGMENTS WHERE SEGMENT_NAME = 'URIAGE_RIREKI';」
「99」
「え!?」

 もう一度実行して見ても、画面には「99」と出力された。
 数字が増えないということは、売上履歴データテーブル(URIAGE_RIREKI)へのデータ格納が完了したのだろうか。
 幸一郎はバッチが終わったかどうかを確認するために、syslogを確認することにした。

「売上データ蓄積バッチ成功」

 syslogにはバッチの成功を示すメッセージが出力されていた。
 つまり、バッチがUSERS表領域を溢れさせるギリギリのところで完了したのである。
 時計の針は23時15分を指していた。
 格納されるデータが100MByteを超えると見積もっていたが、実際はわずかに少なかったようだ。
 顧客のデータ量に助けられた形になったが、取りあえず命はつながった。

(今日は何とか凌いだが......)

 明日の23時になればその日のデータが売上履歴データテーブル(URIAGE_RIREKI)に投入される。
 そうなれば、今日の分と合わさって100MByteを超え、バッチが落ちてしまう。

(今の内にデータごと、テーブルを移動させなければ)

 幸一郎はテーブルとそのデータを別の表領域に移動させる方法を調べることにした。
 スマホのロックを解除し、google先生に問い合わせた。
 結果、データポンプを使えば実現可能だということに行き着いた。
 データポンプとはテーブルの定義やデータをダンプの形で抜き取ったり、そのダンプを他のデータベースに投入することが出来ると言った便利なORACLEのユーティリティである。
 幸一郎は、このデータポンプを使って売上履歴データテーブル(URIAGE_RIREKI)をデータごと丸っと、USERS表領域からGYOMU_DATA表領域へ移動させようと考えた。
 具体的には、以下の方法で出来そうだと頭の中で流れを描いた。

 1.データポンプで、売上履歴データテーブル(URIAGE_RIREKI)からデータのみをダンプの形でエクスポートする。

expdp_impdp1.png

 2.売上履歴データテーブル(URIAGE_RIREKI)を、USERS表領域から削除する。

expdp_impdp2.png

 3.TABLESPACE句にGYOMU_DATA表領域を指定したCREATE TABLE文で、売上履歴データテーブル(URIAGE_RIREKI)を、GYOMU_DATA表領域に再作成する。

expdp_impdp3.png


 4.再作成した売上履歴データテーブル(URIAGE_RIREKI)に、1で取得したダンプデータをインポートする。

expdp_impdp4.png

 データポンプの使い方に慣れていない幸一郎は、震える指先でスマホを操作し、google先生にデータポンプの具体的なコマンドと使い方を問い合わせた。
 どうやら使用するのに先立って、ディレクトリオブジェクトと言うものが必要らしい。
 ディレクトリオブジェクトとはダンプを出力する先のことで、これが無いとデータポンプのコマンドが失敗する。
 まず、sqlplusでデータベースに接続した。

「sqlplus adm/adm」

 そして、ディレクトリオブジェクトを作成するために以下のSQLを実行した。

「create or replace directory DUMPDIR as '/home/oracle';」

 ダンプの出力先を/home/oracleとしたディレクトリオブジェクト「DUMPDIR」を作成した。
 これでadmユーザは、自身が所有するテーブルを抜き取ることが出来る。
 調べた内容に従いデータを取得するコマンドを組み上げた。

「expdp adm/adm directory=DUMPDIR dumpfile=URIAGE_RIREKI.dmp logfile=URIAGE_RIREKI.log tables=URIAGE_RIREKI content=data_only status=60」

 データを抜き取る時はexpdpコマンドを使用する。
 expdpに続いて、接続ユーザとしてテーブルの所有者を指定する。
 directory句には先程作成したディレクトリオブジェクトであるDUMPDIRを指定する。
 dumpfile句には出力するダンプの名前を、logfile句には出力するログファイルの名前を指定する。
 tables句には取得対象テーブル名を指定する。
 今回は売上履歴データテーブル(URIAGE_RIREKI)のデータを取得したいので、URIAGE_RIREKIと指定する。
 content句にdata_onlyと指定したのは、テーブル定義は不要でデータだけを抜き取りたいからである。
 そして、sutatus句に60と指定する。
 単位は秒数でこの場合、60秒に一回の割合で画面にコマンドの進捗状況を出力するようにした。
 と言った事を完璧に理解したわけでは無いが、幸一郎はネットから拾ったサンプルを元に、何とか作り上げた。
 メモ帳に記載したコマンドをTeraTermのウインドウにコピペし、実行した。
 画面に進捗状況が出力され、2分後に/home/oracleにURIAGE_RIREKI.dmpファイルが出力された。

「やった......」

 コマンドが躓くことなく成功し、幸一郎は小さくガッツポーズを取った。
 次に、データベースサーバから見つけ出したCREATE TABLE文の修正に取り掛かった。
 やはりTABLESPACE句が存在していなかった。
 CREATE TABLE文の末尾に「TABLESPACE GYOMU_DATA」と付け加えた。

 これで準備は出来た。
 後は、今ある売上履歴データテーブル(URIAGE_RIREKI)を削除して、新しいCREATE TABLE文を実行し、売上履歴データテーブル(URIAGE_RIREKI)をGYOMU_DATA表領域に作成する。
 最後にダンプからデータを流し込めば完了である。

「やるか......」

 幸一郎は売上履歴データテーブル(URIAGE_RIREKI)を削除するコマンドを入力した。

「DROP TABLE URIAGE_RIREKI PURGE;」

 リターンキーを押そうとした時、その指が止まった。
 指が止まったのは、幸一郎の脳が指令を出したからだが、その指令を出した原因は大山先生の残像だった。

---------------------------------------------------------------------
「大竹! そんな遅い蹴りじゃ敵は国外まで逃げとるぞ!」
「押忍!」

「大竹! お前だけ、平安初段※百回じゃ!」
「押忍!」

「大竹!」
「押忍!」
「お前、だいぶ形にキレが出て来たな!」
「お......押忍!」
---------------------------------------------------------------------

 大山先生は百回の内、九十九回は地鳴りのような声で叱り、一回は優しい声で褒めてくれたものだった。
 スマホの待ち受け画面に表示されている前屈立ち下段払いの構えを取った大山先生の雄姿が、今の幸一郎をじっと見ている気がした。

ooyama.jpg


 人格完成を目指し、空手の修業に励んできた自分が隠れてこそこそと、こんな事をしていていいのかと言う思いが湧いて来た。
 いや、今まで意識しないまでも、気持ちの奥底にはそんな思いはあったのだ。
 それが事に及ぶ直前になって噴出して来た。
 かと言って、小山にこのことを相談する気も起きなかった。
 真面目な彼のことだから、プロパーと言う立場上、上層部にそれを伝えて幸一郎の失態が明るみに出るだろう。
 それだけは避けたかった。

(大山先生、ごめんなさい......)

 心の中で恩師に謝罪した幸一郎は、コマンドを実行しテーブルを削除した。
 続けて、先程作成したCREATE TABLE文を実行し、売上履歴データテーブル(URIAGE_RIREKI)を本来の作成場所であるGYOMU_DATA表領域に作成した。
 もちろん、忘れずにインデックスも作成した。
 最後の仕上げに、URIAGE_RIREKI.dmpにあるデータを新しく作成したテーブルに投入するコマンドを組み上げた。

「impdp adm/adm dumpfile=URIAGE_RIREKI.dmp logfile=URIAGE_RIREKI_imp.log tables=URIAGE_RIREKI status=60」

 データを投入する時はimpdpコマンドを使用する。
 メモ帳に記載したコマンドをTeraTermのウインドウにコピペし、実行した。
 画面に進捗状況が出力され、1分後にimpdp成功の旨を表すメッセージが出力された。
 これで、テーブルとデータ移動が完了した。

「ふう......」

 幸一郎は深い溜息をついた。

(そう言えば、統計情報はどうだったかな......)

 テーブルの統計情報が適切に取得されていないと、適切な実行計画が選択されず、テーブルのインデックスが効かない等といった性能問題が発生する。
 そのことについて心配になったがDBAの石川が、毎晩午後二時に全テーブルに対して統計情報を取得するバッチを仕込んでいると言っていたのを思いだした。
 安心して一息つくと同時に、勢いよく扉が開かれ、小山がサーバ室に上がり込んできた。

「買って来たぞー」

 それを見た幸一郎は、慌ててTeraTermを閉じ何事も無かったかのように装った。
 自分が使いに行かされている間、何があったかも知らない小山はビニール袋を両手に下げて、元気よく幸一郎の元に駆け寄って来た。
 ドン、と机に二つのビニール袋を置いた。
 幸一郎は自分から見て右側にあるビニール袋を覗くと、そこにはどこから見つけて来たのかインカコーラが三本も入っていた。
 幸一郎はインカコーラを輸入食品取扱店「カルディアン」でしか見たことが無い。
 この深夜の街中でどこでそれを探し当てたのか気にはなった。

「駅前のドンキッキにあった」

 小山が問われるより先にそう答えた。
 ペンギンマークで有名なディスカウントストアか、と幸一郎はなるほどと思った。

 そして、もう一つのビニール袋にはドクターペッパーが二本、そして最近あまり見かけないメッコールが一本入っていた。

「それは俺からのおごりだ」

 小山は得意げにそう言った。

「ありがとう」

 幸一郎は乾いた喉を潤そうと、インカコーラを手にした。
 グイっと一気に飲むと、甘さで緊張していた身体が一気に弛緩していくような心地よい雰囲気に包まれた。

「そんなに飲みたかったんだな」
「ああ」

 ごくごく一気に飲み干した幸一郎を、小山はニコやかな和やかな顔で見ている。
 その、ニコやかで和やかな顔を見た幸一郎は、渚沙のことを思いだした。
 つい数時間前、こいつの彼女とも知らず渚沙に告白して振られたことを思い出した。

(そうだった。そんなことも知らずに告った僕は、いい面の皮だ!)

 その後の、嵐ともいえる怒涛の事故処理とパスカード放浪記も思い出した。
 そんな事などつゆ知らず、インカコーラごときで自分の機嫌が直ったと思われていると、無性に腹が立った。
 そして、先ほどまで問い詰めたいことと思っていたことを、ここでしっかり訊き出そうと心に決めた。

「お前、水谷さんと付き合ってるって本当か?」

 それを聞いた小山は、キョトンとして自分のことを指さした。

つづく


---------------------------------------------------------------------
※下段払いや後屈立ちなどの、基本的な動作で構成された一番最初に習う形。
 全二十一挙動で、約一分で終了する。

Comment(4)

コメント

匿名

おそらく形(かた)と読んでくれてる人はどんだけいることか・・・。
主人公は高校から始めたから、平安の形の練習をしてるんですかね。
次は第一指定形、第二指定形もしくは得意形を百回やったことを
回想するんでしょうか。
これからも伝統空手ネタをドンドン盛り込んでください。

糸東流ですかね、なのに"大山"先生。

湯二

匿名さん。
コメントありがとうございます。

多分、「かたち」って読んでる人もいるかもですね。
組手が弱くて、形がまあまあ上手いっていう設定なので、平安の形は相当やっているはずです。
得意形を何にするか考えないと、ですね。
空手の文献を読んで、使えそうなところ探してみます。
大山先生は、空手だとポピュラーな名前だし、この小説が漫画みたいなもんなので、エイヤって付けました。

場末のDBA

表領域移動だけならalter table moveではだめだったのでしょうか。
dropして作り変えると外部キー参照が気になったり、そのDDLに全部のインデックス定義が
ついているかとかいろいろ心配してしまいます・・・
ついでに実行計画がそれで変わる可能性がw

湯二

場末のDBAさん、コメントありがとうございます。

技術的な考証ありがとうございます。

>表領域移動だけならalter table moveではだめだったのでしょうか。
主人公はORACLEに詳しく無いという設定なので、思い付かなかったということで。。。
後の話で、削除したということも効いて来るのでそれも含めて。

>dropして作り変えると外部キー参照が気になったり、そのDDLに全部のインデックス定義が
>ついているかとかいろいろ心配してしまいます・・・
インデックスについては加筆しました。
外部キーは張らないというポリシーで設計されたデータベースと言うことで。。。

>ついでに実行計画がそれで変わる可能性がw
苦し紛れに加筆しました。

コメントを投稿する