AUTO_INCREMENT的是隨著你數(shù)據(jù)庫(kù)里面數(shù)據(jù)項(xiàng)的增加而自動(dòng)增加值的一個(gè)屬性,一般在像MYSQL這種數(shù)據(jù)庫(kù)里,主鍵一般都是用ID號(hào),比如學(xué)生的學(xué)號(hào),公民的身份證號(hào)等,這種ID號(hào)是唯一的,是可以唯一標(biāo)識(shí)數(shù)據(jù)庫(kù)里面的一項(xiàng)數(shù)據(jù)的,而這種ID號(hào)并不需要自己動(dòng)手去一個(gè)個(gè)輸入,直接通過(guò)設(shè)置AUTO_INCREMENT就可以從小到大自動(dòng)生成了。
創(chuàng)新互聯(lián)主營(yíng)遂川網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都App制作,遂川h5微信小程序搭建,遂川網(wǎng)站營(yíng)銷(xiāo)推廣歡迎遂川等地區(qū)企業(yè)咨詢(xún)
擴(kuò)展資料:
如果希望在每次插入新記錄時(shí),自動(dòng)地創(chuàng)建主鍵字段的值??梢栽诒碇袆?chuàng)建一個(gè) auto-increment 字段。MySQL 使用 AUTO_INCREMENT 關(guān)鍵字來(lái)執(zhí)行 auto-increment 任務(wù)。默認(rèn)地AUTO_INCREMENT 的開(kāi)始值是 1,每條新記錄遞增 1。
主鍵又稱(chēng)主關(guān)鍵字,主關(guān)鍵字(primary key)是表中的一個(gè)或多個(gè)字段,它的值用于唯一地標(biāo)識(shí)表中的某一條記錄。在兩個(gè)表的關(guān)系中,主關(guān)鍵字用來(lái)在一個(gè)表中引用來(lái)自于另一個(gè)表中的特定記錄。主關(guān)鍵字是一種唯一關(guān)鍵字,表定義的一部分。一個(gè)表的主鍵可以由多個(gè)關(guān)鍵字共同組成,并且主關(guān)鍵字的列不能包含空值。主關(guān)鍵字是可選的,并且可在 CREATE TABLE 或 ALTER TABLE 語(yǔ)句中定義。
隨著 MySQL 8.0.16 的發(fā)布,我們?yōu)?MGR 添加了一些功能,以增強(qiáng)其高可用性。其中一個(gè)功能是能夠在某些情況下啟用已離開(kāi)組的成員自動(dòng)重新加入,而無(wú)需用戶(hù)干預(yù)。
為了理解這個(gè)功能的好處以及如何使用它,我們將快速查看它背后的概念以及它首先存在的動(dòng)機(jī)。
介紹
MGR 允許 MySQL 用戶(hù)輕松管理高可用組,并完成保證系統(tǒng)高可用所需的所有特征,例如容錯(cuò)或故障檢測(cè)。
MGR 中提供的基本保證之一是該組呈現(xiàn)給用戶(hù)的是一個(gè)不可分割的整體,這意味著一旦成員加入或離開(kāi)該組,該更改將立即被其他成員得知。默認(rèn)情況下,組內(nèi)的數(shù)據(jù)本身最終是一致的,盡管可以被修改。為了實(shí)現(xiàn)這種保證,MGR 使用組成員服務(wù),以及通過(guò)一致性算法檢測(cè)有沖突的事務(wù)并中止它們。MGR 的這一方面超出了本文的范圍,與成員自動(dòng)重新加入功能并不完全相關(guān),本文不作贅述。
組內(nèi)新成員必須符合一些條件。其中新成員需要在事務(wù)方面趕上組進(jìn)度(是通過(guò)選擇組內(nèi)一個(gè)成員來(lái)將已處理的事務(wù)流式傳輸給他,在 MGR 中稱(chēng)為“捐贈(zèng)”)。最后,只要在此“分布式恢復(fù)”過(guò)程中沒(méi)有遇到任何錯(cuò)誤,組內(nèi)新成員將被聲明為 ONLINE 狀態(tài)。
MGR 依靠組通信層 (GCS) 來(lái)管理組。該層實(shí)現(xiàn)了用于解決沖突事務(wù)的一致性算法,并強(qiáng)制執(zhí)行一些通信特性。對(duì)于實(shí)現(xiàn)前面提到的組的不可分割視圖,這些特性至關(guān)重要,如消息的總順序、安全傳遞或視圖同步等。
GCS 需要能夠檢測(cè)組中哪些成員失效或看起來(lái)失效。一旦這些成員被檢測(cè)為失效,就將其從該組中移除,以便保持該組正常使用。為此 GCS 在每個(gè)成員中引入了一個(gè)故障檢測(cè)器,用于分析組內(nèi)交換的消息。如果它在一段時(shí)間內(nèi)沒(méi)有收到來(lái)自指定成員的消息,則故障檢測(cè)器將對(duì)該成員產(chǎn)生“懷疑”,并認(rèn)為該成員可能已經(jīng)失效。成員從“懷疑”到真正失效的等待時(shí)間是可以配置的。
重新加入成員存在的問(wèn)題
我們已經(jīng)了解 MGR 必須為了高可用提供的策略,以及它如何實(shí)現(xiàn),接下來(lái)請(qǐng)看示例:
一個(gè)小組由三個(gè)成員組成,其中一個(gè)成員偶爾會(huì)遇到丟失數(shù)據(jù)包、斷連或者其它導(dǎo)致無(wú)法解決的錯(cuò)誤情況的影響組內(nèi)通信。還要考慮這些錯(cuò)誤持續(xù)時(shí)間超過(guò)?group_replication_member_expel_timeout的值。
其中一個(gè)組員發(fā)生故障,小組的其他成員將決定踢出該成員。問(wèn)題是,一旦該成員重新入組,他將被組驅(qū)逐加入失敗,需要通過(guò)手動(dòng)干預(yù)。
如果該成員的驅(qū)逐超時(shí)屬性設(shè)置不為 0,則它將在被驅(qū)逐前等待滿(mǎn)足該時(shí)間量(將超時(shí)設(shè)置為 0 意味著他將永遠(yuǎn)等待)。超時(shí)后成員將被驅(qū)逐并重新建立連接,并且無(wú)法重新加入舊組,需要再次手動(dòng)干預(yù)。
于此,當(dāng)存在網(wǎng)絡(luò)故障時(shí),顯然需要手動(dòng)干預(yù)。
在 MySQL 8.0.16 中,我們引入了自動(dòng)重新加入組的功能,一旦成員被驅(qū)逐出組,它就會(huì)自動(dòng)嘗試重新加入該組,直到達(dá)到預(yù)設(shè)的次數(shù)為止。有時(shí)每次重試之間至少等待5分鐘。
如何啟動(dòng)自動(dòng)重新加入?
可以通過(guò)將group_replication_autorejoin_tries設(shè)置為所需的重試次數(shù)來(lái)開(kāi)啟并使用自動(dòng)重新加入功能。
SET GLOBAL group_replication_autorejoin_tries = 3
默認(rèn)值為 0,表示服務(wù)器禁用自動(dòng)重新加入。
如何驗(yàn)證自動(dòng)重新加入?
與 MySQL 中的許多功能一樣,自動(dòng)重新加入過(guò)程是可以監(jiān)測(cè)的。自動(dòng)重新加入的可檢測(cè)性依賴(lài)于性能模式基礎(chǔ)架構(gòu),階段式收集有關(guān)數(shù)據(jù)。
他們獲取以下信息:
事件發(fā)生的線程ID(THREAD_ID)
活動(dòng)名稱(chēng)(EVENT_NAME)
起止時(shí)間戳以及事件的總持續(xù)時(shí)間(TIMER_START,TIMER_END 和 TIMER_WAIT)
在事件停止之前完成的工作單位和預(yù)估工作單位(WORK_COMPLETED,WORK_ESTIMATED)
因此,當(dāng)自動(dòng)重新加入過(guò)程開(kāi)始時(shí),它將在performance schema中注冊(cè)一個(gè)名為“stage / grouprpl / Undergoing auto-rejoinprocedure”的事件。使用表performance_schema.events_stage_current,??performance_schema.events_stages_summary_global_by_event_name和performance_schema.events_stages_history_long我們可以觀察到以下內(nèi)容:
是否正在進(jìn)行自動(dòng)重新加入程序
到目前為止,已經(jīng)減少重試的次數(shù)
直到下一次重試的估計(jì)剩余時(shí)間
自動(dòng)重新加入過(guò)程狀態(tài)
可以通過(guò)過(guò)濾包含“auto-rejoin”字符串的活動(dòng)事件來(lái)查找自動(dòng)重新加入過(guò)程狀態(tài)(即,是否正在進(jìn)行):
SELECT COUNT(*) FROM performance_schema.events_stages_current
WHERE EVENT_NAME LIKE '%auto-rejoin%';
COUNT(*)
1
查詢(xún)結(jié)果存在,證明服務(wù)器上運(yùn)行了自動(dòng)重新加入過(guò)程。
到目前為止的重試次數(shù)
如果正在進(jìn)行自動(dòng)重新加入程序,我們可以通過(guò)選擇階段事件上的工作單元數(shù)來(lái)檢查到目前為止嘗試的重試次數(shù):
SELECT WORK_COMPLETED FROM performance_schema.events_stages_current WHERE
EVENT_NAME LIKE '%auto-rejoin%';
WORK_COMPLETED
1
在這個(gè)例子中,到目前為止只有一次嘗試。
預(yù)計(jì)到下次重試的剩余時(shí)間
在每次重新加入嘗試之間,服務(wù)器將處于 5 分鐘的可中斷睡眠中。 重新加入嘗試直到成功或失敗之間的時(shí)間是無(wú)法估計(jì)的。 因此,為了粗略估計(jì)剩余時(shí)間,我們可以將到目前為止嘗試的重試次數(shù)乘以 5 分鐘,并減去到目前為止的階段事件所花費(fèi)的時(shí)間,以估計(jì)我們還需要多長(zhǎng)時(shí)間:
SELECT (300.0 - ((TIMER_WAIT*10e-12) - 300.0 * num_retries)) AS time_remaining FROM
(SELECT COUNT(*) - 1 AS num_retries FROM
performance_schema.events_stages_current WHERE EVENT_NAME LIKE '%auto-rejoin%') AS T,
performance_schema.events_stages_current WHERE EVENT_NAME LIKE '%auto-rejoin%';
time_remaining
30.0
所以在這個(gè)例子中,在下一次重新加入之前還有 30 秒。注意性能模式表中的所有時(shí)間記帳都以微秒精度保持,因此我們將 TIMER_WAIT 縮放為秒。
使用自動(dòng)重新加入與驅(qū)逐超時(shí)的權(quán)衡
到目前為止,在這篇文章中我們只關(guān)注自動(dòng)重新加入。實(shí)際上,有兩種不同的方法可以實(shí)現(xiàn)離開(kāi)組的成員的重新加入:
設(shè)置自動(dòng)重新加入嘗試次數(shù)來(lái)實(shí)現(xiàn)自動(dòng)重新加入
設(shè)置該成員的驅(qū)逐超時(shí)時(shí)間然后配合手動(dòng)干預(yù)
能有延緩刪除組內(nèi)可疑成員,并且如果配置為足夠長(zhǎng)的驅(qū)逐超時(shí)時(shí)間,則增加了重新建立連接的機(jī)會(huì),再次與組進(jìn)行交互。
雖然這兩個(gè)功能實(shí)現(xiàn)了相同的目標(biāo),但它們的工作方式是不同的,并且需要權(quán)衡。通過(guò)使用驅(qū)逐超時(shí),您可以維護(hù)組中可疑的成員,其缺點(diǎn)是您無(wú)法添加或刪除成員或選擇新的主機(jī)。如果通過(guò)使用自動(dòng)重新加入,該成員將不再是該組的正常組員,將保持在 superreadonly 模式,直到重新加入該組。但在此期間,重新加入成員的同步舊數(shù)據(jù)的可能性將增加。自動(dòng)重新加入過(guò)程可監(jiān)控,而驅(qū)逐超時(shí)不是真正可監(jiān)控的。
所以,總結(jié)一下:
驅(qū)逐超時(shí)的優(yōu)點(diǎn)
- 該成員一直在該組內(nèi)
- 可能更適合足夠小的網(wǎng)絡(luò)故障
驅(qū)逐超時(shí)的缺點(diǎn)
- 在懷疑某個(gè)成員時(shí),無(wú)法在該組上添加/刪除成員
- 在懷疑某個(gè)成員時(shí),無(wú)法選擇新的主機(jī)
- 您無(wú)法監(jiān)控此過(guò)程
自動(dòng)重新加入的優(yōu)點(diǎn)
- 該組將在沒(méi)有重新加入成員的情況下運(yùn)行,您可以添加/刪除成員并選擇新的主機(jī)
- 您可以監(jiān)控該過(guò)程
自動(dòng)重新加入的缺點(diǎn)
- 您增加了重新加入成員上過(guò)時(shí)讀取的可能性
- 可能不適合足夠小的網(wǎng)絡(luò)故障
總而言之,我從啟用自動(dòng)重新加入中獲得了什么?
通過(guò)啟用自動(dòng)重新加入,您可以減少對(duì)MySQL實(shí)例的手動(dòng)干預(yù)的需要。您的系統(tǒng)
更加適應(yīng)瞬間網(wǎng)絡(luò)故障,同時(shí)滿(mǎn)足對(duì)容錯(cuò)性和高可用的保證。
摘要
我們引入了一個(gè)名為group_replication_autorejoin_tries的新系統(tǒng)變量,允許用戶(hù)設(shè)置 MGR 成員在被驅(qū)逐或與組的大多數(shù)人失去聯(lián)系后嘗試重新加入組的次數(shù)。
默認(rèn)情況下,此自動(dòng)重新加入過(guò)程處于關(guān)閉狀態(tài)。它能幫助用戶(hù)在面對(duì)瞬間網(wǎng)絡(luò)故障時(shí)避免對(duì) MGR 成員進(jìn)行手動(dòng)干預(yù)。
我舉個(gè)小例子給你簡(jiǎn)單解釋一下。
例:
CREATE TABLE TABLE_1
(
ID INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
// ID列為無(wú)符號(hào)整型,該列值不可以為空,并不可以重復(fù),而且自增。
NAME VARCHAR(5) NOT NULL
)
AUTO_INCREMENT = 100;(ID列從100開(kāi)始自增)
PRIMAPY是主鍵的意思,表示定義的該列值在表中是唯一的意思,不可以有重復(fù)。
UNSIGNED是無(wú)符號(hào)的意思,代表該字段沒(méi)有正負(fù)。
AUTO_INCREMENT可以理解為自動(dòng)遞增的意思,每增加一條記錄,值會(huì)自動(dòng)加1。(例如在上面的例子中,ID列每增加一條記錄,便會(huì)從100自增) 。
我想通過(guò)上面的例子,你應(yīng)該可以理解一些了,不明白再問(wèn)我。謝謝。