12 : mysql 主從複製 - 基於GTID複製

一.什麼是GTID
GTID(Global Transaction ID)全局事務標識符:是一個惟一的標識符,它建立並與源服務器(主)上提交的每一個事務相關聯。
此標識符不只對其發起的服務器是惟一的,並且在給定複製設置中的全部服務器上都是惟一的。 全部交易和全部GTID之間都有1對1的映射。
GTID其實是由UUID+TID組成的。其中UUID是一個MySQL實例的惟一標識。TID表明了該實例上已經提交的事務數量,而且隨着事務提交單調遞增。mysql

下面是一個GTID的具體形式:
它的官方定義以下:
GTID = source_id :transaction_id
3E11FA47-71CA-11E1-9E33-C80AA9429562:23
什麼是sever_uuid,和Server-id 區別?
source_id 也叫uuid 默認在是第一次啓動數據庫時,自動生成的
/application/mysql/data/auto.cnf
手工刪除掉此文件,重啓數據庫,能夠生成新的。sql


二.GTID新特性
(1).支持多線程複製:事實上是針對每一個database開啓相應的獨立線程,即每一個庫有一個單獨的(sql thread).數據庫

(2).支持啓用GTID,在配置主從複製,傳統的方式裏,你須要找到binlog和POS點,而後change master to指向.
在mysql5.6裏,無須再知道binlog和POS點,只須要知道master的IP/端口/帳號密碼便可,由於同步複製是自動的,MySQL經過內部機制GTID自動找點同步.vim

(3).基於Row複製只保存改變的列,大大節省Disk Space/Network resources和Memory usage.服務器

(4).支持把Master 和Slave的相關信息記錄在Table中
原來是記錄在文件裏,記錄在表裏,加強可用性多線程

(5).支持延遲複製app

 

基於GTID複製構建過程(3307主,3308從)
一、更新參數文件ide

vim /data/3307/my.cnf
添加:
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
去掉複製過濾功能!!!!ui


vim /data/3308/my.cnf
添加:
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1spa


二、刪除歷史數據
pkill mysqld
rm -rf /data/3307/data/*
rm -rf /data/3307/mysql-bin*
rm -rf /data/3308/data/*
rm -rf /data/3308/mysql-bin*

三、從新初始化數據
mv /etc/my.cnf /etc/my.cnf.bak ----》若是有就mv一下,沒有的話就不作

/application/mysql/scripts/mysql_install_db --user=mysql --basedir=/application/mysql --datadir=/data/3307/data/
/application/mysql/scripts/mysql_install_db --user=mysql --basedir=/application/mysql --datadir=/data/3308/data/


修改目錄權限
[root@db01 3307]# touch /data/330{7..8}/mysql.log
[root@db01 3307]# chown -R mysql.mysql /data/330*

啓動多實例

mysqld_safe --defaults-file=/data/3307/my.cnf &
mysqld_safe --defaults-file=/data/3308/my.cnf &


四、構建主從

(1)主庫建立用戶:
mysql -S /data/3307/mysql.sock
grant replication slave on *.* to repl@'10.0.0.%' identified by '123';

(2)備份主庫數據
mysqldump -S /data/3307/mysql.sock -A -R --triggers --master-data=2 --single-transaction >/tmp/full.sql

(3)開啓主從
mysql -S /data/3308/mysql.sock


mysql> CHANGE MASTER TO
MASTER_HOST='10.0.0.51',
MASTER_USER='repl',
MASTER_PASSWORD='123',
MASTER_PORT=3307,
MASTER_AUTO_POSITION = 1;

mysql> start slave;

 

-----------------------------

GTID 從庫誤寫入操做 處理

注入空事物的方法:
stop slave;
set gtid_next='8c49d7ec-7e78-11e8-9638-000c29ca725d:2';
begin;commit;
set gtid_next='AUTOMATIC';
start slave;
這裏的xxxxx:N 也就是你的slave sql thread報錯的GTID,或者說是你想要跳過的GTID。

 

最好的解決方案:從新構建主從環境

----------------------------

GTID 複製和普通複製的區別
(0)在主從複製環境中,主庫發生過的事務,在全局都是由惟一GTID記錄的,更方便Failover
(1)額外功能參數(3個)
(2)change master to 的時候再也不須要binlog 文件名和position號
(3)在複製過程當中,從庫再也不依賴master.info文件,而是直接讀取最後一個relaylog的 GTID號
(4) mysqldump備份時,默認會將備份中包含的事務操做,以如下方式
SET @@GLOBAL.GTID_PURGED='8c49d7ec-7e78-11e8-9638-000c29ca725d:1';
告訴從庫,個人備份中已經有以上事務,你就不用運行了,直接從下一個GTID開始請求binlog就行。

相關文章
相關標籤/搜索