2011年01月28日

Oracleのインポート時のORA-12899で躓いた件

Oracle10gでデータ移行をしようと思い、エクスポート&インポートを
したら、ORA-12899のエラーが発生。。。

初めは、エンコーディングの違いのせいかなと思い、
エクスポート時にNLS_LANGを設定して、キャラクタセットを移行元と移行先
で同じにしても変わらず、、、

そこで、あれっと思いました。
VARCHAR2のデータサイズって、文字数だっけ?バイト数だっけ?と。
調べてみると、デフォルトはバイト数とのこと。
(パラメータは、NLS_LENGTH_SEMANTICS

移行元は文字数("CHAR")で、移行先は("BYTE")。。。
これは、あかんなぁ

移行先は、データベースを間借りしているので、根元で変更するわけにはいか
ないので、

セッション単位で変更して、テーブルを再作成することで、なんとかなりました。

SQL> ALTER SESSION SET NLS_LENGTH_SEMANTICS='CHAR';

セッションが変更されました。
〜〜〜
この後にCREATE TABLEを実行しました。

参考:http://www.oracle.co.jp/forum/thread.jspa?threadID=2001445
posted by 台北猫々 at 23:50| Comment(0) | TrackBack(0) | 技術メモ(Oracle)

2009年04月08日

「DLL (OraOps10.dll) を読み込めません。」

以前に遭遇した↑というエラーについて。

環境は、こんな↓感じでALL in One
Windows Server 2003
Oracle10g R2
IIS6.0
ASP.NET

「ASP.NETでOracle Data Provider For .NETの使用」
http://otndnld.oracle.co.jp/easy/dotnet/aspdotnet/index.html#0.2_setting
を参考にしてやってみましたが、NG・・・

基本的にはDLLのあるディレクトリもしくはDLLに対するアクセス権限が無いというのが理由なのだと思って、それならと更にOracleがインストールされているドライブごとASPNETユーザーにフルコントロールのアクセス権限を与えたらOKでした。その後、当アクセス権限は取り消しても、OKのままでした(上記サイトに書かれているORACLE_HOMEへのアクセス権限はそのままにしてあります)。

なんだこりゃ?
posted by 台北猫々 at 22:30| Comment(0) | TrackBack(1) | 技術メモ(Oracle)

2009年04月06日

Oracle 10gでエクスポートした時のEXP-00056、ORA-00932エラー

EXP-00056: ORACLE error 932 encountered
ORA-00932: inconsistent datatypes: expected BLOB, CLOB got CHAR
EXP-00000: Export terminated unsuccessfully

というようなエラーの対処として、SYSユーザーで
SQL> @?/rdbms/admin/catmetx.sql

Package altered.
Index altered.
View created.
Grant succeeded.
View created.
Grant succeeded.
Procedure created.
System altered.
System altered.
System altered.
PL/SQL procedure successfully completed.
Procedure dropped.

SQL> @?/rdbms/admin/utlrp.sql

PL/SQL procedure successfully completed.

というような、データディクショナリ更新&PL/SQLパッケージの再コンパイルという手順がWeb上に転がっているのですが、これって情報ソースはなんなんでしょうね?マニュアルを見ても、当該エラー番号は存在しないのですよね?


posted by 台北猫々 at 20:36| Comment(0) | TrackBack(0) | 技術メモ(Oracle)

2008年03月15日

RMANでバックアップを取るメモ

●RMAN起動とデータベースへの接続
C:\Documents and Settings\XXXXX>rman target sys/oracle

Recovery Manager: Release 10.2.0.1.0 - Production on 日 3月 9 09:28:28 2008

Copyright (c) 1982, 2005, Oracle. All rights reserved.

ターゲット・データベース: ORCL (データベースID=1175176835)に接続されました

RMAN>

●バックアップ種別のデフォルトを確認します。
RMAN> SHOW DEVICE TYPE;

リカバリ・カタログのかわりにターゲット・データベース制御ファイルを使用しています

RMAN構成パラメータは次のとおりです:
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default

RMAN>

→BACKUPSETがデフォルトになっています。

●バックアップ種別のデフォルトを色々な方法に変更します。
1.イメージコピーに変更する場合
RMAN> CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO COPY;

新しいRMAN構成パラメータ:
CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO COPY PARALLELISM 1;
新しいRMAN構成パラメータが格納できました

2.圧縮BACKUPSETに変更(圧縮はBACKUPSETでのみ可能)する場合
RMAN> CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO COMPRESSED BACKUPSET;

古いRMAN構成パラメータ:
CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO COPY PARALLELISM 1;
新しいRMAN構成パラメータ:
CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO COMPRESSED BACKUPSET PARALLELISM 1;
新しいRMAN構成パラメータが格納できました

●そして、バックアップ(圧縮BACKUPSET)
RMAN> BACKUP DATABASE;

backupが開始されました(開始時間: 08-03-09)
チャネル: ORA_DISK_1が割り当てられました
チャネルORA_DISK_1: sid=141 devtype=DISK
チャネルORA_DISK_1: 圧縮型フル・データファイル・バックアップ・セットを開始してい
ます
チャネルORA_DISK_1: バックアップ・セットにデータファイルを指定しています
入力データファイルfno=00001 名前=C:\USR\LOCAL\ORADATA\ORCL\SYSTEM01.DBF
入力データファイルfno=00003 名前=C:\USR\LOCAL\ORADATA\ORCL\SYSAUX01.DBF
入力データファイルfno=00002 名前=C:\USR\LOCAL\ORADATA\ORCL\UNDOTBS01.DBF
入力データファイルfno=00005 名前=C:\USR\LOCAL\ORADATA\ORCL\EXAMPLE01.DBF
入力データファイルfno=00004 名前=C:\USR\LOCAL\ORADATA\ORCL\USERS01.DBF
チャネルORA_DISK_1: ピース1(08-03-09)を起動します
・・・・・・
posted by 台北猫々 at 08:20| Comment(0) | TrackBack(0) | 技術メモ(Oracle)

2008年03月09日

フラッシュリカバリ領域

●RMANによって以下のファイル群が格納されるディレクトリです。(デフォルトの保存先)
(1)アーカイブREDOログファイル → LOG_ARCHIVE_DEST_nで変更可能
(2)フラッシュバックログ
(3)RMANバックアップファイル → RMANの永続構成とバックアップ時で変更可能
  ・イメージコピー
  ・バックアップセット(RMANファイル)
  ・制御ファイルの自動バックアップ
  
●フラッシュリカバリ領域の設定パラメタ(ALTER SYSTEM 〜で変更可能)
DB_RECOVERY_FILE_DEST
DB_RECOVERY_FILE_DEST_SIZE


●フラッシュリカバリ領域のサーバ生成アラートはデフォルト設定です。
【使用量】
85%→警告アラート
97%→クリティカルアラート

●フラッシュリカバリ領域の使用状況を表示するSQLです。
SELECT name,
space_limit/1024/1024/1024 "最大サイズ(G)",
space_used/1024/1024/1024 "使用済み(G)",
space_reclaimable/1024/1024/1024 "再利用可能サイズ(G)"
FROM v$recovery_file_dest;


name最大サイズ(G)使用済み(G)再利用可能サイズ(G)
C:\usr\local/flash_recovery_area20.687937736511230468750


●フラッシュリカバリ領域のファイルをテープ装置にバックアップします。
BACKUP RECOVERY AREA
BACKUP RECOVERY FILES
posted by 台北猫々 at 21:04| Comment(0) | TrackBack(0) | 技術メモ(Oracle)

2008年03月05日

フラッシュバックバージョン問合せ

以下のようなテーブルを作成します。
IDNAMEPRICEUPD_DATE
1商品A10002008/02/23 23:58:27
2商品B15002008/02/23 23:58:27


商品AのPRICEを更新


IDNAMEPRICEUPD_DATE
1商品A12002008/02/23 23:58:27
2商品B15002008/02/23 23:58:27


これまでの変更履歴を表示します。
SELECT versions_starttime,versions_operation,ID,PRICE
FROM MST_SHOHIN
VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE
WHERE ID = '1'


versions_starttimeversions_operationIDPRICE
2008/03/04 23:12:12U11200
2008/03/04 23:11:21I11000

※U:Update, I:Insert

こんなこともできるようになったのですね。猫
posted by 台北猫々 at 19:44| Comment(0) | TrackBack(0) | 技術メモ(Oracle)

2008年03月01日

Oracleをアップグレードする時の起動モード

Oracle9iでは、"startup migrate"だったものが、10gでは"startup upgrade"に変更になったそうです。また、移行ツールも"Database Migrate Assistant"から、"Database Upgrade Assistant"に改名したそうです。

↓は、コマンドラインからデータベースをアップグレードモードで起動する方法です。

C:\Documents and Settings\xxxxx>sqlplus /nolog

SQL*Plus: Release 10.2.0.1.0 - Production on 土 3月 1 08:13:34 2008

Copyright (c) 1982, 2005, Oracle. All rights reserved.

SQL> conn sys/xxxxxxxxxx as sysdba
接続されました。
SQL> startup upgrade
ORACLEインスタンスが起動しました。

Total System Global Area 289406976 bytes
Fixed Size 1248576 bytes
Variable Size 96469696 bytes
Database Buffers 184549376 bytes
Redo Buffers 7139328 bytes
データベースがマウントされました。
データベースがオープンされました。
SQL>
posted by 台北猫々 at 08:22| Comment(0) | TrackBack(0) | 技術メモ(Oracle)

2008年02月28日

フラッシュバックドロップ!

なんか、プロレスの技みたいですが、違います。

ついに、Oracle10gになってDROPしてしまったテーブルを復活できるようになりました。(フラッシュリカバリの進化形ですね)

間違って「SAMPLE」テーブルをDROPしてしまったとします。

DBA権限を持つユーザ(SYSTEMとか)で以下のSQL実行します。
↓のSQLはOracleの「ゴミ箱」を表示します。(NLSSORT関数のくだりは、大文字/小文字を無視する指定です)
select original_name, type, ts_name, droptime, dropscn, object_name, owner
from dba_recyclebin
where NLSSORT(owner, 'NLS_SORT=BINARY_CI') = NLSSORT('taipei_neko', 'NLS_SORT=BINARY_CI')


original_nametypets_namedroptimedropscnobject_nameowner
SAMPLETABLEUSERS2008-02-23:18:29:03629095BIN$TxcezCXaS4iFz2XLZVvS5Q==$0TAIPEI_NEKO


ゴミ箱に残っています。
では、これを復活します。「TAIPEI_NEKO」ユーザで以下のSQLを実行します。

flashback table sample to before drop

もう一度↓を実行しても、先ほど表示されたSAMPLEテーブルのデータは表示されません。
SAMPLEテーブルは復活しました。
select original_name, type, ts_name, droptime, dropscn, object_name, owner
from dba_recyclebin
where NLSSORT(owner, 'NLS_SORT=BINARY_CI') = NLSSORT('taipei_neko', 'NLS_SORT=BINARY_CI')


ただし、SYSTEM表領域のテーブル、ローカル表領域以外のテーブル、ファイングレイン監査・
仮想プライベートデータベース(VPD)が使用されているテーブルは対象外です。
posted by 台北猫々 at 22:42| Comment(0) | TrackBack(1) | 技術メモ(Oracle)

2008年02月25日

ちなみにポリシーを削除するのは、

BEGIN
DBMS_RLS.ADD_POLICY (
object_schema => 'user1',
object_name => 'emp',
policy_name => 'emp_policy',
function_schema => 'user1',
policy_function => 'policy_func',
sec_relevant_cols => 'sal, comm');
END;
/

で作成したものを削除するには、


BEGIN
DBMS_RLS.DROP_POLICY (
object_schema => 'user1',
object_name => 'emp',
policy_name => 'emp_policy');
END;
/


です。猫


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 20:50| Comment(0) | TrackBack(0) | 技術メモ(Oracle)

では、「ファイングレインアクセスコントロール(FGAC)」やってみよう

以下のように、EMP表があるとして、SAL,COMM列に制限をかけて、
SAL,COMM列にアクセスした場合は、自分以外の行は見れないようにします。
NOENAMESALCOMM
10YAMADA1000 
11KUMA5000500
12SASAKI20000
13SUZUKI4000 


(1)先ずは、ポリシーファンクションの登録

CREATE OR REPLACE FUNCTION policy_func (
obj_schema VARCHAR2,
obj_name VARCHAR2)
RETURN VARCHAR2
AS
BEGIN
IF obj_schema = SYS_CONTEXT('USERENV', 'SESSION_USER') THEN
RETURN '1=1';
ELSE
RETURN 'ename = SYS_CONTEXT(''USERENV'', ''SESSION_USER'')';
END IF;
END policy_func;
/


SYS_CONTEXT('USERENV', 'SESSION_USER')は、SQLの実行ユーザ名を返却しますので、
"obj_schema = SYS_CONTEXT('USERENV', 'SESSION_USER')"は、実行ユーザがオブジェクトの所有者であるかを判断しています。

そして、
"'ename = SYS_CONTEXT(''USERENV'', ''SESSION_USER'')'"は、ename列の値が、実行ユーザ名であるかを判断しています。

(2)次に、ポリシーの登録

BEGIN
DBMS_RLS.ADD_POLICY (
object_schema => (EMPの所有ユーザ名),
object_name => 'emp',
policy_name => 'emp_policy',
function_schema => ('policy_func'の所有ユーザ名),
policy_function => 'policy_func',
sec_relevant_cols => 'sal, comm');
END;
/


sec_relevant_cols => 'sal, comm');で、アクセスコントロールする列リストを指定します(Oracle10gから複数の列を指定できるようになりました。)

これで、設定完了です。

"YAMADA"ユーザで以下ような'sal' or 'comm'列にアクセスするSQLを実行すると、ポリシーが働き、
SELECT * FROM (EMPの所有ユーザ名).EMP;

NOENAMESALCOMM
10YAMADA1000 


というようENAMEが自分以外のレコードは見えなくなります。
posted by 台北猫々 at 20:44| Comment(0) | TrackBack(0) | 技術メモ(Oracle)

ファイングレインアクセスコントロール(FGAC)の前準備

この機能は、使ったことはないのですが、DWHなどでは便利なのでしょうか?

「ファイングレインアクセスコントロール(FGAC)」と「アプリケーションコンテキスト」を使用して表の行データへのアクセスを制御できるようです。

とりあえず、試してみるかということで、ポリシーを登録しようとしたところ以下のようなエラーが・・・
DBMS_RLS.ADD_POLICY (
*
行2でエラーが発生しました。:
ORA-06550: 行2、列1:
PLS-00201: 識別子DBMS_RLSを宣言してください。
ORA-06550: 行2、列1:
PL/SQL: Statement ignored

そういえば、
SQL> @(ORACLE_HOME)/rdbms/admin/catalog.sql
SQL> @(ORACLE_HOME)/rdbms/admin/catproc.sql

を実行していなかった。と思って実行してから、ポリシーを登録しようとしても状況変わらず・・・
というか、DBMSパッケージの実行権限を与えないと駄目じゃん!ということに気づいて、SYSユーザで以下のコマンドを実行。
GRANT EXECUTE ON DBMS_RLS TO ユーザ名
とりあえず、問題はクリアできました。猫

posted by 台北猫々 at 19:03| Comment(0) | TrackBack(0) | 技術メモ(Oracle)

2008年02月24日

Oracle10gにおけるMERGE文の拡張

MERGE文のUPDATE句とINSERT句でWHERE句の使用ができるようになったそうです。

例えば、商品マスタがあって↓
20080224MST_SHOHIN.jpg

これに対して、差分商品マスタ↓
20080224SABUN_SHOHIN.jpg

の内容をマージしたい場合で、ただし、当テーブルにはマージ処理からは除外したいレコードが含まれる(DEL列が'Y'のレコードはマージ対象外)ような場合、以下のようなSQL文を作成します。


MERGE INTO MST_SHOHIN ms
USING SABUN_SHOHIN ss ON (ms.id = ss.id)
WHEN MATCHED THEN
UPDATE SET name = ss.name, price = ss.price, upd_date = SYSDATE
WHERE ss.del = 'N'
WHEN NOT MATCHED THEN
INSERT VALUES(ss.id, ss.name, ss.price, NULL);


結果は↓になります。
20080224RESULT_SHOHIN.jpg

商品Cのレコードは、更新されていないことがわかります。

posted by 台北猫々 at 00:10| Comment(0) | TrackBack(0) | 技術メモ(Oracle)

2008年02月23日

ユーザ作成

2年というブランクは、ユーザ作成の仕方すら忘れさせてしまうには十分の時間だったようです。ショックです猫

とりあえずメモしておこう。。。

================================================
CREATE USER ユーザ名
IDENTIFIED BY パスワード
[DEFAULT TABLESPACE デフォルト表領域名]
[TEMPORARY TABLESPACE テンポラリ表領域名]
[PROFILE DEFAULT]
/
GRANT CONNECT TO ユーザ名
/
GRANT RESOURCE TO ユーザ名
/
GRANT UNLIMITED TABLESPACE TO ユーザ名
/
================================================



デフォルト表領域名は、"USERS"
テンポラリ表領域名は、"TEMP"
にデフォルトでDBを構築しているとなりますね。

GRANT UNLIMITED TABLESPACE TO ユーザ名は、本番ユーザであれば容量制限するべきでしょうが、まあ勉強用なのでいいかなと。

posted by 台北猫々 at 20:08| Comment(0) | TrackBack(0) | 技術メモ(Oracle)

いきなりですか?

OracleMaster 10g Goldへの移行試験の勉強を開始しようと思いまして、とりあえずOracle10gを家のマシンにインストールしました。インストールは特に問題無くできまして、さあデータベースを作成しようとしたところ、

20080223OracleDBCAError.jpg

出ました・・・Oracle恒例の意味不明エラー。。。EM(EnterpriseManager)の構成に失敗しているようですね。

指定のログファイルを見ると、
============================
設定: Stack Trace:
oracle.sysman.emSDK.conf.TargetAdditionException: ターゲット・リストをC:\usr\local\oracle\sysman\emd\targets.xmlへ保存中にエラーが発生しました :: Malformed \uxxxx encoding.
at oracle.sysman.emSDK.conf.TargetInstaller.addTargetInt(TargetInstaller.java:1143)
at oracle.sysman.emSDK.conf.TargetInstaller.addTarget(TargetInstaller.java:983)
at oracle.sysman.emSDK.conf.TargetInstaller.addTarget(TargetInstaller.java:943)
at oracle.sysman.emcp.EMAgentConfig.updateTargets(EMAgentConfig.java:2730)
at oracle.sysman.emcp.EMAgentConfig.updateAgentConfigFiles(EMAgentConfig.java:2544)
at oracle.sysman.emcp.EMAgentConfig.performConfiguration(EMAgentConfig.java:1166)
at oracle.sysman.emcp.EMAgentConfig.invoke(EMAgentConfig.java:207)
at oracle.sysman.emcp.EMAgentConfig.invoke(EMAgentConfig.java:185)
at oracle.sysman.emcp.EMConfig.perform(EMConfig.java:146)
at oracle.sysman.assistants.util.em.EMConfiguration.run(EMConfiguration.java:430)
at java.lang.Thread.run(Thread.java:534)
============================
と、どうしたらいいか良くわからないエラーが出ていました。

約2年ぶりにOracleを扱いましたが、こういうところ変わってないですね(^^;

と思いましたが、WindowsXP Home Editionはサポート対象外なんですね。うっかりしていました。猫

一応強引にEMを構成しようと思いましたが、ちょっと難しそう。
とりあえず、データベース機能本体は動作しているようなので、まあ、いいかなと。技術的には、コマンドベースで覚えた方が身に付きますしね。
posted by 台北猫々 at 14:47| Comment(0) | TrackBack(0) | 技術メモ(Oracle)