- PR -

Oracle インポート エクスポート方法について

投稿者投稿内容
小僧
会議室デビュー日: 2004/11/18
投稿数: 7
投稿日時: 2004-11-18 22:39
始めまして。
掲題の件で皆様にお知恵を拝借できればと思います。

・やりたい事
A サーバと B サーバのデータを毎日同期を取る。
同期は夜間、バッチで行うので、処理時間はある程度長くても大丈夫です。
そして、対象は DB の中身全てではなく、ある 1 ユーザのデータのみです。

・問題点
A サーバのユーザを Test1 とし、 B サーバのユーザを Test2 とすると、
Test1 の表領域が「USERS」、 Test2 の表領域が「HONBAN」となっている為、
( 使用する表領域が異なる ) インポートが上手くいかない。
→ どうやら、エクスポートしたダンプファイル内に「表領域情報」を持っていて、
自動的にエクスポートした際のユーザの表領域にインポートしようとしているようです。

・その他
基本的にデータの受け渡しなので、 CSV に出力 → 取込みでも良いのですが、
A サーバの DB に変更 ( 対象テーブルにカラム追加、など ) が発生した場合に
テーブルの Drop、Create が必要かと思われます。
出来れば、一度仕組みを考えた後の手作業は発生しないようにしたいです。
( ちなみに、インポート エクスポート方法の場合、インポート処理前に
全テーブルを Drop してからインポートしようと思っています。 )

・考えた方法
@「その他」の所で書いたように、CSV → 取込み。
@サーバ B に表領域「USERS」としたユーザ Test3 を作成し、 Test1 のデータをインポートする。
その後、Insert 文を使って Test3 のデータを Test2 のテーブルに書き込む。
→ まず、何よりダサい(苦笑
それと、実現可能かどうかも分かりませんし、処理時間も長い、
容量を 2 倍必要とするので、あまり現実的ではない気がします。

・環境
OS・・・・・Windows 2000 Server ( 多分両方のサーバ )
Oracle・・・8.1.6 ( これも、多分両方とも )
LAN 環境なので、通信速度はそこそこ出ると思います。

足りない情報、分からない条件などがありましたらご指摘下さい。
宜しくお願いいたします。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2004-11-18 22:53
小僧さん、こんばんは。

データベースリンクを用いれば、insert文一発で取り敢えずデータの移動は可能ですよね? あと、テーブルの再作成については、『create table 〜 as 〜』で可能かな?(未確認)
小僧
会議室デビュー日: 2004/11/18
投稿数: 7
投稿日時: 2004-11-19 12:09
お世話になります。
早速の回答、ありがとうございました。

その後ですが、制約が出てきてしまいました。
1. テーブル間で直接データの入替えを行うのではなく、
ダンプファイル or CSV ファイルからサーバ B にデータを取り込みたい
( 障害が起こった場合でも、ファイルからリカバリ出来るので )

ですので、今考えているのは、
1. サーバ A にてダンプ取得
2. サーバ B にファイル送信
3. サーバ B にて表領域「USERS」のユーザ ( Test3 ) にインポート
4. サーバ B にて表領域「HONBAN」ユーザ ( Test2 ) にデータ Insert
かな、と思っています。

ここの、3→4の場合に関してですが、
・Test3 ユーザにインポート、
・Test3 と Test2 にデータベースリンク
・Test2 のテーブルを Drop
・Test3 の定義をもとに Test2 上で Create Table as ( 出来る? )
・Test3 からデータ Insert ( 出来る? )
という方式を考えていますが、どうでしょうか?

もっと素晴らしい方法がありましたらご教示願いたいです。
よろしくお願いいたします。

<愚痴>
@インポートユーザとエクスポートユーザの表領域が異なる場合、
インポートが出来ない。
という問題が簡単に解決出来れば楽なんですけど・・・
</愚痴>




[ メッセージ編集済み 編集者: 小僧 編集日時 2004-11-19 12:11 ]
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2004-11-19 13:12
小僧さん、こんにちは。

引用:

@インポートユーザとエクスポートユーザの表領域が異なる場合、
インポートが出来ない。


フツーに出来ません?
そもそも、別のDBへインポートするんですから、ユーザも表領域も違っていて当然のような気がするんですけど…。
MM
会議室デビュー日: 2002/12/20
投稿数: 11
投稿日時: 2004-11-19 13:12
はじめまして。小僧さん。

サーバーBのユーザーに先に使用する表領域を指定して
テーブル定義を作成する。

その後、サーバーAのダンプファイルをテーブル定義が
あっても無視する(ignore?)のパラメータを付けて
インポートするとサーバーBのユーザーのテーブルが
指定した表領域にデータをインポートしてくれると思います。

もちろん、INDEXなども同様にする必要があると思います。

勘違いをしていたらすいません。

こんな方法はどうでしょう。
ゆう
ベテラン
会議室デビュー日: 2003/06/20
投稿数: 56
投稿日時: 2004-11-19 14:20
こんにちわ。

引用:

小僧さんの書き込み (2004-11-19 12:09) より:

<愚痴>
@インポートユーザとエクスポートユーザの表領域が異なる場合、
インポートが出来ない。
という問題が簡単に解決出来れば楽なんですけど・・・
</愚痴>




どんな風にインポートしましたか?
エクスポート元のオブジェクト所有者とインポート先のオブジェクト所有者が違う場合
私はfromuserオプションとtouserオプションを使用してますよ。

コード:

imp id/pass fromuser=Test1 touser=Test2 hoge.dmp



[ メッセージ編集済み 編集者: ゆう 編集日時 2004-11-19 14:22 ]
小僧
会議室デビュー日: 2004/11/18
投稿数: 7
投稿日時: 2004-11-20 11:22
お世話になります。

まず、ご返信ありがとうございます。
まとめて返信させて頂きます。ご容赦下さい。

> ゆうさん
> どんな風にインポートしましたか?
imp test2/test2@ServerB file=XXX owner=test2 touser=test1 fromuser=test2 ignore=y log=XXX
だったと思います。
( OWNER は無かったかもです。
ですが、別ユーザへのエクスポート→インポート ( 表領域は一緒 ) は実績のあるコマンドです。 )

> オブジェクト所有者が違う場合
とありますが、つまり「ユーザが異なる」場合ですよね? ( 違ってたらごめんなさい )
今回はユーザ名も違うのですが、そのユーザが持っている表領域が異なるために
上手くインポート出来ない ( 強制的に「USERS」にインポートしてしまう ) のです。

> MM さん
> サーバーBのユーザーに先に使用する表領域を指定して
> テーブル定義を作成する。
この方法も試したのですが、やはりエクスポートしたユーザが
持っている表領域「USERS」に、強制的にインポートしてしまうようです。
上にも書きましたが、「ignore=y」としても、やはり「USERS」にインポートしていました。

> きくちゃんさん
> フツーに出来ません?
んー、出来ないと思っているのですが。
コマンドがいけないんでしょうか?
ただ、オラクルに詳しい技術者に聞いた際に
「エクスポートした際、表領域情報も一緒に持っていくので、
異なる表領域にインポート出来ない」と言われました。
また、繰り返しになりますが、実際にやってみても
やはり上手くいきません。

もうちょっと調べてみます。
何か良い知恵がありましたら宜しくお願いいたします。


[ メッセージ編集済み 編集者: 小僧 編集日時 2004-11-20 11:25 ]
いーた
大ベテラン
会議室デビュー日: 2004/07/12
投稿数: 154
お住まい・勤務地: 東京
投稿日時: 2004-11-20 13:15
エクスポートする時にFULLや表領域モードではなく、テーブル単位でエクスポートする。
でもって、インポート時にfromuser/touserの指定をしてテーブル単位でインポートする。
これでどうでしょう?

何度もエクスポート/インポートする必要がありますが、バッチなんかで自動化してやればいいし。
ただ、テーブルを追加したりする場合はちょっと面倒ですが。

スキルアップ/キャリアアップ(JOB@IT)