http://blog.csdn.net/swandy45/article/details/6982421
環境要求:
Windows 操作系統
需要Mysql 3.23.15以后的版本。
假設數據庫A為主機,數據庫B為從機(A向B提供同步服務,即B中的數據來自A)
A機器:IP=10.10.151.166
B機器:IP=10.10.151.156
下面看單向同步的配置步驟:
1 在機器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;
2 打開A機器的mysql安裝目錄下的my.ini文件,在文件最后添加:
- server-id=1
- log-bin=c:\mysqlback #啟動同步事件的日志記錄文件
- binlog-do-db=test #提供數據同步服務的數據庫
3 在機器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的數據庫結構必須一致,否則無法構成同步
4 打開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 #同步的數據庫
- p>5 完成以上配置之后,在機器A的mysql控制台中輸入:</p>
- GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO ym@10.10.151.156 IDENTIFIED BY 'ym' ;
#這句是為讓從服務器有足夠的權限從主服務器是哪個接收二進制日志文件
6 重啟機器A和B的mysql數據庫,
- 在機器B的mysql控制台:
- Mysql>slave start;
- 如果想查看同步配置的情況,可以按如下輸入:
- 機器A的mysql控制台:
- Mysql>show master status;
- 機器B的mysql控制台:
- Mysql>show slave status;
7 在機器A中test數據庫中的backup_table表中插入一些數據,查看機器B中test數據庫中的backup_table表應該同步實現了數據的改動。
下面是雙向的數據同步配置步驟:
1還是上面使用的機器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 #提供數據同步服務的數據庫
2 機器B的mysql控制台輸入:
GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO ym@10.10.151.166 IDENTIFIED BY 'ym' ;
3 重啟機器A和機器B的mysql數據庫
在機器B中test數據庫中的backup_table表中插入一些數據,查看機器A中test數據庫中的backup_table表應該同步實現了數據的改動。但不會導致循環
注:實現mysql數據庫的數據同步,須將倆台windows操作系統的windows防火牆關閉
Mysql 數據同步的原理:
Mysql的數據同步,在Mysql官方網站文檔上,叫replication字面意思是重作,這個很准確的表明了Mysql數據庫操作的實質,是重作同樣的操作,以保持主數 據庫服務器沒事master與從屬數據庫服務器slave之間的數據保持一致。
從MySQL3.23.15以后,Mysql支持單向的異步復制。也就是說,1台Mysql服務器充當Master(主庫),1台或多台Mysql服務器充當Slaves(從庫),數據從 Master向Slaves進行異步復制。注意,這種復制是異步的,有別於Mysql的同步復制實現(這種實現稱做Mysql集群,Mysql Cluster)。
當主庫有更新的時候,主庫會把更新操作的SQL寫入二進制日志(Bin log它記錄了所有更新了數據或者已經潛在更新了數據的所有語句),並維護一個二進制日志 文件的索引,以便於日志文件輪回(Rotate)。在從庫啟動異步復制的時候,從庫會開啟兩個I/O線程,其中一個線程連接主庫,要求主庫把二進制日志的變化部 分傳給從庫,並把傳回的日志寫入本地磁盤。另一個線程則負責讀取本地寫入的二進制日志,並在本地執行,以反映出這種變化保證主從數據庫之間的數據同步。 較老的版本在復制的時候只啟用一個I/O線程,實現這兩部分的功能。這種方法是利用了Mysql數據庫主(master)和從(slave)異步復制功能,來實現數據庫 之間的同步。
Windows系統中,Mysql安裝目錄下my.ini文件中:
log-bin=c:\mysqlback;
這一句表示數據庫的二進制日志文件都存放在C盤根目錄下,並且以mysqlback為文件名,以.000001這樣的序號為為文件的擴展名,每一個binlog文件默認是 1GB,超過了會自動換到以.000002為文件擴展名的的文件,索引文件mysqlback.index文件記錄了所有mysqlback的文件名。當然也可以刪除這些二進制日志 文件:
使用下面的兩個命令
PURGE {MASTER | BINARY} LOGS TO 'log_name' //log_name不會被清除,刪除這個序號以//前的
PURGE {MASTER | BINARY} LOGS BEFORE 'date' //date不會被清除,刪除這個日期以前的
刪除之前所有的二進制日志文件,並重新生成新的二進制日志文件后綴從.000001開始。
但是,當如果有一個正在運行的從屬服務器,該服務器當前正在讀取正在試圖刪除的日志文件時則該刪除語句不會起作用,而是會失敗,並伴隨一個錯誤。不過, 如果從屬服務器是停止的,並且碰巧清理了其想要讀取的日志文件,則從屬服務器啟動后便不能復制。當從屬服務器正在復制時,刪除語句可以安全運行,不需要 停止它們。
在完成了主服務器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改為從該文件的第幾條記錄開始同 步。
先輸入slave stop;指令,再輸入上述指令,最后輸入slave start;指令
當數據同步產生錯誤時,會在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是同義詞。