今天就跟大家聊聊有關(guān)如何理解MariaDB.10.5.1這個(gè)版本,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),沙河口企業(yè)網(wǎng)站建設(shè),沙河口品牌網(wǎng)站建設(shè),網(wǎng)站定制,沙河口網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,沙河口網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。提示:本博文演示環(huán)境是基于centos7.2 x86_64位,最小化安裝系統(tǒng),MariaDB.10.5.1二進(jìn)制安裝來(lái)進(jìn)行的
slave_parallel_mode的 slave并行復(fù)制的5種模式:
官方給的5種模式
Description: Controls what transactions are applied in parallel when using parallel replication. optimistic: tries to apply most transactional DML in parallel, and handles any conflicts with rollback and retry. See optimistic mode. conservative: limits parallelism in an effort to avoid any conflicts. See conservative mode. aggressive: tries to maximize the parallelism, possibly at the cost of increased conflict rate. minimal: only parallelizes the commit steps of transactions. none: disables parallel apply completely.
in-order 有序并行復(fù)制的optimistic樂(lè)觀模式為在slave上并行應(yīng)用提供了很多機(jī)會(huì),同時(shí)從應(yīng)用程序的角度來(lái)看,仍然保留精確的事務(wù)語(yǔ)義。這是MariaDB 10.5.1中的默認(rèn)模式
配置主從復(fù)制時(shí), CHANGE MASTER TO master_use_gtid = { slave_pos | current_pos | no } 這3個(gè)參數(shù)介紹:
假如:
A slave is configured to use GTID by CHANGE MASTER TO master_use_gtid=slave_pos
當(dāng)slave從站連接到master主站時(shí),它將在復(fù)制到從站的最后一個(gè)GTID的位置開(kāi)始復(fù)制,這可以在變量gtid_slave_pos中看到。由于所有復(fù)制服務(wù)器上的GTID均相同,因此可以將從屬服務(wù)器指向其他主服務(wù)器,并自動(dòng)確定正確的位置。
如果不希望更改從屬服務(wù)器上的binlog會(huì)影響GTID復(fù)制位置,則應(yīng)使用master_use_gtid = slave_pos。然后,從站將始終在最后復(fù)制的GTID位置連接到主站。
對(duì)于期望與傳統(tǒng)復(fù)制保持一致行為的用戶來(lái)說(shuō),這可以避免一些意外,因?yàn)閺?fù)制位置永遠(yuǎn)不會(huì)因服務(wù)器上進(jìn)行的本地更改而改變
如果在從站上寫(xiě)入任何本地事務(wù),則在使用值current_pos時(shí)可能會(huì)遇到問(wèn)題。例如,如果在slave從屬線程停止時(shí)發(fā)出INSERT語(yǔ)句或以其他方式寫(xiě)入表,則可能在gtid_binlog_pos中生成新的本地GTID,這將影響從屬的gtid_current_pos值。重新啟動(dòng)從屬線程時(shí),這可能會(huì)導(dǎo)致錯(cuò)誤,因?yàn)橹骺刂破鲗⒉淮嬖诒镜谿TID。您可以通過(guò)將MASTER_USE_GTID復(fù)制參數(shù)設(shè)置為slave_pos而不是current_pos來(lái)糾正此問(wèn)題。
重要提示:下面3種場(chǎng)景的演示環(huán)境: centos7.2_x86_64位 MariaDB.10.5.1 二進(jìn)制安裝
mgr01 172.16.0.130 master
mgr03 172.16.0.131 slave
1.場(chǎng)景1:當(dāng)線上的master庫(kù)運(yùn)行了一段時(shí)間,而且數(shù)據(jù)庫(kù)的數(shù)據(jù)很少。針對(duì)此場(chǎng)景給master庫(kù)部署一個(gè)全新的slave庫(kù)
mgr03啟動(dòng)后默認(rèn)情況下GTID位點(diǎn)都是空的,尤其是gtid_slave_pos 這個(gè)是空的
(root@'mgr03':mysql.sock)[(none)]>show variables like 'Gtid%'; +-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | gtid_binlog_pos | | | gtid_binlog_state | | | gtid_cleanup_batch_size | 64 | | gtid_current_pos | | | gtid_domain_id | 0 | | gtid_ignore_duplicates | OFF | | gtid_pos_auto_engines | | | gtid_seq_no | 0 | | gtid_slave_pos | | | gtid_strict_mode | OFF | +-------------------------+-------+ 10 rows in set (0.00 sec) (root@'mgr03':mysql.sock)[(none)]>ALTER USER 'root'@'localhost' IDENTIFIED BY '123456'; Query OK, 0 rows affected (0.02 sec) (root@'mgr03':mysql.sock)[(none)]>show variables like 'Gtid%'; +-------------------------+-------------+ | Variable_name | Value | +-------------------------+-------------+ | gtid_binlog_pos | 0-1313306-1 | | gtid_binlog_state | 0-1313306-1 | | gtid_cleanup_batch_size | 64 | | gtid_current_pos | 0-1313306-1 | | gtid_domain_id | 0 | | gtid_ignore_duplicates | OFF | | gtid_pos_auto_engines | | | gtid_seq_no | 0 | | gtid_slave_pos | | | gtid_strict_mode | OFF | +-------------------------+-------------+ 10 rows in set (0.01 sec)
master操作:
提示:reset master 這一步操作不是必須的,除非在這個(gè)庫(kù)之前,此數(shù)據(jù)庫(kù)做過(guò)別的集群的slave庫(kù)。尤其是在master庫(kù)上,嚴(yán)禁此操作,除非你清楚的知道自己在干什么
mysql -e "grant replication slave on *.* to repuser@'172.16.0.%' identified by 'JuwoSdk21TbUser'; flush privileges;" mysqldump -uroot -p'123456' -B -A -F --master-data=2 --single-transaction --events|gzip >test.sql.gz scp -rp -P52110 /opt/tes.sql.gz root@172.16.0.131:/root
slave操作:
(root@'mgr03':mysql.sock)[test]>source /root/test.sql CHANGE MASTER TO MASTER_HOST='mgr01',MASTER_PORT=3306,MASTER_USER='repuser',MASTER_PASSWORD='JuwoSdk21TbUser',master_use_gtid=slave_pos;start slave;show slave status\G
2.場(chǎng)景2: 當(dāng)線上的master庫(kù)運(yùn)行了一段時(shí)間,而且數(shù)據(jù)庫(kù)的數(shù)據(jù)很少。針對(duì)此場(chǎng)景給master庫(kù)部署一個(gè)slave庫(kù)。但是這個(gè)新slave庫(kù)之前有做過(guò)其他的項(xiàng)目的主庫(kù)
那么初始位置需要手動(dòng)設(shè)置為空:SET GLOBAL gtid_slave_pos = "";
mgr01-master :
當(dāng)前gtid情況:
root@localhost [test]>show variables like 'Gtid%'; +-------------------------+--------------+ | Variable_name | Value | +-------------------------+--------------+ | gtid_binlog_pos | 0-1283306-50 | | gtid_binlog_state | 0-1283306-50 | | gtid_cleanup_batch_size | 64 | | gtid_current_pos | 0-1283306-50 | | gtid_domain_id | 0 | | gtid_ignore_duplicates | OFF | | gtid_pos_auto_engines | | | gtid_seq_no | 0 | | gtid_slave_pos | 0-1313306-41 | | gtid_strict_mode | OFF | +-------------------------+--------------+ 10 rows in set (0.001 sec)
mgr03-slave:
當(dāng)前gtid情況:
(root@'mgr03':mysql.sock)[test]>show variables like 'Gtid%'; +-------------------------+---------------------------+ | Variable_name | Value | +-------------------------+---------------------------+ | gtid_binlog_pos | 0-1313306-45 | | gtid_binlog_state | 0-1283306-42,0-1313306-45 | | gtid_cleanup_batch_size | 64 | | gtid_current_pos | 0-1313306-45 | | gtid_domain_id | 0 | | gtid_ignore_duplicates | OFF | | gtid_pos_auto_engines | | | gtid_seq_no | 0 | | gtid_slave_pos | 0-1283306-42 | | gtid_strict_mode | OFF | +-------------------------+---------------------------+ 10 rows in set (0.00 sec)
具體操作:
master操作:
mysql -e "grant replication slave on *.* to repuser@'172.16.0.%' identified by 'JuwoSdk21TbUser'; flush privileges;" mysqldump -uroot -p'123456' -B -A -F --master-data=2 --single-transaction --events|gzip >test.sql.gz scp -rp -P52110 /opt/test.sql.gz root@172.16.0.131:/root
slave操作:
(root@'mgr03':mysql.sock)[test]>source /root/test.sql (root@'mgr03':mysql.sock)[test]>reset master ; (root@'mgr03':mysql.sock)[test]>stop slave; Query OK, 0 rows affected (0.12 sec) (root@'mgr03':mysql.sock)[test]>reset slave all; (root@'mgr03':mysql.sock)[test]>SET GLOBAL gtid_slave_pos = ""; Query OK, 0 rows affected (0.03 sec) (root@'mgr03':mysql.sock)[test]>show variables like 'Gtid%'; +-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | gtid_binlog_pos | | | gtid_binlog_state | | | gtid_cleanup_batch_size | 64 | | gtid_current_pos | | | gtid_domain_id | 0 | | gtid_ignore_duplicates | OFF | | gtid_pos_auto_engines | | | gtid_seq_no | 0 | | gtid_slave_pos | | | gtid_strict_mode | OFF | +-------------------------+-------+ 10 rows in set (0.00 sec) (root@'mgr03':mysql.sock)[test]>CHANGE MASTER TO MASTER_HOST='mgr01',MASTER_PORT=3306,MASTER_USER='repuser',MASTER_PASSWORD='JuwoSdk21TbUser',master_use_gtid=slave_pos;start slave;show slave status\G
3.場(chǎng)景三:從mysqldump或者XtraBackup或者M(jìn)ariabackup備份集設(shè)置
這兩種方式都可以在非阻塞的情況下獲得備份時(shí)正確的Binlog位點(diǎn)(所有表都要是事務(wù)引擎),當(dāng)然,如果備份時(shí)不會(huì)有寫(xiě)入,那么 SHOW MASTER STATUS 也能提供正確的位點(diǎn)。
一旦獲取了備份時(shí)正確的Binlog位點(diǎn)(文件名和偏移量),那么就可以用BINLOG_GTID_POS()函數(shù)來(lái)計(jì)算GTID:SELECT BINLOG_GTID_POS("mysql-bin.000011",342);
使用mysqldump +gtid 方式新建slave:
從MariaDB 10.0.13版本開(kāi)始,mysqldump會(huì)自動(dòng)完成這個(gè)工作,并且把GTID的寫(xiě)在導(dǎo)出文件中,只要設(shè)置 –master-data 或 -dump-slave 的同時(shí)設(shè)置 --gtid 即可。
mgr01-master:
[root@mgr01 ~]# mysqldump -uroot -p'123456' -B -A -F --master-data=1 --gtid --single-transaction --events >2.sql [root@mgr01 ~]# [root@mgr01 ~]# grep 'CHANGE MASTER TO' 2.sql -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000011', MASTER_LOG_POS=342; CHANGE MASTER TO MASTER_USE_GTID=slave_pos; (root@'mgr01':mysql.sock)[(none)]>SELECT BINLOG_GTID_POS("mysql-bin.000011",342); +-----------------------------------------+ | BINLOG_GTID_POS("mysql-bin.000011",342) | +-----------------------------------------+ | 0-1283306-68 | +-----------------------------------------+ 1 row in set (0.009 sec) [root@mgr01 ~]# scp -rp -P52110 2.sql root@'172.16.0.131':/root
slave庫(kù)操作:
(root@'mgr03':mysql.sock)[test]>source /root/2.sql (root@'mgr03':mysql.sock)[test]>show variables like 'gtid_slave_pos'; +----------------+--------------+ | Variable_name | Value | +----------------+--------------+ | gtid_slave_pos | 0-1283306-68 | +----------------+--------------+ 1 row in set (0.00 sec) (root@'mgr03':mysql.sock)[test]>SET GLOBAL gtid_slave_pos = "0-1283306-68"; 這一步可有可無(wú) (root@'mgr03':mysql.sock)[test]>CHANGE MASTER TO MASTER_HOST='mgr01',MASTER_PORT=3306,MASTER_USER='repuser',MASTER_PASSWORD='JuwoSdk21TbUser',master_use_gtid=slave_pos;start slave;show slave status\G
使用當(dāng)日Mariabackup的全備份來(lái)新建一個(gè)slave庫(kù):
mgr01 master 庫(kù)上操作:
master主庫(kù)上創(chuàng)建備份用戶 root@localhost [(none)]>grant reload,replication client,lock tables,process,super on *.* to mariabackup@'127.0.0.1' identified by 'mypassword';flush privileges; mariabackup --backup --target-dir=/data/backup/ --user=mariabackup --password=mypassword --host=127.0.0.1 mariabackup --prepare --target-dir=/data/backup/ cd /data/; tar zcf bak.tar.gz ./backup scp -rp -P22 bak.tar.gz root@172.16.0.131:/root [root@mgr01 data]# cat /data/backup/xtrabackup_binlog_info mysql-bin.000013 746 0-1283306-74
mgr03 slave庫(kù)上操作:
[root@mgr03 ~]# mariabackup --defaults-file=/etc/my.cnf --copy-back --target-dir=/data/backup/ chown -R mysql.mysql /data/mysql/mysql3306/data /etc/init.d/mysql start 基于Gtid復(fù)制配置: SET GLOBAL gtid_slave_pos = "0-1283306-74"; CHANGE MASTER TO MASTER_HOST='mgr01',MASTER_PORT=3306,MASTER_USER='repuser',MASTER_PASSWORD='JuwoSdk21TbUser',master_use_gtid=slave_pos;start slave;show slave status\G
基于File and Position復(fù)制配置:
CHANGE MASTER TO MASTER_HOST='mgr01', MASTER_PORT=3306, MASTER_USER="repuser", MASTER_PASSWORD="JuwoSdk21TbUser", MASTER_LOG_FILE='mysql-bin.000013', MASTER_LOG_POS=746; START SLAVE;
從一個(gè)線上的slave庫(kù)進(jìn)行 mariabackup備份數(shù)據(jù)庫(kù),然后利用這個(gè)備份做當(dāng)前master庫(kù)的slave庫(kù):
基于Gtid復(fù)制配置:
master庫(kù)操作:
mariabackup --backup --slave-info --safe-slave-backup --target-dir=/data/backup/ --user=mariabackup --password=mypassword mariabackup --prepare --target-dir=/data/backup/ cd /data/; tar zcf bak.tar.gz ./backup scp -rp -P22 bak.tar.gz root@172.16.0.131:/root [root@mgr01 data]# cat /data/backup/xtrabackup_binlog_info mysql-bin.000013 746 0-1283306-74
slave庫(kù)操作:
SET GLOBAL gtid_slave_pos = "0-1283306-74"; CHANGE MASTER TO MASTER_HOST='mgr01',MASTER_PORT=3306,MASTER_USER='repuser',MASTER_PASSWORD='JuwoSdk21TbUser',master_use_gtid=slave_pos;start slave;show slave status\G
假設(shè)我們?cè)O(shè)置了兩個(gè)服務(wù)器A和B,讓A作為master主服務(wù)器,而B(niǎo)作為slave從服務(wù)器。它運(yùn)行了一段時(shí)間。然后在某個(gè)時(shí)候,masterA掛掉了,而slaveB成為了新的master。
然后,稍后我們想添加源masterA作為備庫(kù),也就是作為新的master 的slave庫(kù)。
因?yàn)锳之前從來(lái)不是slave庫(kù),它沒(méi)有任何先前復(fù)制的GTID,并且gtid_slave_pos是空的,
為了允許A自動(dòng)添加為slave庫(kù),可以使用master_use_gtid = current_pos,這將使用變量gtid_current_pos的值而不是gtid_slave_pos進(jìn)行連接,gtid_current_pos該變量還考慮了當(dāng)服務(wù)器作為主服務(wù)器時(shí)寫(xiě)入二進(jìn)制日志中的GTID。
使用master_use_gtid = current_pos時(shí),在使用CHANGE MASTER之前無(wú)需考慮服務(wù)器是master還是slave.
但是必須注意不要將多余的事務(wù)注入到slave 上的binlog中,這些事務(wù)不打算復(fù)制到其他服務(wù)器。
如果這樣的額外事務(wù)是slave服務(wù)器啟動(dòng)時(shí)最新的事務(wù),它將用作復(fù)制的起點(diǎn)。這可能會(huì)失敗,因?yàn)樵撌聞?wù)不在master主服務(wù)器上。為了避免slave從屬服務(wù)器上的本地事務(wù)更改進(jìn)入binlog,請(qǐng)將slave上的sql_log_bin設(shè)置為0。
啟用GTID嚴(yán)格模式(通過(guò)將@@ GLOBAL.gtid_strict_mode設(shè)置為1)時(shí),通常最好使用current_pos。在嚴(yán)格模式下,不允許在主服務(wù)器上進(jìn)行額外的事務(wù)
提示:
不應(yīng)以任何其他方式修改mysql.gtid_slave_pos表。特別是,請(qǐng)勿嘗試更新表中的行以更改從站對(duì)當(dāng)前GTID位置的想法
看完上述內(nèi)容,你們對(duì)如何理解MariaDB.10.5.1這個(gè)版本有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,感謝大家的支持。