mysql主從複製的過稱其實是:將一臺服務器的數據複製到其他服務器上並重新執行一遍的。複製過程中一臺服務器當作主服務器(Master),一臺或多臺服務器當作從服務器(SLave).主服務器將更新寫入到二進制日誌文件,並維護一個索引以跟蹤日誌循環。這些日誌可以記錄發送給從服務器的更新,當一個從服務器連接到主服務器時,它通知主服務器從服務器在日誌中讀取的最後一次成功更新的位置,從服務器接收從那時起的任何更新,然後封鎖並等待主服務器通知新的更新。
整體上分爲三個步驟:
1.master將改變記錄到日誌文件(binary log)中
2.slave複製二進制日誌事件(binary log event)到中繼日誌(relay log)中
3.slave重做中繼日誌,將改變轉化成自己的數據
環境:
系統:centos6.3
Master:10.10.0.224
Slave:10.10.0.226
1.創建備份帳號,只允許從服務器有權限
mysql> grant all privileges on *.* to [email protected] identified by '123456';
mysql> flush privileges;
2.拷貝數據
停掉mysql服務或者鎖表,將master中的數據拷貝到slave中,保證兩邊數據的一致,並且確保數據同步結束之前禁止在master和slave進行寫操作!
mysql> flush tables with read lock; #鎖表
mysql> unlock tables; #解鎖
3.配置master
# vim /etc/my.cnf
#選擇唯一的server-id
server-id = (0--2^32-1)
#啓動二進制日誌
log-bin = mysql-bin
log-bin-index = mysql-bin.index
# service mysqld restart
# mysql
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 | 3318591 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
4.配置slave
# vim /etc/my.cnf
server_id = 2
log-bin = mysql-bin
log-bin-index = mysql-bin.index
relay-log = relay-log
relay-log-index = relay-log.index
5.連接至主服務器並開始複製數據
mysql> stop slave;
mysql> change master to master_host='10.10.0.224',master_port='3306'master_user='backup',
master_password='123456',master_log_file='mysql-bin.000005',master_log_pos=360;
mysql> start slave;
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.10.0.224
Master_User: backup
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000005
Read_Master_Log_Pos: 360
Relay_Log_File: relay-log.000002
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000005
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
*************************** 1. row ***************************
show processlist\G;可以查看I/0線程狀態