MySQL (MyISAM) で運用中のテーブルバックアップ

MyISAM だと --single-transaction が使えないため、普通に mysqldump するとロックがかかってしまって、サービスがストールしてしまう。つーわけでこうした。

MAX_ROW_ID=123456
BLOCK_SIZE=1000

mysqldump -u root --no-data db_name tbl_name
for i in `perl -le 'print $_ for (0..int($ARGV[0]/$ARGV[1]))' $MAX_ROW_ID $BLOCK_SIZE`; do
    mysqldump -u root --no-create-info --compact --where="$i*$BLOCK_SIZE<=id and id<($i+1)*$BLOCK_SIZE" db_name tbl_name
done

なんか化石みたいな話だけど。まだ使ってますw