はじめに
データベースのデータを定期的にバックアップしている際、前回のバックアップファイルと今回のバックアップファイルに差分がないか確認したくなる機会があるのではないでしょうか。通常はそれほど大きなファイルではないので、テキストエディタで開いて目視で確認するのが一般的な方法です。しかし今回、各ファイルのサイズがおよそ10GBと非常に大きかったため、一般的なテキストエディタではファイルを開くことすらできませんでした。そこで、ターミナルで利用できるdiffコマンドを使って差分を確認することにしました。
diffコマンド
diff --side-by-side --width=[文字数] --suppress-common-lines --speed-large-files a.txt b.txt | tee diff.log
--side-by-side
このオプションを付けると、diffは2つのファイルの差分を横に並べて表示します。変更のあった行では、ファイル1の内容が左側に、ファイル2の内容が右側に表示されます。このように横に並べて表示すると、変更箇所が一目でわかりやすくなります。
--width=[文字数]
この引数で表示する行の最大文字数を指定できます。デフォルトでは130文字ですが、今回は120文字に設定しています。使用するターミナルや画面サイズに合わせて見える最大の文字数を指定するのが良いかと思います。
--suppress-common-lines
2つのファイルで共通の行が存在する場合、デフォルトではその共通の行も表示されます。しかし、差分を確認する際は共通の行は不要なので、このオプションを付けることでそれらの行を表示しないようにできます。
--speed-large-files
通常、diffはファイル全体をメモリに読み込んでから処理を行います。しかし、大きなファイルの場合、メモリ不足でクラッシュする可能性があります。このオプションを付けると、diffはファイルの一部分ずつをメモリに読み込むようになり、大きなファイルでも安全に処理できるようになります。
| tee diff.log
この部分はパイプとteeコマンドを組み合わせたものです。diffコマンドの出力結果を標準出力に加えて、diff.logファイルにも書き出すことができます。これにより、結果を他のエディタで見やすい形にして確認することができます。
最初は -u
オプションをつかって差分を確認するようにできないか試していましたが、1行の文字数がとても膨大なためターミナルの出力では確認が非常にやりにくく、--side-by-side
オプションを使用して可能な限り見える範囲で差分を探すことにしてみました。差分があった行を詳しく確認したくなった際は、表示されている文字から検索をかけて特定しています。
余談:他に試した方法
GUIベースの差分確認ツール
- CompareMerge
- FileMerge
どちらも10GBを超えるファイルを開くことができずにクラッシュしてしまいました。
GitHubにファイルをアップロード
GitHubのアップロード上限があることが判明し、この方法も断念。
ファイルを分割して差分を確認する
データベース全体ではなく、テーブル単位でバックアップを取ることで、ファイルサイズを小さくできるかもしれません。しかし、今回は実行せずに終わりました。