mysql中5.6和5.5有什么區(qū)別

區(qū)別:1、在5.5版本中主從配置不能省略binlog和POS兩個(gè)參數(shù),而在5.6版本中這兩個(gè)參數(shù)可以省略;2、在5.5版本中不支持線程復(fù)制,同步復(fù)制是單線程、隊(duì)列的,而在5.6版本中支持多線程復(fù)制。

mysql中5.6和5.5有什么區(qū)別

本教程操作環(huán)境:windows10系統(tǒng)、mysql8.0.22版本、Dell G3電腦。

mysql中5.6和5.5有什么區(qū)別

5.6的改進(jìn)地方:

1、在5.5和之前的版本mysql中,主從配置的話,要在從節(jié)點(diǎn)配置change master to 指明binlog和POS。而在5.6及以后

,這2個(gè)參數(shù)就可以省略掉。MySQL可以通過內(nèi)部的GTID機(jī)制自動(dòng)找點(diǎn)同步。我們只要指明master的IP、用戶名和密碼、端口即可。

2、5.6支持多線程復(fù)制

在5.5里,同步復(fù)制是單線程、隊(duì)列的,只能一個(gè)的執(zhí)行。而在5.6里,多個(gè)庫(kù)可以同時(shí)進(jìn)行復(fù)制(注意:同一個(gè)庫(kù)內(nèi)仍是不能多線程了)。

5.6里會(huì)涉及到UUID這個(gè)參數(shù)

MySQL?[(none)]>show?variables?like?'%uuid%'; +---------------+--------------------------------------+ |?Variable_name?|?Value????????????????????????????????| +---------------+--------------------------------------+ |?server_uuid???|?ca910cf0-3aec-11e6-9319-b888e3dcfeb8?| +---------------+--------------------------------------+ 1?row?in?set?(0.00?sec)

注意:在mysql初次啟動(dòng)時(shí)候會(huì)自動(dòng)生成這個(gè)UIID,寫入到auto.cnf中,官方不建議修改這個(gè)值。并且server_uuid和GTID有密切關(guān)系。

GTID:全局事務(wù)標(biāo)識(shí)符

使用這個(gè)功能時(shí),每次事務(wù)提交都會(huì)在binlog里生成唯一的標(biāo)識(shí)符,它由UUID和事務(wù)ID組成。首次提交的事務(wù)ID為1,以后依次遞增。

開啟GTID時(shí),slave做同步復(fù)制時(shí),無需找到binlog日志和POS點(diǎn)。直接

GTID寫法:

change?master?to master_HOST=192.168.2.100, master_PORT=2206, master_USER=repluser, master_PASSWORD='123456', master_AUTO_POSITION=1; 另外傳統(tǒng)的寫法: CHANGE?MASTER?TO MASTER_HOST='master2.mycompany.com', MASTER_USER='replication', MASTER_PASSWORD='bigs3cret', MASTER_PORT=3306, MASTER_LOG_FILE='master2-bin.001', MASTER_LOG_POS=4, MASTER_CONNECT_RETRY=10;

如果之前啟用過了GTID,那么就不能不能再使用傳統(tǒng)的change master to的方式了,會(huì)報(bào)錯(cuò),如下:

Error 1776 (HY000): Parameters MASTER_LOG_FILE, MASTER_LOG_POS, RELAY_LOG_FILE and RELAY_LOG_POS cannot be set when MASTER_AUTO_POSITION is active.

mysql中5.6和5.5有什么區(qū)別

GTID的工作流程:

1、在master上提交一個(gè)事務(wù),并寫入到binlog

2、binlog發(fā)送到slave上,slave接收并寫入relay log,slave讀取到這個(gè)GTID,并設(shè)置gtid_next的值。例如:

set @@Session.GTID_NEXT=’B0869D03-D332223-35454:3′;

然后告訴slave接下來的事務(wù)必須使用GTID,并寫入到自己的binlog中。

3、slave檢查并確認(rèn)這個(gè)gtid沒有被使用,如果沒有被使用,那么開始執(zhí)行這個(gè)事務(wù)并寫入到它自己的binlog里。

4、由于gtid_next的值不是空的,slave不會(huì)嘗試去生成一個(gè)新的gtid,而是通過主從同步來獲的GTID。

另外,要使用GTID方式進(jìn)行主從同步的話,還要在my.cnf里面加上如下的配置:

[mysqld] log-bin=mysql-bin binlog_format?=?mixed log_slave_updates?=?ON gtid-mode?=?ON enforce_gtid_consistency?=?ON

然后在master上導(dǎo)出mysqldump -uroot -proot -q –single-transaction -R -E –triggers -B hellodb > /root/hello.sql

在slave上導(dǎo)入mysql -uroot -proot

在slave上配置change master to指向(如下6行代碼):

change?master?to master_HOST=192.168.2.100, master_PORT=3306, master_USER=repluser, master_PASSWORD='123456', master_AUTO_POSITION=1;

GTID的局限性:

1、GTID的復(fù)制是基于事務(wù)的,不支持MyISAM,這可能導(dǎo)致多個(gè)GTID分配各同一個(gè)事務(wù)。

2、對(duì)create tableselect語(yǔ)句不支持。因?yàn)樵撜Z(yǔ)句會(huì)被拆分成create table和insert 兩個(gè)事務(wù),并且如果這兩個(gè)事務(wù)被分配了同一個(gè)GTID,將會(huì)導(dǎo)致insert被備庫(kù)忽略掉。

3、不支持創(chuàng)建、刪除臨時(shí)表

多線程復(fù)制演示:

在slave上執(zhí)行下面幾條命令:

>?stop?slave; >?set?global??slave_parallel_workers?=?4; >?start?slave; >?show?full?processlist;可以看到有4個(gè)線程?Waitingfor?an?eventfromCoordinator

如果此時(shí)在主上有大量的insert操作,可以在slave上執(zhí)行> select * from mysql.slave_worker_infoG 應(yīng)該可以查看到worker_id在不斷變化,說明是多線程復(fù)制在起作用了。

說明:slave_parallel_workers 即可實(shí)現(xiàn)在slave上多線程并發(fā)復(fù)制。不過,它只能支持一個(gè)實(shí)例下多個(gè) database 間的并發(fā)復(fù)制,并不能真正做到多表并發(fā)復(fù)制。因此在較大并發(fā)負(fù)載時(shí),slave還是沒有辦法及時(shí)追上master,需要想辦法進(jìn)行優(yōu)化(比如:盡量將一個(gè)庫(kù)中的表按照業(yè)務(wù)邏輯拆分成多個(gè)庫(kù)來保存,這樣在寫操作時(shí)候,slave就能開啟多線程復(fù)制,減少了同步的時(shí)延。)

此外,建議修改my.cnf,增加2行(默認(rèn)這個(gè)info_file是文件的,不寫入數(shù)據(jù)庫(kù)的)

relay_log_info_repository?=?table master_info_repository?=?table

單單這樣還不夠,默認(rèn)這2張表是MyISAM的,不安全還要轉(zhuǎn)換下

>?alter?table?slave_master_info?engine?innodb; >?alter?table?slave_relay_log_info?engine?innodb; >?alter?table?slave_worker_info?engine?innodb;

這樣的話,可防止表?yè)p壞,在損壞后可以自行修復(fù)。

GTID模式下的主從復(fù)制,同步時(shí)候報(bào)錯(cuò)不能跳過的解決方法:

假如在slave上看到同步報(bào)錯(cuò)“從節(jié)點(diǎn)的XXX鍵不存在”

我們可以嘗試使用5.5上的老方法

>?stop?slave; >?set?global?sql_slave_skip_counter=1 >?start?slave;

執(zhí)行的時(shí)候會(huì)發(fā)現(xiàn)報(bào)錯(cuò)了,提示如下:

mysql中5.6和5.5有什么區(qū)別

可以看出運(yùn)行在GTID模式下,不支持sql_slave_skip_counter這種方式跳過的。

那么可以如下方法來跳過:

> show ?slave statusG查看如下2行的信息:

Retrieved_Gtid_Set:?ca910cf0-3aec-11e6-9319-b888e3dcfeb8:1-2 Executed_Gtid_Set:?ca910cf0-3aec-11e6-9319-b888e3dcfeb8:1

第一行表示收到的事務(wù),第二行表示已經(jīng)執(zhí)行完的事務(wù)。也就是說執(zhí)行到Retrieved_Gtid_Set時(shí)候發(fā)生錯(cuò)誤了。

因此,我們直接單單跳過這個(gè)事務(wù)即可。

>?stop?slave; >?set?GTID_NEXT='ca910cf0-3aec-11e6-9319-b888e3dcfeb8:2';?????就是這種寫法,不要加什么1-2這些玩意 >?begin; >?commit; >?set?GTID_NEXT="AUTOMATIC";??????#把gtid_next設(shè)置回來 >?start?slave; >?show?slave?statusG???驗(yàn)證下是否IO/SQL都是YES狀態(tài)。

GTID模式轉(zhuǎn)換為傳統(tǒng)模式的方法及注意點(diǎn):

要轉(zhuǎn)換成傳統(tǒng)模式,需要在my.cnf里面注釋掉下面2行:

#?gtid-mode=ON #?enforce_gtid_consistency?=?ON

然后重啟MySQL。

登進(jìn)mysql,執(zhí)行類似如下命令:

>?stop?slave; >?CHANGE?MASTER?TO MASTER_HOST='master2.mycompany.com', MASTER_USER='replication', MASTER_PASSWORD='bigs3cret', MASTER_PORT=3306, MASTER_LOG_FILE='master2-bin.001', MASTER_LOG_POS=4, MASTER_CONNECT_RETRY=10;

結(jié)果報(bào)錯(cuò)了,如下圖:

mysql中5.6和5.5有什么區(qū)別

解決方法:

>?change?master?to?MASTER_AUTO_POSITION=0;?????#?關(guān)閉這個(gè)參數(shù),這個(gè)參數(shù)是GTID復(fù)制才用到的。 >?CHANGE?MASTER?TO MASTER_HOST?=?'192.168.2.11', MASTER_USER='repluser', MASTER_PASSWORD='123456', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000012', MASTER_LOG_POS=500, MASTER_CONNECT_RETRY=10; >?start?slave; >?show?slave?statusG?驗(yàn)證下是否IO/SQL都是YES狀態(tài)。

推薦學(xué)習(xí):mysql視頻教程

以上就是

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊6 分享