• mysql5.6レプリケーションでold_passwordが拒否される

    こんにちは。小宮です。

    同僚の湯尾さんから教えてもらった情報を貼っておきます。

    【mysql5.6レプリケーション仕様が変わった話】

    某環境で mysql5.5でフルdumpしたSQLを5.6に流し込む作業を行い、その後差分データを5.5→5.6にレプリケーションしようとしたところ レプリケーションが出来なかったという症状がありました。

    その後、mysql5.6の設定見直しのためstop slaveしてmysqlをrestartしレプリケーション貼り直しと試みましたが 今度は5.6環境同士でもレプリケーションが貼れなくなりました。

    原因はmysql5.6からsecure_authの仕様が変更されたためクライアント([mysql]以下の記述)設定で skip-secure-auth が設定されていても レプリケーションIOの時点でold_password(16桁パスワード)が拒否されるためレプリケーション自体開始できないとのことです。 ステータス(show slave status\G)では下記の様になります。

    -------------------------------
    ・・・
    Slave_IO_Running: Connecting
    Slave_SQL_Running: Yes
    ・・・
    Last_IO_Errno: 2049
    Last_IO_Error: error connecting to master 'repl@172.17.xx.xx:3306' - retry-time: 60  retries: 1
    Last_SQL_Errno: 0
    Last_SQL_Error: 
    ・・・
    -------------------------------
    

    解決策として、お客様の許可を得て、mysql5.5、5.6環境の両方に新たにセキュアなレプリケーション用アカウントを作成して、それでレプリケーション貼りました。 セキュア(old_passwordではない)なパスの作り方は下記の通り。

    -------------------------------
    set session old_passwords = 0;
    GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'newrepuser'@'172.17.xxx.%' IDENTIFIED BY 'xxxxxxxxxxxxxx';
    -------------------------------
    

    mysql5.6にデータ移設したいなど相談を受けた場合は、パスワードの桁数にご注意下さい。という話です。

    ...
  • mysqlのreplication関連リンクまとめ

    mysqlのreplication関連情報まとめ

    こんにちは。小宮です。
    なんだかmysqlのことを聞かれることが多い今日この頃なので、
    聞かれたときコピペできるように聞かれがちなことが説明されてるリンクをまとめる試みです。
    この記事だけ読んでも大したことはわかりませんのであしからずご了承ください。
    (自分がすっかり忘れたときにも役立ちそうです。)

    ・基本
    現場指向のレプリケーション詳説
    漢(オトコ)のコンピュータ道: MySQLレプリケーションを安全に利用するための10のテクニック
    Art of MySQL Replication.
    バイナリログに書かれるのは更新系のクエリです。
    補足すると、I/Oエラーは、物理的にディスクが壊れた、ネットワーク的につながらない、レプリケーション用ユーザのIDとパスワードが間違っている、server_idが重複している
     などの理由で起こることがあります。SQLエラーの主な原因は上記の最初のリンクに書いてありますが主に重複エラーが多い印象です。

    参考までに現在のreplicationまわりの設定値はだいたいこんなかんじです。

    [shell]## replication (master/slave) log-bin=mysql-bin log-bin-index=mysql-bin.index binlog_format=mixed server-id = 133 relay-log=mysqld-relay-bin relay-log-index=mysql-relay-bin.index log_slave_updates=1 replicate-ignore-db=mysql,information_schema,performance_schema binlog-ignore-db=mysql,information_schema,performance_schema skip_slave_start read_only slave_net_timeout=120

    ## replication (for 5.6) gtid-mode = OFF enforce_gtid_consistency=false master-info-repository=TABLE relay-log-info-repository=TABLE relay_log_recovery=ON #sync-master-info=1 slave-parallel-workers=0 binlog-checksum=CRC32 #master-verify-checksum=1 #slave-sql-verify-checksum=1 binlog-rows-query-log_events=1 #log_bin_use_v1_row_events=ON #sync_binlog=1 report-port=3306 report-host = 192.168.1.133[/shell]

    ...