環境要求: Windows + MySQL 3.23.15以上。
前置條件
假設數據庫A爲主機,數據庫B爲從機(A向B提供同步服務,即B中的數據來自A)
- A機器:IP=10.10.151.166
- B機器:IP=10.10.151.156
單向同步
下面看單向同步的配置步驟:
- 在機器A中建立一個新的數據庫,sql語句:
CREATE DATABASE backup_db;
USE test;
CREATE TABLE `backup_table` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(20) character set utf8 NOT NULL,
`sex` varchar(2) character set utf8 NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
- 打開A機器的mysql安裝目錄下的my.ini文件,在文件最後添加:
server-id=1
log-bin=c:\mysqlback #啓動同步事件的日誌記錄文件
binlog-do-db=test #提供數據同步服務的數據庫
- 在機器B中建立一個和機器A結構相同的數據庫,sql語句:
CREATE DATABASE backup_db;
USE test;
CREATE TABLE `backup_table` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(20) character set utf8 NOT NULL,
`sex` varchar(2) character set utf8 NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
注:機器A和B的數據庫結構必須一致,否則無法構成同步
- 打開B機器的mysql安裝目錄下的my.ini文件,在文件最後添加:
server-id=2
master-host=10.10.151.166 #主機A的地址
master-user=ym #主機A提供給B的用戶,該用戶中需要包括數據庫test的權限
master-password=ym #訪問密碼
master-port=3306 #端口,主機的MYSQL端口
master-connect-retry=60 #重試間隔60秒,當主從服務器連接意外斷開時數據庫每隔60秒進行一個重新連接
replicate-do-db=test #同步的數據庫
- 完成以上配置之後,在機器A的mysql控制檯中輸入:
GRANT REPLICATION SLAVE,RELOAD,SUPER
ON *.* TO ym@10.10.151.156 IDENTIFIED BY 'ym';
這句負責給服務器配權限,從主服務器接收二進制日誌文件
重啓機器A和B的mysql數據庫.
在機器B的mysql控制檯(開啓主從同步):
Mysql>slave start;
如果想查看同步配置的情況,可以按如下輸入:
機器A的mysql控制檯:
Mysql>show master status;
機器B的mysql控制檯:
Mysql>show slave status;
在機器A中test數據庫中的
backup_table
表中插入一些數據,查看機器B中test數據庫中的backup_table
表應該同步實現了數據的改動。
雙向同步
- 還是使用機器A和機器B,但B是主機,A是從機,保持上面的配置不要改,在機器A的mysql安裝目錄下的my.ini文件最後添加:
master-host=10.10.151.156 #主機B的地址
master-user=ym #主機B提供給A的用戶,該用戶中需要包括數據庫test的權限
master-password=ym #訪問密碼
master-port=3306 #端口,主機的MYSQL端口
master-connect-retry=60 #重試間隔60秒當主從服務器連接意外斷開時數據庫每隔60秒進行一個重新連接
replicate-do-db=test #同步的數據庫
在機器B的mysql安裝目錄下的my.ini文件最後添加
log-bin=c:\mysqlback #啓動同步事件的日誌記錄文件
binlog-do-db=test #提供數據同步服務的數據庫
- 機器B的mysql控制檯輸入:
GRANT REPLICATION SLAVE,RELOAD,SUPER
ON *.* TO ym@10.10.151.166 IDENTIFIED BY 'ym' ;
重啓機器A和機器B的mysql數據庫
在機器B中test數據庫中的
backup_table
表中插入一些數據,查看機器A中test數據庫中的backup_table
表應該同步實現了數據的改動。但不會導致循環
注:實現mysql數據庫的數據同步,須將參與數據同步服務器的防火牆關閉。
數據同步的原理
簡介
在Mysql官方網站文檔上,數據同步叫replication
,字面意思是重複、主從複製,很準確的表明了Mysql數據庫操作的實質,是重複同樣的操作,以保持主數據庫服務器(master)與從屬數據庫服務器(slave)之間的數據一致。
在MySQL 3.23.15以後,Mysql支持單向的異步複製。也就是說,1臺Mysql服務器充當Master(主庫),1臺或多臺Mysql服務器充當Slaves(從庫),數據從Master向Slaves進行異步複製。注意,這種複製是異步的,有別於Mysql的同步複製實現1。
當主庫有更新的時候,主庫會把更新操作的SQL寫入二進制日誌2,並維護一個二進制日誌文件的索引,以便於日誌文件輪迴(Rotate)。
異步複製 機制
在從庫啓動異步複製時,從庫會開啓兩個I/O線程:
1. 其中一個線程連接主庫,要求主庫把二進制日誌的變化部分傳給從庫,並把傳回的日誌寫入本地磁盤。
2. 另一個線程則負責讀取本地寫入的二進制日誌,並在本地執行,以保證主從數據庫之間的數據同步。
舊版本在複製時,只啓用一個I/O線程,實現這兩部分的功能。
這種方法是利用了Mysql數據庫主(master)和從(slave)異步複製功能,來實現數據庫之間的同步。
Windows系統中,Mysql安裝目錄下my.ini文件中:
log-bin=c:\mysqlback;
這一句表示數據庫的二進制日誌文件都存放在C盤根目錄下,並且以mysqlback
爲文件名,以.000001
這樣的序號爲爲文件的擴展名,每一個binlog
文件默認是1GB,超過了會自動換到以.000002
爲文件擴展名的的文件,索引文件mysqlback.index
記錄了所有mysqlback
的文件名。當然也可以刪除這些二進制日誌文件:
//使用下面的兩個命令:xxx不會被清除,刪除這個序號以前的所有二進制日誌文件,並重新生成新的二進制日誌文件,後綴從.000001開始。
PURGE {MASTER | BINARY} LOGS TO 'log_name' //log_name不會被清除……
PURGE {MASTER | BINARY} LOGS BEFORE 'date' //date不會被清除……
但,若存在一個正在運行的從屬服務器,該服務器當前正在讀取正在試圖刪除的日誌文件時,則該刪除語句不會起作用,而是會失敗,並提示一個錯誤。
如果從屬服務器是停止的,並且碰巧清理了其想要讀取的日誌文件,則從屬服務器啓動後便不能複製。當從屬服務器正在複製時,刪除語句可以安全運行,無需停止它們。
在完成了主服務器A的my.ini
文件的配置之後,重啓主服務器A,從現在起對主服務器A數據庫的增刪改操作都會記錄在二進制日誌文件中(查詢操作不做記錄)。
也可以指定從服務器從哪裏開始和主服務器進行同步,在從服務器上執行下面sql操作:
首先輸入命令:slave stop;
然後輸入:
Mysql > change master to
—>master_host=’master_host_name’,#主機IP地址
—>master_user=’replication_user_name’,
—>master_password=’replication_password’,
—>master_log_file=’recorded_log_file_name’,
—>master_log_pos=’recorded_log_position’;
最後輸入命令:slave start
;
想從哪個二進制日誌文件開始同步,就把上面的recorded_log_file_name
改爲對應的文件名,而recorded_log_position
改爲從該文件的第幾條記錄開始同步。
當數據同步產生錯誤時,會在mysql安裝目錄下生成*.err日誌文件,同時同步線程會退出。
PURGE binary logs TO ‘mysql-bin.000003′;
PURGE {MASTER | BINARY} LOGS TO 'log_name'
PURGE {MASTER | BINARY} LOGS BEFORE 'date'
用於刪除列於在指定的日誌或日期之前的日誌索引中的所有二進制日誌。這些日誌也會從記錄在日誌索引文件中的清單中被刪除,這樣被給定的日誌成爲第一個。
例如:
PURGE MASTER LOGS TO 'mysql-bin.010';
PURGE MASTER LOGS BEFORE '2008-06-22 13:00:00';
清除3天前的 binlog:
PURGE MASTER LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 3 DAY);
BEFORE變量的date自變量可以爲’YYYY-MM-DD hh:mm:ss’格式。MASTER和BINARY是同義詞。