Mysql Replication(轉)

post0發表於2007-08-10
Mysql Replication(轉)[@more@]

類似於從一臺伺服器複製資料庫到另一臺伺服器上,但它是透過定義Master 和Slave的關係去實時地保證兩個資料庫的完全同步,這個功能在Mysql的3.23版中開始出現。

Master/Slave模式備份

TestEnv:

Master:Mysql-4.1.12 on Redhat9.0 IP:192.168. 0.217

Slave: Mysql-4.1.12 on Redhat9.0 IP:192.168.10.244

1、編譯,安裝

1. #tar –zxvf Mysql-4.1.12.tar.gz

2. #cd Mysql-4.1.12

3. .#/configure –prefix=/var/eyou/mysql

4. #make

5. #make install

6. #chown –R root /var/eyou/mysql

7. # chown –R mysql /var/eyou/mysql/var

8. #chgrp –R mysql /var/eyou/mysql

9. #scripts/mysql_install_db

10. #cp support-files/my-medium.cnf /etc/my.cnf

2、Master 機器設定許可權,賦予Slave機器FILE及Replication Slave權利,並打包要同步的資料庫結構。

Master# pwd

/var/eyou/mysql/bin

Master#./mysql –u root –p

Enter password:

Welcome to the MySQL monitor. Commands end with ; or g.

Your MySQL connection id is 2 to server version: 4.1.12

Type 'help;' or 'h' for help. Type 'c' to clear the buffer.

mysql> GRANT FILE ON *.* TO rep@192.168.0.244 IDENTIFIED BY ‘eyou’;

mysql> GRANT REPLICATION SLAVE ON *.* TO rep@192.168.0.244 IDENTIFIED BY ‘eyou’;

賦予192.168.10.244也就是Slave 機器有File許可權, 這個4.1.12版對replication的許可權好像做了調整,只賦予Slave機器有File許可權還不行,還要給它REPLICATION SLAVE的許可權才可以。

然後打包要複製的資料庫

Master# cd var

Master# tar czvf reptest.tar.gz reptest

這樣,我們得到一個reptest資料庫的打包檔案reptest.tar.gz

2設定主伺服器Master的my.cnf,啟動Mysql服務

Master# vi /etc/my.cnf

在[mysqld]新增或修改以下的

[mysqld]

log-bin #開啟logbin選項以能寫到slave的 I/O執行緒;

server-id=1 #表示是本機的序號為1,一般來講就是master的意思.

sql-bin-update-same

binlog-do-db= reptest #表示同步reptest資料庫;

然後把Master主伺服器的Mysql重啟。

Master# /var/eyou/mysql/bin/mysqladmin –u root –p shutdown

Master# /var/eyou/mysql/bin/safe_mysqld --user=mysql &

3、建立Slave資料庫

剛才在Master中打包了reptest.tar.gz,它的作用就是要在Slave恢復成一樣的資料庫。先把Master 的reptest.tar.gz檔案傳到Slave機器中去。然後

Slave# tar zxvf reptest.tar.gz -C /var/eyou/mysql/var/

4、修改Slave伺服器的my.cnf

Slave# vi /etc/my.cnf

在[mysqld]新增或修改以下的

master-host=192.168.10.217

master-user=rep

master-password=eyou

master-port=3306

server-id=2

master-connect-retry=60

replicate-do-db=reptest    [要更新的資料庫]

log-slave-updates

5、刪除Slave端資料庫目錄中的master.info

Slave# rm /var/eyou/mysql/var/master.info

6、重啟動Slave的slave start。

Slave# /var/eyou/mysql/bin/mysqladmin –u root –p shutdown

Slave# /var/eyou/mysql/bin/safe_mysqld --user=mysql &

7、測試

先檢測兩個Mysql資料庫中的reptest是否正常。

正常情況應該是Master和Slave 中的Mysql 都有相同的reptest 資料庫,並且裡面的資料都一樣。

然後測試replication 功能是否起用。

在Master中的reptest資料庫新增一筆資料:

Master# /var/eyou/mysql/bin/mysql –u root -p

Enter password:

Welcome to the MySQL monitor. Commands end with ; or g.

Your MySQL connection id is 12 to server version: 4.1.12

Type 'help;' or 'h' for help. Type 'c' to clear the buffer.

mysql> use reptest;

Database changed

mysql> INSERT INTO rep_table VALUES ('test1', '4321', 'T',24);

Query OK, 1 row affected (0.00 sec)

mysql>

然後檢視Slave機器的reptest資料庫:

Slave#/var/eyou/mysql/bin/mysql –u root –p

Enter password:

Welcome to the MySQL monitor. Commands end with ; or g.

Your MySQL connection id is 12 to server version: 4.1.12

Type 'help;' or 'h' for help. Type 'c' to clear the buffer.

mysql> use reptest;

Database changed

mysql>select * from reptable;;

+------+------+------+------+

| id | name | sex | age |

+------+------+------+------+

| test1| 4321 | T | 24 |

+------+------+------+------+

1 row in set (0.00 sec)

PS :

1,Slave機器的許可權問題,不但要給slave機器File許可權,還要給它REPLICATION SLAVE的許可權。

2.在修改完Slave機器/etc/my.cnf之後,slave機器的mysql服務啟動之前,記得要刪除掉master.info

3,在show master status 或著show slave status 不正常時,看看.err是怎樣說的。

4,Slave上Mysql的Replication工作有兩個執行緒, I/O thread和SQL thread 。I/O 的作用是從master 3306埠上把它的binlog取過來(master在被修改了任何內容之後,就會把修改了什麼寫到自己的binlog等待slave更新),然後寫到本地的relay-log,而SQL thread則是去讀本地的relay-log,再把它轉換成本Mysql所能理解的語句,於是同步就這樣一步一步的完成.決定I/O thread的是/var/lib/mysql/master.info,而決定SQL thread的是/var/lib/mysql/relay-log.info.

雙向複製模式

1:

Slave 機器設定許可權,賦予Master機器FILE及Replication Slave權利.

Master#./var/eyou/mysql –u root –p

Enter password:

Welcome to the MySQL monitor. Commands end with ; or g.

Your MySQL connection id is 2 to server version: 4.1.12

Type 'help;' or 'h' for help. Type 'c' to clear the buffer.

mysql> GRANT FILE ON *.* TO rep@192.168.0.217 IDENTIFIED BY ‘eyou’;

mysql> GRANT REPLICATION SLAVE ON *.* TO rep@192.168.0.217 IDENTIFIED BY ‘eyou’;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-940553/,如需轉載,請註明出處,否則將追究法律責任。

相關文章