- - PR -
Oracle インポート エクスポート方法について
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 環境なので、通信速度はそこそこ出ると思います。 足りない情報、分からない条件などがありましたらご指摘下さい。 宜しくお願いいたします。 | ||||||||
|
投稿日時: 2004-11-18 22:53
小僧さん、こんばんは。
データベースリンクを用いれば、insert文一発で取り敢えずデータの移動は可能ですよね? あと、テーブルの再作成については、『create table 〜 as 〜』で可能かな?(未確認) | ||||||||
|
投稿日時: 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 ] | ||||||||
|
投稿日時: 2004-11-19 13:12
小僧さん、こんにちは。
フツーに出来ません? そもそも、別のDBへインポートするんですから、ユーザも表領域も違っていて当然のような気がするんですけど…。 | ||||||||
|
投稿日時: 2004-11-19 13:12
はじめまして。小僧さん。
サーバーBのユーザーに先に使用する表領域を指定して テーブル定義を作成する。 その後、サーバーAのダンプファイルをテーブル定義が あっても無視する(ignore?)のパラメータを付けて インポートするとサーバーBのユーザーのテーブルが 指定した表領域にデータをインポートしてくれると思います。 もちろん、INDEXなども同様にする必要があると思います。 勘違いをしていたらすいません。 こんな方法はどうでしょう。 | ||||||||
|
投稿日時: 2004-11-19 14:20
こんにちわ。
どんな風にインポートしましたか? エクスポート元のオブジェクト所有者とインポート先のオブジェクト所有者が違う場合 私はfromuserオプションとtouserオプションを使用してますよ。
[ メッセージ編集済み 編集者: ゆう 編集日時 2004-11-19 14:22 ] | ||||||||
|
投稿日時: 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-11-20 13:15
エクスポートする時にFULLや表領域モードではなく、テーブル単位でエクスポートする。
でもって、インポート時にfromuser/touserの指定をしてテーブル単位でインポートする。 これでどうでしょう? 何度もエクスポート/インポートする必要がありますが、バッチなんかで自動化してやればいいし。 ただ、テーブルを追加したりする場合はちょっと面倒ですが。 | ||||||||
