MySQL 數據備份

来源:https://www.cnblogs.com/heyongshen/archive/2023/12/07/17874375.html
-Advertisement-
Play Games

備份類型 常見的備份有冷備份、溫備份、熱備份,還有什麼物理備份、邏輯備份、增量備份、差異備份等等。 冷備份: 需要服務停止,在備份期間不能進行讀和寫操作。 溫備份: 讀操作可執行;但寫操作不可執行 熱備份: 讀和寫都可以正常進行,不影響數據備份 邏輯備份: 導出資料庫中的數據和對象定義為標準 SQL ...


備份類型

常見的備份有冷備份、溫備份、熱備份,還有什麼物理備份、邏輯備份、增量備份、差異備份等等。


冷備份: 需要服務停止,在備份期間不能進行讀和寫操作。


溫備份: 讀操作可執行;但寫操作不可執行


熱備份: 讀和寫都可以正常進行,不影響數據備份


邏輯備份: 導出資料庫中的數據和對象定義為標準 SQL 語句保存在文本文件中。這些 SQL 語句可以重新執行來恢複數據庫。


物理備份: 直接複製資料庫的文件,包括數據文件、索引文件和日誌文件等。它是對資料庫文件系統層面的直接拷貝。

MySQL 備份內容

用戶信息: 例如MySQL的賬號信息,賬號的許可權等。這些都是存放再mysql這個資料庫中的。


業務數據: 相關的業務資料庫


配置文件: MySQL服務的相關配置

MySQL 物理備份

一種方法是將mysql服務停止後,將整個數據目錄進行拷貝或者打包,例如利用tar、cp、rsync等工具

還有一種方法就是利用專門的物理備份工具,例如xtrabackup就是一個非常好用的物理備份工具。

xtrabackup 介紹

xtrabackup是 Percona 開發的一個資料庫物理備份工具,100%開源。主要用來執行MySQL、Percona Server 和 MariaDB 資料庫的備份和恢復操作。


官方文檔:https://docs.percona.com/percona-xtrabackup/innovation-release/


xtrabackup具有以下特點:


1、非常適合大型資料庫以及需要快速備份還原和需要支持災難級備份的場景。


2、支持增量備份、對備份數據進行壓縮、數據加密等功能


3、xtrabackup主要是用來操作innodb這種存儲引擎的數據,且整個過程是非阻塞的。在備份過程中,對資料庫的讀寫操作可以繼續進行,適合需要7*24小時運行的環境


4、正是因為xtrabackup是直接操作資料庫文件和日誌,所以對資料庫的內部結構(如數據字典、redo log 格式)高度敏感。當這些內部結構在資料庫的新版本中發生變化時,XtraBackup 需要更新以適應這些更改。並且高版本不能向下相容低版本。

xtrabackup 安裝

安裝的時候需要先確認需要備份的資料庫版本,然後再參考官方文檔下載合適的 xtrabackup 版本才行。上面也說了,MySQL不同版本的文件結構有差別,所以造成不能高版本相容低版本的問題。


例如:mysql的版本是5.7.x,那麼就需要下載 2.4版本的xtrabackup,8.0版本的xtrabackup不能備份mysql5.7。

xtrabackup 備份數據

備份整個資料庫

XtraBackup 是直接備份物理文件的工具,但是也需要連接到 MySQL。因為需要知道MySQL的一些配置(如 datadir、innodb_data_home_dir、innodb_log_group_home_dir 等),通過這些配置來確定需要備份的文件。


還有就是讀取二進位日誌位置來確保備份可以用於點恢復操作。連接MySQL的參數和mysql命令行工具是一樣的。

1、創建備份目錄

需要執行備份操作的過程中,具有對這個目錄的讀和寫許可權,所以可以直接以root用戶身份執行。

mkdir /home/ehigh/mysql_bak
2、執行備份操作

通過 --backup 選項可以執行全備份。


例如:

sudo xtrabackup --backup --host="192.168.15.12" --user="root" --password="eHIGH2014" --port=3306 --datadir="/var/lib/mysql" --target-dir="/home/ehigh/mysql_bak"
3、數據恢復前的準備

通過 --prepare 選項讓 xtrabackup完成一些數據恢復前的準備工作,因為執行物理備份時,XtraBackup 複製的是資料庫文件的實時狀態,包括那一刻的所有數據文件和日誌文件。


這個狀態下可能會有未完成的事務等等。通過這個操作可以將這些未完成的事務回滾。保證恢復時資料庫的一致性。


而且執行這個操作是不會影響到現有數據的,因為這個操作僅針對備份的數據進行處理,只會處理備份目錄中的備份文件,例如應用重做日誌和回滾未完成的事務。

sudo xtrabackup --prepare --target-dir="/home/ehigh/mysql_bak"
4、進行數據恢復

(1)停止服務。避免在恢複數據時發生數據損壞。

sudo systemctl stop mysql.service

(2)清空數據目錄。

sudo rm -rf /var/lib/mysql

mv /var/lib/mysql /var/lib/mysql-bak

mkdir /var/lib/mysql

chown -R mysql:mysql /var/lib/mysql 

(3)執行數據恢復
執行數據恢復一種方法是直接使用cp或者rsync工具將備份目錄下的所有文件拷貝到mysql數據目錄中,還有種方法就是通過 --copy-back 或 --move-back 選項從備份目錄將數據恢復到原始 MySQL 數據目錄。


這兩個參數的區別如下:

  • --copy-back:將備份數據複製回 MySQL 的數據目錄。這個過程不會刪除或更改備份目錄中的原始備份文件

  • --move-back:將備份數據移動(而非複製)回 MySQL 的數據目錄,移動過後備份目錄中就不存在備份文件了

sudo xtrabackup --copy-back  --target-dir=/home/ehigh/mysql_bak  --datadir=/var/lib/mysql

(4)更改文件許可權
將MySQL數據目錄下的文件許可權改為mysql

sudo chown -R /var/lib/mysql

備份整個資料庫並壓縮數據

xtrabackup不同版本支持的壓縮演算法不同,具體信息可以看官方文檔確認。通過 --compress選項即可再備份數據的時候,將數據進行壓縮。

1、備份數據

例如:

sudo xtrabackup --backup --host="192.168.15.12" --user="root" --password="eHIGH2014" --port=3306 --compress --compress-threads=4   --datadir="/var/lib/mysql" --target-dir="/home/ehigh/mysql_bak_c"
2、恢複數據前先解壓縮

在備份數據的時候xtrabackup會通過自帶的一些壓縮演算法庫文件將文件進行壓縮,但是解壓的時候需要在系統上安裝對應的工具才行。

通過 --decompress 選項即可完成解壓

sudo xtrabackup --decompress --target-dir=/home/ehigh/mysql_bak_c
3、恢復前的準備

通過 --prepare 選項完成恢復前的準備,具體操作和上面一樣的

4、數據恢復

(1)停止MySQL服務

(2)清空MySQL數據目錄

(3)使用 xtrabackup 恢複數據

(4)修改MySQL數據目錄中文件的屬主和屬組

備份單個資料庫

XtraBackup 備份單個資料庫的操作比較特殊,因為 XtraBackup 主要設計用於備份整個 MySQL 伺服器的。備份單個庫用mysqldump就行了。

MySQL 邏輯備份

就是將資料庫中的數據備份為SQL語句,將這些SQL語句存放在一個文件中,恢複數據的時候直接執行這個文件裡面的SQL即可重現數據。

mysqldump

mysqldump是mysql服務自帶的一個工具,mysqldump可以跨平臺使用且使用簡單,非常適用於小到中等規模的資料庫。

預設情況下,mysqldump 工具將生成的 SQL 語句輸出到標準輸出(stdout)。如果直接運行 mysqldump 命令而不進行任何重定向,它會在命令行界面中顯示 SQL 語句。

備份整個資料庫

mysqldump -u 用戶名 -p 用戶密碼  database_name > backup.sql

通過這種方法備份整個資料庫時,會生成一個包含所有表結構和數據的 SQL 文件,但不會包含 CREATE DATABASE 語句。即恢複數據的時候需要手動將對應的資料庫創建好,然後再將數據導入到該資料庫中。

如果需要生成一個帶 CREATE DATABASE 語句 的sql文件,加一個 --databases 參數就可以了。

備份多個資料庫

如果需要一次性備份多個指定的資料庫,可以通過 mysqldump 的 --databases 選項來實現。還可以用 -B 參數,-B參數效果和 --databases 一樣的。

mysqldump -u user_name -p password --databases db1 db2 db3 > backup.sql

備分所有資料庫

如果想將所有資料庫進行備份的話,通過 --all-databases 選項可以實現,也可以用 -A 參數,效果是一樣的

mysqldump -u user_name -p password --all-databases > backup.sql

備份單個數據表

如果只想要備份單張表,只需要在資料庫的後面指定表名就行了。

mysqldump -u user_name -p password database_name table_name > backup.sql

備份多個數據表

在資料庫的後面指定多個表名就行了。

mysqldump -u user_name -p password database_name tb1 tb2 tb3 > backup.sql

只備份表結構,不備份數據

僅備份資料庫結構(例如,表定義、視圖、存儲過程等),但不包含任何實際數據,可以使用 --no-data 選項。

mysqldump -u user_name -p password --no-data database_name table_name > backup.sql

只備份數據,不備份表結構

只想備份數據而不包括表結構,可以使用 --no-create-info 選項

mysqldump -u user_name -p password --no-create-info database_name table_name > backup.sql

備份表的一部分數據

如果需要備份一個數據表中的部分數據,通過 -where 選項來指定符合特定條件的數據。


例如:備份id < 1000 的數據

mysqldump -u user_name -p password --databases db1 tables1  --where="id < 1000" > users_backup.sql

備份存儲過程和函數

使用 --routines 選項可以確保存儲過程和函數被包含在備份中,也可以使用簡寫的-R參數。

mysqldump -u user_name -p --no-create-info --no-data --no-create-db --routines --skip-triggers database_name > routines_backup.sql

打開備份的sql文件,我們可以看到 /*!50003 ... */ 這是MySQL的一種特殊註釋模式,稱為“條件註釋”或“版本控制註釋”。這些註釋內容實際上會被 MySQL 執行。


/*!50003 ,這裡的50003表示該命令需要的最低 MySQL 版本為 5.00.03,MySQL版本大於或等於這個版本的時候,註釋中的內容會被執行。

mysqldump 高級選項

在備份數據的過程中,可以添加一些選項來對備份進行優化:

1、優化備份速度:

如果備份一個數據量很大的庫或者表,mysqldump 預設會讀取整個表到記憶體中,然後寫入到備份文件。如果表非常大,這可能會消耗大量記憶體,並可能導致過度的記憶體使用甚至崩潰。

這個時候可以通過 --quick 選項,它是直接逐行讀取數據並寫入備份文件,顯著減少了一次性記憶體需求。從而加快備份速度。


2、主從複製環境:

預設情況下,備份數據文件的時候,是不會記錄當前二進位日誌位置的。使用 --master-data 時,mysqldump 會在 SQL 備份文件中添加一個 CHANGE MASTER TO 語句。

這個語句包含了備份時刻的二進位日誌文件名和位置(log file position)。這對於設置複製非常重要,因為它指明瞭從伺服器(slave)開始讀取主伺服器(master)二進位日誌的起始點。


--master-data有兩個值,預設值是2

  • --master-data=1:以非註釋形式包含 CHANGE MASTER TO 語句

  • --master-data=2:使CHANGE MASTER TO 語句以註釋形式添加,從而在不自動更改從伺服器配置的情況下提供必要的信息。


--master-data 選項經常結合 --flush-logs 選項一起使用,--flush-logs 會在備份開始前刷新 MySQL 伺服器的日誌,包括二進位日誌(binary log)。此時 MySQL 會關閉當前的二進位日誌文件並開始一個新的日誌文件。


說明:

--master-data 選項在 mysqldump 輸出的 CHANGE MASTER TO 語句中主要包含 MASTER_LOG_FILE 和 MASTER_LOG_POS 參數,這些參數指明瞭二進位日誌(binary log)的文件名和位置。

但是,這個語句並不包含完整的主伺服器(master)配置,如 master_host、master_user、master_password 等。

所以這個參數主要用於記錄備份時刻的二進位日誌位置,這對於配置從伺服器從正確的位置開始複製數據很重要,所以完整的數據配置可以自己手動修改這個sql文件實現。


3、innodb引擎表備份:

使用 --single-transaction 選項,mysqldump 會在開始備份之前啟動一個新的事務。所以備份會捕捉到事務開始時刻的資料庫狀態,並且在整個備份過程中保持這一狀態,即使後續對資料庫進行了更改。


4、mysql資料庫備份

mysql這個資料庫裡面存放了mysql的用戶和許可權信息,如果想讓備份文件被恢復到另一個 MySQL 伺服器上後,用戶和許可權的更改立即生效。需要加 --flush-privileges 選項

添加這個選項後,會在 SQL 備份文件中添加一條 FLUSH PRIVILEGES; 語句。當這個備份文件被導入到 MySQL 伺服器時,FLUSH PRIVILEGES; 語句會執行,從而重新載入許可權表。

這確保了任何用戶和許可權的更改(如新用戶的添加或許可權的修改)會立即生效。這樣就不用手動刷新許可權了。

5、mysam引擎備份
現在一般用的都是innodb這個存儲引擎,使用mysqldump這個工具的時候,innodb是支持熱備份的,而mysam只支持溫備份,即備份過程中能讀不能寫。


如果備份所有資料庫,通過 --lock-all-tables 選項或者 -x選項來加全局讀鎖,會鎖定所有資料庫的所有表。也會導致一個問題,數據量大時,可能會導致長時間無法併發訪問資料庫。

mysqldump -u user_name -p --lock-all-tables --all-databases > backup.sql

如果支持備份單個資料庫,可以用 -lock-tables 參數,這樣只會鎖定正在備份的資料庫中的表。備份操作不會影響到伺服器上其他資料庫中的表。

mysqldump -u user_name -p --lock-tables database_name > backup.sql

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在前面的隨筆,我對我們開發的審批工作流做了不少的介紹,其中有包括WInform的、Vue+Element、Bootstrap Asp.net的,在各個框架上,我們都儘量爭取界面能夠一致化,以便客戶能夠在不同的前端上有相同的用戶體驗,並結合不同的前端特點,做了一些優化處理,本篇隨筆對WPF應用框架中工... ...
  • 1. C/S 與 B/S C/S結構系統是什麼 Client/Server結構(C/S結構)是大家熟知的客戶機和伺服器結構。它是軟體系統體繫結構,通過它可以充分利用兩端硬體環境的優勢,將任務合理分配到Client端和Server端來實現,降低了系統的通訊開銷 B/S結構系統是什麼 B/S結構(Bro ...
  • 在 .NET 開發中,Serilog 是一款廣受歡迎的日誌庫,它提供了強大的日誌記錄功能,具有豐富的特性和高度的可擴展性。Serilog 的優秀之處包括: 可擴展性: Serilog 可以輕鬆擴展以滿足不同的日誌記錄需求,例如日誌存儲、格式化和過濾。它支持各種插件和自定義擴展,讓你可以根據項目的具體 ...
  • tmux教程 功能 分屏。 允許斷開Terminal連接後,繼續運行進程。 結構 // 一個tmux可以包含多個session,一個session可以包含多個window,一個window可以包含多個pane。 tmux: session 0: window 0: pane 0 pane 1 pan ...
  • 近幾天發現MarkdownPad有一些小問題,打開時會彈出以下報錯信息,告訴你打開文件的許可權不夠 解決方法如下: 1、複製報錯信息中的文件路徑'C:\Users\Administrator\AppData \Roaming\wyUpdate AU\ApricitySoftware-MarkdownP ...
  • 版本 Linux 6.5 背景 在學習cgroupv2的時候,想給子cgroup開啟cpu控制器結果失敗了: # 查看可以開啟哪些控制器 root@ubuntu-vm:/sys/fs/cgroup# cat cgroup.controllers cpuset cpu io memory hugetl ...
  • 運算符 1.算術運算符 算術運算符主要用於數學運算,其可以連接運算符前後的兩個數值或表達式,對數值或表達式進行 +,-,*,/,%運算。 1.1 加法和減法運算符 mysql> SELECT 100,100 + 0,100 - 0,100 + 50,100 + 50 - 30,100 + 35.5, ...
  • SQL CREATE INDEX 語句 SQL CREATE INDEX 語句用於在表中創建索引。 索引用於比其他方式更快地從資料庫中檢索數據。用戶無法看到索引,它們只是用於加速搜索/查詢。 註意: 使用索引更新表比不使用索引更新表需要更多的時間(因為索引也需要更新)。因此,只在經常進行搜索的列上創 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...