- PR -

オラクル9iでの、エクスポート・インポートについて

投稿者投稿内容
ubaba
会議室デビュー日: 2004/10/08
投稿数: 3
投稿日時: 2004-10-08 17:07
はじめまして。
初歩的な質問で申し訳ないのですが、オラクルのインポートで困っています。

同じ構成のサーバが2台あり、オラクルも同じバージョンが入っています。
サーバAからデータベース全体をエクスポートしてサーバBへインポート
したいと思っています。(定期的に)

エンタープライズマネージャのインポート・エクスポートウィザードを使用して
ジョブをつくり実行すると初めの1回は成功しました。
(サーバBに同じ名前のDBを作成した直後に実行)
しかし、再度ジョブを実行するとインポートの所でジョブが失敗し、
オブジェクトは既に存在するといったエラーメッセージがログに多数出てきます。

一度インポートして出来上がったDBにたいして、上書きでインポートするような
事はできないのでしょうか。

毎晩、サーバAのDBをサーバBに複製するという運用がしたいのです。
たるたる
会議室デビュー日: 2003/09/29
投稿数: 16
投稿日時: 2004-10-08 20:56
恐らく、テーブルの作成でエラーになっているのですね?

エンタープライズマネージャは、
過去に少し触っただけなので忘れてしまいました。
たしか、オプションで設定できると思います。
「IGNORE」とか「作成時エラー無視」といったような
設定項目は無いでしょうか?

コマンド(IMP)では、「IGNORE=Y」としますので。

[追加]
この場合、元サーバで修正、削除したデータは、反映されません。
なのでデータを「TRANCATE TABLE」で削除してから
インポートするようにしてください。

[ メッセージ編集済み 編集者: たるたる 編集日時 2004-10-08 21:03 ]
会社員
ベテラン
会議室デビュー日: 2003/01/21
投稿数: 50
投稿日時: 2004-10-08 22:27
Oracle9iの場合、「DataGuard」や「Advanced Replication」といったDatabaseの同期を行ってくれる機能があります。
それを使ったほうがいいかもしれません。
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-10-10 08:45
引用:

ubabaさんの書き込み (2004-10-08 17:07) より:
毎晩、サーバAのDBをサーバBに複製するという運用がしたいのです。


会社員さんの仰る背景には「複製するという運用」という事は
目的や要件によってはExport&Importは不適切じゃ無いのか?
って事だと思います。

私は、思います。

もし、その時点からの質問であれば
目的と制約を提示されると宜しいかと思います。
ubaba
会議室デビュー日: 2004/10/08
投稿数: 3
投稿日時: 2004-10-12 11:20
皆様、ご返答いただき有難うございます。

「DataGuard」、「Advanced Replication」の存在を知らなかったため
調べて見ました。
当方のオラクルのライセンスはスタンダードエディションの為、どちらの
機能も使用できないようです。

はにまる様
他の選択肢の存在を知りませんでしたので、ご教示願えますでしょうか。

状況をも少し詳しく書きます。

データベースは通常時Aを使用しています。
Bは、バックアップ、兼テスト、兼データリカバリ用に使用します。
即時の同期は必要なく、前日のデータを保持していればいいのです。
間違ったデータ更新等をしてしまった場合、そのデータだけBより復旧します。

また、DB管理者がいない為、DBの管理を出来るだけ簡単に済ましたい
ということもあります。この仕組みの構築にすら余り時間を割けない状況です。

以上まとめると、目的は
 データベースの前日時点の複製を作成すること(新規作成したユーザ、その他含めて)
制約は
1.スタンダードエディションであること
2.出来るだけ簡単な仕組みで実現すること
です。
DB全体をエクスポートして、インポートするのが簡単でこの方法しか思いつかなかった
のですが、こういった運用の場合に適した方法をご教示ください。
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-10-12 12:48
引用:

ubabaさんの書き込み (2004-10-12 11:20) より:
当方のオラクルのライセンスはスタンダードエディションの為


がび〜ん。では増分エクスポートも無理ですね。
# エンタープライズ版しか知らない為、機能差は今調べてきました。


知らぬ馬の骨の発言として客観的に受止めて下さいね。

正直言いますと、提示要件を簡単に満たす手立てが思いつきません。

既に提案されている「IGNORE=Y」による既存エラー無視のインポートは
Aサーバにて新規追加されたデータはBサーバに反映されますが、
変更されたレコードは一意制約で排除され、
またレコード削除の更新結果は反映はされません。
後、一意制約の無いテーブルは重複登録される形式になる為、ご注意下さい。

つまりは、綺麗にサーバBに全レコード反映させたいのであれば
一旦、テーブル空にしてからインポートする必要があります。

そこで、思いつくのがテスト機としての精度を下げる方法です。
仮に日曜日がメンテナンス日として運用出来るのであれば、
日曜日に完全反映させる構成にし、月〜土は前回日曜日の
状態を利用する方針に変えるのです。

もう一声いくと

不完全性を許し、日々少しでもAサーバの状態を反映させたいのであれば
月〜土は「IGNORE=Y」でインポートし

もう少し完全性を高めたいのであれば、
更新頻度の高いテーブルに関してのみ
事前にTruncate Tableして
インポートコマンドの「TABLE=xxxxx」コマンドによりテーブルを限定し
「IGNORE=Y」でインポートされると宜しいかと思います。
ぽん助
会議室デビュー日: 2004/10/12
投稿数: 2
投稿日時: 2004-10-12 13:15
Oracleのユーザが固定されているならば、
ユーザ単位にexpして
imp前にユーザをDrop->Createすれば
簡単です。(あくまでもユーザ単位ですが)
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-10-12 13:27
IGNORE=Yに拘って、勝手に時間制限を設けていた。失敗!

時間が許す範囲内で、より広い対象で一括反映した方がいいですね。

後は他のOracleユーザが更新対象ユーザのオブジェクトを
ストアードプロシージャ等のオブジェクトで参照していなければ、OKですね。

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