Tuesday, September 28, 2010

MySql 複寫機制

這次在MySql上做複寫,是使用MySql本身的replication solution,所以不需要外掛third party軟體。我是使用兩台電腦進行複寫的動作,將A的指定資料庫複寫到B。

Ubuntu A(192.168.220.130)
Ubuntu B(192.168.220.132)

安裝與設定步驟如下(為方便起見,我是使用root帳號去做)




如果還沒安裝mysql的話,在Ubuntu A與B上安裝mysql

$ sudo apt-get install mysql-server mysql-client
安裝mysql



在Ubuntu A建立複寫用帳號

$ mysql -p
進入mysql

mysql> create database testdb;
建立測試用的DB

mysql> GRANT REPLICATION SLAVE ON *.* TO [email protected] IDENTIFIED BY 'password';
建立一個有複寫權限的帳號repl,可從192.168.220.132連來,密碼為password



將兩台機器上的mysql資料統一

$ service mysql stop
將兩台的mysql停下

$ cd /var/lib/mysql
在Ubuntu A上切到mysql資料夾

$ tar -vxf /root/mysqldb.tar ./
將mysql下的資料全部壓縮起來

$ scp /root/mysqldb.tar [email protected]:/var/lib/mysql
mysqldb.tar 100% 21MB 10.4MB/s 00:02
將壓縮檔丟到Ubuntu B

到Ubuntu B
$ cd /var/lib/mysql
切到mysql資料夾

$ tar -xvf mysqldb.tar
將壓縮檔解壓,完成資料同步


修改設定檔

$ vi /etc/mysql/my.cnf
修改兩台的my.cnf設定檔
Ubuntu A,在[mysqld]下面修改這些,如果沒有則新增
server-id = 1 (隨意設,兩台要不一樣)
log_bin = /var/log/mysql/mysql-bin.log (我只有將#拿掉,路徑用預設的)
binlog_do_db = testdb (需要同步的database)
#binlog_ignore_db = include_database_name (不需要同步的database)

Ubuntu B,在[mysqld]下面修改這些,如果沒有則新增

server-id = 2 (隨意設,兩台要不一樣)
log_bin = /var/log/mysql/mysql-bin.log (我只有將#拿掉,路徑用預設的)
binlog_do_db = testdb (需要同步的database)
#binlog_ignore_db = include_database_name (不需要同步的database)
master-host =192.168.220.130 (Master的ip)
master-user =repl (Master 給replication的帳號)
master-password =password (該帳號的密碼)
master-port =3306 (Master mysql使用的port)
master-connect-retry =60 (多久retry一次)


啟動複寫

$ service mysql start
將兩台的mysql啟動


mysql> show master status;

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      106 |       testdb |                  |
+------------------+----------+--------------+------------------+

顯示master的資訊,File與Position這兩個欄位是等等要使用的


到Ubuntu B

$ mysql -p
進入mysql

mysql> slave stop;
將 slave 停下

mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.220.130',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='password',
-> MASTER_LOG_FILE='mysql-bin.000001',
-> MASTER_LOG_POS=106;
將Master的資訊設給Slave

mysql> slave start;
啟動slave

mysql> show slave status\G;
顯示salve資訊,下面這兩項都是Yes的話就表示設成功了
Slave_IO_Running: Yes
Slave_SQL_Running: Yes


測試資料同步

在Ubuntu A

mysql> use testdb;
指定testdb;

mysql> create table tbl_test(si int) engine=InnoDB;
創一個測試table

mysql> insert into tbl_test (si) values(1);
塞入一筆資料

到Ubuntu B

mysql> use testdb;
指定testdb;

mysql> select * from tbl_test;

+------+
| si   |
+------+
|    1 |
+------+

1 row in set (0.05 sec)
如果有資料表示同步測試成功。

No comments:

Post a Comment