Google
カスタム検索
2009年12月02日
特定のデータベースだけをmysqldumpで作成したダンプファイルから抜き出すawkスクリプト
タイトルのまんまのプチトリビアを紹介しようと思う。mysqlの--one-databaseオプションを使えば「mysqldumpで--all-databasesとか--databasesオプションを使って作成したダンプファイルに含まれる複数のデータベースから、一つのデータベースだけを選択してリストアする」という操作ができるけど、毎回ダンプファイル全体を読み込むのは無駄じゃないか?と思われることもあるだろう。だったら事前にダンプファイルを分けちゃいたい!と考えるのが人情というもの。そんなときはawkコマンドを使うといい。
(削除) DB数が多い場合は"Too many open files”エラーが出てしまうので注意すること。 (削除ここまで)(色々直しました。)
もちろん既存のダンプファイルを分けることも可能。
なお、このスクリプトの利用は自己責任でお願いします。ライセンスはGPLv3で。何か不具合等があれば直して使って下さい。
#!/usr/bin/awk -f
BEGIN {
dump_current_db = 0;
num_db = split(databases, db_arr, ",")
for (i = 1; i <= num_db; i++) { db_arr[i] = "`" db_arr[i] "`"; } } /^\-\-/ { print 0ドル; if (2ドル == "Current" && 3ドル == "Database:") { dump_current_db = 0; for (i = 1; i <= num_db; i++) { if (4ドル == db_arr[i]) { dump_current_db = 1; break; } } } } /^\/\*.+\*\/;/ { print 0ドル } /^$/ { print 0ドル } /^[^\-]/ { if (dump_current_db == 1) print 0ドル }
このawkスクリプトを例えばcut-database.awkとかに保存して、
shell> ./cut-database -v databases=db1,db2,db3... < dump.sql> sub_dump.sqlてな具合にコマンドを起動すれば、目的のデータベースだけを含んだダンプファイルがいっちょあがり。 そもそもmysqldumpコマンドでダンプするときにファイルを分ければ?なんて考える人も居るかも知れないけど、それは出来ない相談だったりする。ロールフォワードリカバリとかを考えてバイナリログと同期をとっておかないといけなかったりするし、そもそもデータベースが複数あるときにはデータベース間でデータが同期していないといけない。ところがデータベースを個別にダンプするとロールフォワードリカバリが出来ないどころか、データが使い物にならないことになってしまう。よって--all-databasesとか--databasesの利用は必須なのである。 そこでもう一つ紹介するのが、mysqldumpコマンドの出力をそのまま別々のファイルに保存するawkスクリプト。
#!/usr/bin/awk -f
function is_new_db(db_name) {
for (i = 1; i <= num_db; i++) { if (db_name == db[i]) { return 0; } } return 1; } BEGIN { num_db = 0 num_prelines = 0 num_postlines = 0 current_file = "/dev/null" } /^\-\-/ { if (2ドル == "Current" && 3ドル == "Database:") { close(current_file); db_name = 4ドル gsub("`", "", db_name); current_file = db_name ".sql"; if (is_new_db(db_name)) { db[++num_db] = db_name; print "--\n" 0ドル "\n--\n"> current_file;
for (i = 1; i <= num_prelines; i++) print prelines[i]>> current_file;
}
} else if (num_db == 0) {
num_prelines++;
prelines[num_prelines] = 0ドル;
} else if (2ドル == "Dump" && 3ドル == "completed") {
num_postlines++;
postlines[num_postlines] = "";
num_postlines++;
postlines[num_postlines] = 0ドル;
} else {
print 0ドル>> current_file
}
next;
}
/^\/\*.+\*\/;/ {
if (match(0,ドル "character|collation")) {
print 0ドル>> current_file;
} else if (match(0,ドル "SET")) {
if (num_db == 0) {
if (match(prelines[num_prelines], "^\-\-")) {
num_prelines++;
prelines[num_prelines] = "";
}
num_prelines++;
prelines[num_prelines] = 0ドル;
} else {
num_postlines++;
postlines[num_postlines] = 0ドル;
}
} else {
print 0ドル>> current_file;
}
next;
}
{ print 0ドル>> current_file }
END {
for (i = 1; i <= num_db; i++) { current_file = db[i] ".sql"; print "">> current_file
for (j = 1; j <= num_postlines; j++) { print postlines[j]>> current_file;
}
}
}
このスクリプトを例えばseparate-dump.awkというファイルに保存して実行権限を与えてやれば、
shell> mysqldump -A --single-transaction --master-data=2 --flush-logs | ./separate-dump.awkという具合にこのコマンドを使うことができる。そうするとカレントディレクトリに「データベース名.sql」というファイルにダンプが分けられて保存されるという寸法。
shell> ./separate-dump.awk < dump.sql
なお、このスクリプトの利用は自己責任でお願いします。ライセンスはGPLv3で。何か不具合等があれば直して使って下さい。
2008年09月09日
liveventの意義
最近注目度ナンバーワンのmemcachedであるが、そのソースコードはシンプルでありビルドも非常に簡単なのだが、リンクするべきライブラリがただ一つだけ存在する。それがlibeventである。
http://monkey.org/~provos/libevent/
libeventとはその名の通りイベント通知ライブラリである。と言っただけではなんのこっちゃ?!と思われることだろう。別の言い方をすると非同期I/Oライブラリてな感じだろうか。
※オトコたるもの滅多なことでそもそも論をしてはいけないが、非同期I/Oについて語らねば先に進まないので致し方なしとする。
http://monkey.org/~provos/libevent/
libeventとはその名の通りイベント通知ライブラリである。と言っただけではなんのこっちゃ?!と思われることだろう。別の言い方をすると非同期I/Oライブラリてな感じだろうか。
※オトコたるもの滅多なことでそもそも論をしてはいけないが、非同期I/Oについて語らねば先に進まないので致し方なしとする。
2008年04月29日
古き良きもの・・・X
オトコたるもの、時にはコネクションも大切である。
俺のメインの端末はMacBook Kuroである。当然OSはLeopard(10.5.2)が搭載されている。OSXのGUIはAquaと呼ばれる専用のものであるが、X11.appのおかげでX Window System互換のアプリケーションも実行可能である。
X Window System(以下たんにXと呼ぶ)には遠隔のホストにGUIを転送するという機能が、なんと設計当初から備わっている。イメージ的には以下のように画面の描画を遠隔ホストにリクエストする仕組みだ。遠隔ホストの指定がなければ、同じホストにあるXサーバプロセスに描画のリクエストが出される。
頑張って絵を描いてみたが、WikipediaのX Window Systemのページを見た方がが分かりやすいかも知れない。
俺のメインの端末はMacBook Kuroである。当然OSはLeopard(10.5.2)が搭載されている。OSXのGUIはAquaと呼ばれる専用のものであるが、X11.appのおかげでX Window System互換のアプリケーションも実行可能である。
X Window System(以下たんにXと呼ぶ)には遠隔のホストにGUIを転送するという機能が、なんと設計当初から備わっている。イメージ的には以下のように画面の描画を遠隔ホストにリクエストする仕組みだ。遠隔ホストの指定がなければ、同じホストにあるXサーバプロセスに描画のリクエストが出される。
頑張って絵を描いてみたが、WikipediaのX Window Systemのページを見た方がが分かりやすいかも知れない。
2008年03月23日
オトコ前なコマンド表
Unix Toolbox
http://cb.vu/unixtoolbox.xhtml
これほどまでに巨大なUNIXコマンド表のページは見たことがない。
しかしこれは便利だ。一ページに内容をまとめてあるところがミソで、ブラウザで開いて検索することで目的の機能がすぐに見つかるだろう。「あれってなんだっけ?」という時にオススメ。LinuxとFreeBSD、そしてSolarisを少しカバーしている。個人的にはMacOS Xのリファレンスも欲しかったところだが。
ただ、日本人にとっての難点はこのページが英語であること。日本語版を作ったらウケルだろうか?
あと、もう少しSolarisの情報が充実しててもイイと思った。
http://cb.vu/unixtoolbox.xhtml
これほどまでに巨大なUNIXコマンド表のページは見たことがない。
しかしこれは便利だ。一ページに内容をまとめてあるところがミソで、ブラウザで開いて検索することで目的の機能がすぐに見つかるだろう。「あれってなんだっけ?」という時にオススメ。LinuxとFreeBSD、そしてSolarisを少しカバーしている。個人的にはMacOS Xのリファレンスも欲しかったところだが。
ただ、日本人にとっての難点はこのページが英語であること。日本語版を作ったらウケルだろうか?
あと、もう少しSolarisの情報が充実しててもイイと思った。
登録:
コメント (Atom)