ラベル Oracle の投稿を表示しています。 すべての投稿を表示
ラベル Oracle の投稿を表示しています。 すべての投稿を表示

2011年4月5日火曜日

Oracle DataPump

10gを利用しているが、丸々一晩かかったImp/Expも、DATA_PUMPを利用すると
わずかな時間で完了する。長足の進歩だ!ただし、不満もある。

impdp .....

で、fatal_error とログに出るのに何の情報もなく、手探りで調べると
ディレクトリオブジェクトに対しての権限が不足していたようだ、、、

impdp usr121/usr121 directory=DATA_PUMP_DIR dumpfile=EXPDAT-20110405-01.DMP logfile=IMP-3.log schemas=usr21 remap_schema=usr21:usr121



GRANT READ ON DIRECTORY "DATA_PUMP_DIR" TO "USR121"
GRANT WRITE ON DIRECTORY "DATA_PUMP_DIR" TO "USR121"

2010年8月10日火曜日

OracleXE での UTL_FILE パッケージ

XEの場合、権限を付与しておかないと使用できない。

参考はここ


%>sqlplus /NOLOG

SQL> conn / as sysdba
接続されました。
-- PUBLIC (すべてのユーザ)に付与する場合
SQL> grant execute on utl_file to public;

権限付与が成功しました。

-- rivus (rivusユーザ)に付与する場合
SQL> grant execute on utl_file to rivus;

権限付与が成功しました。


再度実行すると、以下の様なエラー

DECLARE
*
ERROR at line 1:
ORA-29280: invalid directory path
ORA-06512: at "SYS.UTL_FILE", line 33
ORA-06512: at "SYS.UTL_FILE", line 436
ORA-06512: at line 89


よーーーく見てみると、未定義のディレクトリを発見;

f_main := UTL_FILE.FOPEN ('DIR_TEMP', v_file, 'w');


ググってみると、以下のような定義が必要らしい;

create or replace directory DIR_TEMP as '/tmp';


付け加えて実行したら成功!

2010年7月30日金曜日

Oracle JdbcConnectionのclose問題

AdvancedQueuingを扱っていて、JMSConnection#close()でThreadがHANGするので調査したところ、どうもOracleのJDBCの古いもの(ojdbc14以前)のバグの様でojdbc5以降でHANGしなくなっているようだ。
以下に、関連情報を載せるが、close()自体は成功しても実際のTCP-Connectionは解放されないため、調査続行中:

1) 2009/12 Thread stuck waiting on java.net.SocketInputStream.socketRead : Weblogic
http://objectmix.com/weblogic/532984-thread-stuck-waiting-java-net-socketinputstream-socketread.html

ojdbcのバグだから新しいのを使え;
Hangした時に以下のSQLを実行する;

select
vse.username, vse.osuser, vse.status, vse.sql_address, vs.piece, vs.sql_text
from v$sqltext_with_newlines vs, v$session vse
where vse.sql_address = vs.address and vse.status = 'ACTIVE'
order by sql_address, piece


2) 2003/01-2006/12 thread deadlock but no other thread holds lock??
http://forums.sun.com/thread.jspa?threadID=343023

DaemonThreadからclose()すればいい;

3) 2003/08-2009/04 Thread Hangs at SocketInputStream.read
http://www.dbforums.com/oracle/894519-thread-hangs-socketinputstream-read.html

TableSpaceが不足した場合に発生する;


4) 2009/09 JDBC insert query to Oracle sometimes hangs
http://dbaspot.com/forums/oracle-server/19570-jdbc-insert-query-oracle-sometimes-hangs.html

複数のInsertによるブロック;

5) 2004/06 ds.getConnection( )返ってこない
http://otn.oracle.co.jp/forum/message.jspa?messageID=11004716

DBCPの設定とOracle-SharedServerの設定の問題?;
v$session周りを調べると共有サーバに設定してあるのですが、server列がNONEだったりSHAREDだったりまちまち;

共有サーバの設定値を具体的には、
alter system set shared_servers=5 scope=both;
にすると、ds.getConnection()で待つことなく正常に返ってくるようになりました。
接続セッション数は40くらいだったのですが、マニュアルには
「shared_serversの値1に対し10セッションで安定する」みたいです。

6) 2003/02-2010/06 JDBC conneciton hanging at SocketInputStream.socketRead
http://forums.oracle.com/forums/thread.jspa?messageID=4354229


FierWallの影響か?;

7) 2008/11 Deadlocks with Oracle
http://old.nabble.com/Deadlocks-with-Oracle-td20378297.html

古いojdbcのバグ?;
I'm rather certain the patches are included in 10.2.0.3 patchset

2009年9月11日金曜日

Oracle9 でのバインド変数制限

[Oracle] JDBCでバインドできる文字列のサイズの制限や、JDBCでバインドできる文字列のサイズの制限→複数のバインド変数を使って解決にあるように、9iでは長い日本語文字列の扱いには注意が必要であった。
最初に記事を見たときは、4000バイトも指定してあるのに、日本文字は666字しか入らないなんて!!!と思ってしまいましたが、バインド変数を使用した場合だけの制限であり、実際にはCharCode毎でのバイト数一杯は入るのですね。(sjisなら日本文字で2000文字) まあ、アプリではバインド変数を使うようにするのが普通なので、回避するにはこの部分だけ特殊は処理をする必要があったのですね。

varchar2 の制限 => 4000 bytes
バインド変数の制限 => 2000 bytes
日本語の制限 => UTF-8 としてのbyte数で計算される

Oracle 10g ではバインド変数の制限は緩和されたようで、長さに応じて自動的にsetCharacterStream()に変えてくれるようです。