--------(--)

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2012-06-10(Sun)

MySQLでレプリケーション時にエラー

MySQLでレプリケーション(Master/Slaveモード)を組んでみたらエラーが発生したので
メモる。

(環境調査)
$ cat /etc/redhat-release
CentOS release 6.2 (Final)

$ mysql -u root -p
mysql> select version();
+------------+
| version() |
+------------+
| 5.5.21-log |
+------------+
1 row in set (0.00 sec)


(Master側)
(1). my.cnf編集
$ vim /etc/my.cnf
[mysqld]
# Replication Master Server (default)
# binary logging is required for replication
log-bin=mysql-bin # バイナリログを取ることを指定
server-id=1 # Master Server識別用ID。Slaveと重複しないように。


(2). Slaveへのアクセス権限を追加。

$ mysql -u root -p
Slaveアクセス用のユーザーを作成し、SLAVE ON権限を与える。
ユーザー: repli
slave server IP: 192.168.11.3
> GRANT REPLICATION SLAVE ON *.* TO repli@192.168.11.3 IDENTIFIED BY 'replipd';


(3). Slaveへコピーするためのデータを圧縮する
圧縮するデータはDB全て。
CentOSへMySQLをインストールした場合、デフォルトで/var/lib/mysqlにDBがあるのでまるまる
コピーする。
# tar実行中に書き込みがないようにロックしておく。
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000014 | 107 | | |
+------------------+----------+--------------+------------------+
ファイルとポジションは覚えておく。

DB tar圧縮してslaveに送る。
$ cd /var/lib
$ tar czvf mysql_20120606.tar.gz mysql/
SCPか何かでslaveへ送る。


# ロック解除
mysql> UNLOCK TABLES;


(Slave側)
Masterから送ってもらったDBのtarを解凍する。
ディレクトリーはmasterと同じ。
$ cd /var/lib
$ tar xzvf mysql_20120606.tar.gz
$ chown -R mysql:mysql mysql/
$ cd mysql
$ pwd
$ /var/lib/mysql


Slave側のmy.cnfにserver-idを設定する。
IDの設定。
$ vim /etc/my.cnf
[mysqld]
# Replication Master Server (default)
# binary logging is required for replication
log-bin=mysql-bin # バイナリログを取ることを指定
server-id=2 # Slave Server識別用ID。

起動
$ /etc/init.d/mysqld start


エラー発生
InnoDB: Error: log file ./ib_logfile0 is of different size 0 67108864 bytes
対応↓
$ rm /var/lib/mysql/ib_logfile*


同期設定
Masterで覚えておいた
ファイルとポジションを書き込む。
$ mysql -u root -p
mysql> CHANGE MASTER TO
-> MASTER_HOST='***.***.***.***',
-> MASTER_USER='repli',
-> MASTER_PASSWORD='replibs',
-> MASTER_LOG_FILE='mysql-bin.000014',
-> MASTER_LOG_POS=107;
Query OK, 0 rows affected (0.00 sec)


Replicationスタート
mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)

状態確認
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.11.2
Master_User: repli
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000014
Read_Master_Log_Pos: 107
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000014
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

Slave_IO_RunningとSlave_SQL_Runningの両方がOKならいいらしい。
ここを見たらだいたいわかりますが
http://dev.mysql.com/doc/refman/5.1/ja/show-slave-status.html
Slave_IO_RunningがNOの場合はMasterとの接続がうまくいってないらしい。IPTableとかの確認ですね。
Slave_SQL_RunningがNOの場合はSQLスレッドに要因があるらしい。

作業中にこんなエラーがでました。
(Error)
ERROR 1198 (HY000): This operation cannot be performed with a running slave; run STOP SLAVE first


(対策)
ぐぐりまくってみるとこんなんがありました。
http://www.techjini.com/blog/2009/11/25/how-to-set-up-mysql-master-slave-replication/
どうやら、MasterとSlaveのログファイルがずれているのでもう一度設定しなおしてみると
いいらしい。
Masterのファイルとポジションをもう一度覚えてSlaveで読みなおしてみる。
$ mysql -u root -p
mysql> STOP SLAVE
mysql> CHANGE MASTER TO
-> MASTER_HOST='****.****.****.****',
-> MASTER_USER='repli',
-> MASTER_PASSWORD='replibs',
-> MASTER_LOG_FILE='mysql-bin.000014',
-> MASTER_LOG_POS=107;
Query OK, 0 rows affected (0.00 sec)
mysql> START SLAVE

これで治りましたー。



関連記事
スポンサーサイト

コメントの投稿

管理者にだけ表示を許可する

コメント

プロフィール

kumagonjp2

Author:kumagonjp2
Python,Django,R,Mongo,MySQL,Struts,Spring,データマイニングなどサーバー関係のメモを残していきます。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
雪が3Dで降るブログパーツ ver2

マウスで見る方向変えられます

検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。