最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL如何保證備份數(shù)據(jù)的一致性詳解

 更新時間:2022年05月01日 11:33:09   作者:_江南一點雨  
在高并發(fā)的場景下,大量的請求直接訪問Mysql很容易造成性能問題,下面這篇文章主要給大家介紹了關(guān)于MySQL如何保證備份數(shù)據(jù)一致性的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下

前言

為了數(shù)據(jù)安全,數(shù)據(jù)庫需要定期備份,這個大家都懂,然而數(shù)據(jù)庫備份的時候,最怕寫操作,因為這個最容易導(dǎo)致數(shù)據(jù)的不一致,松哥舉一個簡單的例子大家來看下:

假設(shè)在數(shù)據(jù)庫備份期間,有用戶下單了,那么可能會出現(xiàn)如下問題:

  • 庫存表扣庫存。
  • 備份庫存表。
  • 備份訂單表數(shù)據(jù)。
  • 訂單表添加訂單。
  • 用戶表扣除賬戶余額。
  • 備份用戶表。

如果按照上面這樣的邏輯執(zhí)行,備份文件中的訂單表就少了一條記錄。將來如果使用這個備份文件恢復(fù)數(shù)據(jù)的話,就少了一條記錄,造成數(shù)據(jù)不一致。

為了解決這個問題,MySQL 中提供了很多方案,我們來逐一進行講解并分析其優(yōu)劣。

1. 全庫只讀

要解決這個問題,我們最容易想到的辦法就是在數(shù)據(jù)庫備份期間設(shè)置數(shù)據(jù)庫只讀,不能寫,這樣就不用擔(dān)心數(shù)據(jù)不一致了,設(shè)置全庫只讀的辦法也很簡單,首先我們執(zhí)行如下 SQL 先看看對應(yīng)變量的值:

show variables like 'read_only';

可以看到,默認情況下,read_only 是 OFF,即關(guān)閉狀態(tài),我們先把它改為 ON,執(zhí)行如下 SQL:

set global read_only=1;

1 表示 ON,0 表示 OFF,執(zhí)行結(jié)果如下:

這個 read_only 對 super 用戶無效,所以設(shè)置完成后,接下來我們退出來這個會話,然后創(chuàng)建一個不包含 super 權(quán)限的用戶,用新用戶登錄,登錄成功之后,執(zhí)行一個插入 SQL,結(jié)果如下:

可以看到,這個錯誤信息中說,現(xiàn)在的 MySQL 是只讀的(只能查詢),不能執(zhí)行當(dāng)前 SQL。

加了只讀屬性,就不用擔(dān)心備份的時候發(fā)生數(shù)據(jù)不一致的問題了。

但是 read_only 我們通常用來標識一個 MySQL 實例是主庫還是從庫:

  • read_only=0,表示該實例為主庫。數(shù)據(jù)庫管理員 DBA 可能每隔一段時間就會對該實例寫入一些業(yè)務(wù)無關(guān)的數(shù)據(jù)來判斷主庫是否可寫,是否可用,這就是常見的探測主庫實例是否活著的。
  • read_only=1,表示該實例為從庫。每隔一段時間探活,往往只會對從庫進行讀操作,比如select 1;這樣進行探活從庫。

所以,read_only 這個屬性其實并不適合用來做備份,而且如果使用了 read_only 屬性將整個庫設(shè)置為 readonly 之后,如果客戶端發(fā)生異常,則數(shù)據(jù)庫就會一直保持 readonly 狀態(tài),這樣會導(dǎo)致整個庫長時間處于不可寫狀態(tài),風(fēng)險很高。

因此這種方案不合格。

2. 全局鎖

全局鎖,顧名思義,就是把整個庫鎖起來,鎖起來的庫就不能增刪改了,只能讀了。

那么我們看看怎么使用全局鎖。MySQL 提供了一個加全局讀鎖的方法,命令是 flush tables with read lock (FTWRL)。當(dāng)你需要讓整個庫處于只讀狀態(tài)的時候,可以使用這個命令,之后其他線程的增刪改等操作就會被阻塞。

從圖中可以看到,使用 flush tables with read lock; 指令可以鎖定表;使用 unlock tables; 指令則可以完成解鎖操作(會話斷開時也會自動解鎖)。

和第一小節(jié)的方案相比,F(xiàn)TWRL 有一點進步,即:執(zhí)行 FTWRL 命令之后如果客戶端發(fā)生異常斷開,那么 MySQL 會自動釋放這個全局鎖,整個庫回到可以正常更新的狀態(tài),而不會一直處于只讀狀態(tài)。

但是?。?!

加了全局鎖,就意味著整個數(shù)據(jù)庫在備份期間都是只讀狀態(tài),那么在數(shù)據(jù)庫備份期間,業(yè)務(wù)就只能停擺了。

所以這種方式也不是最佳方案。

3. 事務(wù)

不知道小伙伴們是否還記得松哥之前和大家分享的數(shù)據(jù)庫的隔離級別,四種隔離級別中有一個是可重復(fù)讀(REPEATABLE READ),這也是 MySQL 默認的隔離級別。

在這個隔離級別下,如果用戶在另外一個事務(wù)中執(zhí)行同條 SELECT 語句數(shù)次,結(jié)果總是相同的。(因為正在執(zhí)行的事務(wù)所產(chǎn)生的數(shù)據(jù)變化不能被外部看到)。

換言之,在 InnoDB 這種支持事務(wù)的存儲引擎中,那么我們就可以在備份數(shù)據(jù)庫之前先開啟事務(wù),此時會先創(chuàng)建一致性視圖,然后整個事務(wù)執(zhí)行期間都在用這個一致性視圖,而且由于 MVCC 的支持,備份期間業(yè)務(wù)依然可以對數(shù)據(jù)進行更新操作,并且這些更新操作不會被當(dāng)前事務(wù)看到。

在可重復(fù)讀的隔離級別下,即使其他事務(wù)更新了表數(shù)據(jù),也不會影響備份數(shù)據(jù)庫的事務(wù)讀取結(jié)果,這就是事務(wù)四大特性中的隔離性,這樣備份期間備份的數(shù)據(jù)一直是在開啟事務(wù)時的數(shù)據(jù)。

具體操作也很簡單,使用 mysqldump 備份數(shù)據(jù)庫的時候,加上 -–single-transaction 參數(shù)即可。

為了看到 -–single-transaction 參數(shù)的作用,我們可以先開啟 general_log,general_log 即 General Query Log,它記錄了 MySQL 服務(wù)器的操作。當(dāng)客戶端連接、斷開連接、接收到客戶端的 SQL 語句時,會向 general_log 中寫入日志,開啟 general_log 會損失一定的性能,但是在開發(fā)、測試環(huán)境下開啟日志,可以幫忙我們加快排查出現(xiàn)的問題。

通過如下查詢我們可以看到,默認情況下 general_log 并沒有開啟:

我們可以通過修改配置文件 my.cnf(Linux)/my.ini(Windows),在 mysqld 下面增加或修改(如已存在配置項)general_log 的值為1,修改后重啟 MySQL 服務(wù)即可生效。

也可以通過在 MySQL 終端執(zhí)行 set global general_log = ON 來開啟 general log,此方法可以不用重啟 MySQL。

開啟之后,默認日志的目錄是 mysql 的 data 目錄,文件名默認為 主機名.log。

接下來,我們先來執(zhí)行一個不帶 -–single-transaction 參數(shù)的備份,如下:

mysqldump -h localhost -uroot -p123 test08 > test08.sql

大家注意默認的 general_log 的位置。

接下來我們再來加上 -–single-transaction 參數(shù)看看:

mysqldump -h localhost -uroot -p123 --single-transaction test08 > test08.sql

大家看我藍色選中的部分,可以看到,確實先開啟了事務(wù),然后才開始備份的,對比不加 -–single-transaction 參數(shù)的日志,多了開啟事務(wù)這一部分。

4. 小結(jié)

總結(jié)一下,加事務(wù)備份似乎是一個不錯的選擇,不過這個方案也有一個局限性,那就是只適用于支持事務(wù)的引擎如 InnoDB,對于 MyISAM 這樣的存儲引擎,如果要備份,還是乖乖的使用全局鎖吧。

到此這篇關(guān)于MySQL如何保證備份數(shù)據(jù)一致性的文章就介紹到這了,更多相關(guān)MySQL備份數(shù)據(jù)一致性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 修改MySQL的默認密碼的四種小方法

    修改MySQL的默認密碼的四種小方法

    對于windows平臺來說安裝完MySQL后,系統(tǒng)就已經(jīng)默認生成了許可表和賬戶,下文中就教給大家如何修改MySQ的默認密碼。
    2015-09-09
  • MySQL是怎么保證主備一致的

    MySQL是怎么保證主備一致的

    大家知道 binlog 可以用來歸檔,也可以用來做主備同步,但它的內(nèi)容是什么樣的呢?為什么備庫執(zhí)行了 binlog 就可以跟主庫保持一致了呢,本文就詳細的介紹一下
    2021-09-09
  • MySQL8.0+版本1045錯誤的問題及解決辦法

    MySQL8.0+版本1045錯誤的問題及解決辦法

    這篇文章主要介紹了MySQL8.0+版本1045錯誤解決辦法,使用命令行登錄MySQL報錯1045 Access denied for user ‘root’@‘localhost’ (using password:YES),折騰半天才解決問題,需要的朋友可以參考下
    2022-08-08
  • MacOS 下安裝 MySQL8.0 登陸 MySQL的方法

    MacOS 下安裝 MySQL8.0 登陸 MySQL的方法

    這篇文章主要介紹了MacOS 下安裝 MySQL8.0 登陸 MySQL 的方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05
  • Python3.6-MySql中插入文件路徑,丟失反斜杠的解決方法

    Python3.6-MySql中插入文件路徑,丟失反斜杠的解決方法

    下面小編就為大家?guī)硪黄狿ython3.6-MySql中插入文件路徑,丟失反斜杠的解決方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Mysql 報Row size too large 65535 的原因及解決方法

    Mysql 報Row size too large 65535 的原因及解決方法

    這篇文章主要介紹了Mysql 報Row size too large 65535 的原因及解決方法 的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • mysql導(dǎo)入sql文件報錯 ERROR 2013 2006 2002

    mysql導(dǎo)入sql文件報錯 ERROR 2013 2006 2002

    今天在做項目的時候遇到個問題,就是往mysql里導(dǎo)入sql文件的時候總是報ERROR 2013 2006 2002,研究了一番才找到解決辦法,這里記錄下來分享給大家
    2014-11-11
  • Canal監(jiān)聽MySQL的實現(xiàn)步驟

    Canal監(jiān)聽MySQL的實現(xiàn)步驟

    本文主要介紹了Canal監(jiān)聽MySQL的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Redis什么是熱Key問題以及如何解決熱Key問題

    Redis什么是熱Key問題以及如何解決熱Key問題

    這篇文章主要介紹了Redis什么是熱Key問題以及如何解決熱Key問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • MySQL MVVC多版本并發(fā)控制的實現(xiàn)詳解

    MySQL MVVC多版本并發(fā)控制的實現(xiàn)詳解

    在多版本并發(fā)控制中,為了保證數(shù)據(jù)操作在多線程過程中,保證事務(wù)隔離的機制,降低鎖競爭的壓力,保證較高的并發(fā)量。在每開啟一個事務(wù)時,會生成一個事務(wù)的版本號,被操作的數(shù)據(jù)會生成一條新的數(shù)據(jù)行
    2022-08-08

最新評論

星子县| 绥棱县| 乌拉特前旗| 项城市| 桃江县| 洪雅县| 元江| 巴林右旗| 安阳市| 德安县| 沙河市| 绥江县| 长武县| 康定县| 大埔县| 山西省| 天祝| 象州县| 兴山县| 阿荣旗| 叶城县| 清丰县| 杭锦后旗| 武山县| 元谋县| 万盛区| 房山区| 昭通市| 任丘市| 南城县| 灵寿县| 保靖县| 玛多县| 柳河县| 武穴市| 台南县| 呼伦贝尔市| 中卫市| 通辽市| 连云港市| 昌都县|