dak ブログ

python、rubyなどのプログラミング、MySQL、サーバーの設定などの備忘録。レゴの写真も。

mysqldumpが使えない場合のデータダンプ方法

2011-08-15 22:27:54 | mysql
mysqldump では -w オプションでダンプするレコードの条件を指定することができますが、例えば複数のテーブルを組み合わせた条件を指定することはできません。
他にも view の実データをダンプしたい場合に、mysqldump で view を指定すると、view のテーブル定義がダンプされるだけです。

このような場合に、select 文で insert/replace 文を生成するのはいかがでしょうか。

mysql> select * from test_dump;
+---------+---------+
| int_col | str_col |
+---------+---------+
| 1 | abc |
| 2 | a'b'c |
+---------+---------+

$ cat dump.sql
select
concat(
"replace into test_dump set"
, " int_col = ", int_col
, ", str_col = ", quote(str_col)
, ";")
from
test_dump
;

$ cat dump.sql | mysql -s DB名
replace into test_dump set int_col = 1, str_col = 'abc';
replace into test_dump set int_col = 2, str_col = 'a\\'b\\'c';


quote() を使えば、文字列を ' で囲んで、エスケープが必要な文字をエスケープして出力してくれます。

splitコマンドで行単位で分割する方法

2011-08-10 21:04:49 | linux
splitコマンドでファイルを分割する際に、-C オプションを使うと、指定バイト数を超えないところで、行単位でファイルを分割することができます。

$ cat test.txt
abc
defgh

-C 7 を指定して、行単位で7バイト毎に分割します。
$ split -C 7 test.txt
$ ls x*
xaa xab
$ cat xaa
abc
$ cat xab
defgh


-C ではなく -b オプションを指定すると単純にバイト単位で分割されます。

$ split -b 7 test.txt
$ ls x*
xaa xab
$ cat xaa
abc
def
$ cat xab
gh