現(xiàn)今大部分MySQL集群都是以主從復(fù)制為基礎(chǔ),如MHA、MGR、第三方中間件等,一旦主從復(fù)制出現(xiàn)異常,整體集群都會(huì)受到影響,主從復(fù)制出現(xiàn)異常分為兩類:IO線程異常與SQL線程異常。
IO線程異常,常見有:
復(fù)制用戶或密碼錯(cuò)誤
網(wǎng)絡(luò)不穩(wěn)定
復(fù)制心跳時(shí)間大于slave_net_timeout參數(shù),IO線程空閑被終斷
SQL線程異常,常見有:
復(fù)制點(diǎn)指定錯(cuò)誤
主鍵或唯一鍵沖突
記錄不存在
表結(jié)構(gòu)不一致
今天所講案例便是SQL線程異常的最后一種情況:主從表結(jié)構(gòu)不一致。
查看異常
接到一生產(chǎn)主從復(fù)制異常告警,登陸數(shù)據(jù)庫(kù)查看異常信息如下:
上述信息僅表示執(zhí)行一事務(wù)失敗,并不詳細(xì);因使用并行復(fù)制,查詢以下表,了解更詳細(xì)信息
錯(cuò)誤信息表明,表中編號(hào)為3的字段不能進(jìn)行類型轉(zhuǎn)換。
上面的錯(cuò)誤信息表明,很大可能是主從兩邊表結(jié)構(gòu)不一致,登陸主從,查看兩邊該表表結(jié)構(gòu)如下:
主庫(kù) | 從庫(kù) |
該表在主從兩邊共有4處不一致,復(fù)制報(bào)錯(cuò)信息中僅顯示了一處:3號(hào)字段即“operate_method”字段。
我們?cè)谧鰯?shù)據(jù)遷移的時(shí)候,如果碰到目標(biāo)字段長(zhǎng)度比源字段大且字符集相同,那遷移過程中就不會(huì)出現(xiàn)問題,但以Row格式為基礎(chǔ)的MySQL主從復(fù)制卻會(huì)出現(xiàn)意外。
在MySQL數(shù)據(jù)庫(kù)中,表上字段的類型包括字段的數(shù)據(jù)類型、定義的數(shù)據(jù)類型長(zhǎng)度兩個(gè)因素。因此通常情況下,主從兩邊表結(jié)構(gòu)必須保持一致,才能夠保障主從復(fù)制的正常進(jìn)行,進(jìn)而保證主從數(shù)據(jù)的完全一致性。如果是上述情況僅字段類型不一致的話,MySQL會(huì)針對(duì)不同的binlog格式進(jìn)行處理。
語句格式
如果事務(wù)SQL語句能夠在從庫(kù)正常執(zhí)行,那主從復(fù)制就不會(huì)出現(xiàn)問題。
行格式
對(duì)于行格式而言,MySQL會(huì)針對(duì)不同的情況分別處理
從庫(kù)目標(biāo)字段長(zhǎng)度小于主庫(kù)
MySQL采取有損數(shù)據(jù)類型轉(zhuǎn)換,對(duì)數(shù)據(jù)進(jìn)行類型內(nèi)的截取操作。
從庫(kù)目標(biāo)字段長(zhǎng)度大于主庫(kù)
MySQL采取無損數(shù)據(jù)類型轉(zhuǎn)換,轉(zhuǎn)換后數(shù)據(jù)不會(huì)丟失。
mix格式
上述兩種情況的綜合處理。
上述現(xiàn)象中從庫(kù)存在目標(biāo)字段長(zhǎng)度大于、小于主庫(kù)兩種情況,主從復(fù)制即要進(jìn)行無損數(shù)據(jù)類型轉(zhuǎn)換,又要進(jìn)行有損數(shù)據(jù)類型轉(zhuǎn)換;而控制這一行為的是從的”slave_type_conversions”數(shù)據(jù)庫(kù)參數(shù),該參數(shù)默認(rèn)情況下為空,即主從復(fù)制遇到這種情況不會(huì)進(jìn)行任何操作。設(shè)置該參數(shù)為以下值,重啟主從復(fù)制,主從復(fù)制恢復(fù)正常
該參數(shù)包括兩個(gè)值,ALL_LOSSY有損轉(zhuǎn)換、ALL_NON_LOSSY無損轉(zhuǎn)換,對(duì)應(yīng)上述兩種目標(biāo)字段長(zhǎng)度情況。
異構(gòu)表復(fù)制
在mysql數(shù)據(jù)庫(kù)主從復(fù)制中,源表和目標(biāo)表不必相同,源表可以具有比目標(biāo)表更多或更少的列。此外,在一定條件下,源表與目標(biāo)表的列可以擁有不同的數(shù)據(jù)類型。
在源表與目標(biāo)表?yè)碛胁煌x的情況下,源表與目標(biāo)表必須擁有相同的庫(kù)名、表名,下面將講述上面兩種不同情況的操作要求。
源表、目標(biāo)表?yè)碛胁煌瑪?shù)量的列
在源表、目標(biāo)表?yè)碛胁煌瑪?shù)量列的情況下,保證主從復(fù)制正常進(jìn)行,必須滿足以下條件:
共有的列在源表、目標(biāo)表,必須擁有相同的定義順序
源表、目標(biāo)表共有列必須在其它列前面定義
源表、目標(biāo)表額外的列必須定義默認(rèn)值
目標(biāo)表列數(shù)多于源表時(shí),共有列必須使用相同的數(shù)據(jù)類型
源表、目標(biāo)表?yè)碛胁煌瑪?shù)據(jù)類型的列
通常情況下,同一表在主庫(kù)、從庫(kù)上的列必須使用相同的數(shù)據(jù)類型,但是在符合某些條件下,這并不總是嚴(yán)格執(zhí)行的,此時(shí)MySQL可以進(jìn)行有損、無損數(shù)據(jù)類型轉(zhuǎn)換,驅(qū)使主從復(fù)制順利進(jìn)行,但卻不保證主從數(shù)據(jù)的完全一致性。
來自源表列的數(shù)據(jù)類型在目標(biāo)表上變?yōu)橄嗤笮』蚋蟮臄?shù)據(jù)類型時(shí),這稱為屬性上升,此時(shí)可以進(jìn)行無損數(shù)據(jù)類型轉(zhuǎn)換。
來自源表列的數(shù)據(jù)類型在目標(biāo)表上變?yōu)楦〉臄?shù)據(jù)類型時(shí),這稱為屬性下降,此時(shí)可以進(jìn)行有損數(shù)據(jù)類型轉(zhuǎn)換。
MySQL支持以下不同但相似數(shù)據(jù)類型間的轉(zhuǎn)換:
TINYINT, SMALLINT, MEDIUMINT, INT, and BIGINT間的整數(shù)類型轉(zhuǎn)換
DECIMAL, FLOAT, DOUBLE, and NUMERIC間的類型轉(zhuǎn)換
CHAR, VARCHAR, and TEXT間的類型轉(zhuǎn)換
BINARY, VARBINARY, and BLOB間的類型轉(zhuǎn)換
BIT間的類型轉(zhuǎn)換
不允許上述以外的類型轉(zhuǎn)換,當(dāng)向小類型轉(zhuǎn)換時(shí),數(shù)據(jù)被截?cái)嗪髲?fù)制至從庫(kù),此時(shí)主從數(shù)據(jù)就產(chǎn)生了不一致。
MySQL主從復(fù)制相對(duì)比較靈活,即可以單表復(fù)制,又可以部分表復(fù)制,更可以進(jìn)行異構(gòu)表復(fù)制,但對(duì)于已生產(chǎn)的主從復(fù)制,必須保證主從兩邊的數(shù)據(jù)結(jié)構(gòu)一致性,從而保證主從兩邊的數(shù)據(jù)一致性;對(duì)于數(shù)據(jù)遷移或數(shù)據(jù)割接的場(chǎng)景,依據(jù)MySQL異構(gòu)表復(fù)制規(guī)則進(jìn)行操作,便可以正常的進(jìn)行數(shù)據(jù)復(fù)制。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/130194.html
閱讀 1346·2023-01-11 13:20
閱讀 1684·2023-01-11 13:20
閱讀 1132·2023-01-11 13:20
閱讀 1858·2023-01-11 13:20
閱讀 4100·2023-01-11 13:20
閱讀 2704·2023-01-11 13:20
閱讀 1385·2023-01-11 13:20
閱讀 3595·2023-01-11 13:20