2018.10 «  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  » 2018.12

バックアップ
オラクルのデータをバックアップする際
10g以前は、dmpファイルを扱っていたと思うけど
10gでは、pmpファイル(パンプファイル)を扱うみたい

dmpを使っても特に支障はありませんが
pmpの方が高速かつ、信頼性が高いようです

使い方としては、以下のようになります

1.ディレクトリオブジェクトの作成
まずは、ディレクトリオブジェクトの作成を行います
これは、EXPORTや、IMPPORTをする際
どこのディレクトリを参照するのかと言うことを設定します

デフォルトで「DPUMP_DIR」と言う、ディレクトリオブジェクトが
用意されているので、特に支障がなければ、これを使って問題ないです
ちなみに、DPUMP_DIRの参照先は
「C:oracleproduct10.2.0adminorcldpdump」この辺です

CREATE {OR REPLACE} DIRECTORY [ディレクトリオブジェクト名] AS [ディレクトリのパス];

にて、好きに作成できるので、気楽に作ってください
必要なくなったら

DROP DIRECTORY [ディレクトリオブジェクト名];

これで、消しちゃって下さい

2.EXPRT
エクスポートは、以下のコマンドで出来ます
注意:SQLPLUSに入らず、コマンドプロンプトにて入力して下さい

EXPDP [EXPORT実行スキーマ名]/[パスワード] DIRECTORY=[ディレクトリオブジェクト名] DUMPFILE=[ダンプファイル名] LOGFILE=[ログファイル名]

例としては、こんな感じになります
EXPDP scott/tiger DIRECTORY=DPUMP_DIR DUMPFILE=export.pmp LOGFILE=log.txt

3.IMPORT
インポートは、以下のコマンドで出来ます
注意:SQLPLUSに入らず、コマンドプロンプトにて入力して下さい

IMPDP [IMPORT実行スキーマ名]/[パスワード] DIRECTORY=[ディレクトリオブジェクト名] DUMPFILE=[ダンプファイル名] LOGFILE=[ログファイル名] SCHEMAS=[インポート対象スキーマ] REMAP_SCHEMA=[旧スキーマ名]:[新スキーマ名] REMAP_TABLESPACE=[旧テーブルスペース名]:[新テーブルスペース名] TABLE_EXISTS_ACTION=TRUNCATE EXCLUDE=[インポート対象外オブジェクト名]

例としては、こんな感じです
IMPDP usr_b/bbb DIRECTORY=DPUMP_DIR DUMPFILE=export.pmp LOGFILE=impdplog.txt SCHEMAS=usr_a REMAP_SCHEMA=usr_a:usr_b REMAP_TABLESPACE=ts_a:ts_b TABLE_EXISTS_ACTION=TRUNCATE

IMPORTは、異なるユーザーや
異なる表領域に入れることが可能なので
便利ですな
†2008/06/13 08:58 †
| オラクル | コメント(0) | トラックバック(2) |
表領域の削除
Oracle10gにて
UNDO領域のAUTOEXTENDをONにしている場合
大量データを投入したら
UNDO領域がどんどん膨れ上がって
トランザクションを確定しても、縮まることがありません

これって、ウザイよね
膨れ上がったら、手動でちぢこませる必要があるんだけど
RESIZEを行っても、大概、エラーになって
縮小することが出来ません


ALTER DATABASE DATAFILE '/data/undo01.dbf' resize 15M;


こんな感じで、RESIZEを行っても
以下のエラーが出て、縮小できません
(まっさらな状態なら、問題ないか)

ORA-03297:
ファイルには、要求したRESIZE値を超える使用中のデータが含まれています。

こうなると、UNDO領域を作り直すしかないみたい
以下の手順で、作り直しが可能です

1.一時、表領域の作成


CREATE UNDO TABLESPACE UNDO2 DATAFILE '/data/undo02.dbf' SIZE 15M REUSE AUTOEXTEND ON;


2.UNDO設定を一時表領域にする


ALTER SYSTEM SET UNDO_TABLESPACE = UNDO2;


3.膨れ上がったUNDO表領域を削除


DROP TABLESPACE UNDO1;


4.表領域の作り直し


CREATE UNDO TABLESPACE ROLLBACK_DATA DATAFILE '/data/undo01.dbf' SIZE 500M REUSE AUTOEXTEND ON;


5.UNDO設定を新規表領域にする


ALTER SYSTEM SET UNDO_TABLESPACE = UNDO1;


6.退避UNDO領域の削除


DROP TABLESPACE UNDO2;



この手順をバッチ化しておけば
表領域が膨れ上がった時、プチッと縮めることが出来ます
ただ、膨れ上がった表領域に
トランザクションデータが残っていると
UNDO設定を切り替えても削除できないので
業務をしていない時に行いましょう
また、テンポラリ領域についても、同じような手順で
縮めることが出来ます
†2008/06/11 12:25 †
| オラクル | コメント(0) | トラックバック(0) |
DBLINKのエラー?
これは、オラクルのエラーなのか?

ある端末に、DATBASE LINKを作成して、接続先のテーブルを抽出した際
こんなエラーが発生した
 「ORA-03113(通信チャネルでend-of-fileが検出されました)」
なんのこっちゃ?
すてべのテーブルでエラーになるわけではなく
特定のテーブル、特定の条件の場合だけ、上記エラーが発生して
接続が切れてしまう
とにかく、意味が分からないので、根気強く原因を探ってみた所
NUMBER型のフィールドを抽出した時に起こることがわかった
しかも、NUMBER型でも4桁以上で、同じ値が続く時のみ、発生する

このような感じのデータ
  キー ナンバー型
   1   1000
   2   1000
   3   1000
   4   1000
   5   1000
   6   1000

上記の様なデータをDATABASE LINKを使用して抽出すると
以下のように返ってくる
  キー ナンバー型
   1   1000
   2   1000.00
   3   1000.0000
   4   1000.00000000
   5   1000.0000000000000000
   6   1000.00000000000000000000000000000000

と、この様に、数値型のフィールドに、小数点以下が付与されて抽出される
件数が多くなればなるほど、小数点以下が増えていき
最終的に桁あふれが起きて
「ORA-03113(通信チャネルでend-of-fileが検出されました)」
が発生してしまう模様
うーん、これは、オラクルのバグなのか、こちらの設定が悪いのか・・・

とりあえず、この問題を回避するために
to_charを使用
文字型であれば、問題がないらしい

SELECT キー,to_char(ナンバー)
FROM テーブル名@DBLINK

こんな感じだね
でも、これでは本当の解決策とはいえないし、何かいい方法はないかな?



†2007/08/16 20:50 †
| オラクル | コメント(2) | トラックバック(1) |
ORA-12637
ORA-12637 パケット受信に失敗しました。

と言うエラーが発生し、オラクルに接続できなくなった
これは、どうやら、DBとクライアントのバージョンの違いが招くエラーみたいですね

クライアント環境 Oracle Client 7.3
 アプリ :VB5
 接続方法:oo4o

サーバー環境 Oralce10g

で行った場合、1回目の接続は、問題なく接続できるが
接続中に別アプリから接続を行おうとすると
「ORA-12637」のエラーが発生し、接続できなくなってしまいました

つまり、何も接続されていない状態であれば、接続可能だが
他のアプリが接続中の場合、接続できなくなってしまう。と言う事

Oracle Clientが10gの場合、このような問題はおきませんでした

†2007/07/31 21:28 †
| オラクル | コメント(0) | トラックバック(0) |
オラクルロック
昨日の続き

テーブルにロックが掛かってしまった件だけど
どうやら、データの更新中にUNDO領域が足りなくなってしまい
アプリが途中で落ちてしまい、ロックが掛かりっぱになってしまった模様

それと言うのも、とある理由で更新処理のエラー処理を付けていなかったので
きちんとロールバックされずに、ロックされたままになっちゃったみたいね

と、言う事で、ロックを解除し、アプリもきちんとエラー処理をつける事で
対応しました

以下、ロック解除の手法です

まず、セッション確認
 以下のSQLで、セッションを確認します

select pid,spid,s.sid,s.serial#,s.username,s.program,s.status
from v$process p, v$session s where p.addr=s.paddr

 これで、セッション一覧がズラ〜っと表示されるので、怪しげなセッションを見つける

セッション削除!!
 KILLコマンドにて、セッションを削除!!

Alter system kill session 'sid, serial#'

 大概は、これでオッケーなんだけどね
 でも、これだけでは削除できないセッションもあるの
 STATUSがACTIVEのものは、どうも削除できないみたい
 そんな時は、以下の要領で削除できます

1.OracleDBの入っているマシンに繋げる
2.コマンドプロンプトを開く
3.Oracleのbinに移動(例 cd c:oraclebin)
4.orakill SID名 SPID を実行


 これで、セッション削除できるよ

†2007/07/23 22:32 †
| オラクル | コメント(1) | トラックバック(2) |
| ホーム| 次ページ