2012年11月22日木曜日

mysqldumpの--flush-logsオプション

mysqldumpの--flush-logsオプション、mysqldumpを取ると同時にFLUSH LOGSしてくれるので、
バイナリログの管理が便利になったりするあのオプション。

ドキュメントには、
`--master-dataまたは--lock-all-tablesを一緒につけないと、複数データベースをダンプする時に
 各データベースのダンプごとにFLUSH LOGSするよ!'
とか書いてあるんだけど、一向に手元で再現しなかったのでソースを読んでみた。

結論、5.5.21以降(5.6も)では、--flush-logs --single-transactionならFLUSH LOGSは1回だけしか実行されない。
5.5.20以前(5.1も)では、--flush-logs --single-transactionではデータベースごとにFLUSH LOGSされる。



5.5.21以降のclients/mysqldump.cのmain関数の中で、

-------------------------------------------------------



  /*
    Flush logs before starting transaction since
    this causes implicit commit starting mysql-5.5.
  */
  if (opt_lock_all_tables || opt_master_data ||
      (opt_single_transaction && flush_logs) ||
      opt_delete_master_logs)
  {
    if (flush_logs || opt_delete_master_logs)
    {
      if (mysql_refresh(mysql, REFRESH_LOG))
        goto err;
      verbose_msg("-- main : logs flushed successfully!\n");
    }

    /* Not anymore! That would not be sensible. */
    flush_logs= 0;
  }

-------------------------------------------------------






となっているのを発見した。。

5.5.20の同じ部分は、

-------------------------------------------------------

  if (opt_delete_master_logs)
  {
    if (mysql_refresh(mysql, REFRESH_LOG) ||
        get_bin_log_name(mysql, bin_log_name, sizeof(bin_log_name)))
      goto err;
    flush_logs= 0;
  }
  if (opt_lock_all_tables || opt_master_data)
  {
    if (flush_logs && mysql_refresh(mysql, REFRESH_LOG))
      goto err;
    flush_logs= 0; /* not anymore; that would not be sensible */
  }
-------------------------------------------------------

と、ドキュメントどおりの動作。

ドキュメントのバグとして人生初Bugs投稿しました。。ドキがムネムネ。


ネタをくれた@studio3104さん、ありがとうございました(*-人-) 楽しかったです

0 件のコメント :

コメントを投稿