商城網(wǎng)站源碼大全愛(ài)站工具seo綜合查詢(xún)
文章目錄
- 一、前提
- 二、修改my.cnf
- 主1 10.255.131.9
- 主2 10.255.131.10
- 三、配置主主
- 3.1 配置主 10.255.131.9
- 3.2 配置從 10.255.131.10
- 3.3 配置主 10.255.131.10
- 3.4 配置從 10.255.131.9
- 四、驗(yàn)證
- 五、同步問(wèn)題排查以及恢復(fù)
- 5.1 查看同步狀態(tài)
- 5.2 查看同步是否數(shù)據(jù)一致性,延遲多少
- 5.3 過(guò)濾掉常見(jiàn)錯(cuò)誤
- 5.4 同步失敗如何恢復(fù)
一、前提
兩臺(tái)機(jī)器均部署好了mysql;
部署可參考之前的博客: Mysql 8.4.3LTS 的離線(xiàn)部署
二、修改my.cnf
主1 10.255.131.9
vim /etc/my.cnf
[mysqld] 中加入以下內(nèi)容
# 配置server-id 每個(gè)MySQL實(shí)例的server-id都不能相同
server-id=9
# MySQL的日志文件的名字
log-bin=mysql_master
# 作為從庫(kù)時(shí) 更新操作是否寫(xiě)入日志 on:寫(xiě)入 其他數(shù)據(jù)庫(kù)以此數(shù)據(jù)庫(kù)做主庫(kù)時(shí)才能進(jìn)行同步
log-slave-updates=on
# 同步DML
binlog_format = ROW
# 開(kāi)啟GTID
gtid-mode = ON
enforce-gtid-consistency = ON
log-slave-updates = ON
# 多線(xiàn)程復(fù)制
slave_parallel_workers = 4# MySQL系統(tǒng)庫(kù)的數(shù)據(jù)不需要同步 我們這里寫(xiě)了3個(gè) 更加保險(xiǎn)
# 同步數(shù)據(jù)時(shí)忽略一下數(shù)據(jù)庫(kù) 但是必須在使用use db的情況下才會(huì)忽略;如果沒(méi)有使用use db 比如create user 數(shù)據(jù)還是會(huì)同步的
replicate-ignore-db=information_schema
replicate-ignore-db=mysql
replicate-ignore-db=performance_schema
replicate-ignore-db=sys
# 使用通配符忽略MySQL系統(tǒng)庫(kù)的表 這樣在create user時(shí)也不會(huì)進(jìn)行同步了
replicate_wild_ignore_table=information_schema.%
replicate_wild_ignore_table=mysql.%
replicate_wild_ignore_table=performance_schema.%
replicate_wild_ignore_table=sys.%
# MySQL系統(tǒng)庫(kù)的日志不計(jì)入binlog 這樣更加保險(xiǎn)了
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
主2 10.255.131.10
修改my.cnf, 只需要修改其中的兩個(gè)地方,其他內(nèi)容一樣
# 配置server-id 每個(gè)MySQL實(shí)例的server-id都不能相同
server-id=10
# MySQL的日志文件的名字
log-bin=mysql_slave
my.cnf文件修改完成后,重啟mysql
systemctl restart mysql
三、配置主主
主主模式就是配置兩個(gè)主從。
10.255.131.9(主)->10.255.131.10(從)
10.255.131.10(主)->10.255.131.9(從)
3.1 配置主 10.255.131.9
先登錄10.255.131.9(主1)的數(shù)據(jù)庫(kù),依次執(zhí)行如下命令:
#創(chuàng)建備份的賬號(hào) 使用MYSQL_NATIVE_PASSWORD的方式加密
create user 'repl_master'@'%' identified with mysql_native_password by 'master_ccdcsm';
# 對(duì)repl_master授予備份的權(quán)限
grant replication slave on *.* to 'repl_master'@'%';
# 刷新權(quán)限
flush privileges;
3.2 配置從 10.255.131.10
登錄到10.255.131.10(主2) 中,執(zhí)行如下命令:
mysql> CHANGE MASTER TO
MASTER_HOST='10.255.131.10',
MASTER_USER='repl_master',
MASTER_PASSWORD='master_ccdcsm',
MASTER_PORT=3306,
MASTER_AUTO_POSITION = 1;
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G;
這樣,
10.255.131.9(主1)->10.255.131.10(主2)的主從就搭建好了。
然后,我們?cè)俜催^(guò)來(lái),搭建
10.255.131.10(主2)->10.255.131.9(主1)的主從。
3.3 配置主 10.255.131.10
登錄10.255.131.10(主2)的數(shù)據(jù)庫(kù),依次執(zhí)行如下命令:
#創(chuàng)建備份的賬號(hào) 使用MYSQL_NATIVE_PASSWORD的方式加密
create user 'repl_slave'@'%' identified with mysql_native_password by 'slave_ccdcsm';
# 對(duì)repl_slave授予備份的權(quán)限
grant replication slave on *.* to 'repl_slave'@'%';
# 刷新權(quán)限
flush privileges;
# 查看MySQL主節(jié)點(diǎn)的狀態(tài)
show master status;
binlog文件的名字,mysql_master.000001,和位置,也就是830。
3.4 配置從 10.255.131.9
登錄到10.255.131.9(主1),執(zhí)行如下命令:
mysql> CHANGE MASTER TO MASTER_HOST='10.255.131.9',MASTER_USER='repl_slave',MASTER_PASSWORD='slave_ccdcsm',MASTER_PORT=3306,MASTER_AUTO_POSITION = 1;
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G;
四、驗(yàn)證
由于上述的my.cnf中將創(chuàng)建用戶(hù),創(chuàng)建表的行為給屏蔽同步了。
注釋相關(guān)代碼后 重啟,發(fā)現(xiàn)在10.255.131.9上執(zhí)行的創(chuàng)建用戶(hù)與表的動(dòng)作;
10.255.131.10上已經(jīng)同步過(guò)去了。
此外創(chuàng)建分區(qū)并不會(huì)導(dǎo)致同步的報(bào)錯(cuò)以及異常;
CALL P_ADD_TAB_PARTITION_THAT_VERY_DAY(‘MON_DATA_CUR’);
兩臺(tái)服務(wù)器均正常創(chuàng)建了今天的分區(qū);
五、同步問(wèn)題排查以及恢復(fù)
5.1 查看同步狀態(tài)
同步狀態(tài)是否正??赏ㄟ^(guò)sql查詢(xún);
mysql> show slave status\G;
以下兩個(gè)屬性均為yes;說(shuō)明同步狀態(tài)正常
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果有任何為No,可以查詢(xún)Last_SQL_Error上次同步失敗的sql;如何恢復(fù),請(qǐng)看5.4
5.2 查看同步是否數(shù)據(jù)一致性,延遲多少
mysql> show slave status\G;
Seconds_Behind_Master: 為0說(shuō)明數(shù)據(jù)同步完成,這個(gè)屬性表示的是從庫(kù)同步主庫(kù)的延遲時(shí)間,單位秒;
5.3 過(guò)濾掉常見(jiàn)錯(cuò)誤
常見(jiàn)的有1032錯(cuò)誤碼;
binlog中變更的那行在表中不存在,導(dǎo)致主從失敗; 該錯(cuò)誤很常見(jiàn),可屏蔽
my.cnf可配置slave-skip-errors=1032
重啟mysql,就可以跳過(guò)日志中的1032錯(cuò)誤碼
也可以配置
# 跳過(guò)所有錯(cuò)誤 slave-skip-errors=all
5.4 同步失敗如何恢復(fù)
如果主庫(kù)有個(gè)錯(cuò)誤的sql執(zhí)行導(dǎo)致報(bào)錯(cuò),或者主從庫(kù)數(shù)據(jù)結(jié)構(gòu)不一致等原因?qū)е峦綀?bào)錯(cuò);
這種情況如何恢復(fù)同步呢;
基本上就這三步;
mysql> stop slave;mysql> reset slave;mysql> start slave;
如果起不來(lái)可能是binlog記錄的位置不一致。這時(shí)候reset slave下再重啟;
復(fù)雜的錯(cuò)誤導(dǎo)致數(shù)據(jù)不一致的情況
- 全量同步
可以采取刪除從庫(kù)數(shù)據(jù)庫(kù),主庫(kù)鎖庫(kù)只讀。然后全量備份再恢復(fù)到從庫(kù)中,再建立主從同步的鏈接,以此來(lái)恢復(fù)。
鎖表:FLUSH TABLES WITH READ LOCK;
解鎖:UNLOCK TABLES;
- 跳過(guò)部分錯(cuò)誤(沒(méi)啥用)
mysql>stop slave ;
~~mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;~~跳過(guò)一個(gè)事務(wù)
mysql>start slave;
- 對(duì)于復(fù)雜的報(bào)錯(cuò)無(wú)法解決的時(shí)候如果同步并恢復(fù)主從呢
在此舉例主從,主主的模式一樣,就是操作兩遍。
首先從數(shù)據(jù)庫(kù)停止同步;并刪除主從連接配置信息
mysql> stop slave;
mysql> reset slave all;
主數(shù)據(jù)庫(kù)中刪除binlog,重新記錄binlog
mysql> reset master;
借助工具,手動(dòng)的同步兩個(gè)數(shù)據(jù)庫(kù),主數(shù)據(jù)庫(kù)數(shù)據(jù)同步到從數(shù)據(jù)庫(kù)中;Navicat,SQLyog 均可,好用。
從數(shù)據(jù)庫(kù)上建立連接GTID
mysql> CHANGE MASTER TO MASTER_HOST='10.255.131.9',MASTER_USER='repl_master',MASTER_PASSWORD='master_ccdcsm',MASTER_PORT=3306,MASTER_AUTO_POSITION = 1;
啟動(dòng)從庫(kù)同步;
mysql> start slave;
這樣就可以恢復(fù)主從的同步了。
這是沒(méi)法通過(guò) reset slave; 恢復(fù)同步時(shí)候的實(shí)用的解決方式,要注意mysql同步之前最好做下必要的備份,防止數(shù)據(jù)丟失。
總之?dāng)?shù)據(jù)庫(kù)的同步是一個(gè)復(fù)雜的情況,如果生產(chǎn)上發(fā)現(xiàn)同步異常,數(shù)據(jù)庫(kù)數(shù)據(jù)不一致等情況,可以找專(zhuān)業(yè)DBA。
O
MASTER_HOST=‘10.255.131.9’,
MASTER_USER=‘repl_master’,
MASTER_PASSWORD=‘master_ccdcsm’,
MASTER_PORT=3306,
MASTER_AUTO_POSITION = 1;
啟動(dòng)從庫(kù)同步;`mysql> start slave;`這樣就可以恢復(fù)主從的同步了。這是沒(méi)法通過(guò) reset slave; 恢復(fù)同步時(shí)候的實(shí)用的解決方式,要注意mysql同步之前最好做下必要的備份,防止數(shù)據(jù)丟失??傊?dāng)?shù)據(jù)庫(kù)的同步是一個(gè)復(fù)雜的情況,如果生產(chǎn)上發(fā)現(xiàn)同步異常,數(shù)據(jù)庫(kù)數(shù)據(jù)不一致等情況,可以找專(zhuān)業(yè)DBA。