區別:1、在5.5版本中主從配置不能省略binlog和POS兩個參數,而在5.6版本中這兩個參數可以省略;2、在5.5版本中不支援多執行緒複製,同步複製是單執行緒、佇列的,而在5.6版本中支援多執行緒複製。
本教學操作環境:windows10系統、mysql8.0.22版本、Dell G3電腦。
5.6的改進地方:
1、在5.5和之前的版本mysql中,主從配置的話,要在從節點配置change master to 指明binlog和POS。而在5.6及以後
,這2個參數就可以省略掉。 MySQL可以透過內部的GTID機制自動找點同步。我們只要指明master的IP、使用者名稱和密碼、連接埠即可。
2、5.6支援多執行緒複製
在5.5裡,同步複製是單執行緒、佇列的,只能一個的執行。而在5.6裡,多個函式庫可以同時進行複製(注意:同一個庫內仍是不能多執行緒了)。
5.6裡會牽涉到UUID這個參數
MySQL [(none)]>show variables like '%uuid%'; +---------------+--------------------------------------+ | Variable_name | Value | +---------------+--------------------------------------+ | server_uuid | ca910cf0-3aec-11e6-9319-b888e3dcfeb8 | +---------------+--------------------------------------+ 1 row in set (0.00 sec)
注意:在mysql初次啟動時候會自動產生這個UIID,寫入到auto.cnf中,官方不建議修改這個值。且server_uuid和GTID有密切關係。
GTID:全域事務標識符
使用這個功能時,每次事務提交都會在binlog裡產生唯一的標識符,它由UUID和事務ID組成。首次提交的事務ID為1,以後依序遞增。
開啟GTID時,slave做同步複製時,不需要找到binlog日誌和POS點。直接
GTID寫法:
change master to master_HOST=192.168.2.100, master_PORT=2206, master_USER=repluser, master_PASSWORD='123456', master_AUTO_POSITION=1; 另外传统的写法: 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,那麼就不能不能再使用傳統的change master to的方式了,會報錯,如下:
# 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.
#B43的工作流程:#1、##113工作流程:##1的工作流程:#1、##1、##1的工作流程:##1、##1、##1的工作流程:#1、##1、##1的工作流程:#14在master上提交一個事務,並寫入到binlog2、binlog發送到slave上,slave接收並寫入relay log,slave讀取到這個GTID,並設定gtid_next的值。例如:set @@SESSION.GTID_NEXT='B0869D03-D33223-35454:3';然後告訴slave接下來的事務必須使用GTID,並寫入到自己的binlog中。 3、slave檢查並確認這個gtid沒有被使用,如果沒有被使用,那麼開始執行這個事務並寫入到它自己的binlog裡。 4、由於gtid_next的值不是空的,slave不會嘗試去產生一個新的gtid,而是透過主從同步來獲的GTID。 另外,要使用GTID方式進行主從同步的話,還要在my.cnf裡面加上如下的配置:[mysqld] log-bin=mysql-bin binlog_format = mixed log_slave_updates = ON gtid-mode = ON enforce_gtid_consistency = ON然後在master上導出mysqldump -uroot -proot -q --single-transaction -R -E --triggers -B hellodb > /root/hello.sql在slave上匯入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的複製是基於交易的,不支援MyISAM,這可能導致多個GTID分配各同一個事務。 2、對create table ... select語句不支援。因為該語句會被拆分成create table和insert 兩個事務,如果這兩個事務被分配了同一個GTID,將會導致insert被備庫忽略掉。 3、不支援建立、刪除臨時表多執行緒複製示範:#在slave上執行下面幾條指令:
> stop slave; > set global slave_parallel_workers = 4; > start slave; > show full processlist;可以看到有4个线程 Waitingfor an eventfromCoordinator如果此時主上有大量的insert操作,可以在slave上執行> select * from mysql.slave_worker_info\G 應該可以查看到worker_id在不斷變化,說明是多執行緒複製在運作了。 說明:slave_parallel_workers 即可實現在slave上多執行緒並發複製。不過,它只能支援一個實例下多個 database 間的並發複製,並不能真正做到多表並發複製。因此在較大並發負載時,slave還是沒有辦法及時追上master,需要想辦法進行優化(比如:盡量將一個庫中的表按照業務邏輯拆分成多個庫來保存,這樣在寫操作時候, slave就能開啟多執行緒複製,減少了同步的時延。)此外,建議修改my.cnf,增加2行(預設這個info_file是檔案的,不寫入資料庫的)
relay_log_info_repository = table master_info_repository = table單單這樣還不夠,預設這2張表是MyISAM的,不安全還要轉換下
> alter table slave_master_info engine innodb; > alter table slave_relay_log_info engine innodb; > alter table slave_worker_info engine innodb;這樣的話,可防止表損壞,在損壞後可以自行修復。 GTID模式下的主從複製,同步時候報錯不能跳過的解決方法:假如在slave上看到同步報錯「從節點的XXX鍵不存在」
我們可以嘗試使用5.5上的舊方法
> stop slave; > set global sql_slave_skip_counter=1 > start slave;執行的時候會發現報錯了,提示如下:
可以看出运行在GTID模式下,不支持sql_slave_skip_counter这种方式跳过的。
那么可以如下方法来跳过:
> show slave status\G查看如下2行的信息:
Retrieved_Gtid_Set: ca910cf0-3aec-11e6-9319-b888e3dcfeb8:1-2 Executed_Gtid_Set: ca910cf0-3aec-11e6-9319-b888e3dcfeb8:1
第一行表示收到的事务,第二行表示已经执行完的事务。也就是说执行到Retrieved_Gtid_Set时候发生错误了。
因此,我们直接单单跳过这个事务即可。
> stop slave; > set GTID_NEXT='ca910cf0-3aec-11e6-9319-b888e3dcfeb8:2'; 就是这种写法,不要加什么1-2这些玩意 > begin; > commit; > set GTID_NEXT="AUTOMATIC"; #把gtid_next设置回来 > start slave; > show slave status\G 验证下是否IO/SQL都是YES状态。
GTID模式转换为传统模式的方法及注意点:
要转换成传统模式,需要在my.cnf里面注释掉下面2行:
# gtid-mode=ON # enforce_gtid_consistency = ON
然后重启MySQL。
登进mysql,执行类似如下命令:
> 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;
结果报错了,如下图:
解决方法:
> change master to MASTER_AUTO_POSITION=0; # 关闭这个参数,这个参数是GTID复制才用到的。 > 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 status\G 验证下是否IO/SQL都是YES状态。
推荐学习:mysql视频教程
以上是mysql中5.6和5.5有什麼差別的詳細內容。更多資訊請關注PHP中文網其他相關文章!