skip to main | skip to sidebar

ちょっと硬派なコンピュータフリークのBlogです。

Google
カスタム検索
ラベル unix の投稿を表示しています。 すべての投稿を表示
ラベル unix の投稿を表示しています。 すべての投稿を表示

2009年12月02日

特定のデータベースだけをmysqldumpで作成したダンプファイルから抜き出すawkスクリプト

タイトルのまんまのプチトリビアを紹介しようと思う。mysqlの--one-databaseオプションを使えば「mysqldumpで--all-databasesとか--databasesオプションを使って作成したダンプファイルに含まれる複数のデータベースから、一つのデータベースだけを選択してリストアする」という操作ができるけど、毎回ダンプファイル全体を読み込むのは無駄じゃないか?と思われることもあるだろう。だったら事前にダンプファイルを分けちゃいたい!と考えるのが人情というもの。そんなときはawkコマンドを使うといい。
#!/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」というファイルにダンプが分けられて保存されるという寸法。(削除) DB数が多い場合は"Too many open files”エラーが出てしまうので注意すること。 (削除ここまで)(色々直しました。) もちろん既存のダンプファイルを分けることも可能。
shell> ./separate-dump.awk < dump.sql 

なお、このスクリプトの利用は自己責任でお願いします。ライセンスはGPLv3で。何か不具合等があれば直して使って下さい。
投稿者 Mikiya Okuno 時刻: 15:41 1 コメント
ラベル: , ,

2008年09月09日

liveventの意義

最近注目度ナンバーワンのmemcachedであるが、そのソースコードはシンプルでありビルドも非常に簡単なのだが、リンクするべきライブラリがただ一つだけ存在する。それがlibeventである。
http://monkey.org/~provos/libevent/

libeventとはその名の通りイベント通知ライブラリである。と言っただけではなんのこっちゃ?!と思われることだろう。別の言い方をすると非同期I/Oライブラリてな感じだろうか。

オトコたるもの滅多なことでそもそも論をしてはいけないが、非同期I/Oについて語らねば先に進まないので致し方なしとする。
投稿者 Mikiya Okuno 時刻: 18:48 0 コメント
ラベル: , , ,

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のページを見た方がが分かりやすいかも知れない。
投稿者 Mikiya Okuno 時刻: 0:43 0 コメント
ラベル: , ,

2008年03月23日

オトコ前なコマンド表

Unix Toolbox
http://cb.vu/unixtoolbox.xhtml

これほどまでに巨大なUNIXコマンド表のページは見たことがない。

しかしこれは便利だ。一ページに内容をまとめてあるところがミソで、ブラウザで開いて検索することで目的の機能がすぐに見つかるだろう。「あれってなんだっけ?」という時にオススメ。LinuxとFreeBSD、そしてSolarisを少しカバーしている。個人的にはMacOS Xのリファレンスも欲しかったところだが。

ただ、日本人にとっての難点はこのページが英語であること。日本語版を作ったらウケルだろうか?

あと、もう少しSolarisの情報が充実しててもイイと思った。
投稿者 Mikiya Okuno 時刻: 14:36 0 コメント
ラベル: , ,

 

AltStyle によって変換されたページ (->オリジナル) /