- - PR -
オラクル9iでの、エクスポート・インポートについて
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-10-08 17:07
はじめまして。
初歩的な質問で申し訳ないのですが、オラクルのインポートで困っています。 同じ構成のサーバが2台あり、オラクルも同じバージョンが入っています。 サーバAからデータベース全体をエクスポートしてサーバBへインポート したいと思っています。(定期的に) エンタープライズマネージャのインポート・エクスポートウィザードを使用して ジョブをつくり実行すると初めの1回は成功しました。 (サーバBに同じ名前のDBを作成した直後に実行) しかし、再度ジョブを実行するとインポートの所でジョブが失敗し、 オブジェクトは既に存在するといったエラーメッセージがログに多数出てきます。 一度インポートして出来上がったDBにたいして、上書きでインポートするような 事はできないのでしょうか。 毎晩、サーバAのDBをサーバBに複製するという運用がしたいのです。 | ||||
|
投稿日時: 2004-10-08 20:56
恐らく、テーブルの作成でエラーになっているのですね?
エンタープライズマネージャは、 過去に少し触っただけなので忘れてしまいました。 たしか、オプションで設定できると思います。 「IGNORE」とか「作成時エラー無視」といったような 設定項目は無いでしょうか? コマンド(IMP)では、「IGNORE=Y」としますので。 [追加] この場合、元サーバで修正、削除したデータは、反映されません。 なのでデータを「TRANCATE TABLE」で削除してから インポートするようにしてください。 [ メッセージ編集済み 編集者: たるたる 編集日時 2004-10-08 21:03 ] | ||||
|
投稿日時: 2004-10-08 22:27
Oracle9iの場合、「DataGuard」や「Advanced Replication」といったDatabaseの同期を行ってくれる機能があります。
それを使ったほうがいいかもしれません。 | ||||
|
投稿日時: 2004-10-10 08:45
会社員さんの仰る背景には「複製するという運用」という事は 目的や要件によってはExport&Importは不適切じゃ無いのか? って事だと思います。 私は、思います。 もし、その時点からの質問であれば 目的と制約を提示されると宜しいかと思います。 | ||||
|
投稿日時: 2004-10-12 11:20
皆様、ご返答いただき有難うございます。
「DataGuard」、「Advanced Replication」の存在を知らなかったため 調べて見ました。 当方のオラクルのライセンスはスタンダードエディションの為、どちらの 機能も使用できないようです。 はにまる様 他の選択肢の存在を知りませんでしたので、ご教示願えますでしょうか。 状況をも少し詳しく書きます。 データベースは通常時Aを使用しています。 Bは、バックアップ、兼テスト、兼データリカバリ用に使用します。 即時の同期は必要なく、前日のデータを保持していればいいのです。 間違ったデータ更新等をしてしまった場合、そのデータだけBより復旧します。 また、DB管理者がいない為、DBの管理を出来るだけ簡単に済ましたい ということもあります。この仕組みの構築にすら余り時間を割けない状況です。 以上まとめると、目的は データベースの前日時点の複製を作成すること(新規作成したユーザ、その他含めて) 制約は 1.スタンダードエディションであること 2.出来るだけ簡単な仕組みで実現すること です。 DB全体をエクスポートして、インポートするのが簡単でこの方法しか思いつかなかった のですが、こういった運用の場合に適した方法をご教示ください。 | ||||
|
投稿日時: 2004-10-12 12:48
がび〜ん。では増分エクスポートも無理ですね。 # エンタープライズ版しか知らない為、機能差は今調べてきました。 知らぬ馬の骨の発言として客観的に受止めて下さいね。 正直言いますと、提示要件を簡単に満たす手立てが思いつきません。 既に提案されている「IGNORE=Y」による既存エラー無視のインポートは Aサーバにて新規追加されたデータはBサーバに反映されますが、 変更されたレコードは一意制約で排除され、 またレコード削除の更新結果は反映はされません。 後、一意制約の無いテーブルは重複登録される形式になる為、ご注意下さい。 つまりは、綺麗にサーバBに全レコード反映させたいのであれば 一旦、テーブル空にしてからインポートする必要があります。 そこで、思いつくのがテスト機としての精度を下げる方法です。 仮に日曜日がメンテナンス日として運用出来るのであれば、 日曜日に完全反映させる構成にし、月〜土は前回日曜日の 状態を利用する方針に変えるのです。 もう一声いくと 不完全性を許し、日々少しでもAサーバの状態を反映させたいのであれば 月〜土は「IGNORE=Y」でインポートし もう少し完全性を高めたいのであれば、 更新頻度の高いテーブルに関してのみ 事前にTruncate Tableして インポートコマンドの「TABLE=xxxxx」コマンドによりテーブルを限定し 「IGNORE=Y」でインポートされると宜しいかと思います。 | ||||
|
投稿日時: 2004-10-12 13:15
Oracleのユーザが固定されているならば、
ユーザ単位にexpして imp前にユーザをDrop->Createすれば 簡単です。(あくまでもユーザ単位ですが) | ||||
|
投稿日時: 2004-10-12 13:27
IGNORE=Yに拘って、勝手に時間制限を設けていた。失敗!
時間が許す範囲内で、より広い対象で一括反映した方がいいですね。 後は他のOracleユーザが更新対象ユーザのオブジェクトを ストアードプロシージャ等のオブジェクトで参照していなければ、OKですね。 |