MySQL之備份與恢復(六)

備份與恢復

文件系統快照

先決條件和配置

創建一個快照的消耗幾乎微不足道,但還是需要確保系統配置可以讓你獲取在備份瞬間的所有需要的文件的一致性副本。首先,確保系統滿足下面這些條件。

  • 1.所有的InnoDB文件(InnoDB的表空間文件和InnoDB的事務日志)必須時在單個邏輯卷(分區)。你需要絕對的時間點一致性,LVM不能為多于一個卷做某個時間點一致的快照。(這是LVM的一個限制;其他一些系統沒有這個問題)
  • 2.如果需要備份表定義,MySQL數據目錄必須在相同的邏輯卷中。如果使用另外一種方法來備份表的帝國一,例如只備份Schema到版本控制系統中,就不需要擔心這個問題
  • 3.必須在卷組中有足夠的空閑空間來創建快照。需要多少取決于負載。當配置系統時,應該留一些未分配的空間以便后面做快照。

LVM有卷組的概念,它包含一個或多個邏輯卷。可以按照如下的方式查看系統中的卷組:

vgs
VG:vg
#PV:1
#LV:4
#SN:0
Attr:wz--n-
VSize:534.18G
VFree:249.18G

輸出顯示了一個分布在一個物理卷上的卷組,它有四個邏輯卷,大概有250GB空間空閑。入股哦需要,可用vgdisplay命令產生更詳細的輸出。現在讓我們看下系統上的邏輯卷

lvs
LV:home
VG:vg
Attr:-wi-ao
LSize:40.00G
Origin Snap%:
Move Log Copy%:LV:mysql
VG:vg
Attr:-wi-ao
LSize:225.00G
Origin Snap%:
Move Log Copy%:LV:tmp
VG:vg
Attr:-wi-ao
LSize:10.00G
Origin Snap%:
Move Log Copy%:LV:var
VG:vg
Attr:-wi-ao
LSize:10.00G
Origin Snap%:
Move Log Copy%:

創建、掛載和刪除LVM快照

一條命令就能創建快照。只需要決定快照存放的未知和分配給寫時復制的空間大小即可。不要糾結于是否適用比想象中的需求更多的空間。LVM不會馬上使用完所有指定的空格鍵,只是為后續適用預留而已。因此多預留一點空間并沒有壞處,除非你必須同時為其他快照預留空間。讓我們來練習創建一個快照。我們給它16GB的寫時復制空間,名字為backup_mysql.

lvcreate --size 16G --snapshot --name backup_mysql /dev/vg/mysq

這里特意命名為backup_mysql卷而不是mysql_backup,是為了避免Tab鍵自動補全造成誤會。這有助于避免因為Tab鍵自動補全導致突然誤刪除mysql卷組的可能。我們可以適用lvs看看新創建的卷的狀態。快照的屬性與原設備不同,而且該輸出還顯示了一點額外的信息:原始卷組和分配了16GB的寫時復制空間目前已經使用了多少。備份對此進行監控是個非常好的主意,可以知道是否會因為設備寫滿而備份失敗。可以交互地監控設備的狀態,或使用諸如Nagios這樣的監控系統。

wathc 'lvs | grep backup'

從前面mount的輸出可以看到,mysql卷包含一個文件系統。這意味著快照也同樣如此,可以像其他文件系統一樣掛載。

mkdir /tmp/backup
mount /dev/mapper/vg-backup_mysql /tmp/backup
ls -l /tmp/backup/mysql

這里只是為了聯系,因此我們卸載這個快照并用lvremove命令將其刪除

umount /tmp/backup
rmdir /tmp/backup
lvremove --force /dev/vg/backup_mysql

用于在線備份的LVM快照

在這里插入圖片描述

現在已經知道如何創建、加載和刪除快照,可以使用它們來進行備份了。首先看一下如何在不停止MySQL服務的情況下備份InnoDB數據庫,這里需要使用一個全局的讀鎖。連接MySQL服務器并使用一個全局讀鎖將表刷到磁盤上,然后獲取二進制日志的位置:

mysql>FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;

記錄SHOW MASTER STATUS的輸出,確保到MySQL的連接處于打開狀態,以使讀鎖不被釋放。然后獲取LVM的快照并立刻釋放該讀鎖,可以使用UNLOCK TABLES或直接關閉連接來釋放鎖。最后,加載快照并賦值文件到備份位置。這種方法最主要的問題是,獲取讀鎖可能需要一點時間,特別時當有許多長時間運行的查詢時。當連接等待全局讀鎖時,所有的查詢都將被阻塞,并且不可預測這會持續多久。

文件系統快照和InnoDB

即使鎖住所有的表,InnoDB的后臺線程仍會繼續工作,因此,即使在創建快照時,仍然可以往文件中寫入。并且,由于InnoDB沒有執行關閉操作。如果服務器意外斷電,快照中InnoDB的文件會和服務器意外掉電后文件的遭遇一樣。這不是什么問題,因為InnoDB是個ACID系統。任何時刻(例如快照時),每隔提交的事務要么在InnoDB數據文件中要么在日志文件中。在還原快照后啟動MySQL時,InnoDB將運行恢復進程,就像服務器斷過電一樣。它會查找事務日志中任何提交但沒有應用到數據文件中的事務然后應用,因此不會丟失任何事務。這正是要強制InnoDB數據文件和日志文件在一起快照的原因。這也是在備份后需要測試的原因。啟動一個MySQL實例,把它指向一個新備份,讓InnoDB執行崩潰恢復過程,然后檢測所有的表。通過這種方法,就不會備份損壞了卻還不知道(文件可能由于任何原因損壞)。這么做的另外一個好處是,維拉i需要從備份中還原時會更快,因為已經在備份上運行過一遍恢復程序了。甚至還可以在將快照復制到備份目的地之前,直接在快照上做上面的操作,但增加一點點額外開銷。所以需要確保這是計劃內的操作

使用LVM快照無所InnoDB備份

在這里插入圖片描述

無鎖備份只有一點不同。區別是不需要執行FLUSH TABLES WITH READ LOCK.這意味著不能保證MyISAM文件在磁盤上一致,如果只使用InnoDB,這就不是問題。mysql系統數據庫中依然有部分MyISAM表,但如果是典型的工作負載,在快照時這些表不太可能發生改變。如果你認為mysql系統表可能會變更,那么可以鎖住并刷新這些表。一般不會對這些表有長時間運行的查詢,所以通常會很快:

mysql> LOCK TABLES mysql.user READ, mysql.db READ;
mysql> FLUSH TABLES mysql.user, mysql.db;

由于沒有用全局讀鎖,因此不會從SHOW MASTER STATUS 中獲取到任何有用的信息。盡管如此,基于快照啟動MySQL(來驗證備份的完整性)時,也將會在日志文件中看到像下面的內容:

InnoDB: Doing recovery: scanned up to log sequence number 0 40817239
InnoDB: Starting an apply batch of log records to the database...
InnoDB:Progress in percents: 3 4 5 6 ..  [omitted] ... 97 98 99
InnoDB:Apply batch completed
InnoDB:Last MySQL binlog file position 0 3304937,file name /var/log/mysql/mysql-bin.000001
070928 14:08:42 InnoDB:Started; log sequence number 0 40817239

InnoDB記錄了MySQL已經恢復得時間點對應的二進制日志位置,這個二進制日志位置可以用來做基于時間點的恢復。使用快照進行無鎖備份的方法在MySQL5.0或更新版本中有變動。這些MySQL版本使用XA來協調InnoDB和二進制日志。如果還原到一個與備份時server_id不同的服務器,服務器在準備事務階段可能發現這是從另外一個與自己不同ID的服務器來的。在這種情況下,服務器會變得困惑,恢復事務時可能會卡在PREPARED狀態。這種情況很少發生,但是存在可能性。這也是只有經過驗證才可以說備份成功的原因。有些備份也許是不能恢復的。如果時在備庫上獲取快照,InnoDB恢復時還會打印如下幾行日志:

InnoDB:In a MySQL replica the last master binlog file
InnoDB:position 0 115, file name mysql-bin.001717

輸出顯示了InnoDB已經恢復了基于主庫的二進制位置(相對于備庫二進制日志位置),這對基于備庫備份或基于其他備庫克隆備庫來說非常有用

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/41375.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/41375.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/41375.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++學習第十三天——stack/queue的使用及底層剖析雙端隊列容器適配器

? 少年的旅途應是星辰大海 🌏 📃個人主頁:island1314 🔥個人專欄:C學習 🚀 歡迎關注:👍點贊 👂&am…

學會python——用python制作一個繪圖板(python實例十九)

目錄 1.認識Python 2.環境與工具 2.1 python環境 2.2 Visual Studio Code編譯 3.制作一個繪圖板 3.1 代碼構思 3.2 代碼實例 3.3 運行結果 4.總結 1.認識Python Python 是一個高層次的結合了解釋性、編譯性、互動性和面向對象的腳本語言。 Python 的設計具有很強的可…

昇思25天學習打卡營第12天| 基于MindNLP+MusicGen生成自己的個性化音樂

之前都是看圖文類的東西,今天體驗一點不一樣的。來點聽力的內容。 mindspore有音樂生成模型MusicGen,MusicGen支持兩種生成模式:貪心(greedy)和采樣(sampling)。在實際執行過程中,采…

京東金融大數據分析平臺總體架構:剖析和解讀

京東金融大數據分析平臺總體架構:剖析和解讀 在現代金融行業中,大數據分析已成為決策支持和業務創新的重要工具。京東金融憑借其強大的大數據分析平臺,成功地將海量數據轉化為洞察力,為企業和用戶提供優質服務。本文將深入探討京…

代碼隨想錄訓練營第二十九天 134加油站 135分發糖果 860檸檬水找零 406根據身高重建隊列

第一題: 原題鏈接:134. 加油站 - 力扣(LeetCode) 思路: 需要三個變量,一個變量start記錄結果也就是出發的第一個加油站,一個變量curSum來記錄此時加油耗油后剩余的油量,如果發現c…

微前端的需求有哪些?微前端的原理是怎么樣的?為什么這么設計,及微前端的應用場景是什么?對有些客戶,前端的重要性高于后端

微前端(Micro Frontends)是將前端應用拆分成多個獨立、可部署的部分,每個部分可以由不同的團隊獨立開發、測試、部署和維護。這種架構類似于微服務在后端的應用,是為了應對復雜前端應用的維護和擴展問題而提出的。 來龍去脈 背景…

【吳恩達機器學習-week2】可選實驗:使用 Scikit-Learn 進行線性回歸

支持我的工作 🎉 📃親愛的朋友們,感謝你們一直以來對我的關注和支持! 💪🏻 為了提供更優質的內容和更有趣的創作,我付出了大量的時間和精力。如果你覺得我的內容對你有幫助或帶來了歡樂&#xf…

庫表設計(基礎)-實體與設計關系

實體關系分析 1 實體關系是指系統事務之間的聯系。 2 實體關系需要雙向分析。 3 實體關系決定表關系。 實體關系的種類 1 一對一 2 一對多 3 多對多 舉例: 上面關系如下: 班級和學生 : 1:N 學生和課程:N : N 學生和學籍檔案&a…

MISRA C 和MISRA C++:汽車軟件安全的守護者

一、MISRA C與C語言 自1972年Dennis MacAlistair Ritchie在美國貝爾實驗室創造C語言以來,它已成為當今最流行的編程語言之一。C語言以其使用的靈活性、功能的豐富性而廣受歡迎,但同時也因其寬松的語法和不嚴格的數據類型給開發的產品帶來了安全隱患。 …

如何批量給文件名添加編號?這個方法速度快!操作簡單!

如何批量給文件名添加編號?這個方法速度快!操作簡單!批量給文件重命名,這個是在工作中和生活中經常要用到的一個小技巧,許多人還不知道怎么操作,當然如果要按一定的格式和規律重命名大量的文件,…

Linux內核 -- 多核通信之RPMSG驅動使用

Linux Kernel RPMsg 驅動注冊流程的高級用法與注意事項 在Linux Kernel中,RPMsg(Remote Processor Messaging)是一種用于不同處理器之間通信的機制,通常用于多核系統中的通信,如主處理器和協處理器之間的消息傳遞。了…

巴西電子游戲PWA借助海外快手kwai社交廣告出海趨勢解讀

巴西電子游戲PWA借助海外快手kwai社交廣告出海趨勢解讀 在數字化時代的浪潮中,電子游戲行業蓬勃發展,而廣告投放策略也隨之日新月異。特別是在巴西這樣一個充滿活力的市場,電子游戲的普及與流行程度不容小覷。在這樣的背景下,在數…

java數據結構集合復習之ArrayList與順序表

前言: 這是我最一年學習java的一部分的回顧總結 1.List 1.1什么是List? 在框架集合中,List是一個接口,繼承自Collection。 Collection也是一個接口,該接口中規范了后序容器中常用的一些方法,具體如下所示 --------boolean add(E e)尾插 evoid a…

[pwn]靜態編譯

靜態編譯 1. 棧足夠大的情況下 程序在ida打開后,左側的函數欄目沒有紅色(系統調用的函數),而只有一些靜態函數,通常這類文件的大小會必普通的pwn題程序要大得多。 這種靜態編譯的題沒有調用庫函數,也就沒…

百度云智能媒體內容分析一體機(MCA)建設

導讀 :本文主要介紹了百度智能云MCA產品的概念和應用。 媒體信息海量且復雜,采用人工的方式對視頻進行分析處理,面臨著效率低、成本高的困難。于是,MCA應運而生。它基于百度自研的視覺AI、ASR、NLP技術,為用戶提供音視…

Vue 性能革命:揭秘前端優化的終極技巧;Vue優化技巧,解決Vue項目卡頓問題

目錄 Vue優化路徑 一、使用key 二、使用凍結對象 三、使用函數式組件 四、使用計算屬性 五、使用非實時綁定的表單項 六、保持對象引用穩定 6.1、保持對象引用穩定定義 6.2、保持對象引用穩定與不穩定的例子 6.3、vue2判斷數據是否變化是通過hasChanged函數實現的 ①…

2024年【四川省安全員B證】考試及四川省安全員B證考試題

題庫來源:安全生產模擬考試一點通公眾號小程序 2024年【四川省安全員B證】考試及四川省安全員B證考試題,包含四川省安全員B證考試答案和解析及四川省安全員B證考試題練習。安全生產模擬考試一點通結合國家四川省安全員B證考試最新大綱及四川省安全員B證…

golang項目中gorm框架的配置和具體使用

最近在改造golang項目,從postgre數據庫遷移到達夢數據庫,我還想在改造后的項目使用 gorm 操作數據庫,保持較小的改動。查找了不少資料,最終從以下兩篇文章中借鑒了不少 1、Gorm 入門介紹與基本使用 這篇知乎文章詳細介紹了 gorm 框…

C語言 -- 操作符詳解?

C語言 -- 操作符詳解? 1. 操作符的分類2. 二進制和進制轉換?2.1 2進制轉10進制?2.1.1 10進制轉2進制數字? 2.2 2進制轉8進制和16進制?2.2.1 2進制轉8進制?2.2.2 2進制轉16進制? 3. 原碼、反碼、補碼?4. 移位操作符?4.1 左移操作符? 4.2 右移操作符?5. 位操作符&…

Symfony實戰手冊:PHP框架的高級應用技巧

引言 Symfony是一個功能強大且廣泛應用于PHP應用程序開發的框架,它提供了許多高級特性和工具,可以幫助開發人員更高效地構建和管理復雜的Web應用程序。以下是Symfony框架的幾個關鍵方面及其高級應用技巧: 1. 路由和控制器 Symfony的路由組…