ある Informix データベースから別のデータベースにデータをコピーする必要があります。これを行うためにLOADを使用したくありません。これに役立つスクリプトはありますか? これを行う他の方法はありますか?
3 に答える
最も簡単な解決策は、データベースインスタンスをバックアップし、それを別のインスタンスに復元することです。これが不可能な場合は、他の可能性があります。
- dbexport / dbimport
- アンロード/ロード
- 手作りのSQLインサート
データベース構造が同一の場合は、dbexport / dbimportを使用できますが、これにより、データがファイルシステムまたはテープのフラットファイルにアンロードされ、フラットファイルからインポートされます。
私は一般的に、DB構造が同じである場合、ロード/アンロードが最も簡単な解決策であることがわかります。
ロード/アンロードdbimport/dbexportを使用したくない場合は、次のように直接SQL INSERTSを使用できます(テストされていない場合は、構文を確認する必要があります)
INSERT INTO dbname2@informix_server2:table
SELECT * FROM dbnam1e@informix_server1:table_name
もちろん、これは一貫性のあるテーブル構造を意味します。構造が異なる場合は、列リストを使用できます。
問題を引き起こす1つの領域は、参照整合性です。外部キーがある場合、挿入が正しい順序で行われることを確認する必要があるため、これにより問題が発生します。SERIAL列とINSERTSにも問題がある可能性があります。シリアル値を使用してテーブルにロードし、元の値を保持できるため、ロードでこの問題が発生することはありません。
私はしばしば最良の解決策は次のとおりであることを発見しました
- database1からスキーマを取得します。
- それを2つの部分に分割します。最初のセグメントはすべてのテーブル作成ステートメントであり、2番目の部分はすべてのCREATE INDEX、参照整合性などのステートメントです。
- スキーマの最初の部分からdatabase2を作成します。
- UNLOAD / LOADを使用して、データをdatabase2にロードします。
- スキーマの2番目の部分をdatabase2に適用します
これは、dbimportが実行するプロセスと非常に似ていますが、データベースに別のデータベースの同義語が含まれており、dbimportがこれらを使用した/機能しないため、これまでdbimportを使用できませんでした。
使用しているInformixデータベースのタイプについてもう少し情報がなければ、最適なオプションを正確に言うことは困難です。
テーブルの数が少なく、データの量が多い場合は、onunload、onload、および/またはHighPerformanceLoaderを確認してください。(ここでは標準エンジンについて話しているのではないと思います。)
一方、テーブルがたくさんあり、HPLが面倒な場合は、myexport / myimport(iiug.orgサイトで入手可能)を参照してください。これらは、標準のdbexport/dbimportユーティリティと同等の非ロックです。
UNLOAD と LOAD は、最も簡単な方法です。それらを除外すると、DB-Load と DB-Access、DB-Export と DB-Import も使用できなくなります。これらは最も簡単な方法です。
すでに述べたように、HPL の使用を検討できます。
ER システムをセットアップすることもできます。これは、UNLOAD に続いて LOAD を実行するよりも困難ですが、冗長な操作は使用しません。
2 つのマシンが実質的に同一である場合は、onunload と onload を検討できます。私はそれをお勧めしません。