MySQL備份遷移之mydumper

来源:https://www.cnblogs.com/immaxfang/archive/2022/04/25/16188555.html
-Advertisement-
Play Games

簡介 mydumper 是一款開源的 MySQL 邏輯備份工具,主要由 C 語言編寫。與 MySQL 自帶的 mysqldump 類似,但是 mydumper 更快更高效。 mydumper 的一些優點特性: 輕量級C語言開發 支持多線程備份數據,備份後按表生成多個備份文件 支持事務性和非事務性表一 ...


簡介

mydumper 是一款開源的 MySQL 邏輯備份工具,主要由 C 語言編寫。與 MySQL 自帶的 mysqldump 類似,但是 mydumper 更快更高效。
mydumper 的一些優點特性:

  • 輕量級C語言開發
  • 支持多線程備份數據,備份後按表生成多個備份文件
  • 支持事務性和非事務性表一致性備份
  • 支持將導出的文件壓縮,節約空間
  • 支持多線程恢復
  • 支持已守護進程模式工作,定時快照和連續二進位日誌
  • 支持按指定大小將備份文件切割
  • 數據與建表語句分離

下載安裝

安裝方式非常多,以下介紹幾種常見的方式。

  • Ubuntu 中自帶了 myloader

sudo apt-get install mydumper

  • 使用 deb 包安裝,以 Ubuntu 為例

apt-get install libatomic1
wget https://github.com/mydumper/mydumper/releases/download/v0.11.5/mydumper_0.11.5-1.$(lsb_release -cs)_amd64.deb dpkg -i mydumper_0.11.5-1.$(lsb_release -cs)_amd64.deb

  • 編譯安裝
  • docker 安裝

根據實際平臺情況,可選擇不同的安裝方式,官方也提供了一些常見的安裝文檔,https://github.com/mydumper/mydumper

參數說明

mydumper 參數說明

-B, --database              要備份的資料庫,不指定則備份所有庫,一般建議備份的時候一個庫一條命令
-T, --tables-list           需要備份的表,名字用逗號隔開
-o, --outputdir             備份文件輸出的目錄
-s, --statement-size        生成的insert語句的位元組數,預設1000000
-r, --rows                  將表按行分塊時,指定的塊行數,指定這個選項會關閉 --chunk-filesize
-F, --chunk-filesize        將表按大小分塊時,指定的塊大小,單位是 MB
-c, --compress              壓縮輸出文件
-e, --build-empty-files     如果表數據是空,還是產生一個空文件(預設無數據則只有表結構文件)
-x, --regex                 是同正則表達式匹配 'db.table'
-i, --ignore-engines        忽略的存儲引擎,用都厚分割
-m, --no-schemas            不備份表結構
-d, --no-data								不備份表數據
-G, --triggers							備份觸發器
-E, --events								備份事件
-R, --routines							備份存儲過程和函數
-W, --no-views							不備份視圖
--where 										只導出符合條件的數據
-k, --no-locks              不使用臨時共用只讀鎖,使用這個選項會造成數據不一致
--less-locking              減少對InnoDB表的鎖施加時間(這種模式的機制下文詳解)
-l, --long-query-guard      設定阻塞備份的長查詢超時時間,單位是秒,預設是60秒(超時後預設mydumper將會退出)
--kill-long-queries         殺掉長查詢 (不退出)
-b, --binlogs               導出binlog
-D, --daemon                啟用守護進程模式,守護進程模式以某個間隔不間斷對資料庫進行備份
-I, --snapshot-interval     dump快照間隔時間,預設60s,需要在daemon模式下
-L, --logfile               使用的日誌文件名(mydumper所產生的日誌), 預設使用標準輸出
--tz-utc                    跨時區時使用的選項。允許備份timestamp,這樣會導致不同時區的備份還原出問題,預設關閉。
--skip-tz-utc               同上,預設值。
--use-savepoints            使用savepoints來減少採集metadata所造成的鎖時間,需要 SUPER 許可權
--success-on-1146           Not increment error count and Warning instead of Critical in case of table doesn't exist
-h, --host                  連接的主機名
-u, --user                  備份所使用的用戶
-p, --password              密碼
-P, --port                  埠
-S, --socket                使用socket通信時的socket文件
-t, --threads               開啟的備份線程數,預設是4
-C, --compress-protocol     壓縮與mysql通信的數據
-V, --version               顯示版本號
-v, --verbose               輸出信息模式, 0 = silent, 1 = errors, 2 = warnings, 3 = info, 預設為 2

myloader 參數說明

-d, --directory                   備份文件的文件夾
-q, --queries-per-transaction     每次事物執行的查詢數量,預設是1000
-o, --overwrite-tables            如果要恢復的表存在,則先drop掉該表,使用該參數,需要備份時候要備份表結構
-B, --database                    還原到的資料庫(目標庫)
-s, --source-db										被還原的資料庫(源資料庫),-s db1 -B db2,表示源庫中的db1資料庫,導入到db2資料庫中。
-e, --enable-binlog               啟用還原數據的二進位日誌
-h, --host                        主機
-u, --user                        還原的用戶
-p, --password                    密碼
-P, --port                        埠
-S, --socket                      socket文件
-t, --threads                     還原所使用的線程數,預設是4
-C, --compress-protocol           壓縮協議
-V, --version                     顯示版本
-v, --verbose                     輸出模式, 0 = silent, 1 = errors, 2 = warnings, 3 = info, 預設為2

常用案例

mydumper 導出示例

# 個人實際中最常用的備份語句
mydumper -B test -o /home/mydumper/data/test -e -G -R -E -D -u root -p 123456 -h 192.168.0.191 -P 3306 -v 3 --long-query-guard 288000 --skip-tz-utc --no-locks --logfile /home/mydumper/log/test

# 備份全部資料庫 
mydumper -u root -p 123456 -o /home/mydumper/data/all/

# 備份全部資料庫,排除系統庫,
mydumper -u root -p 123456 --regex '^(?!(mysql|sys|performance_schema|information_schema))' -o /home/mydumper/data/all/

# 備份全部資料庫,包含觸發器、事件、存儲過程及函數
mydumper -u root -p 123456 -G -R -E -o /home/mydumper/data/all/

# 備份指定庫
mydumper -u root -p 123456 -G -R -E -B db1 -o /home/mydumper/data/db1

# 備份指定表
mydumper -u root -p 123456 -B db1 -T tb1,tb2 -o /home/mydumper/data/db1

# 只備份表結構
mydumper -u root -p 123456 -B db1 -d -o /home/mydumper/data/db1

# 只備份表數據
mydumper -u root -p 123456 -B db1 -m -o /home/mydumper/data/db1

myloader 導入案例

# 個人實際中最常用的導入語句
myloader -h 192.168.0.192 -P 33306 -u root -p 123456 -t 1 -v 3 -d /home/mydumper/data/test/0/ -B test

# 從備份中恢復指定庫
myloader -u root -p 123456 -s db1 -o -d /home/mydumper/data/all/0/

# 導入時開啟 binlog
myloader -u root -p 123456 -e -o -d /home/mydumper/data/db1/0/

# 將源庫的 db1 導入到備庫的 db1_bak 庫中
myloader -u root -p 123456 -B db1_bak -s db1 -o -d /home/mydumper/data/db1/0/

# 導入特定的某幾張表
## 先將 metadata 文件和需要單獨導入的表的結構文件和數據文件導入到單獨的文件夾中。此處預設庫已建好,否則還需要複製建庫相關語句。
cp /home/mydumper/data/db1/0/metadata /backup/db1/0/
cp /home/mydumper/data/db1/0/d1.t1-schema.sql /backup/db1/0/
cp /home/mydumper/data/db1/0/d1.t1.sql /backup/db1/0/
## 從新文件夾中導入數據
myloader -u root -p 123456 -B db1 -d /backup/db1/0/
## 以上就可以單獨導入 db1.t1 表

關於 -e 參數,需要稍微註意下。預設情況下,myloader 是不開啟 binlog 的,這樣可以提高導入速度。如果導入實例有從庫,且需要導入的結果同步到從庫上,則需要使用 -e 打開 binlog 記錄。

導出之後的目錄如下,以資料庫 d1 ,其中有表 t1 為例:

-d1
 -0
   metadata							記錄備份時間點的Binlog信息,日誌文件名和寫入位置
   d1-schema-create.sql	建庫語句
   d1-schema-post.sql		        存儲過程,函數,事件創建語句
   d1.t1-schema.sql			        表結構文件
   d1.t1.sql						表數據文件,若使用了分塊參數,大表的數據文件會出現多個,以數字分開。
 -1

以上為比較常見的導出後的目錄結構,根據實際情況不同,可能還有會含有觸發器的文件,含有視圖的文件等。

常見問題與實踐經驗

  • Error switching to database whilst restoring table

使用 myloader 導入時會出現這類報錯,可以嘗試的解決方法如下:調大 wait_timeout 參數;調大 max_packet_size 參數;使用一個線程導入, -t 1。

  • (myloader:35671): CRITICAL **: Error restoring test.email_logger from file test.email_logger.sql: Cannot create a JSON value from a string with CHARACTER SET 'binary'.

MySQL 的一個 Bug,可以嘗試手動修改對應的備份文件,將

/!40101 SET NAMES binary/;

修改為:

/!40101 SET NAMES utf8mb4/;

  • (myloader:34726): CRITICAL **: Error restoring test.(null) from file test-schema-post.sql: Access denied; you need (at least one of) the SUPER privilege(s) for this operation

在導入 AWS RDS 時部分存儲過程創建失敗,有比較嚴格的許可權限制,需要導入用戶有 SUPER 許可權,但是 AWS RDS 用戶無法授予 SUPER 許可權。針對這部分存儲過程,可以考慮手動在備份庫上創建。

  • 大表導出優化

使用 -r-F參數,對導出的數據文件進行分片。

  • 備份機器配置儘可能高

備份前先預估大小,避免機器磁碟不足。儘可能選用配置較高的機器,加快備份速度。

  • 非必要數據不備份

備份前對於不用備份的數據可以提前進行一次刪除,也可在導出數據時添加正則參數等過濾部分表

  • 備份儘量不跨網路

備份數據時儘量在內網中進行,若需要將數據遷移到外網,可以備份完之後,將備份文件拷貝到外網伺服器上,儘量減少導出時網路不穩定的干擾。導入時同理。

  • 加快導入速度的一些方法

選擇合適的線程數,根據實際情況和機器配置,選擇合適的線程參數,並非線程數越多越快。
導入時關閉 MySQL 的 binlog 寫入,待導入完成後再開啟。
在內網或較穩定的環境中進行導入。

原理與架構

mydumper 工作流程


主要步驟概括

  • 主線程 FLUSH TABLES WITH READ LOCK,施加全局只讀鎖,阻止DML語句寫入,保證數據的一致性。
  • 讀取當前時間點的二進位日誌文件名和日誌寫入的位置並記錄在metadata文件中。
  • N個dump線程 START TRANSACTION WITH CONSISTENT SNAPSHOT,開啟讀一致的事務。
  • dump non-InnoDB tables, 首先導出非事物引擎的表。
  • 主線程 UNLOCK TABLES 非事物引擎備份完後,釋放全局只讀鎖。
  • dump InnoDB tables,基於事物導出InnoDB表。
  • 事務結束。

myloader 工作原理


更多技術文章,請關註我的個人博客 www.immaxfang.com 和小公眾號 Max的學習札記


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

-Advertisement-
Play Games
更多相關文章
  • C#中要謹慎使用async void,因為它可能會導致程式崩潰。 ...
  • 本文介紹如何用Metalama框架無侵入地為.NET項目添加編譯時AOP及代碼分析,以及動態生成方法 ...
  • 註意事項 不讀本註意事項沒資格乾這個活! 1,進行此操作前,一定要先創建磁碟快照,出現任何報錯,必須回滾。 2,公司生產機避免升級一二級版本號,建議僅安裝內核安全更新。 3,對公司生產機操作前,一定要徵得技術主管同意,你自己沒把握讓他來弄。 4,請不要參照網上其他文章下載 deb 包手動升級,尤其是 ...
  • 鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 Virtual Box 安裝虛擬機 一、下載安裝Virtual Box 1. 下載Virtual Box 2. 安裝Virtual Box 雙擊Virtual Box安裝程式進入安裝歡迎界面,如下圖所示: 單擊 下一步 按鈕後進入下一安裝界面,在 ...
  • 一:創建maven項目 導入maven <dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>2.7.6</version> </d ...
  • 鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 背景: Centos7上需要創建一個用戶leojiang,而用戶時間不純在系統上,但是還是報錯說用戶已經存在。 1、假設您正在嘗試添加一個名為“leojiang”的用戶並且您收到以下錯誤。 [root@leo]# useradd -m -d /h ...
  • 安裝Prometheus wget https://github.com/prometheus/prometheus/releases/download/v2.34.0/prometheus-2.34.0.linux-amd64.tar.gz tar -zxvf prometheus-2.34.0. ...
  • 一、MicroPython 簡介 Python,是一種面向對象的解釋型電腦程式設計語言,它是純粹的自由軟體,源代碼和解釋器CPython遵循GPL(GNU General Public License)協議。Python的設計目標之一是讓代碼具備高度的可閱讀性。它設計時儘量使用其它語言經常使用的標 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...