2013年1月4日金曜日

slave(別サーバー環境)の再設定、追加(コールドバックアップ)

コールドバックアップ(オフラインバックアップ)を試してみました。
MySQLを停止し、データディレクトリを丸々コピーして、別環境にコピーして再開する方法になります。
ダンプファイルなどを利用したオンラインバックアップよりか比較的早く設定しなおせるが、
MySQLを停止しなければいけないデメリットがあります。
オンラインバックアップの手順は以前の記事を参考してください。

今回は、Aというレンタルサーバーで構築されているレプリケーション環境のslave(以降slave-A)からコールドバックアップを行い、
Bというレンタルサーバーで構築されていたレプリケーション環境のslave(以降slave-B)に対してへ
slave-Aのコールドバックアップを適用して、Aというレンタルサーバーのレプリケーション用のslaveの再設定を行いました。

まずは、Aサーバーのslave-Aでコールドバックアップを行います。

■手順0
今回はslave-Aとslave-Bは別々の環境の外部のネットワーク同士のサーバーなので、
slave-Aのmasterに、slave-Bが同期用に接続できるようなアカウントを追加してあげる必要がありました。
slave-Aとslave-Bが同じローカルネットワーク同士であったり、
接続アカウントのホストの制限が無いのであれば、
特にmasterに新たなレプリケーションユーザーを作る必要ありません

slave-Aのmasterへslave-Bが接続できるようにレプリケーションユーザーを追加する。
slave-Bはslave-Aのコールドバックアップを行うため、ユーザー情報なども引き継がれるために、
基本的には、既存のレプリケーションユーザーに許可するホスト名を追加するだけになる。
#レプリケーションユーザーの追加
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'レプリケーションユーザー名'@'slave-BのIPアドレス' IDENTIFIED BY 'レプリケーションユーザーのパスワード';

#設定を反映させる
FLUSH PRIVILEGES;


■手順1
slave-AのMySQLの停止を行う。
#MySQLにログインして、slaveの同期を停止します。
mysql> stop slave;
Query OK, 0 rows affected (0.15 sec)

#mysqlの停止
# /etc/init.d/mysqld stop
Stopping mysqld:                                           [  OK  ]

#プロセスの確認
# ps aux|grep msyql
root      5232  0.0  0.0 103148   832 pts/0    S+   11:56   0:00 grep msyql

■手順2
コールドバックアップ用の作業用ディレクトリを作成して、データディレクトリをコピーする
#作業用のディレクトリ作成
# mkdir -p /data/tmp/cold-backup
# chmod 777 /data/tmp/cold-backup

#コピー開始
date
Thu Dec 27 12:00:15 JST 2012

#-p オーナー、グループ、パーミッション、タイムスタンプを保持したまま
#-r 再帰的に
#-f コピー先に同名ファイルがあっても上書き
#/var/lib/mysqlの中身をコピー。/data/tmp/cold-backup/にmysqlというディレクトリが作られてコピーされる。
cp -prf /var/lib/mysql/ /data/tmp/cold-backup/

#コピー終了
date
Thu Dec 27 13:10:51 JST 2012

■手順3
コピーが完了したらslave再開する。
#slaveの起動
/etc/init.d/mysqld start

#同期開始
mysql> start slave;

■手順4
コールドバックアップしたファイルを圧縮し、slave-Bへ転送する
#/data/tmp/cold-backup/mysqlを圧縮する
tar czf /data/tmp/cold-backup.`date +%Y%m%d_%H%M%S`.tar.gz /data/tmp/cold-backup/mysql/

#slave-Bへ転送
$ scp /data/tmp/cold-backup.20121227_131636.tar.gz 新しいslaveサーバーの接続アカウント名@新しいslaveサーバーIPアドレス:/tmp/cold-backup.20121227_131636.tar.gz
cold-backup.20121227_131636.tar.gz                                                                                                                                                                          100% 3432MB   4.6MB/s   12:23

ここからは、slave-B側での作業になります

■手順5
slave-Bに転送されてきたコールドバックアップを解凍して、既存環境にあるslave-Bのデータディレクトリの中身を退避させておく。
#
mkdir -p /tmp/mysql/cold-backup
#
chmod 777 /tmp/mysql/cold-backup

#転送したファイルをslave-Bで解凍する。
tar xvzf /tmp/cold-backup.20121228_180746.tar.gz -C /tmp/mysql/cold-backup/

■手順6
slave-BのMySQLを停止させ、既存のデータディレクトリを退避させておく
#停止
/etc/init.d/mysqld stop

#slave-Bのmysqlが起動していないことの確認
# ps aux|grep mysql
root     18195  0.0  0.0 103240   868 pts/0    D+   18:29   0:00 grep mysql

#コピー先のディレクトリ作成
mkdir -p /data/tmp/mysql/


#念のために新しいmysqlのデータディレクトリを退避させておく
cp -prf /var/lib/mysql/* /data/tmp/mysql/


#mysqlのデータディレクトリの中身を削除
rm -rf  /var/lib/mysql/*

■手順7
手順5で解凍したコールドバックアップファイルをデータディレクトリへコピーする。
#解凍したデータをmysqlのデータディレクトリに丸ごとコピーする
cp -prf /tmp/mysql/cold-backup/data/tmp/cold-backup/mysql/* /var/lib/mysql/
■手順8
slave-BのMySQLの起動を行ってみる。
#slaveの追加の場合にはmy.cnfのserver-idを変更する
vi /etc/my.cnf
#master,slave内でユニークなIDにする
server-id = 999
#masterでSHOW SLAVE HOSTSコマンドを実行したときにスレーブの一覧が見れるように。
#master,slave内でユニークなIDにする
report_host = slave999

#MySQL起動する
/etc/init.d/mysqld start
mysqld を起動中:                                           [失敗]
エラーガ━━(;゚Д゚)━━ン!!
エラーログを確認してみる。
view /var/lib/mysql/mysql-error.log
InnoDB: Error: log file ./ib_logfile0 is of different size 0 268435456 bytes
InnoDB: than specified in the .cnf file 0 5242880 bytes!
121227 19:34:47 [ERROR] Plugin 'InnoDB' init function returned error.
121227 19:34:47 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
121227 19:34:47 [ERROR] Unknown/unsupported storage engine: InnoDB
121227 19:34:47 [ERROR] Aborting

121227 19:34:47 [Note] unregister_replicator OK
121227 19:34:47 [Note] /usr/libexec/mysqld: Shutdown complete

121227 19:34:47 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
Error: log file ./ib_logfile0 is of different size 0 268435456 bytes
とのことなので、slave-Aとslave-Bのmy.cnfの
innodb_log_file_sizeを見てみると、サイズが違っていたせいで、
logfileの初期化に失敗している?ためエラーが発生してる感じでした。

innodb_log_file_sizeのサイズをバックアップ元と同じサイズに指定後に、
再起動を行ってみると、無事に起動が行えました( ´∀`)bグッ!

■手順9
起動した、MySQLにログインしてslave-Bの状態を確認する。
Master_Hostが、slave-Aの環境でのmasterへの接続IPアドレスになっている。
slave-Aの環境ではローカルIPアドレスで接続をしていたために、
slave-Bの環境ではそのままでは接続できないため、
slave-AのmasterのグローバルIPアドレスを指定してあげる必要がある

#コールドバックアップから再設定した直後の状態
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State:
                  Master_Host: slave-AのmasterのIPアドレスが入ってる(今回はローカルIPアドレス)
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 10
              Master_Log_File: mysql-bin.000714
          Read_Master_Log_Pos: 3752556
               Relay_Log_File: mysqld-relay-bin.000448
                Relay_Log_Pos: 3752702
        Relay_Master_Log_File: mysql-bin.000714
             Slave_IO_Running: No
            Slave_SQL_Running: No
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 3752556
              Relay_Log_Space: 3753028
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 0
1 row in set (0.00 sec)

再設定した直後の状態のslave statusを見て、CHANGE MASTER TOの各パラメーターを設定すれば良いが、MySQLを起動した時にバイナリーログなどが自動でローテーションされてしまっているので、
リレーログの最新は「mysqld-relay-bin.000449」となり、
バイナリーログの最新は「mysql-bin.000321」となってしまっている。
MySQLを起動した時にバイナリーログなどが自動でローテーションされてしまう。

#バックアップから持ってきた状態(slave-Bの起動前)
# ls -alt /var/lib/mysql/|grep bin
-rw-rw----  1 mysql mysql        126 12月 28 16:40 2012 mysql-bin.000320
-rw-rw----  1 mysql mysql    3752721 12月 28 16:40 2012 mysqld-relay-bin.000448
-rw-rw----  1 mysql mysql        200 12月 28 04:12 2012 mysqld-relay-bin.000447
-rw-rw----  1 mysql mysql         78 12月 28 04:12 2012 mysqld-relay-bin.index
-rw-rw----  1 mysql mysql        150 12月 28 03:49 2012 mysql-bin.000318
-rw-rw----  1 mysql mysql        150 12月 28 03:49 2012 mysql-bin.000319
-rw-rw----  1 mysql mysql        228 12月 28 03:49 2012 mysql-bin.index
-rw-rw----  1 mysql mysql        150 12月 28 03:49 2012 mysql-bin.000317
-rw-rw----  1 mysql mysql        126 12月 27 11:56 2012 mysql-bin.000316
-rw-rw----  1 mysql mysql        150 12月 27 03:14 2012 mysql-bin.000315
-rw-rw----  1 mysql mysql        150 12月 27 03:14 2012 mysql-bin.000314
-rw-rw----  1 mysql mysql        150 12月 27 03:14 2012 mysql-bin.000313
-rw-rw----  1 mysql mysql        150 12月 26 03:32 2012 mysql-bin.000311
-rw-rw----  1 mysql mysql        150 12月 26 03:32 2012 mysql-bin.000312
-rw-rw----  1 mysql mysql        150 12月 26 03:32 2012 mysql-bin.000310
-rw-rw----  1 mysql mysql        126 12月 25 20:14 2012 mysql-bin.000309
-rw-rw----  1 mysql mysql        126  4月 16 18:07 2012 mysql-relay-bin.000001
-rw-rw----  1 mysql mysql         38  4月 16 18:07 2012 mysql-relay-bin.index

#slave-Bの起動後にバイナリーログなどを確認する
# ls -alt /var/lib/mysql/|grep bin
-rw-rw----  1 mysql mysql        107 12月 28 19:18 2012 mysqld-relay-bin.000449
-rw-rw----  1 mysql mysql        104 12月 28 19:18 2012 mysqld-relay-bin.index
-rw-rw----  1 mysql mysql        107 12月 28 19:18 2012 mysql-bin.000321
-rw-rw----  1 mysql mysql        247 12月 28 19:18 2012 mysql-bin.index
-rw-rw----  1 mysql mysql        126 12月 28 16:40 2012 mysql-bin.000320
-rw-rw----  1 mysql mysql    3752721 12月 28 16:40 2012 mysqld-relay-bin.000448
-rw-rw----  1 mysql mysql        200 12月 28 04:12 2012 mysqld-relay-bin.000447
-rw-rw----  1 mysql mysql        150 12月 28 03:49 2012 mysql-bin.000318
-rw-rw----  1 mysql mysql        150 12月 28 03:49 2012 mysql-bin.000319
-rw-rw----  1 mysql mysql        150 12月 28 03:49 2012 mysql-bin.000317
-rw-rw----  1 mysql mysql        126 12月 27 11:56 2012 mysql-bin.000316
-rw-rw----  1 mysql mysql        150 12月 27 03:14 2012 mysql-bin.000315
-rw-rw----  1 mysql mysql        150 12月 27 03:14 2012 mysql-bin.000314
-rw-rw----  1 mysql mysql        150 12月 27 03:14 2012 mysql-bin.000313
-rw-rw----  1 mysql mysql        150 12月 26 03:32 2012 mysql-bin.000311
-rw-rw----  1 mysql mysql        150 12月 26 03:32 2012 mysql-bin.000312
-rw-rw----  1 mysql mysql        150 12月 26 03:32 2012 mysql-bin.000310
-rw-rw----  1 mysql mysql        126 12月 25 20:14 2012 mysql-bin.000309
-rw-rw----  1 mysql mysql        126  4月 16 18:07 2012 mysql-relay-bin.000001
-rw-rw----  1 mysql mysql         38  4月 16 18:07 2012 mysql-relay-bin.index

そのため、単純にslave statusの状態を見て、CHANGE MASTER TOを設定すると、次のようになるが、
エラーになってしまって実行できない。
#slave statusの状態をそのまま利用して実行。
CHANGE MASTER TO
MASTER_HOST='外部サーバーから接続のためローカルIPアドレスからグローバルIPアドレスに変更したslave-AのmasterのIPアドレス',
MASTER_USER='レプリケーション用の接続アカウント名',
MASTER_PASSWORD='レプリケーション用の接続アカウントのパスワード',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000714',
MASTER_LOG_POS=3752556,
MASTER_CONNECT_RETRY=10,
RELAY_LOG_FILE = 'mysqld-relay-bin.000448',
RELAY_LOG_POS = 3752702;
#
ERROR 1380 (HY000): Failed initializing relay log position: Could not find target log during relay log initialization
そこで、MySQLが起動してローテーションされた「mysqld-relay-bin.000449」を利用する。
#mysqld-relay-bin.000449のend_log_posを調べる。
# mysqlbinlog --no-defaults /var/lib/mysql/mysqld-relay-bin.000449
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#121228 19:45:35 server id 30  end_log_pos 107  Start: binlog v 4, server v 5.5.28-log created 121228 19:45:35
BINLOG '
T3jdUA8eAAAAZwAAAGsAAAAAAAQANS41LjI4LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAA==
'/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;


#一応mysqld-relay-bin.000448も見てみる。
# mysqlbinlog --no-defaults /var/lib/mysql/mysqld-relay-bin.000448 |tail -n 20
SET INSERT_ID=7286/*!*/;
# at 3751952
#121228 16:36:41 server id 1  end_log_pos 3752289       Query   thread_id=226282        exec_time=0     error_code=0
SET TIMESTAMP=1356680201/*!*/;
INSERT INTO `user_login` (`user_id`, `user_crypt_id`, `ip_address`, `host`, `referer`, `agent`, `uid`, `insert_date`, `update_date`) VALUES ('89', '***', '***.***.**.***', '', '', 'Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20100101 Firefox/17.0', '', '2012/12/28 16:36:41', '2012/12/28 16:36:41')
/*!*/;
# at 3752435
#121228 16:36:41 server id 1  end_log_pos 3752529       Query   thread_id=226282        exec_time=0     error_code=0
SET TIMESTAMP=1356680201/*!*/;
UPDATE `user_total_info` SET `login_date` = '2012-12-28 16:36:41', `update_date` = '2012/12/28 16:36:41' WHERE (user_crypt_id = '***')
/*!*/;
# at 3752675
#121228 16:36:41 server id 1  end_log_pos 3752556       Xid = 9608742
COMMIT/*!*/;
# at 3752702
#121228 16:40:09 server id 2  end_log_pos 3752721       Stop
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;



RELAY_LOG_FILEに、mysqld-relay-bin.000449を設定して、
RELAY_LOG_POSに、上記で調べたend_log_posの107を設定する。

CHANGE MASTER TOを再度実行してみる。
CHANGE MASTER TO
MASTER_HOST='外部サーバーから接続のためローカルIPアドレスからグローバルIPアドレスに変更したslave-AのmasterのIPアドレス',
MASTER_USER='レプリケーション用の接続アカウント名',
MASTER_PASSWORD='レプリケーション用の接続アカウントのパスワード',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000714',
MASTER_LOG_POS=3752556,
MASTER_CONNECT_RETRY=10,
RELAY_LOG_FILE = 'mysqld-relay-bin.000449',
RELAY_LOG_POS = 107;
Query OK, 0 rows affected (0.00 sec)
キタ――(゚∀゚)――!!
一応、リレーログなどを確認する。
CHANGE MASTER TOが変に設定されると、mysqld-relay-binの連番が000001から始まったりする? その際には、コールドバックアップで持ってきたリレーログなどが消えてしまう?
# ls -alt /var/lib/mysql/|grep bin
-rw-rw----  1 mysql mysql        107 12月 28 19:45 2012 mysqld-relay-bin.000449
-rw-rw----  1 mysql mysql        104 12月 28 19:45 2012 mysqld-relay-bin.index
-rw-rw----  1 mysql mysql        107 12月 28 19:45 2012 mysql-bin.000321
-rw-rw----  1 mysql mysql        247 12月 28 19:45 2012 mysql-bin.index
-rw-rw----  1 mysql mysql        126 12月 28 16:40 2012 mysql-bin.000320
-rw-rw----  1 mysql mysql    3752721 12月 28 16:40 2012 mysqld-relay-bin.000448
-rw-rw----  1 mysql mysql        200 12月 28 04:12 2012 mysqld-relay-bin.000447
-rw-rw----  1 mysql mysql        150 12月 28 03:49 2012 mysql-bin.000318
-rw-rw----  1 mysql mysql        150 12月 28 03:49 2012 mysql-bin.000319
-rw-rw----  1 mysql mysql        150 12月 28 03:49 2012 mysql-bin.000317
-rw-rw----  1 mysql mysql        126 12月 27 11:56 2012 mysql-bin.000316
-rw-rw----  1 mysql mysql        150 12月 27 03:14 2012 mysql-bin.000315
-rw-rw----  1 mysql mysql        150 12月 27 03:14 2012 mysql-bin.000314
-rw-rw----  1 mysql mysql        150 12月 27 03:14 2012 mysql-bin.000313
-rw-rw----  1 mysql mysql        150 12月 26 03:32 2012 mysql-bin.000311
-rw-rw----  1 mysql mysql        150 12月 26 03:32 2012 mysql-bin.000312
-rw-rw----  1 mysql mysql        150 12月 26 03:32 2012 mysql-bin.000310
-rw-rw----  1 mysql mysql        126 12月 25 20:14 2012 mysql-bin.000309
-rw-rw----  1 mysql mysql        126  4月 16 18:07 2012 mysql-relay-bin.000001
-rw-rw----  1 mysql mysql         38  4月 16 18:07 2012 mysql-relay-bin.index

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State:
                  Master_Host: 外部サーバーから接続のためローカルIPアドレスからグローバルIPアドレスに変更したslave-AのmasterのIPアドレス
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 10
              Master_Log_File: mysql-bin.000714
          Read_Master_Log_Pos: 3752556
               Relay_Log_File: mysqld-relay-bin.000449
                Relay_Log_Pos: 107
        Relay_Master_Log_File: mysql-bin.000714
             Slave_IO_Running: No
            Slave_SQL_Running: No
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 3752556
              Relay_Log_Space: 3753028
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 0
1 row in set (0.00 sec)

後は、start slaveを実行するだけですド━━━━m9(゚∀゚)━━━━ン!!
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: 外部サーバーから接続のためローカルIPアドレスからグローバルIPアドレスに変更したslave-AのmasterのIPアドレス
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 10
              Master_Log_File: mysql-bin.000714
          Read_Master_Log_Pos: 5001245
               Relay_Log_File: mysqld-relay-bin.000450
                Relay_Log_Pos: 327899
        Relay_Master_Log_File: mysql-bin.000714
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 4080202
              Relay_Log_Space: 5002020
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 8510
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1
1 row in set (0.00 sec)
完了(`・ω・´)ゞビシッ!!

■疑問点
slave-Bを起動したときにリレーログがローテーションされてしまい、
コールドバックアップ時のリレーログが使えないとなると、
仮に、slave-AのSQLスレッドの遅延が発生していて、 コールドバックアップ時にslave-Aのデータとして実行されていなかったSQLが
リレーログに残っていた場合にはそのSQLはどうなるのか・・・?

Master_Log_FileとRelay_Master_Log_Fileが同じ名前で、
Read_Master_Log_Posと、Exec_Master_Log_Posが同じ数値であれば、
masterと同期されているはずなので、その心配もなさそうだけど・・・。

それと、slave-Aを停止する際にSET GLOBAL innodb_fast_shutdown=0;を利用して
テーブルスペースに反映されていないデータが残っているものを
反映させてからシャットダウンするようにした方が良いのかな?

今回のようにコールドバックアップを別環境にあるサーバーに適用して、
CHANGE MASTER TOを実行する必要が無い場合には、問題なさそうですけど(゚д゚)(。_。)(゚д゚)(。_。) ウンウン
誰か教えてください(´;ω;`)ブワッ


■注意点
・その1
今回slave-Aのバックアップファイルをslave-Bに持っていって、
slave-Bで再設定を行った際に、slave-Aとslave-Bのmy.cnfのログ関係の設定が違うことで、
エラーが発生していました・・・orz
slave-Aのmy.cnfの次の項目は確認し、slave-Bは同じ値にしてあげること。
同じにしておかないと起動に失敗などしてしまう:(;゙゚'ω゚'):

#slave-Aのログファイルのサイズと一致していないと、起動に失敗するの同じ値にする。
innodb_log_file_size

#slave-Aのリレーログのファイル名と一致しないと、適切なリレーログが使われないので同じにする。
relay_log=mysql-relay-bin
relay-log-index=mysql-relay-bin

#バイナリーログも
log-bin=mysql-bin

他にもログ関係だと次のものがあるので利用している場合にはあわせておいた方が良いかも?
#一般ログ
general-log = ON
general-log-file = /var/log/mysql/mysql.log

#スローログ
slow-query-log = ON
slow-query-log-file = /var/log/mysql/mysql-slow.log

#エラーログ
log-error = mysql-error.log

■ ・その2
CHANGE MASTER TO MASTER_HOST='***.***.***.**';だけで実行すると リレーログが初期化されてしまう?「mysqld-relay-bin.000001」になる?
-----------------
reset slave;を実行するとmysqld-relay-binが全て消されて、初期化されるっぽい。
w-rw----  1 mysql mysql        126 12月 28 21:02 2012 mysqld-relay-bin.000001
-rw-rw----  1 mysql mysql         26 12月 28 21:02 2012 mysqld-relay-bin.index

・その3
再現が出来なかったのですが、
slave-Bを起動したときにCHANGE MASTER TOがエラーになってしまうときの話。

MySQLは再起動を行うとログのローテーションを実行するらしく、
コールドバックアップをコピーしたslave-Bを起動したときに、同じログローテーションが実行されます。
その際に、slave-Bのmy.cnfの設定では、relay-logとrelay-log-indexの設定がされていなかったために、
デフォルトの「mysql-relay-bin」が使われてしまい、
コールドバックアップのデータの中にはmysql-relay-binの名前がつくファイルが無いため?
「mysql-relay-bin」という名前のファイルで新規で1番からのファイルを作り直してるっぽい感じでした。
そのせいで、CHANGE MASTER TOでエラーになっていた・・・?
リレーログファイル名の確認と一緒に、バイナリーログの名前も一致してるか確認しておいた方が良いかも?

エラー内容を消してしまったのでこれであってるかわかりませんが、
こんなようなエラーが出ていたと思われます(´;ω;`)ウッ…
ERROR 1380 (HY000): Failed initializing relay log position: Could not find target log during relay log initialization

#もしくはこんな感じの
ERROR 1201 (HY000): Could not initialize master info structure; more error messages can be found in the MySQL error log
解決方法をぐぐってみると、master.infoとrelay-log全部けしてchange master toとか書かれていることが多い感じでした。

参考URL

0 件のコメント:

コメントを投稿