MySQL メモ

レプリケーションの作り方

マスターを動作させながら、レプリカの作成ができる。 ただし、一時的に更新クエリが使えなくなる。 MyISAM のみ可能、InnoDB を使っているときは、ダンプを使うこと

  1. マスターサーバにレプリケーション用ユーザを作る
  2. マスターに server-id を付け、binlog を記録するように設定(debian ならデフォルトで付いてるので気にしなくて良い)
    server-id               = 1
    log-bin                 = /var/log/mysql/mysql-bin.log
    
  3. スレーブの /etc/my.cnf を変更する(そして MySQL は止めておく)
    server-id               = 11
    report-host             = hogehoge-slave-server
    #master-host=mymaster
    #master-user=repl
    #master-password=mypassword
    
    • server-id を設定して、log-bin をが設定されていればコメントアウト
    • report-host を付けておくとサーバ側で show slave hostsをしたときわかりやすい
    • マスターになるホストの設定をコメントアウトして載せておく
  4. rsync で /var/lib/mysql をスレーブに仮コピー
    • rsync -avHS /var/lib/mysql/ slave:/var/lib/mysql/
  5. マスターの MySQL に接続して「FLUSH TABLES WITH READ LOCK;
    • ここから更新クエリ使用不可
    • MySQL の接続を切るとロックが解除されるのでこのままにしておく
  6. もう一度 4. の rsync を行う
  7. 5. でロックした端末で「SHOW MASTER STATUS;」して、出てきたものをすべて記録
  8. UNLOCK TABLES;」でロックを解除
    • ここから更新クエリ使用可

コピーするための二つの方法

  1. dump して restore
    • dump するときに、ログの何番目からの出力か記録させることができ、あまり考えずスタートできる
    • dump を一気にコピーしないといけないので、転送に時間がかかる
  2. ファイルをそのままコピー

特定のテーブルだけレプリケーション

  • データを持ってくるときに、特定のだけダンプする
    • FLUSH TABLES WITH READ LOCK;
    • % mysqldump --default-character-set=binary --lock-all-tables --databases db1 db2 db3 ... > all.sql
    • SHOW MASTER STATUS;
  • my.cnf で除く DB の設定(「_」と「%」は「\」でエスケープする)
    replicate-wild-ignore-table = mysql.%
    replicate-wild-ignore-table = not\_repl.%
    
  • ほかはだいたい同じ

レプリケーション参考文献