MySQL メモ
レプリケーションの作り方
マスターを動作させながら、レプリカの作成ができる。 ただし、一時的に更新クエリが使えなくなる。 MyISAM のみ可能、InnoDB を使っているときは、ダンプを使うこと。
- マスターサーバにレプリケーション用ユーザを作る
- マスターに server-id を付け、binlog を記録するように設定(debian ならデフォルトで付いてるので気にしなくて良い)
server-id = 1 log-bin = /var/log/mysql/mysql-bin.log
- スレーブの /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をしたときわかりやすい
- マスターになるホストの設定をコメントアウトして載せておく
- rsync で /var/lib/mysql をスレーブに仮コピー
- rsync -avHS /var/lib/mysql/ slave:/var/lib/mysql/
- マスターの MySQL に接続して「FLUSH TABLES WITH READ LOCK;」
- ここから更新クエリ使用不可
- MySQL の接続を切るとロックが解除されるのでこのままにしておく
- もう一度 4. の rsync を行う
- 5. でロックした端末で「SHOW MASTER STATUS;」して、出てきたものをすべて記録
- 「UNLOCK TABLES;」でロックを解除
- ここから更新クエリ使用可
コピーするための二つの方法
- dump して restore
- dump するときに、ログの何番目からの出力か記録させることができ、あまり考えずスタートできる
- dump を一気にコピーしないといけないので、転送に時間がかかる
- ファイルをそのままコピー
特定のテーブルだけレプリケーション
- データを持ってくるときに、特定のだけダンプする
- 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.%
- ほかはだいたい同じ
