2012年6月20日水曜日

--init-fileオプションを上手く使いたい

init-fileオプションを設定しておくと、mysqldが起動した時にそのファイルを読んでくれる。



制約としては、
・1行じゃなきゃダメ(改行入れちゃいけない。2行目以降無視)
・1ステートメントじゃなきゃダメ(改行入れずにつなげても最初の1つだけ実行して後は無視)
・SOURCEは使えない(SQLステートメントじゃないからか)
・SLEEP関数が一瞬で抜けて返ってくると思う(使うことないけど)
 ⇒SHOW PROCESSLISTで捕まらない。捕まらないだけか?
・SQLを実行し終わるまでconnectionが張れない?(同じ重いクエリをコマンドラインから流しても別termから接続は出来るのに、init-fileで指定すると接続すら出来ない)
最後のはちょっと追いかけてみようかな。


Memoryエンジンを使う時は、init-fileオプション使ってLOADするとかしてねって書いてあるけど、
1つしかSQLが書けない以上、2つ以上Memoryエンジンのテーブルを作るとお手上げ。
(そんなに作るなって話は棚に上げて)



/etc/init.d/mysqlのstart部分にmysql mysql < init.fileて感じでコードするのが良いのかな。。

【2012/06/21追記】
ストアドプロシージャなら利いた。
好きなデータベースにsp_initって作っておいて、--init-fileで指定したSQLにCALL xx.sp_init;
ただ、このプロシージャが流れ終わるまでの間接続できないのかどうかはまだ調べてない。

調べてみた。

120621 15:59:17 [Note] Server hostname (bind-address): '0.0.0.0'; port: 3306
120621 15:59:17 [Note]   - '0.0.0.0' resolves to '0.0.0.0';
120621 15:59:17 [Note] Server socket created on IP: '0.0.0.0'.
120621 15:59:17 [Warning] Neither --relay-log nor --relay-log-index were used; so replication may break when this MySQL server acts as a slave and has his hostname changed!! Please use '--relay-log=cent01-relay-bin' to avoid this problem.
120621 15:59:17 [Note] Event Scheduler: Loaded 0 events
120621 15:59:22 [Note] /usr/sbin/mysqld: ready for connections.

仕込んだsp_initの中身は、
INSERT INTO t2 VALUES(NOW());
INSERT INTO t1 VALUES(SLEEP(30));
INSERT INTO t2 VALUES(NOW());
t2の中には、15:59:17と15:59:22が記録されてる。
SLEEPはどこかかっ飛ばされたみたいだけど、
--init-fileにSELECT SLEEP(60)でもかっとばされてるっぽいからSLEEPがそもそも上手く利かないか。


sp_initの中身を10億行くらいJOINするSELECT文に変えてみる。


120621 16:11:15 InnoDB: 1.1.8 started; log sequence number 241958172
120621 16:11:15 [Note] Server hostname (bind-address): '0.0.0.0'; port: 3306
120621 16:11:15 [Note]   - '0.0.0.0' resolves to '0.0.0.0';
120621 16:11:15 [Note] Server socket created on IP: '0.0.0.0'.
120621 16:11:15 [Warning] Neither --relay-log nor --relay-log-index were used; so replication may break when this MySQL server acts as a slave and has his hostname changed!! Please use '--relay-log=cent01-relay-bin' to avoid this problem.
120621 16:11:15 [Note] Event Scheduler: Loaded 0 events
120621 16:40:13 [Note] /usr/sbin/mysqld: ready for connections.

あー、やっぱり--init-fileが流れ終わるまで接続できないんだね。。
/etc/init.d/mysqlの中に、mysql < init.sqlでコーディングするか。。


日付が変わってから、ストアドプロシージャにはLOAD DATAがコーディングできないことに気が付く。
バッファプールあっためる目的だともうスクリプト一択なのかね。。

0 件のコメント :

コメントを投稿