2017-11-02 4 views
-1

ローカルテストのために私のシステムにMySQL DBをセットアップしました。変更がいつ行われたかを見るためにテーブルを監視しています。Bash - md5よりもファイルの変更を迅速に確認できますか?

ステップ1 - DIR

cd /usr/local/mysql-5.7.16-osx10.11-x86_64/data/blog_atom_tables/

ステップ2に行く - [スクリプトの実行watchDB()が(少し読みやすくするために変更)され

watchDB

...

ディレクトリ内のすべてのテーブルファイルを通じてDRループ、各 md5のコピーを保存し、変更の確認をループし続ける; 10
function watchDB() { 
    declare -A aa // Associative array of filenames and their md5 hashes 
    declare k  // Holder for current md5 

    prt="0" 

    while true; do // Run forever 

     // Loop through all table files within directory 
     for i in *.ibd; 
     do 
      k=$(sudo md5 -q $i) // md5 of file (table) 

      // If table has not been hashed yet 
      if [[ ${aa[$(echo $i | cut -f 1 -d '.')]} == "" ]]; then 

       aa[$(echo $i | cut -f 1 -d '.')]=$k 

      // If table has been hashed, and diff md5 (i.e. table changed) 
      elif [[ ${aa[$(echo $i | cut -f 1 -d '.')]} != $k ]]; then 

       echo $i; 
       aa[$(echo $i | cut -f 1 -d '.')]=$k 

      fi 
     done 
    done 
} 

TL。

どのような行/列が変更されたかを知る必要はなく、テーブル自体が異なるだけです。ほとんどの場合、これは私が望むように正確に動作しますが、すべてのテーブルに対してmd5を計算するのにはかなりの時間がかかります。たった25テーブルの場合、各ループを実行するのに3〜5秒かかります。

md5以外の方法が簡単ですか?私はcmpのようなものを使用したいと思いますが、ファイルの現在の状態の参照を保存する必要があります。

これは最終的にそこに入るテーブルの約1/6に過ぎないので、スピードの改善は歓迎されます。

+0

ファイルシステムのマウント時に 'atime'が無効にされていない限り、ファイルアクセス/変更時刻を監視してみてはいかがですか? –

+0

@Birrelすべてのファイルにはそれがあります。 – 123

+0

@Birrelなぜテーブルを変更するためにmysqlを使用してください... – 123

答えて

1

実際にファイルの内容をチェックしていない間に、ファイルシステムの属性を使用して、変更を簡単に監視することができます。ファイルシステムがあなたがアクセス時刻と更新時刻のタイムスタンプを監視することができ、無効にタイムスタンプを搭載している場合を除き:

stat -f "%m" <filename> 

読み取りと書き込みが発生し、その後のタイムスタンプを更新するとき、ファイルシステムドライバが知っています。

関連する問題