もう一度向き合うmysql(2)〜レプリケーションとか〜
前回の続き。
もう一度向き合うmysql(1) - 恥知らずのウェブエンジニア
引き続き、これをもとに自分用めもを。
- 作者: とみたまさひろ,鶴長鎮一,舘山聖司,遠藤俊裕,坂井恵,班石悦夫,松信嘉範
- 出版社/メーカー: 翔泳社
- 発売日: 2014/03/25
- メディア: Kindle版
- この商品を含むブログ (1件) を見る
レプリケーション
レプリケーションの流れ
- マスター側、更新情報があったらバイナリログを出力
- スレイブ側、マスターに接続して更新あったら、それをリレーログに保存。
- スレーブ側、リレーログに出力した情報をデータベースに保存
※スレーブはどの情報まで複製したかをmaster.infoに保存。
スレーブ再起動後はこのファイルの情報をもとに再開する。
バイナリログの形式
- STATMENT
└更新系のSQL文をそのまま保存
- ROW
└更新された後のレコードデータを保存
ログファイル大きくなりがち、STATMENTより実行が速い
- MIXED
└通常はSTATMENTで、STATMENTでは正確に記録できないクエリの場合はROWで保存
レプリケーションの設定方法
- マスター側:my.cnfに
server-id=数値 log-bin=ファイル名
- スレーブ側:my.cnfに
server-id=数値
※言わずもがなserver-idは重複しないようにん
- データ同期
直接data_dirのデータをコピーするか、
mysqldumpでデータをダンプしてコピー
この時、show master status;でログポジションをメモっておく
- スレーブでマスターを指定する
mysql>CHANGE MASTER TO ->MASTER_HOST='マスターのホスト名、IP' ->MASTER_USER='マスターに接続するユーザ' ->MASTER_PASSWORD='パスワード' ->MASTER_LOG_FILE='バイナリログファイル名' ->MASTER_LOG_POS='レプリケーション開始するポジション'
※mysqldumpを使うときに、
master-dataオプションを指定するとログファイル、ポジションをdumpに含めるので指定する必要はなし
※--master-data=1 //change master文あり。ポジション付き。
--master-data=2 //change master文、ポジションをコメントアウト。デフォルトはこちら
- スレーブ開始、確認
mysql>START SLAVE; mysql>SHOW SLAVE STATUS¥G; ※SLAVE_IO_Running,SLAVE_SQL_RunningがYESになってること確認
※SLAVE_IO_RunningがNOの場合は、マスターからバイナリログを取得できてない状態
※SLAVE_SQL_RunningがNOの場合は、リレーログからのデータ反映に失敗している状態
※スレーブでSQLでエラーになった時、単純にSQLをスキップしたい時は、「SET GLOBAL sql_slave_skip_counter=1;」