亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL?Online?DDL原理解析

 更新時(shí)間:2024年10月10日 12:28:59   作者:碼到三十五  
MySQL原生OnlineDDL通過允許在表可用的情況下執(zhí)行DDL操作,大大提升了數(shù)據(jù)庫(kù)的可用性,通過不同的執(zhí)行算法,如COPY、INPLACE和INSTANT,它支持在線修改數(shù)據(jù)庫(kù)結(jié)構(gòu),優(yōu)化了數(shù)據(jù)庫(kù)維護(hù)流程,本文給大家介紹MySQL?Online?DDL原理,感興趣的朋友跟隨小編一起看看吧

一、背景與意義

在傳統(tǒng)的數(shù)據(jù)庫(kù)系統(tǒng)中,執(zhí)行DDL操作時(shí)通常需要鎖定表,以防止數(shù)據(jù)不一致。然而,這種鎖定會(huì)導(dǎo)致表在DDL操作期間不可用,從而影響數(shù)據(jù)庫(kù)的可用性。MySQL原生Online DDL解決了這個(gè)問題,它允許DDL操作在表仍然可用時(shí)執(zhí)行,大大提高了數(shù)據(jù)庫(kù)的可用性,特別是對(duì)于需要24/7高可用性的應(yīng)用來說,這是一個(gè)重要的特性。

二、工作機(jī)制

MySQL原生Online DDL的工作機(jī)制涉及多個(gè)步驟和內(nèi)部原理:

1. 準(zhǔn)備階段

  • 檢查與評(píng)估:在執(zhí)行DDL操作之前,MySQL會(huì)進(jìn)行一系列的檢查和評(píng)估工作。這包括驗(yàn)證DDL操作的語(yǔ)法正確性、檢查用戶權(quán)限以及評(píng)估所需資源等。
  • 選擇執(zhí)行策略:根據(jù)DDL操作的類型和表的結(jié)構(gòu),MySQL會(huì)選擇一個(gè)合適的執(zhí)行策略。這通常涉及決定是使用COPY算法、INPLACE算法還是INSTANT算法。

2. 執(zhí)行DDL操作

COPY算法

  • 創(chuàng)建臨時(shí)表:首先,MySQL會(huì)創(chuàng)建一個(gè)與原始表結(jié)構(gòu)相似的新臨時(shí)表。
  • 數(shù)據(jù)拷貝:接著,原始表中的數(shù)據(jù)會(huì)被逐行拷貝到新的臨時(shí)表中。這個(gè)過程可能需要一些時(shí)間,具體取決于表的大小和系統(tǒng)的性能。
  • 重命名與替換:數(shù)據(jù)拷貝完成后,臨時(shí)表會(huì)被重命名為原始表的名字,從而替換掉原始表。在這個(gè)過程中,原始表會(huì)被加上寫鎖,以阻止對(duì)數(shù)據(jù)進(jìn)行修改,確保數(shù)據(jù)的一致性。

INPLACE算法

  • 直接修改:與COPY算法不同,INPLACE算法直接在原始表上進(jìn)行修改,無需創(chuàng)建臨時(shí)表和拷貝數(shù)據(jù)。
  • 記錄DML操作:在DDL操作執(zhí)行期間,如果有DML操作(如INSERT、UPDATE、DELETE)嘗試修改表,這些操作會(huì)被記錄下來。
  • 應(yīng)用DML更改:DDL操作完成后,之前記錄的DML更改會(huì)被應(yīng)用到表上,確保數(shù)據(jù)的完整性和一致性。

INSTANT算法

  • 元數(shù)據(jù)修改:對(duì)于某些簡(jiǎn)單的DDL操作(如修改表的默認(rèn)字符集),INSTANT算法可以直接修改數(shù)據(jù)字典中的元數(shù)據(jù),而無需對(duì)表數(shù)據(jù)進(jìn)行任何更改。
  • 無鎖操作:由于只修改元數(shù)據(jù),因此這種算法可以在不鎖定表的情況下完成,實(shí)現(xiàn)了真正的“瞬間”完成DDL操作。

3. 完成與清理

  • 釋放資源:DDL操作完成后,系統(tǒng)會(huì)釋放所有在操作過程中分配的資源,如臨時(shí)表、內(nèi)存等。
  • 更新統(tǒng)計(jì)信息:MySQL會(huì)更新與表相關(guān)的統(tǒng)計(jì)信息,以便優(yōu)化器能夠更好地制定查詢計(jì)劃。
  • 通知與日志記錄:操作完成后,系統(tǒng)會(huì)生成相應(yīng)的日志記錄,以便在必要時(shí)進(jìn)行恢復(fù)或?qū)徲?jì)。同時(shí),也可能通過某種機(jī)制(如觸發(fā)器)通知應(yīng)用程序DDL操作的完成。

MySQL原生Online DDL通過不同的算法和策略來實(shí)現(xiàn)在線修改數(shù)據(jù)庫(kù)結(jié)構(gòu)的目標(biāo),從而提高了數(shù)據(jù)庫(kù)的可用性和靈活性。這些工作原理確保了即使在執(zhí)行DDL操作時(shí),數(shù)據(jù)庫(kù)仍然能夠處理正常的DML操作,減少了停機(jī)時(shí)間和維護(hù)成本。

三、實(shí)現(xiàn)原理與優(yōu)化

在線DDL的核心實(shí)現(xiàn)原理涉及幾個(gè)關(guān)鍵環(huán)節(jié),同時(shí)也有一些關(guān)鍵的優(yōu)化策略:

  • 構(gòu)建臨時(shí)表:為了不影響原表的正常讀寫,系統(tǒng)會(huì)創(chuàng)建一個(gè)具備新結(jié)構(gòu)的臨時(shí)表。這一步驟為后續(xù)的DDL操作提供了基礎(chǔ)。
  • 數(shù)據(jù)遷移與實(shí)時(shí)同步:舊表中的數(shù)據(jù)會(huì)被高效地遷移到臨時(shí)表中,同時(shí)確保數(shù)據(jù)的實(shí)時(shí)同步。這種遷移策略旨在保障DDL過程中數(shù)據(jù)的完整性和一致性,避免數(shù)據(jù)丟失或損壞。
  • 變更追蹤與重播:利用日志機(jī)制,系統(tǒng)會(huì)追蹤DDL執(zhí)行期間舊表上的數(shù)據(jù)變更,并將這些變更實(shí)時(shí)重播到臨時(shí)表中。這一優(yōu)化確保了數(shù)據(jù)在DDL操作完成后的準(zhǔn)確性。
  • 無縫切換:當(dāng)DDL操作完成且數(shù)據(jù)完全同步后,數(shù)據(jù)庫(kù)引擎會(huì)在合適的時(shí)機(jī)將臨時(shí)表提升為新表,從而實(shí)現(xiàn)無縫切換。此后,所有的讀寫操作都將基于新表進(jìn)行。

四、使用場(chǎng)景與優(yōu)勢(shì)

MySQL原生Online DDL適用于多種場(chǎng)景,如添加或刪除列、修改數(shù)據(jù)類型、添加或刪除索引等。這些操作都可以在不中斷服務(wù)的情況下完成,大大提高了數(shù)據(jù)庫(kù)的靈活性和可用性。此外,由于Online DDL減少了停機(jī)時(shí)間,因此也降低了維護(hù)成本和數(shù)據(jù)丟失的風(fēng)險(xiǎn)。

五、使用約束與注意事項(xiàng)

盡管MySQL 5.7的在線DDL帶來了諸多便利,但在實(shí)際使用中仍需注意以下幾點(diǎn):

  • 操作支持范圍:并非所有類型的DDL操作都支持在線執(zhí)行。某些特定操作可能仍需要鎖定整張表,因此在執(zhí)行前需確認(rèn)操作類型。
  • 資源占用:DDL操作期間可能會(huì)顯著增加系統(tǒng)資源的消耗,特別是在數(shù)據(jù)遷移和同步階段。因此,在高負(fù)載環(huán)境下應(yīng)謹(jǐn)慎規(guī)劃并執(zhí)行此類操作。
  • 測(cè)試與驗(yàn)證:為確保數(shù)據(jù)的完整性和業(yè)務(wù)的連續(xù)性,執(zhí)行在線DDL之前應(yīng)進(jìn)行充分的測(cè)試和驗(yàn)證。這包括但不限于數(shù)據(jù)的備份、恢復(fù)以及一致性檢查等步驟。

六、鎖在Online DDL中的作用

在Online DDL過程中,鎖主要用于確保數(shù)據(jù)的一致性。不同類型的鎖對(duì)表的可訪問性有不同的影響:

  • 共享鎖(S鎖):允許多個(gè)事務(wù)讀取同一資源,但不允許寫入。在Online DDL中,這可能用于允許讀取操作繼續(xù)進(jìn)行,同時(shí)阻止寫入操作。
  • 排他鎖(X鎖):阻止其他事務(wù)讀取或?qū)懭胭Y源。在DDL操作中,如果需要修改表的結(jié)構(gòu)或數(shù)據(jù),則可能需要使用排他鎖。

ALGORITHM和LOCK選項(xiàng)

  • 在MySQL中,你可以通過ALGORITHMLOCK關(guān)鍵字來控制DDL操作的行為。

ALGORITHM選項(xiàng)

  • INPLACE:這個(gè)選項(xiàng)指示MySQL直接在原表上進(jìn)行修改,而不是創(chuàng)建一個(gè)新表。這通??梢詼p少鎖的使用和時(shí)間,從而提高并發(fā)性。但是,并非所有的DDL操作都支持INPLACE算法。
  • COPY:這個(gè)選項(xiàng)告訴MySQL創(chuàng)建一個(gè)新表,將原表的數(shù)據(jù)復(fù)制到新表中,然后在新表上執(zhí)行DDL操作。完成后,新表會(huì)替換原表。這個(gè)過程中,原表通常會(huì)被鎖定,以防止數(shù)據(jù)不一致。COPY算法通常需要更多的時(shí)間和資源。
  • DEFAULT:如果不指定ALGORITHM選項(xiàng),MySQL將選擇默認(rèn)的行為。這通常是嘗試使用INPLACE算法,如果不可能,則回退到COPY算法。 LOCK選項(xiàng)
  • NONE:這個(gè)選項(xiàng)指示MySQL在執(zhí)行DDL操作時(shí)不要對(duì)表加鎖(如果可能的話)。但是,如果DDL操作需要保證數(shù)據(jù)的一致性,MySQL可能會(huì)忽略這個(gè)選項(xiàng)并加鎖。
  • SHARED:允許讀取操作繼續(xù)進(jìn)行,但阻止寫入操作。
  • EXCLUSIVE:阻止讀取和寫入操作。這是最強(qiáng)的鎖類型,用于確保DDL操作期間數(shù)據(jù)的一致性。

如何使用這些選項(xiàng)

  • 當(dāng)你想要執(zhí)行一個(gè)DDL操作時(shí),你可以通過添加ALGORITHMLOCK選項(xiàng)來控制操作的行為。例如:
ALTER TABLE tbl_name ADD COLUMN col_name col_type, ALGORITHM=INPLACE, LOCK=NONE;

這條命令嘗試在原地(INPLACE)添加一個(gè)新列,并且盡量不使用鎖(LOCK=NONE)。但是,需要注意的是,如果MySQL判斷無法保證數(shù)據(jù)的一致性而不使用鎖,它可能會(huì)忽略這些選項(xiàng)。

可以通過如下的SQL語(yǔ)句查看是否有事務(wù)和鎖等信息。

select * from information_schema.innodb_locks;
select * from information_schema.innodb_trx;
select * from information_schema.innodb_lock_waits;
select * from information_schema.processlist;

注意事項(xiàng)

不是所有的DDL操作都支持所有的ALGORITHM和LOCK組合。在執(zhí)行DDL操作之前,最好查閱MySQL的官方文檔以了解具體的支持情況。

即使指定了LOCK=NONE,MySQL也可能在必要時(shí)自動(dòng)加鎖以確保數(shù)據(jù)的一致性。因此,這些選項(xiàng)應(yīng)被視為指導(dǎo)性的,而不是強(qiáng)制性的。

更多online DDL原理,請(qǐng)移步 : Mysql Online DDL的使用詳解

到此這篇關(guān)于MySQL Online DDL原理解讀的文章就介紹到這了,更多相關(guān)MySQL Online DDL原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 數(shù)據(jù)庫(kù)查詢哪個(gè)對(duì)像里面包含什么字段方法語(yǔ)句

    數(shù)據(jù)庫(kù)查詢哪個(gè)對(duì)像里面包含什么字段方法語(yǔ)句

    在本篇文章里小編給大家整理的關(guān)于數(shù)據(jù)庫(kù)查詢哪個(gè)對(duì)像里面包含什么字段方法語(yǔ)句有需要的朋友們可以學(xué)習(xí)下。
    2019-08-08
  • MySQL深分頁(yè)問題的原因及解決方案

    MySQL深分頁(yè)問題的原因及解決方案

    MySQL?作為最受歡迎的開源關(guān)系數(shù)據(jù)庫(kù)之一,被廣泛用于各種規(guī)模的應(yīng)用程序中,分頁(yè)是一種常見的數(shù)據(jù)檢索技術(shù),它允許用戶在大量數(shù)據(jù)中瀏覽和檢索信息,當(dāng)涉及到“深分頁(yè)”時(shí),即查詢大量數(shù)據(jù)后的頁(yè)面時(shí),MySQL?的性能可能會(huì)顯著下降,本文介紹了MySQL深分頁(yè)問題的原因及解決方案
    2024-09-09
  • MySQL進(jìn)行JSON查詢的詳細(xì)教程

    MySQL進(jìn)行JSON查詢的詳細(xì)教程

    在MySQL中,一般會(huì)使用特定的 JSON 路徑表達(dá)式語(yǔ)法來導(dǎo)航和提取 JSON 文檔中的數(shù)據(jù),本文將為大家詳細(xì)介紹一下具體的查詢方法,希望對(duì)大家有所幫助
    2025-03-03
  • MySQL 如何設(shè)計(jì)統(tǒng)計(jì)數(shù)據(jù)表

    MySQL 如何設(shè)計(jì)統(tǒng)計(jì)數(shù)據(jù)表

    有些時(shí)候,改進(jìn)數(shù)據(jù)表查詢性能的最佳方式是在同一張數(shù)據(jù)表中冗余一些繼承的數(shù)據(jù)。然而,有些時(shí)候需要新建完全獨(dú)立的統(tǒng)計(jì)或緩存數(shù)據(jù)表,尤其是在需要反復(fù)查詢的需求情況下。如果業(yè)務(wù)允許一些時(shí)間上的誤差的話,那么這種方式會(huì)更好。
    2021-06-06
  • 簡(jiǎn)單了解標(biāo)準(zhǔn)SQL的update語(yǔ)句三種用法

    簡(jiǎn)單了解標(biāo)準(zhǔn)SQL的update語(yǔ)句三種用法

    這篇文章主要介紹了簡(jiǎn)單了解標(biāo)準(zhǔn)SQL的update語(yǔ)句三種用法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下
    2019-06-06
  • linux忘記mysql密碼處理方法

    linux忘記mysql密碼處理方法

    這篇文章主要為大家介紹下linux忘記mysql密碼處理方法,需要的朋友可以參考下。
    2011-08-08
  • MySQL配置sql_mode的參數(shù)屬性作用

    MySQL配置sql_mode的參數(shù)屬性作用

    ,通過設(shè)置sql_mode,可以完成不同嚴(yán)格程度的數(shù)據(jù)校驗(yàn),本文主要介紹了MySQL配置sql_mode的作用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • Windows下安裝MySQL 5.7.17壓縮版中遇到的坑

    Windows下安裝MySQL 5.7.17壓縮版中遇到的坑

    最近發(fā)現(xiàn)原來好端端的MySQL突然間不能用了,無奈只能重新下載了最新的MySQL 5.7.17 Community 壓縮版 for Windows 64-bit。但在安裝過程中遇到了一些意外的問題,通過查找相關(guān)資料也解決了,所以想著總結(jié)出來,方便需要的朋友們可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • MySQL 查詢樹結(jié)構(gòu)方式

    MySQL 查詢樹結(jié)構(gòu)方式

    今天小編就為大家分享一篇MySQL 查詢樹結(jié)構(gòu)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • MySQL中BIGINT數(shù)據(jù)類型如何存儲(chǔ)整數(shù)值

    MySQL中BIGINT數(shù)據(jù)類型如何存儲(chǔ)整數(shù)值

    mysql數(shù)據(jù)庫(kù)設(shè)計(jì),其中對(duì)于數(shù)據(jù)性能優(yōu)化,字段類型考慮很重要,下面這篇文章主要給大家介紹了關(guān)于MySQL中BIGINT數(shù)據(jù)類型如何存儲(chǔ)整數(shù)值的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10

最新評(píng)論