サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
ノーベル賞
ameblo.jp/archive-redo-blog
このSQLはどこがおかしいでしょう? SELECT E1.ENAME NAME, E1.SAL SAL, E2.ENAME MANAGER, E2.SAL MANAGER_SAL FROM EMP E1 LEFT OUTER JOIN EMP E2 ON E1.MGR = E2.EMPNO AND SAL >= 3000; このSQLは、EMP表を自己結合(左外部結合)して、従業員とそのマネージャの名前と給与を取得するものなのですが、最後の行の"SAL"にエイリアスが指定されていないので、"E1"の"SAL"なのか"E2"の"SAL"なのかがわかりません。 9.2.0.7.0環境では、このようなSQLを実行すると ORA-00918: 列の定義が未確定です。 というエラーが発生します。 しかし、どういうわけか9.2.0.1.0環境ではこれが通ってしまうのです。 SQL> SELECT E1
データベースの運用を続けていると、ディスク容量やディスクI/Oの問題により、データファイルを物理的に移動させたくなる、あるいは移動せざるを得ない状況になることがあります。 データファイルを物理的に移動させるには、以下の2つの方法があります。 1.ALTER TABLESPACE ~ RENAME DATAFILE ~ ALTER TABLESPACE文を使う場合、データベースを停止させずに、移動させるデータファイルが属する表領域を一時的にオフラインにするだけでデータファイルを移動させることができます。 ただし、システム表領域やアクティブなUNDO表領域などを構成するデータファイルはこの方法で移動させることはできません。 手順は以下の通り。 1)表領域をオフラインにします。 SQL> ALTER TABLESPACE USERS OFFLINE; 表領域が変更されました。 2)OS上でデータ
Oracle 9i 以前は、テーブルからデータを大量に削除した時などに、セグメントを縮小して空き領域を解放しようと思ったら、ALTER TABLE ~ MOVE コマンドなどを利用してテーブルを再構築するしかありませんでした。 ALTER TABLE テーブル名 MOVE TABLESPACE 表領域名; しかし、Oracle 10g から導入された ALTER TABLE ~ SHRINK SPACE コマンドを利用すれば、もっと手軽にセグメントの縮小を行うことができます。 ALTER TABLE テーブル名 SHRINK SPACE; MOVE と比較すると、SHRINK SPACE には以下のような利点があります。 オンライン中に実行できる MOVE の場合は表に排他ロックがかけられるが、SHRINK SPACE の場合は行排他ロックしかかけられない。 大量の作業領域を必要としない
Mail::factory() を使ってメールインスタンスを作成し、メールを組み立てて Mail::send() で送信します。 バックエンドにSMTPを使用する場合の実装例は以下の通りです。 require_once 'Mail.php'; $param = array( host'=>'smtp.example.com', port'=>'25'); $mailobject = Mail::factory( 'smtp', $param ); $recipients = 'to@example.com'; $headers = array( 'From'=>'from@example.com', 'To'=>$recipients, 'Subject'=>'Test' ); $body = 'Test Mail'; $mailobject->send( $recipients, $he
PHP+Oracle のアプリケーションを構築する場合、例えば文字コードを UTF-8 で統一するならば、NLS_LANG 環境変数に"Japanese_Japan.AL32UTF8"を設定します。 このアプリケーションを Linux 上の Apache で稼動させる場合、通常は Apache のインストールディレクトリの下の bin ディレクトリにある envvas に export NLS_LANG=Japanese_Japan.AL32UTF8 と書いておけば OK です。 ただし、このように設定してしまうと、Apache 上で NLS_LANG 環境変数に異なるキャラクタ・セットを設定していることを前提にしている別のアプリケーションが稼動している場合、それらのアプリケーションの動作に悪影響を及ぼす可能性があります。 このような場合、Apache 全体に対して環境変数を設定するのでは
ある条件に合うレコードがテーブルに存在するかしないかを判断する場合に SELECT COUNT(*) FROM ~ WHERE ~ というSQLを使うことがあります。 一般的によく使うSQLだし、意味はあっているのですが、パフォーマンスの観点から、以下のような場合はできれば使用を避けた方がよい。 ・カウント対象件数が多い ・インデックスが効かない ・繰り返し実行することが多い なぜ避けた方がよいかというと、レコードがあるかないかを知りたいだけなのに、わざわざレコード件数をカウントしてやる必要はないからです。 特に上記のような状況に当てはまる場合は、カウントにかなりの処理時間を要するため、パフォーマンス低下の要因となってしまいます。 では、どんな方法を用いて存在チェックを行うのがよいかというと、思いつくのは以下の3つの方法です。 カーソルを使う方法 以下のようにレコードを検索するカーソルを作
ローカル PC に PHP の開発環境を構築するため、XAMMP をインストールしました。 データベースには MySQL ではなく、Oracle を使用します。 XAMPP と Oracle のバージョンはそれぞれ以下のとおりです。 XAMPP for Windows 1.7.3 Oracle Database 11g Release 11.1.0.7.0 この環境における PHP と Oracle の接続設定手順は以下のとおりです。 1.Oracle Instant Client インストール PHP から Oracle への接続には OCI(Oracle Call Interface)を利用しますが、そのためには Oracle Instant Client をインストールする必要があります。 (Oracle Database がインストールされているだけではだめなようです。) というこ
Tomcat を 5.5.27 にバージョンアップすると 一部の JSP で以下のようなエラーが出るようになりました。 Attribute value "~" is quoted with " which must be escaped when used within the value ... どうやら Tomcat5.5.27 から JSP のスクリプトレットなどの中でクォートを使用する際にエスケープが必要になったようです。 そのため、既存の JSP の中にクォートをエスケープしていないものがあった場合、上記のようなエラーが発生するようです。 このエラーを解消するには、JSP ファイルを修正するのが筋ですが、既に稼働中のシステムについては、修正とテストにかなりの労力を必要とする上に、修正ミスによって不具合が発生するリスクもあります。 幸いなことに、このエラーは、システムプロパティ o
Linux で DOS のバッチファイル的な簡単なスクリプトを作成するにはシェルスクリプトを使用します。 しかし、一口にシェルと言っても、B shell、C shell、bash などいろいろな種類があるんですね。 使用しているディストリビューションがサポートしているならどれでも使えるということなので、それぞれ特徴を考慮してどれを使うかを選択すればいいようです。 しかし、そう言われても特徴を意識しなければならないほど難しいことをしようと思っているわけでもないですし、どれを使うか戸惑ってしまいます。 Linux の標準は一応 bash らしいので、bash を使うことにしましたが、オープンソースの世界ならではの利点というか欠点というか...ビシッと統一してもらいたいというのが本音です。(せめて文法くらいはね^^;) と、シェルの種類自体もいろいろあるのですが、その実行方法にもいろいろあるよう
リスナーのログ(listener.log)、Oracle Net クライアントのログ(sqlnet.log)は、10g までは >ORACLE_HOME</network/log で示される場所に出力されていました。 例えば ORACLE_HOME 環境変数が "/u01/app/oracle/product/11.1.0/db_1" の場合、出力先は、 /u01/app/oracle/product/11.1.0/db_1/network/log となります。 しかし、11g からはアラート・ログと同様に、自動診断リポジトリ(ADR)の構造にしたがって出力先が変更されています。 リスナーのログ(listener.log)の出力先 listener.ora の ADR_BASE_ パラメータ、ORACLE_BASE 環境変数によって出力先が変わります。 ADR_BASE_<LISTENER
"[Oracle] JDBCによるLOBの操作方法 "で説明した方法でOracleのLOBデータを読み込む場合、LOBロケータから入力ストリームを生成し、そこからLOBデータを読み込んでいきますが、この時、読み込みバッファサイズをどれくらいに設定するのがいいのでしょうか? PreparedStatement pstmt = conn.prepareStatement( 'SELECT BLOB_VALUE FROM TABLEA WHERE ID = ?' ); pstmt.setInt( 1, 1 ); rs = pstmt.executeQuery(); if( rs.next() ){ BLOB blob = (( OracleResultSet ) rs ).getBLOB( 1 ); InputStream ins = blob.getBinaryStream(); bos =
UTL_FILE パッケージを使ってファイル出力をする場合、PUT_LINE プロシージャを使って1行ずつ出力するのが一般的です。 この時、Oracle が自動的に出力するレコードの終端に改行コードを付けてくれるわけですが、先日奇妙な現象に遭遇しました。 データベース・キャラクタ・セットが UTF-8(AL32UTF8) の環境でファイルを出力していたのですが、ある程度大量のデータを出力しようとすると WRITE_ERROR 例外(ORA-29285: ファイル書込みエラーが発生しました。)が発生するのです。 バッファサイズも適切だし、過去にこれくらいのデータ量の出力ならいくらでもやっているし、とにかく例外が発生するようなことは全く行っていないのですが、なぜか WRITE_ERROR となります。 そこで、データ量を減らしたり、出力データの中身をみたりと、いろいろと調べているとあることに気
Oracle 11g をしばらく使っていると、ある日突然ログイン時に以下のようなメッセージが出るようになりました。 ORA-28002: パスワードは、n日以内に期限切れになります。 このまま放置しているとやがて、 ORA-28001: ユーザーのアカウントが期限切れです。パスワードを変更する必要があります。 となります。 これは、Oracle 11g ではデフォルトでパスワードの有効期限が 180日と設定されているのが原因のようです。 旧バージョンと同じくパスワードの有効期限を無期限とするには、デフォルトプロファイルのパスワード有効期限を無期限に設定し、 alter profile default limit password_life_time unlimited; 既存アカウントのパスワードを再設定する必要があります。 alter user ユーザ名 identified by パス
データベースを全く同じ構成でそっくりそのまま別のマシンにコピーしたい場合、オフライン・バックアップを利用して行うのが楽チンです。 オフライン・バックアップを利用したデータベース丸ごとコピーは、以下の手順で行います。 1.ソースデータベースの停止 コピーするデータベース・ファイルを確定させる(オフライン・バックアップを取得できる状態にする)ためにソース・データベースを停止します。 2.Oracleデータベース構成ファイルのコピー ソース・データベース上のOracleデータベース構成ファイルを、ネットワークあるいはテープなどのバックアップ・メディアを介して、ターゲット・データベース上の同一ディレクトリにコピーします。 コピー対象となるOracleデータベース構成ファイルは以下のとおり。 サーバー・パラメータ・ファイル ※SPFILEで起動するインスタンスの場合 初期化パラメータ・ファイル ※P
Linux のシェルスクリプトなどで指定した URL に HTTP でアクセスできるかどうかを確認するには、wget コマンドを利用するのが便利です。 wget コマンドは本来 HTTP/HTTPS/FTP プロトコルを使用して非対話的にファイルをダウンロードするコマンドですが、以下のようにオプションを駆使することで指定した URL にアクセスできるかどうかだけを確認するという用途にも応用することができます。 $ wget --spider -nv --timeout 60 -t 1 http://$HOSTNAME/ 200 OK 各オプションは以下の通り。 --spider ファイルをダウンロードしません。 -nv 冗長メッセージを出力せず、エラーメッセージと基本情報のみを出力します。 --timeout 接続タイムアウト(秒)を指定します。デフォルトはタイムアウトなし。 -t 接続拒
Oracle サーバーの IP アドレスを取得するため、以下のような SQL を実行すると、 SELECT UTL_INADDR.GET_HOST_ADDRESS('server1') FROM DUAL; 10g では正常に IP アドレスが取得できますが、11g では以下のようなエラーが発生するようになりました。 ORA-24247: アクセス制御リスト(ACL)によりネットワーク・アクセスが拒否されました ORA-06512: "SYS.UTL_INADDR", 行19 ORA-06512: "SYS.UTL_INADDR", 行40 ORA-06512: 行1 これは 11g から UTL_TCP、UTL_SMTP、UTL_MAIL、UTL_HTTP、UTL_INADDR といったパッケージを使用する際にファイングレイン・アクセス制御が効くようになったためだで、10g 以前のバージ
半角英数字を全角英数字に変換する private static String hankakuToZenkaku(String value) { StringBuilder sb = new StringBuilder(value); for (int i = 0; i < sb.length(); i++) { int c = (int) sb.charAt(i); if ((c >= 0x30 && c <= 0x39) || (c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A)) { sb.setCharAt(i, (char) (c + 0xFEE0)); } } value = sb.toString(); return value; } 全角英数字を半角英数字に変換する private static String zenk
arbさんのブログテーマ、「Java」の記事一覧ページです。
[Oracle] 終了したはずのユーザー・プロセスがOS上に残り続ける... | Archive Redo Blog Oracle では、専用サーバー構成の場合、サーバー上にはセッションごとにユーザー・プロセスが立ち上がります。 これらのユーザー・プロセスは正常に切断されれば終了されますが、強制終了したり、不意にネットワークが切れたりしたときには、サーバー上に残り続けることがあります。 しかも、これらのユーザー・プロセスは CPU を占有し続け、サーバーのパフォーマンスに悪影響を及ぼすこともありますので要注意です。 このようなユーザー・プロセスを発見するには、Oracle、OS の両サイドからアプローチし、両者の情報を照合して対処することになるかと思います。 Oracle サイドからアプローチする場合は、V$SESSION と V$PROCESS の情報を参照します。 例えば、以下の SQ
ROW_NUMBER()関数を使うと結果セットに対して行番号を振ることができますが、PARTITION BY句を使うと、PARTITION BY句で指定した列の値ごとに行番号が振られます。 例えば、部署(deptno)ごとに給料(sal)の多い者順に行番号を振る場合、以下のようになります。 SELECT DEPTNO, EMPNO, ENAME, SAL, ROW_NUMBER() OVER ( PARTITION BY DEPTNO ORDER BY SAL DESC ) ROW# FROM EMP; DEPTNO EMPNO ENAME SAL ROW# ---------- ---------- -------------------- ---------- ---------- 10 7839 KING 5000 1 10 7782 CLARK 2450 2 10 7934 MIL
[Oracle] フラッシュ・リカバリ領域が一杯になりOracleが応答しなくなる | Archive Redo Blog 普段は NOARCHIVELOG モードで使用している開発環境を ARCHIVELOG モードに変更しました。 そしてその後何日か使っていると突然 Oracle が応答しなくなりました。 新規に接続しようとすると ORA-00257: アーカイブ・エラーです。解除されるまで内部接続のみにしてください。 が発生します。 アラート・ログを見ると以下のエラーが発生していました。 ORA-19815: 警告: db_recovery_file_dest_size(2147483648バイト)は100.00%バイトが使用され、残り0バイトが使用可能です。 Tue Feb 13 15:18:31 2008 *************************************
Linux、Windows間でテキストファイルをやりとりする場合など、Linux上でテキストファイルの改行コードを変換しなければならないことがあります。 この手の処理はコマンドを1つ覚えてしまうと、そのやり方で通してしまうものですが、実はその方法はいくつもあるようです。 CRLFからLFへの変換 dos2unixコマンド dos2unix TEST.TXT nkfコマンド nkf --windows --overwrite TEST.TXT trコマンド tr -d '\r' < TEST_CRLF.TXT > TEST_LF.TXT LFからCRLFへの変換 unix2dosコマンド unix2dos TEST.TXT nkfコマンド nkf --unix --overwrite TEST.TXT perl perl -p -e 's/\n/\r\n/' < TEST_LF.TXT >
3.SQLの実行計画を取得する方法(EXPLAIN PLAN) 以下のようにEXPLAIN PLANコマンドを実行するとPLAN_TABLEに実行計画が格納されます。 explain plan for SQL文; ただし、格納された実行計画を見るにはわざわざ複雑なSQLを実行しなければならないので少々使いづらいです。 4.SQLの実行計画を取得する方法(V$SQL_PLAN) Oracle9iでは、ディクショナリV$SQL_PLANに実行計画が保存されるようになりました。 該当するSQLが共有SQL領域にキャッシュされている限りは、これを検索すれば実行計画を見ることができます。 ただし、これもわざわざ複雑なSQLを実行しなければならないので少々使いづらいです。 5.SQLの実行計画を取得する方法(OBJECT BROWSER) OBJECT BROWSERを使えば、SQL実行の画面でグラフ
SQL で LIKE 条件を使うとパターン一致検索が実行できます。 この時、'%'と'_'はそれぞれ任意の文字列、任意の1文字を表す特殊文字として扱われます。 したがって、'%'や'_'という文字を検索したい場合は、エスケープ文字を使用して、文字としての'%'、'_'であることを明示する必要があります。 例えば、COL1 に'_'を含む TBL1 のレコードを検索したい場合は以下のように記述します。 SELECT * FROM TBL1 WHERE COL1 LIKE '%\_%' ESCAPE '\' と、ここまでは SQL の常識です。 しかし、実はこの'%'と'_'、全角の'%'、'_'でもやはり特殊文字として認識されてしまうのです。 つまり、 SELECT * FROM TBL1 WHERE COL1 LIKE '%_%' と記述すると、”任意の1文字を含む”となりますので、Nul
ORA-01745: ホスト/バインド変数名が無効です。 は以下のようにバインド変数名に予約語を指定してしまった場合などに発生します。 SQL> var number number; SQL> select * from emp where empno = :number; select * from emp where empno = :number * 行1でエラーが発生しました。: ORA-01745: ホスト/バインド変数名が無効です。 しかし、このエラーは、上記のようなケースだけでなく、バインド変数の数の上限を超えた場合にも発生します。 ただ、その上限というのが 32768 ととてつもなく大きい数ですので、普通はまず超えることはないと思います。 上限を突破するとすれば、条件となる値のリストを受け取って、それを IN 句に列挙するというような SQL で、その値のリストがバインド変
10g 以前のバージョンでは、アラート・ログ、リスナーのログ、クライアントのログ、各種トレースファイルなどの情報は蓄積される一方でした。 そのため、これらの情報が蓄積されやすい環境においては、一定のポリシーにしたがってこれらの情報を定期的に削除するなどのケアが必要でした。 しかし、11g では自動診断リポジトリ(ADR)によってこれらの情報をあらかじめ設定された削除ポリシーにしたがって一括削除できるようになっています。 自動診断リポジトリ(ADR)の削除ポリシーには、SHORTP_POLICY と LONGP_POLICY の2つが用意されており、ディレクトリごとにどちらが適用されるかが決められています。 SHORTP_POLICY デフォルトでは 720 時間( 30 日 )に設定されている。trace ディレクトリや cdump ディレクトリに適用される。 LONGP_POLICY デ
UNDO表領域に必要な容量は以下の公式で見積もることができます。 UNDO表領域必要容量(byte) = UNDO保存期間(秒) × 1秒あたりUNDOブロック生成数 × ブロックサイズ + オーバーヘッド(byte) 例えば、UNDO保存期間が900秒で、1秒あたりのUNDOブロック生成数が100で、ブロックサイズが8192バイトの場合、 900×100×8192=737280000 つまり約703MB+オーバーヘッドということになります。 この計算に必要な情報はV$UNDOSTATまたはDBA_HIST_UNDOSTATから得ることができます。 これらのビューにはUNDO統計情報が10分ごとに記録されています。 SQL> SELECT TO_CHAR(BEGIN_TIME,'MM/DD HH24:MI') AS BEGIN_TIME, TO_CHAR(END_TIME, 'MM/DD
Oracleを運用中、ごくまれにデータ・ファイルに破損が生じることがあります。 そんな時、該当データ・ファイルのバックアップとバックアップ以降のREDOログが全て揃っている場合は、完全メディアリカバリによって容易に復旧することができます。 例えば、何か処理を実行した際に、以下のようなエラーが発生した場合... ORA-01115: ファイル11(ブロック番号332831)からの読込みI/Oエラーが発生しました。 ORA-01110: データ・ファイル11: 'C:\ORACLE\ORADATA\ORCL\USERS01.DBF' ORA-27091: skgfqio: I/Oをキューできません。 ORA-27070: skgfdisp: 非同期の読込み/書込みに失敗しました。 OSD-04006: ReadFile()に失敗しました。ファイルからの読込みができません O/S-Error:
次のページ
このページを最初にブックマークしてみませんか?
『Archive Redo Blog』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く