パーティション間で大量のデータをコピーする最良の方法

パーティション間で大量のデータをコピーする最良の方法

HP-UX サーバーの 2 つの LV 間でデータを転送したいと考えています。転送するデータがいくつかありますが、その一部は主にバイナリ (Oracle テーブルスペースなど) で、その他はテキスト ファイル (ログなど) です。ボリュームの使用データ サイズは 100Gb から 1Tb の間です。また、これらのパーティションの一部でブロック サイズを 1K から 8K に変更する予定です...

探しているもの:

  • データの整合性を保証する
  • 最速のデータ転送速度
  • ファイルの所有権と権限を保持

今のところ、dd、cp、rsync について考えましたが、どれを使用するのが最適か、またそれらをどのように使用するのが一番良いかはわかりません...

答え1

dd は使用しないでください。これは、ファイルシステム全体ではなく、1 つのファイルまたはストリームを操作するためのものです。

rsync は、あなたが望むことを行うように設計されていますが、前の投稿者が述べたように、また私のテストが示したように、最速ではありません。これは、次のようなことを行うためです。「わかりました。ファイル A を調べています。ファイル A は宛先にありますか? そうであれば、新しいですか、古いですか、同じですか?」など。rsync は、複数回実行することを想定しているため、少し複雑です... 名前が示すように、2 つの場所を同期するためのものです。

あなたが望む種類のことを実行するには、tar コピーが迅速で簡単、そして信頼できる方法であることが分かりました。Tar はハード リンクを認識します。Tar はデバイスを認識します。Tar は、ファイル システムで発生するほぼすべての状況に対応します (非常に長いパスを除きます。また、Gnu tar を使用していない場合は、パス名の先頭に / を入れることに注意する必要があります)。

とにかく、私は次のことを実行することで過去 20 年間 99.98% の成功を収めてきました。

cd /my/source; tar cf - subdirectory | (cd /destination/path; tar xf -)

...コピーしたいサブディレクトリは /destination/path に表示されます。

進捗状況を確認したい場合は、文字列の後半部分で「xf」の代わりに「xvf」を使用できます。

...0.02% の失敗は、非常に長いファイル パスが原因でした... :-(

Tar はファイルの整合性を保証するものではありません。とはいえ、エラー メッセージが表示されない限り、非常に信頼性が高いことがわかっています。権限と所有権は適切に保持されます。

しかし! あなたの投稿ではファイルの整合性について具体的に言及されており、何年も前の私の回答に解決策を含めなかったことをお詫びします...

タールを塗った後は、これをやるだけです。

cd /path/to/source/dir; tar cf - * | (cd /path/to/dest/dir; tar xf -)

これで、ファイルの保証は次のように実行できます。

find * -exec md5sum {} /path/to/dest/dir/{} \; > /path/to/dest/dir/md5-manifest.txt

完了したら、マニフェスト ファイルを目視するか、awk スクリプト (ユーザーの演習用として残しておきます) を記述して、find/md5sum コマンドからの 2 行の出力を比較することができます。

答え2

見てこの郵便受け。いくつかの回答では を使用することを提案していますtar。他の回答では を使用することを提案していますrsync。2 台のマシン間でデータをコピーすることについて説明しています。あなたの問題は似ていますが、ネットワーク経由で行うのではなく、ローカルでファイルをコピーする必要があります。

答え3

rsyncには、ほとんどの懸念事項に具体的に対処する機能があるため、を使用することをお勧めします。適切なオプション (-aオプションなど) を使用すると、すべてのファイルの所有権、権限、および時間が保持されます。さらに、 はrsync自動的にチェックサムを使用して、転送されたすべてのファイルが宛先にそのまま到着するようにするため、データの整合性が保証されます (正常に実行された場合)。

唯一のポイントはrsync 5月速度は最適ではないかもしれません。特に、 のような軽量の代替手段と比較すると速度がcp遅くなりますが、処理能力が非常に低くない限り、大きな違いに気付くことはないと思います。

答え4

基本的に 3 つの選択肢があります。

  1. パーティション/ブロックデバイス全体をコピーする
  2. ファイルシステム全体をダンプする
  3. データをコピーする内部ファイルシステム

バックアップする内容と、どのような結果を得たいかに応じて、3つのオプションから1つを選択してください。あなたのケースでは、オプション1(ブロックデバイスコピー)とddrescueが正しい方法です。とにかく、利用可能なオプションのコレクションを見てみましょう。

ケース1: パーティションのコピー
利点: ブロック デバイス全体をコピーすると、何も残らないことが確実になります。
欠点: ブロック デバイスを扱うのはファイルを扱うよりも不便で、間違ったブロック デバイスまたはオプションを選択するとデータが破壊される可能性があります。

ブロック全体のバイナリコピーが必要な場合は、ddまたは同様のツールを使用する必要があります。他の非常に便利なツールは次のとおりです。dcfldd(ハッシュ対応のddフォーク)とddrescue(さらに高度な dd のようなツール)。

ケース2: ファイルシステムのダンプ
利点: ファイルシステム全体をコピーすると、その中のすべてのデータとメタデータがバックアップされたことが保証されます。
欠点: バックアップするファイルシステムが複数ある場合は、複数のパスを実行する必要があります (ファイルシステムごとに 1 つ)
ファイルシステムを扱うのに便利なツールはFSアーカイブさらに、多くのファイルシステムには、その内容を効率的にダンプするためのユーティリティが統合されています (例: XFS には xfsdump があり、Ext2/3/4 には dumpe2fs が使用されます)。

ケース3: ファイルシステム内のデータをコピーする
利点: ファイルシステム内からデータをコピーすることで、バックアップする対象を非常に具体的に選択できます。これにより、バックアップ/復元時間が短縮され、バックアップ イメージが小さくなります。
欠点: バックアップする対象と方法を完全に把握している必要があります。重要なメタデータ (所有者、権限、ACL、EA など) には特別な注意が必要です。
同期ここでのあなたの親友です。スナップショットそしてrdiff バックアップrsync/librsync 上に構築された素晴らしいツールです。タールあらゆる Unix システム管理者にとってスイスナイフのようなものです。

関連情報