2013年10月26日土曜日

OracleDBバックアップ用EXPDPバッチ作成のコツ

EXPDPは本来DBの引っ越しなんかで使うコマンドらしいですが、
お手軽データバックアップ方法としてや、断片化対策としても用いられています。

「Data Pump(expdp/impdp)の使い方~エクスポート/インポート、データ移動、論理バックアップ」
https://blogs.oracle.com/oracle4engineer/entry/data_pumpexpdpimpdp

「Oracleにおける断片化の種類と解消方法~表領域、セグメント、エクステント、ブロック、テーブル、索引」
https://blogs.oracle.com/oracle4engineer/entry/column_table_fragmentation

ただ先代まで使われていたEXP/IMPコマンドとの互換はなく、
おまけにお作法が面倒くさい。

下記ページにコマンドの使い方は載っていたのですが、
バッチを組むには少し厳しい情報量だったので少し補足しますよ!

「Oracleでexpdp/impdpを使ってみる」
http://dbtuning.seesaa.net/article/142143213.html

1.下ごしらえ

コマンドプロンプトよりSQLPLUSに入って、以下の設定を行います。
EXPファイルを吐き出す場所を予めOracleさんに認識させる必要があります。

あと、当サイトオリジナル要素として、
ストリームプールの明示指定をおススメします!
たまにOracleさんがエクスポートに使うメモリ領域確保に失敗するので。
…結構ホラーですよ。バックアップが取れてなくて、ある日システムが壊れたら。

  sqlplus STUDY/STUDY
  set linesize 2000

  --ユーザSTUDYの権限を確認(DBAあればよし)
  SELECT * FROM session_roles;

  --エクスポートファイルを吐き出す場所を指定
  CREATE DIRECTORY DumpDir as 'C:\★EXPファイル出力先フォルダ指定★';
  SELECT * FROM DBA_DIRECTORIES;

  --稀にEXPDPに用いるメモリ領域確保失敗するエラーを回避
  --下記コマンドで失敗したら、scope=spfileに変えてDB再起動必要
  alter system set streams_pool_size=48M scope=both;

  exit

2.エクスポート

バッチを意識して、エクスポートファイルとログは日付フォルダに移動。
エクスポートする場所にすでに同名のファイルがあると失敗します!!

  rem エクスポート先のフォルダを指定
  cd C:\★EXPファイル出力先フォルダ指定★

  rem 実行時の日時のフォルダを作成
  set DIRNAME=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%_expdp
  mkdir %DIRNAME%

  rem エクスポート用コマンド
  expdp system/manager dumpfile=DumpDir:expdp.dmp logfile= DumpDir:expdp.log schemas=STUDY
  rem ダンプファイルを移動
  move expdp.dmp %DIRNAME%
  move expdp.log %DIRNAME%

3.インポート

こちらは非バッチかと思いますが、備えは必要なので。
ポイントは「table_exists_action=REPLACE」です。
これのおかげで、1度テーブルなどのオブジェクトをDROPしなくても、
自動で上書きしてくれます。これは昔のEXPコマンドとは違うそうな。

  rem インポート元のフォルダを指定
  cd C:\★EXPファイル読み込み元フォルダ指定★

  rem インポート用コマンド
  impdp system/manager dumpfile=DumpDir:expdp.dmp logfile= DumpDir:impdp.log schemas=STUDY table_exists_action=REPLACE

この手の情報は、大方は大手ブログに書かれているのに、
何か困った時の情報となると途端に不足しますよね。

そのために保守サポートサービスに加入するんでしょうが、
社会全体でつまらん仕事を減らしていくためには、ナレッジ共有が大切なんでしょうね。

困ったときはお互い様ということで、
1人でも多くの技術者さんの情報発信をお待ちしてますよ!

2013年10月25日金曜日

無料ダウンロードOracle11g使用条件

Oracleの勉強をするなら、実物に触れるのが1番。

でも、あんな高いものを自腹で払うのは無理だし、
職場のデータベースで実験してたら怒られるし・・・。

ということで、そこは気が利くOracleさん。
学習目的ならOracleDBを無償でダウンロードできます。
機能限定版だけじゃなくて、11gのEnterpriseEditionはもちろん、
12cも使うことができますぜ!

使用条件は下記の通り。
「自分用Oracle DBを「無償で」作ろう!「OTN開発者ライセンス」」
https://blogs.oracle.com/oracle4engineer/entry/oracle_db_-otn_developer_license

ポイントをまとめると、以下の3点が大切。

  1.個人の学習・自社の開発検証に使うのはOKだが、
    お客さんの開発検証に使うのはNG
  2.個人で用いるのはOKだが、複数人で使用するのはNG
  3.1回のダウンロードでインストールできるのは1台のみ

厳密な使用条件は下記参照。
「OTN開発者ライセンス」
http://www.oracle.com/technetwork/jp/licenses/standard-license-192230-ja.html

ダウンロードページはこちら。

「ソフトウェア・ダウンロード」
http://www.oracle.com/technetwork/jp/indexes/downloads/index.html

Oracle.comのユーザー登録が必要ですが、
こちらも個人で登録可能・無料です。

まあでも、OracleDB入れるとCPUやメモリなどのリソースはがっつり使います。
できれば安い開発機を購入することをお勧めしますよ。
(私はEPSON Directで買った3万円ほどのWindows8を使用)

ではでは。

2013年10月20日日曜日

【OracleDB】学習用サンプルデータ(ver1.0)公開!!

OracleDB学習するのにデータ入った業務システムのデータベースが欲しい。
でもネット上で見つからないし、構築するのも大変だし・・・

・・・というわけで、サンプルデータベースを作成しました!!

ファイル名「STUDY_DBset_20131020ver.lzh」
https://docs.google.com/file/d/0By1NtDqMrKkzYzVRWGdFUklXNTg/edit?usp=sharing

Ver1.0現在のテーブルは以下の通りです。

1.宛名マスタ(16件)
2.部門マスタ(37件)
3.分類マスタ(4件)
4.商品マスタ(20件)
5.社員マスタ(172件)
6.職位マスタ(7件)
7.担当者マスタ(36件)
8.取引先マスタ(14件)

例えば、以下のようなSQLが使えます。

  select C.TORIHIKISAKI_CD,C.TORIHIKISAKI_NM,B.SYAIN_CD,B.SYAIN_NM
  from 
     STUDY.TANTOUSYA_M A,
     (select TORIHIKISAKI_CD,SYAIN_CD,max(YUUKOU_FROM) YUUKOU_FROM from STUDY.TANTOUSYA_M where YUUKOU_TO is null group by TORIHIKISAKI_CD,SYAIN_CD) Am,
     STUDY.SYAIN_M B,
     (select SYAIN_CD,max(YUUKOU_FROM) YUUKOU_FROM from STUDY.SYAIN_M where YUUKOU_TO is null group by SYAIN_CD) Bm,
     STUDY.TORIHIKISAKI_M C,
     (select TORIHIKISAKI_CD,max(YUUKOU_FROM) YUUKOU_FROM from STUDY.TORIHIKISAKI_M where YUUKOU_TO is null group by TORIHIKISAKI_CD) Cm 
  where  A.TORIHIKISAKI_CD=Am.TORIHIKISAKI_CD
     and A.SYAIN_CD=Am.SYAIN_CD
     and A.YUUKOU_FROM=Am.YUUKOU_FROM
     and B.SYAIN_CD=Bm.SYAIN_CD
     and B.YUUKOU_FROM=Bm.YUUKOU_FROM
     and C.TORIHIKISAKI_CD=Cm.TORIHIKISAKI_CD
     and C.YUUKOU_FROM=Cm.YUUKOU_FROM
     and A.TORIHIKISAKI_CD=C.TORIHIKISAKI_CD
     and A.SYAIN_CD=B.SYAIN_CD
  order by C.TORIHIKISAKI_CD,B.SYAIN_CD;

出力結果はこんな感じ。


部署が存在する前から所属していることになっていた・・・
くらいのミスはあるかと思いますが、そこはまあ、担当者の入力ミスということでご勘弁。

あと、住所電話番号などは架空のものとお考えください。
たまに郵便番号と住所が対応している箇所がありますが、気まぐれです。

できたら今後、トランザクションデータを作成していく予定です。
最終的には、自動データ挿入機能付き・ニセ業務アプリケーションを作りたいな!

ではでは。

Oracle11g for Windows アンインストール手順

悪夢のOracleDB再インストール。
仕事で担当してるシステムでは絶対たりたくないが、
恐らく近々発生しかねないのですよ…。

OracleDBはアンインストーラ一本で全部消えたと思うと痛い目を見るのでご注意。
まっさらにするための手順を書いたサイトがあったのでメモがてら。

「らんすの本棚 - Oracle11g for Windows アンインストール手順」
http://rina.jpn.ph/rance/index.php?Oracle11g%20for%20Windows%20%E3%82%A2%E3%83%B3%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%89%8B%E9%A0%86

これのミソはレジストリ消し忘れないこと。
消し忘れるとコンフィグレーション構成あたりで底なし沼のようなORAエラーに沈み、
最終的にインストールしなおすことになる。

こんな大変な作業、よほどの時しかやらないだろうと思いきや。
管理ツール「EnterpriseManager」が壊れたときにも、
最終的にやる羽目になるのだよ…。

「tipsを掻き集めてknowledgeを目指す日記 - OracleDBConsoleの再構築」
http://d.hatena.ne.jp/zabadaq/20080307

てゆうか、今再インストールしてるのはこれのせいなのですが。

いつやるの?
今でしょ!(泣きながら)

Windows8で常に管理者としてプログラムを実行させる

Windows8にしてから管理者がどうので非常にストレス感じてたので。

操作のたびに出てくるのは我慢するとして、
管理者実行忘れたコマンドプロンプトからバッチ流して
権限不足で中途半端な状態になるのが困る。

なわけで、うまい方法教えていただいたので共有。

「Wiki.inamuu.com - Windows8で常に管理者としてプログラムを実行させる」
http://inamuu.com/index.php?Windows8%E3%81%A7%E5%B8%B8%E3%81%AB%E7%AE%A1%E7%90%86%E8%80%85%E3%81%A8%E3%81%97%E3%81%A6%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%95%E3%81%9B%E3%82%8B

  1.Windowsキー+Rで「ファイル名を指定して実行」のプロンプトを表示
  2.「regedit」を入力
  3.「HKEY_LOCAL_MACHINE|SOFTWARE\Microsoft\Windows\CurrentVersion?\Policies\System」へ移動
  4.「EnableLUA」を16進数で「0」を入力
  5.PCを再起動。再起動後からプログラムは常に管理者権限で実行されます。 

とはいえ仕事用PCではこれやるわけにはいかないし、
うまくお付き合いするしかなさそうだな…。

2013年10月19日土曜日

パッケージ javax.servlet.http は存在しません。

Tomcatさんのメモリ領域管理を見ようと、
下記サイト見ながら試しにJavaのテストプログラム作ってたら、
早速コンパイルからつまづいた。

RT
「いまさら聞けないTomcat〜JSPサーバ構築のキソ
6回:TomcatにWebアプリケーションを配備する」
http://thinkit.co.jp/cert/article/0708/2/6/2.htm

  import java.io.IOException;
  import java.io.PrintWriter;

  import javax.servlet.ServletException;
  import javax.servlet.http.HttpServlet;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;

  public class HelloWorld extends HttpServlet{

     public void service(HttpServletRequest request,
              HttpServletResponse response)
                  throws ServletException, IOException {

          response.setContentType("text/html");
          PrintWriter out = response.getWriter();

          out.println("<html>");
          out.println("<head>");
          out.println("<title>Hello World</title>");
          out.println("</head>");
          out.println("<body>");
          out.println("<h1>Hello World</h1>");
          out.println("</body>");
          out.println("</html>");

          out.close();
      }
  }

そしたらエラー。
「パッケージ javax.servlet.http は存在しません。」



こんな具合にQ&Aにも上がっているが、どうも解決せず。

「パッケージ javax.servlet.http は存在しません。」
http://okwave.jp/qa/q5770325.html

環境変数の問題らしいけど、下記サイトの通りに設定してあるし…

「基礎から学ぶサーブレット/JSP(11):
JSPとサーブレットの違いを明らかにする (1/2)」
http://www.atmarkit.co.jp/ait/articles/0403/18/news102.html

ええと、答え。

  javac -classpath "%CATALINA_HOME%¥lib¥servlet-api.jar" HelloWorld.java

ポイントは「ダブルクォーテーション」で囲むこと。

原因はこれ。


一見、普通のユーザ変数「CATALINA_HOME」なのですが、
変数値に半角空白が混じってるんですよ。

なので、半角の場所で途切れてしまっていたのが真相。

分かれば簡単。
解決方法見つけるよりブログ書く方が時間掛かっているので、
今後はアウトプットの省力化に邁進しますよ!

ではでは。