MYSQL

Statement is unsafe because it uses a system function that may return a different value on the slave

  • Statement is unsafe because it uses a system function that may return a different value on the slave
  • [Warning] Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. INSERT... ON DUPLICATE KEY UPDATE on a table with more than one UNIQUE KEY is unsafe Statement: <statement>
  • バイナリログのフォーマット的に,ステートメントのロギングをしてしまっていてwarningが出るやつ.
  • SELECT @@binlog_format; をしてみると今のロギングフォーマットがわかる.
  • select variable_value as "BINARY LOG FORMAT (binlog_format) :: " from information_schema.global_variables where variable_name='binlog_format';でも可.
  • loggin format は下記の3種類
    • RAW: ステートメントの実行結果をbinary logとして保存
    • STATEMENT: ステートメント自体をbinary logとして保存
    • MIXED: 危険なステートメントをRAWとして,そのほかはステートメントをbinary logとして保存
  • 危険なステートメント,とは,sys_date() 的な関数がステートメントに入っているやつ.
  • レプリケーションを設定していると,master/slaveで実行結果が異なる可能性があるのでwarningが出るようだ.
  • warningを止める策の1つとして,binary log format をmixed もしくはraw にしてしまうという手がありそう.(my.cnfbinlog_format 行を書き換える)
  • MySQL :: MySQL 5.6 Reference Manual :: 17.1.2.3 Determination of Safe and Unsafe Statements in Binary Logging
  • 日々の覚書: MySQLのNOW関数はどのようにして安全にスレーブでリプレイされるのか

binary log

  • ログがdiskを逼迫したとき.

    mysql> SHOW MASTER STATUS\g;
    +------------------+----------+--------------+------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +------------------+----------+--------------+------------------+
    | mysql-bin.000020 | 85145715 |              |                  |
    +------------------+----------+--------------+------------------+
    1 row in set (0.00 sec)
    

    この場合mysql-bin.000020より前のものは消しても問題なさそう.

    • 一番古いログのpositionを探す

      • ls -ltr /data/mysql/mysql-bin* | head -100
    • purgeする.(mysql-bin.000020以前すべて)

      mysql> PURGE MASTER LOGS TO 'mysql-bin.000020';
      Query OK, 0 rows affected (0.02 sec)
      
      • PURGE MASTER LOGS BEFORE '2014-06-25 22:46:26'; などと日時以前指定もできる.
    • 一気に大容量のfileをpurgeするとdbパフォーマンスに影響する可能性があるので注意のこと.

    • my.cnfとかでexpire_logs_days=3などと指定すると,再起動もしくはbinary logのrotate時にauto purgeされる.