MySQLBackUp

更新日2009-07-29 (水) 12:47:25

レプリケーションを利用したバックアップ

マスターでの更新情報をバイナリログとしてスレーブに転送、これをSQLに変換しスレーブで実行しデータ同期を行うようだ。バイナリログは逐次スレーブ側に転送される?

BackUpをとるには同じDBを作製しておく必要がある。
DBさえあればテーブル作製、フィールド更新などはレプリケーションしてくれる。

マスター

/etc/my.cnf

[mysqld]

## REPLICATION MASTER SETTING

## user = mysql
server-id = 1
log-bin
character-set-server = utf8

設定内容
SLAVE IP :10.1.4.142
User :repl

mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'10.1.4.142' IDENTIFIED BY '*****';

現在のバイナリログの状態を確認

マスタのバイナリログのどの時点からレプリケートを開始すればよいかスレーブにはわからないからないので、場所を決定するに必要となる。この場所がFileとPosition。

(Master側でDBをLock) <=変更が多くないときは不要かもでも安全のため

mysql> FLUSH TABLES WITH READ LOCK;

logファイルと、logポジションを表示

 mysql> SHOW MASTER STATUS;   <=(1)
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000024 |       98 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.01 sec)

DBをBackUpしてスレーブ側にコピーしてからUnLock

mysql> UNLOCK TABLES;

スレーブ

/etc/my.cnf

[mysqld]

## REPLICATION SLAVE SETTING

server-id = 2
character-set-server = utf8
read-only   <=アプリケーションからの変更禁止

以下のCHANGE MASTER TO と STOP/START SLAVE;はDBを追加するごとに必要

一度CHANGE MASTER TO は実行すればOK

mysql> CHANGE MASTER TO 
    -> MASTER_HOST='10.99.99.202', 
    -> MASTER_PORT=3306,   <=''は不要
    -> MASTER_USER='repl', 
    -> MASTER_PASSWORD='*******', 
    -> MASTER_LOG_FILE='mysql-bin.000024', <=MASTER側で表示したSTATUSの結果を記入
    -> MASTER_LOG_POS=98;  <=MASTER側で表示したSTATUSの結果を記入。''は不要

Query OK, 0 rows affected (0.04 sec)
/etc/my.cnf に設定してもOKのようだがMASTER_LOG_FILEやMASTER_LOG_POSは逐次変更するのかな?
[mysqld]
server-id=2
master-host=マスターサーバのアドレス
master-user=repl
master-password=パスワード
master-port=3306

スレーブの起動

mysql> START SLAVE;
Query OK, 0 rows affected (0.01 sec)

スレーブの状態の表示

mysql> show slave status\G;

*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 10.99.99.202
                Master_User: repl
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.000024
        Read_Master_Log_Pos: 98
              Relay_Log_File: localhost-relay-bin.000002
              Relay_Log_Pos: 235
      Relay_Master_Log_File: mysql-bin.000024
           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: 98
            Relay_Log_Space: 235
            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: 0
1 row in set (0.00 sec)

ERROR:
No query specified
項目名                 内容 
Master_Host            マスタのホスト名。 
Master_User            マスタへの接続に使用するユーザ名。 
Master_Port            マスタのポート番号。 
Connect_retry          マスタと接続できなかった場合に、スレーブが再接続を試みるまでの待機秒数。 
Master_Log_File        スレーブのI/Oスレッドが現在処理中のマスタのバイナリログファイル名。 
Read_Master_Log_Pos    I/Oスレッドが読み込んだマスタのバイナリログの位置。 
Relay_Log_File         スレーブのSQLスレッドが現在処理中のスレーブのリレーログファイル名。 
Relay_Log_Pos SQL      スレッドが実行完了したスレーブのリレーログの位置。 
Relay_Master_Log_File  SQLスレッドが最後に実行したクエリが記録されていたマスタのバイナリログファイル名。 
Slave_IO_Running I/O   スレッドが稼働中かどうか。 
Slave_SQL_Running SQL  スレッドが稼働中かどうか。 
Replicate_do_db        レプリケートするように指定されているデータベース名。 
Replicate_ignore_db    レプリケートしないように指定されているデータベース名。 
Last_errno             最後に実行したクエリのエラー番号。『0』ならば成功。 
Last_error             最後に実行したクエリのエラーメッセージなど。空文字はエラーがないことを示す。 
Skip_counter           最後にSQL_SLAVE_SKIP_COUNTERを使用したときの値。使用していなければ『0』になる。 
Exec_master_log_pos    SQLスレッドが最後に実行したクエリの、マスタのバイナリログでの位置。 
Relay_log_space        存在するリレーログファイルのサイズ。単位はバイト。 

スレーブの停止

mysql> STOP SLAVE;
Query OK, 0 rows affected (0.01 sec)

CHANGE MASTER TO を実行すると以下のファイルができるので、その情報でその後再起動は問題なく動作する。

# less /var/lib/mysql/master.info
14
mysql-bin.000024
98
10.99.99.202
repl
******
3306
60
0
# less /var/lib/mysql/relay-log.info
./localhost-relay-bin.000002
235
mysql-bin.000024
98

その他の指定

レプリケーションを作製するDBやテーブルの指定
Slaveのmy.cnfに指定

[mysqld]

replicate-do-db対象となるデータベース名
replicate-ignore-db対象外となるデータベース名
replicate-do-table対象となるテーブル名指定方法:データベース名.テーブル名
replicate-ignore-table対象外となるテーブル名指定方法:データベース名.テーブル名

複数あるときは
replicate-do-db = db1
replicate-do-db = db2

のように併記する。

メンテナンス

サーバ側

MySQLはデータベース単位でバイナリログに記録する/しないの指定ができ、その内容がBinlog_do_db/Binlog_ignore_dbの欄に表示されます。特に指定していない場合は全てのデータベースがバイナリログの対象

mysql> SHOW MASTER STATUS\G
*************************** 1. row ***************************
            File: mysql-bin.000024
        Position: 3683
    Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
項目名            内容 
File              使用中のバイナリログのファイル名。 
Position          使用中のバイナリログの位置情報。 
Binlog_do_db      バイナリログに記録するように指定されているデータベース名。 
Binlog_ignore_db  バイナリログに記録しないように指定されているデータベース名。 

バイナリログファイルも以下のように確認できるが増えるので適当に削除する。このときはスレーブのステータスのRelay_Log_File (スレーブのSQLスレッドが現在処理中のスレーブのリレーログファイル名)を指定しそれ以前を削除。

mysql> SHOW MASTER LOGS;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |     14329 |
| mysql-bin.000002 |       445 |
| mysql-bin.000003 |      3725 |
| mysql-bin.000004 |       656 |
(略)
| mysql-bin.000022 |       253 |
| mysql-bin.000023 |       117 |
| mysql-bin.000024 |      3683 |
+------------------+-----------+
24 rows in set (0.01 sec)

削除

mysql> PURGE MASTER LOGS TO 'mysql-bin.000023';
Query OK, 0 rows affected (0.06 sec)
mysql> SHOW MASTER LOGS;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000023 |       117 |
| mysql-bin.000024 |      3683 |
+------------------+-----------+
2 rows in set (0.01 sec)

動作確認

の値がすべて同じ場合はOK

動作確認2

スレーブ

mysql> SHOW PROCESSLIST;
+----+-------------+-----------+-------+---------+------------+-----------------------------------------------------------------------+------------------+
| Id | User        | Host      | db    | Command | Time       |  State                                                                | Info             |
+----+-------------+-----------+-------+---------+------------+-----------------------------------------------------------------------+------------------+
|  1 | system user |           | NULL  | Connect |       7708 | Waiting for master to send event                                      | NULL             |
|  2 | system user |           | NULL  | Connect | 4284212285 | Has read all relay log; waiting for the slave I/O thread to update it | NULL             |
|  4 | root        | localhost | test2 | Query   |          0 | NULL                                                                  | SHOW PROCESSLIST |
+----+-------------+-----------+-------+---------+------------+-----------------------------------------------------------------------+------------------+
3 rows in set (0.01 sec)

Id 1と2のようなスレッドが二つ動作していること

マスタ

mysql> SHOW PROCESSLIST;
+----+------+------------------+-------+-------------+------+----------------------------------------------------------------+------------------+
| Id | User | Host             | db    | Command     | Time | State                                                          | Info             |
+----+------+------------------+-------+-------------+------+----------------------------------------------------------------+------------------+
| 21 | root | localhost        | test2 | Query       |    0 | NULL                                                           | SHOW PROCESSLIST |
| 23 | repl | 10.1.4.142:56560 | NULL  | Binlog Dump |  666 | Has sent all binlog to slave; waiting for binlog to be updated | NULL             |
+----+------+------------------+-------+-------------+------+----------------------------------------------------------------+------------------+
2 rows in set (0.00 sec)

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS