因爲Mysql不一樣版本之間的(二進制日誌)binlog格式可能會不太同樣,所以最好的搭配組合是主(Master)服務器的Mysql版本和從(Slave)服務器版本相同或者更低,主服務器的版本確定不能高於從服務器版本。
本次我用於測試的兩臺服務器版本都是Mysql-5.5.17。mysql
2.1環境描述
A服務器(主服務器Master):59.151.15.36
B服務器(從服務器Slave):218.206.70.146
主從服務器的Mysql版本皆爲5.5.17
Linux環境下
將主服務器須要同步的數據庫內容進行備份一份,上傳到從服務器上,保證始初時兩服務器中數據庫內容一致。
不過這裏說明下,因爲我是利用Mysql在安裝後就有的數據庫test進行測試的,因此兩臺服務器裏面是沒有創建表的,只不分別在test裏面創建了一樣的一張空表tb_mobile;
Sql語句以下:
mysql> create table tb_mobile( mobile VARCHAR(20) comment'手機號碼', time timestamp DEFAULT now() comment'時間' );
2.2 主服務器Master配置
2.2.1 建立同步用戶
進入mysql操做界面,在主服務器上爲從服務器創建一個鏈接賬戶,該賬戶必須授予REPLICATION SLAVE權限。由於從mysql版本3.2之後就能夠經過REPLICATION對其進行雙機熱備的功能操做。
操做指令以下:
mysql> grant replication slave on . to 'replicate'@'218.206.70.146' identified by '123456';
mysql> flush privileges;
建立好同步鏈接賬戶後,咱們能夠經過在從服務器(Slave)上用replicat賬戶對主服務器(Master)數據庫進行訪問下,看下是否能鏈接成功。
在從服務器(Slave)上輸入以下指令:
[root@YD146 ~]# mysql -h59.151.15.36 -ureplicate -p123456
若是出現下面的結果,則表示能登陸成功,說明能夠對這兩臺服務器進行雙機熱備進行操做。
2.2.2 修改mysql配置文件
若是上面的準備工做作好,那邊咱們就能夠進行對mysql配置文件進行修改了,首先找到mysql配置全部在目錄,通常在安裝好mysql服務後,都會將配置文件複製一一份出來放到/ect目錄下面,而且配置文件命名爲:my.cnf。即配置文件準確目錄爲/etc/my.cnf
(Linux下用rpm包安裝的MySQL是不會安裝/etc/my.cnf文件的,
至於爲何沒有這個文件而MySQL卻也能正常啓動和做用,在點有兩個說法,
第一種說法,my.cnf只是MySQL啓動時的一個參數文件,能夠沒有它,這時MySQL會用內置的默認參數啓動,
第二種說法,MySQL在啓動時自動使用/usr/share/mysql目錄下的my-medium.cnf文件,這種說法僅限於rpm包安裝的MySQL,
解決方法,只須要複製一個/usr/share/mysql目錄下的my-medium.cnf文件到/etc目錄,並更名爲my.cnf便可。)
找到配置文件my.cnf打開後,在[mysqld]下修改便可:
[mysqld]
server-id = 1 //惟一id
log-bin=mysql-bin //其中這兩行是原本就有的,能夠不用動,添加下面兩行便可.指定日誌文件
binlog-do-db = test //記錄日誌的數據庫
binlog-ignore-db = mysql //不記錄日誌的數據庫
2.2.3 重啓mysql服務
修改完配置文件後,保存後,重啓一下mysql服務,若是成功則沒問題。
2.2.4 查看主服務器狀態
進入mysql服務後,可經過指令查看Master狀態,輸入以下指令:
注意看裏面的參數,特別前面兩個File和Position,在從服務器(Slave)配置主從關係會有用到的。
注:這裏使用了鎖表,目的是爲了產生環境中不讓進新的數據,好讓從服務器定位同步位置,初次同步完成後,記得解鎖。
linux
2.3 從服務器Slave配置
2.3.1修改配置文件
由於這裏面是以主-從方式實現mysql雙機熱備的,因此在從服務器就不用在創建同步賬戶了,直接打開配置文件my.cnf進行修改便可,道理仍是同修改主服務器上的同樣,只不過須要修改的參數不同而已。以下:
[mysqld]
server-id = 2
log-bin=mysql-bin
replicate-do-db = test
replicate-ignore-db = mysql,information_schema,performance_schema
2.3.2重啓mysql服務
修改完配置文件後,保存後,重啓一下mysql服務,若是成功則沒問題。
2.3.3用change mster 語句指定同步位置
這步是最關鍵的一步了,在進入mysql操做界面後,輸入以下指令:
mysql>stop slave; //先停步slave服務線程,這個是很重要的,若是不這樣作會形成如下操做不成功。
mysql>change master tosql
master_host='59.151.15.36',master_user='replicate',master_password='123456',
master_log_file=' mysql-bin.000016 ',master_log_pos=107;
注:master_log_file, master_log_pos由主服務器(Master)查出的狀態值中肯定。也就是剛剛叫注意的。master_log_file對應File, master_log_pos對應Position。Mysql 5.x以上版本已經不支持在配置文件中指定主服務器相關選項。
遇到的問題,若是按上面步驟以後還出現以下狀況:
則要從新設置slave。指令以下
mysql>stop slave;
mysql>reset slave;
以後中止slave線程從新開始。成功後,則能夠開啓slave線程了。
mysql>start slave;
2.3.4查看從服務器(Slave)狀態
用以下指令進行查看
mysql> show slave status\G;
查看下面兩項值均爲Yes,即表示設置從服務器成功。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
2.4 測試同步
以前開始已經說過了在數據庫test只有一個表tb_mobile沒有數據,咱們能夠先查看下兩服務器的數據庫是否有數據:
Master:59.151.15.36
Slave:218.206.70.146
好了,如今能夠在Master服務器中插入數據看下是否能同步。
Master:59.151.15.36
Slave:218.206.70.146
能夠從上面兩個截圖上看出,在Master服務器上進行插入的數據在Slave服務器能夠查到,這就表示雙機熱備配置成功了。數據庫
- Mysql 創建主-主服務器雙機熱備配置步驟
服務器仍是用回如今這兩臺服務器
3.1建立同步用戶
同時在主從服務器創建一個鏈接賬戶,該賬戶必須授予REPLIATION SLAVE權限。這裏由於服務器A和服務器B互爲主從,因此都要分別創建一個同步用戶。
服務器A:
mysql> grant replication slave on . to 'replicate'@'218.206.70.146' identified by '123456';
mysql> flush privileges;
服務器B:
mysql> grant replication slave on . to 'replicate'@'59.151.15.36' identified by '123456';
mysql> flush privileges;
3.2修改配置文件my.cnf
服務器A
[mysqld]
server-id = 1
log-bin=mysql-bin
binlog-do-db = test
binlog-ignore-db = mysql
#主-主形式須要多添加的部分
log-slave-updates
sync_binlog = 1
auto_increment_offset = 1
auto_increment_increment = 2
replicate-do-db = test
replicate-ignore-db = mysql,information_schema
服務器B:
[mysqld]
server-id = 2
log-bin=mysql-bin
replicate-do-db = test
replicate-ignore-db = mysql,information_schema,performance_schema
#主-主形式須要多添加的部分
binlog-do-db = test
binlog-ignore-db = mysql
log-slave-updates
sync_binlog = 1
auto_increment_offset = 2
auto_increment_increment = 2
3.3分別重啓A服務器和B服務器上的mysql服務
重啓服務器方式和上面的同樣,這裏就不作講解了。
3.4分別查A服務器和B服務器做爲主服務器的狀態
服務器A:
緩存
服務器B:
3.5分別在A服務器和B服務器上用change master to 指定同步位置
服務器A:
mysql>change master to安全
master_host='218.206.70.146',master_user='replicate',master_password='123456',
master_log_file=' mysql-bin.000011 ',master_log_pos=497;
服務器B:
mysql>change master to
master_host='59.151.15.36',master_user='replicate',master_password='123456',
master_log_file=' mysql-bin.000016 ',master_log_pos=107;
3.6 分別在A和B服務器上重啓從服務線程
mysql>start slave;
3.7 分別在A和B服務器上查看從服務器狀態
mysql>show slave status\G;
查看下面兩項值均爲Yes,即表示設置從服務器成功。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
3.8 測試主-主同步例子
測試服務器A:
在服務器A上插入一條語句以下圖所示:服務器
以後在服務器B上查看是否同步以下圖所示:ide
測試服務器B:
在服務器B上插入一條語句以下圖所示:
而後在從服務器A上查看是否有同步數據以下圖所示:測試
最後從結果能夠看出主-主形式的雙機熱備是能成功實現的。ui
MySQL 5.6 as well as MySQL Cluster NDB 7.3 support an additional shorthand value
ddl_exist_errors, which is equivalent to the error code list 1007,1008,1050,1051,
1054,1060,1061,1068,1094,1146.
Examples:
--slave-skip-errors=1062,1053
--slave-skip-errors=all
--slave-skip-errors=ddl_exist_errors
Sync_binlog=1 Or N
Sync_binlog的默認值是0,這種模式下,MySQL不會同步到磁盤中去。這樣的話,Mysql依賴操做系統來刷新二進制日誌binary log,就像操做系統刷新其餘文件的機制同樣。所以若是操做系統或機器(不只僅是Mysql服務器)崩潰,有可能binlog中最後的語句丟失了。要想防止這種狀況,可使用sync_binlog全局變量,使binlog在每N次binlog寫入後與硬盤同步。當sync_binlog變量設置爲1是最安全的,由於在crash崩潰的狀況下,你的二進制日誌binary log只有可能丟失最多一個語句或者一個事務。可是,這也是最慢的一種方式(除非磁盤有使用帶蓄電池後備電源的緩存cache,使得同步到磁盤的操做很是快)。
即便sync_binlog設置爲1,出現崩潰時,也有可能表內容和binlog內容之間存在不一致性。若是使用InnoDB表,Mysql服務器處理COMMIT語句,它將整個事務寫入binlog並將事務提交到InnoDB中。若是在兩次操做之間出現崩潰,重啓時,事務被InnoDB回滾,但仍然存在binlog中。能夠用-innodb-safe-binlog選項來增長InnoDB表內容和binlog之間的一致性。(註釋:在Mysql 5.1版本中不須要-innodb-safe-binlog;因爲引入了XA事務支持,該選項做廢了),該選項能夠提供更大程度的安全,使每一個事務的binlog(sync_binlog=1)和(默認狀況爲真)InnoDB日誌與硬盤同步,該選項的效果是崩潰後重啓時,在滾回事務後,Mysql服務器從binlog剪切回滾的InnoDB事務。這樣能夠確保binlog反饋InnoDB表的確切數據等,並使從服務器保持與主服務器保持同步(不接收回滾的語句)。
Auto_increment_offset和Auto_increment_increment
Auto_increment_increment和auto_increment_offset用於主-主服務器(master-to-master)複製,並能夠用來控制AUTO_INCREMENT列的操做。兩個變量都可以設置爲全局或局部變量,而且假定每一個值均可覺得1到65,535之間的整數值。將其中一個變量設置爲0會使該變量爲1。
這兩個變量影響AUTO_INCREMENT列的方式:auto_increment_increment控制列中的值的增量值,auto_increment_offset肯定AUTO_INCREMENT列值的起點。
若是auto_increment_offset的值大於auto_increment_increment的值,則auto_increment_offset的值被忽略。例如:表內已有一些數據,就會用如今已有的最大自增值作爲初始值。
如何解決MySQL主從同步錯誤的SQL解決: stop slave; #表示跳過一步錯誤,後面的數字可變set global sql_slave_skip_counter =1;start slave; 以後再用mysql> show slave status\G 查看: Slave_IO_Running: YesSlave_SQL_Running: Yes ok,如今主從同步狀態正常了。