mysqlのデータを復元するために利用したfindの使い方とか

mysqlのデータを復元するために利用したfindの使い方とか。

findの使い方がよくわかんなくて前からすごく困ってたけど、今回はうまくいったっぽい。なのでココにメモメモ。

自分のところで利用しているmysqlは、ログファイルとデータファイルを別のディレクトリで管理しているので、ログファイルを除いた物をコピーしたかった。それをコピーするためのfindの使い方。

下記が対象となるディレクトリ例

shell> ls
cacti/                   mysql-bin.000080         mysql-bin.000167
ib_logfile0              mysql-bin.000081         mysql-bin.000168
ib_logfile1              mysql-bin.000082         mysql-bin.000169
ibdata1                  mysql-bin.000083         mysql-bin.000170
ibdata2                  mysql-bin.000084         mysql-bin.000171
master.info              mysql-bin.000085         mysql-bin.000172
my.cnf*                  mysql-bin.000086         mysql-bin.000

(後略)

上記ファイルの内、mysql-binで始まるファイルを除いた物をデータディレクトリにコピーしたかった。

findで特定の文字列を含まない指定方法

findで特定の文字列を含まないように指定するには

shell> find . ! -name foo
SoftwareDesign 2011年5月

上記の方法だとfooというファイルを除外してリスト表示する

先のmysql-binで始まるファイルを除くには、mysql-bin.*なファイル名を除外すれば良い。

そのままワイルドカードのアスタリスク(*)を使うとシェル側で展開されてしまって困るので、クォートで囲んでfindに渡してやる

shell> find . ! -name 'mysql-bin.*'
cacti/
./cacti
./cacti/data_template_data_rra.ibd
./cacti/user_log.frm
(中略)
./ib_logfile0
./ib_logfile1

これで欲しいデータがとれた。

でもこれだとcpコマンドでファイルをコピーするに当たって問題がある。

現在リストで表示されているのはmysql-binで始まらないファイル名全てを表示している。このリストに対してcpコマンドを実行すると、ファイル全てをコピーしようとするのでエラーとなってしまうだろう。下記がその例。

cp ./cacti /foo/bar/
cp  ./cacti/data_template_data_rra.ibd /foo/bar/cacti
cp ./cacti/user_log.frm /foo/bar/cacti
(中略)
cp ./ib_logfile0 /foo/bar/cacti
cp ./ib_logfile1  /foo/bar/cacti

一番最初のcp ./cactiはディレクトリなのでこのままでは通らない。二段目以降はcactiディレクトリにあるファイルを一つ上の階層にコピーしようとしてしまっている。コレだとまずい。

ということで、ディレクトリだけをcp -Rpでコピーしてやればよい。

その下ファイルまでコピーすると 階層違い+二度コピーすること になってしまうので、現在居る階層のファイル or ディレクトリだけをコピーすると良い。

findで探索する現在の階層からのディレクトリの深さ

findでは探索するディレクトリの深さを指定できる。コレまであっさり調べててうまくいかなかったけど、やっと出来るようになった。

現在のディレクトリから深さ1(今居るディレクトリの中身、ファイルとディレクトリに対して)のファイルを探索する。

shell> find ./ -depth 1

-depthオプションはファイルに対する検索条件の一つとして見られるので、探索対象のディレクトリの後ろに並べて記述する。前に書くとうまく動かない。これで勘違いた様子。残念。

まとめ: mysqlのディレクトリにあるファイルの内、mysql-binで始まるもの以外を対象のディレクトリにコピーする

mysqlのディレクトリにあるファイルの内、mysql-binで始まるもの以外を対象のディレクトリにコピーする際に利用したコマンド。

shell> find ./ ! -name 'mysql-bin.*' -depth 1 -exec sudo cp -Rp {} /usr/local/mysql_data/ \;

コメントを残す