Mysql主從復制技術(親測)
開始配置: www.2cto.com
第一步:創建復制帳號
每個slave使用標准的MySQL用戶名和密碼連接master。進行復制操作的用戶會授予
REPLICATIONSLAVE權限。
用戶名的密碼都會存儲在文本文件master.info中。假如,你想創建repl用戶,如下
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO repl@'192.
168.1.%' IDENTIFIED BY '123456';
第二步:配置My.cnf
配置Master的My.cnf,該文件默認位置為/etc/my.cnf
接下來對master進行配置,包括打開二進制日志,指定唯一的servr ID。例如,在配置文件
加入如下值:
[mysqld]
server-id=1
log-bin=mysql-bin
重啟mysql,service mysql restart ,
登錄mysql -uroot -p
運行SHOW MASTER STATUS,輸出如下:
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 | 106 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
配置Slave的My.cnf,該文件默認位置為/etc/my.cnf
Slave的配置與master類似,你同樣需要重啟slave的MySQL。如下:
server-id = 2
log-bin = mysql-bin
relay_log = mysql-relay-bin
log_slave_updates = 1
read_only = 1
server-id是必須的,而且唯一。slave沒有必要開啟二進制日志,但是在一些情況下,必須
設置,例如,如果slave為其它slave的master,必須設置bin_log。在這裡,我們開啟了二進制
日志,而且顯示的命名(默認名稱為hostname,但是,如果hostname改變則會出現問題)。
relay_log配置中繼日志,log_slave_updates表示slave將復制事件寫進自己的二進制日志(後面會
看到它的用處)。
有些人開啟了slave的二進制日志,卻沒有設置log_slave_updates,然後查看slave的數據是否改
變,這是一種錯誤的配置。所以,盡量使用read_only,它防止改變數據(除了特殊的線程)。但是,
read_only並是很實用,特別是那些需要在slave上創建表的應用。
重啟mysql,service mysql restart ,
登錄mysql -uroot -p
第三步:啟動slave
www.2cto.com
接下來就是讓slave連接master,並開始重做master二進制日志中的事件。你不應該用配置
文件進行該操作,而應該使用CHANGE MASTER TO語句,該語句可以完全取代對配置文件的修改,
而且它可以為slave指定不同的master,而不需要停止服務器。如下:
mysql>CHANGE MASTER TO MASTER_HOST='192.168.60.73',MASTER_USER='repl',MASTER_PASSWORD='123456',MASTER
_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=0;
MASTER_LOG_POS的值為0,因為它是日志的開始位置。然後,你可以用SHOW SLAVE STATUS
語句查看slave的設置是否正確:
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: server1
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 4
Relay_Log_File: mysql-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: No
Slave_SQL_Running: No
...omitted...
Seconds_Behind_Master: NULL
Slave_IO_State, Slave_IO_Running, 和Slave_SQL_Running表明slave還沒有開始復制過程。
日志的位置為4而不是0,這是因為0只是日志文件的開始位置,並不是日志位置。實際上,MySQL知
道的第一個事件的位置是4。
為了開始復制,你可以運行:
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G
運行SHOW SLAVE STATUS查看輸出結果:
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: server1
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 164
Relay_Log_File: mysql-relay-bin.000001
Relay_Log_Pos: 164
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...omitted...
Seconds_Behind_Master: 0
注意,slave的I/O和SQL線程都已經開始運行,而且Seconds_Behind_Master不再是NULL。日志
的位置增加了,意味著一些事件被獲取並執行了。如果你在master上進行修改,你可以在slave上看
到各種日志文件的位置的變化,同樣,你也可以看到數據庫中數據的變化。
你可查看master和slave上線程的狀態。在master上,你可以看到slave的I/O線程創建的連接:
mysql> show processlist \G
*************************** 1. row ***************************
Id: 1
User: root
Host: localhost:2096
db: test
Command: Query
Time: 0
State: NULL
Info: show processlist
*************************** 2. row ***************************
Id: 2
User: repl
Host: localhost:2144
db: NULL
Command: Binlog Dump
Time: 1838
State: Has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
2 rows in set (0.00 sec)
基本到這裡就完成,至於後期的加強操作,我會在另行添加。
www.2cto.com
Mysql復制的時候可以做到限制復制(主)
binlog-do-db=work #只復制
binlog_ignore_db=mysql #不允許復制
Replicate_Do_DB=mysql
replicate-ignore-db=mysql
另外還有幾條常用的命令
flush mater; #清除垃圾
flush slave; #清除垃圾
start slave; #開始服務
reset slave; #重設服務
stop slave; #停止服務
上面復制方式是假設在新設Master和slave的情況下,實際環境並不十分實用,例如,你在一
組運行了很久的Master中加入一個新的slave呢?
這樣我們就需要優先進行數據處理。
1.現將Master的數據庫鎖定,以免數據復制的時候出現差異。
FLUSH TABLES WITH READ LOCK;
2. 在另一個連接用mysqldump創建一個你想進行復制的數據庫的轉儲:
shell> mysqldump --all-databases --lock-all-tables >dbdump.db
3. 對表釋放鎖。
mysql> UNLOCK TABLES;
上面方法中,第2部需要將數據庫復制到新slave中還原,這樣,Master和新Slave的數據源就一致。
其實第2部的方法有很多,也可以使用Mysql軟件進行同步,例如:Navicat for Mysql
方法不是唯一,只要結果一致即可。
4.完成舊數據同步後,Master中輸入 www.2cto.com
mysql> show master status;
##得到:
+------------------+----------+--------------+---------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+---------------------------+
| mysql-bin.000024 | 38113 | | mysql,test |
1 row in set (0.00 sec)
5.然後在根據上表中內容輸入上文啟動Slave步驟的內容。
CHANGE MASTER TO MASTER_HOST='192.168.60.73',MASTER_USER='repl',MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=0;
6.啟動slave
START SLAVE;
7.啟動完成後進行檢查。
mysql> SHOW SLAVE STATUS\G ***************************
1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.171
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000024
Read_Master_Log_Pos: 38255
Relay_Log_File: mysql-relay-bin.000002
Relay_Log_Pos: 393
Relay_Master_Log_File: mysql-bin.000024
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB: mysql,wdcpdb,mysql,wdcpdb
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: 38255
Relay_Log_Space: 548
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
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
1 row in set (0.00 sec)
完成
www.2cto.com
測試過程要主要的問題:
1.請先配置好Mysql
2.開通復制前請將Mysql的庫和表的框架復制過去。
(在測試一下能不能連表都復制過去!)