MyDumper/MyLoader的進階玩法

来源:https://www.cnblogs.com/coygfly/p/18112776
-Advertisement-
Play Games

源碼分析丨MySQL的多層SP中Cursor相關BUG 一、問題發現 在一次開發中在sp中使用多層cursor的時候想知道每層的m_max_cursor_index值分別是多少,以用來做後續開發。於是做了以下的試驗,但是發現第一個level=2那層的m_max_cursor_index的值有點問題。 ...


一、前言

從mydumper v0.11.5版本開始,mydumper提供了--load-data參數,使用此參數導出的sql文件將不再是insert語句,而是load data語句。在MySQL官方文檔中關於load data是這麼描述的:When loading a table from a text file, use LOAD DATA. This is usually 20 times faster than using INSERT statements。load data的導入比insert快20倍,雖然實際中可能很難達到這個效率,但是對於MyDumper/MyLoader來說,使用--load-data選項,對導入速度的提升是顯而易見的。

二、--load-data選項

--load-data選項的參數主要有以下幾個。使用該選項導出將預設生成dat數據文件,而加上--csv參數將生成csv數據文件。此外也可以自定義數據文件里欄位、行的分隔符等,如果不定義,將使用預設的,一般使用預設的就行。

--load-data                      Instead of creating INSERT INTO statements, it creates LOAD DATA statements and .dat files
--csv                            Automatically enables --load-data and set variables to export in CSV format.
--fields-terminated-by           Defines the character that is written between fields
--fields-enclosed-by             Defines the character to enclose fields. Default: "
--fields-escaped-by              Single character that is going to be used to escape characters in theLOAD DATA stament, default: '\' 
--lines-starting-by              Adds the string at the begining of each row. When --load-data is usedit is added to the LOAD DATA statement. Its affects INSERT INTO statementsalso when it is used.
--lines-terminated-by            Adds the string at the end of each row. When --load-data is used it isadded to the LOAD DATA statement. Its affects INSERT INTO statementsalso when it is used.

三、數據導出

使用--load-data選項進行單庫的數據導出:

mydumper -h $host -u $user -p $password -B test -o /mydata/backup/shemafile --load-data --less-locking

從以下導出的內容中可以看到,對於每個表除了建表語句的sql文件,還生成了一個包含load語句sql文件,還有一個dat數據文件,裡面包含了該表的所有數據。

[root@wusl shemafile]# ll
total 7651704
-rw-r--r-- 1 root root        698 Apr  2 11:18 metadata
-rw-r--r-- 1 root root 1958809525 Apr  2 11:18 test.sbtest1.00000.dat
-rw-r--r-- 1 root root        319 Apr  2 11:18 test.sbtest1.00000.sql
-rw-r--r-- 1 root root        402 Apr  2 11:18 test.sbtest1-schema.sql
-rw-r--r-- 1 root root 1958809801 Apr  2 11:18 test.sbtest2.00000.dat
-rw-r--r-- 1 root root        319 Apr  2 11:18 test.sbtest2.00000.sql
-rw-r--r-- 1 root root        402 Apr  2 11:18 test.sbtest2-schema.sql
-rw-r--r-- 1 root root 1958809332 Apr  2 11:18 test.sbtest3.00000.dat
-rw-r--r-- 1 root root        319 Apr  2 11:18 test.sbtest3.00000.sql
-rw-r--r-- 1 root root        402 Apr  2 11:18 test.sbtest3-schema.sql
-rw-r--r-- 1 root root 1958809678 Apr  2 11:18 test.sbtest4.00000.dat
-rw-r--r-- 1 root root        319 Apr  2 11:18 test.sbtest4.00000.sql
-rw-r--r-- 1 root root        402 Apr  2 11:18 test.sbtest4-schema.sql
-rw-r--r-- 1 root root        153 Apr  2 11:18 test-schema-create.sql
-rw-r--r-- 1 root root          0 Apr  2 11:18 test-schema-triggers.sql

[root@wusl shemafile]# more test.sbtest1.00000.dat
1       5014614 68487932199-96439406143-93774651418-41631865787-96406072701-20604855487-25459966574-28203206787-41238978918-19503783441 22195207048-70116052123-74140395089-76317954521-98
694025897
2       5024801 13241531885-45658403807-79170748828-69419634012-13605813761-77983377181-01582588137-21344716829-87370944992-02457486289 28733802923-10548894641-11867531929-71265603657-36
546888392
3       4989423 51185622598-89397522786-28007882305-52050087550-68686337807-48942386476-96555734557-05264042377-33586177817-31986479495 00592560354-80393027097-78244247549-39135306455-88
936868384
4       5026450 54133149494-75722987476-23015721680-47254589498-40242947469-55055884969-23675271222-20181439230-74473404563-55407972672 88488171626-98596569412-94026374972-58040528656-38
000028170

[root@wusl shemafile]# more test.sbtest1.00000.sql
/*!40101 SET NAMES binary*/;
/*!40014 SET FOREIGN_KEY_CHECKS=0*/;
/*!40103 SET TIME_ZONE='+00:00' */;
LOAD DATA LOCAL INFILE 'test.sbtest1.00000.dat' REPLACE INTO TABLE `sbtest1` CHARACTER SET binary FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES STARTING BY '' TERMINATED
 BY '\n' (`id`,`k`,`c`,`pad`);

四、導入速度對比

實驗中使用的是sysbench生成的表,數據量9.5G。可以看到使用load-data導入對比insert導入,時間上提升了15%。有一定的提升,但不是特別明顯,主要因為是myloader在insert時,也做了很多優化,比如多個insert批量提交,每次提交1000行。

#--load-data導入
[root@wusl soft]# time myloader -h 10.xx.xx.xx -u root -p xxxxxxxx -d /mydata/backup/shemafile
** (myloader:119586): WARNING **: 13:36:34.783: zstd command not found on any static location, use --exec-per-thread for non default locations

real    2m49.765s
user    0m4.755s
sys     0m4.599s

#insert導入
[root@wusl soft]# time myloader -h 10.xx.xx.xx -u root -p xxxxxxxx -d /mydata/backup/shemafile
** (myloader:122550): WARNING **: 13:45:00.895: zstd command not found on any static location, use --exec-per-thread for non default locations

real    3m20.258s
user    0m11.874s
sys     0m5.455s

五、對比MySQL官方mysqlshell的導數工具

MySQL Shell 8.0.21 中推出的Dump & Load工具,同樣也是使用load data命令來導入數據,所以理論上和mydumper/myloader使用--load-data效率是一樣的。關於mysqlshell的Dump&Load工具,可以參考一下官方陳臣老師的這篇文章:https://mp.weixin.qq.com/s/RC6MykrGbZ850xh3AOjrtw。我們對這兩個工具進行一下對比實驗,既然是工具對比那就得相對公平,參數環境什麼的保持一致,首先導數前重啟一下mysql釋放buffer pool。mysqlshell導出會預設開壓縮和表分片,需要把它關閉。此外,mysqlshell預設是會生成binlog,因此myloader導入時也要加上-e參數開啟binlog。

#使用mysqlshell進行數據導出
MySQL  10.xx.xx.xx:33060+ ssl  JS > util.dumpSchemas(['test'],'/mydata/backup/shemafile',{compression: "none",chunking: "false"})
Acquiring global read lock
Global read lock acquired
Initializing - done 
1 schemas will be dumped and within them 8 tables, 0 views.
Gathering information - done 
All transactions have been started
Locking instance for backup
Global read lock has been released
Writing global DDL files
Running data dump using 4 threads.
NOTE: Progress information uses estimated values and may not be accurate.
Writing schema metadata - done       
Writing DDL - done       
Writing table metadata - done       
Starting data dump
106% (40.00M rows / ~37.59M rows), 323.53K rows/s, 63.45 MB/s                 
Dump duration: 00:01:05s                                     
Total duration: 00:01:05s                                    
Schemas dumped: 1                                            
Tables dumped: 8                                             
Data size: 7.84 GB                                           
Rows written: 40001025                                       
Bytes written: 7.84 GB                                       
Average throughput: 119.52 MB/s

#使用mysqlshell進行數據導入
MySQL  10.xx.xx.xx:33060+ ssl  JS > util.loadDump("/mydata/backup/shemafile")
Loading DDL and Data from '/mydata/backup/shemafile' using 4 threads.
Opening dump...
Target is MySQL 8.0.31. Dump was produced from MySQL 8.0.31
Scanning metadata - done       
Checking for pre-existing objects...
Executing common preamble SQL
Executing DDL - done       
Executing view DDL - done       
Starting data load
2 thds loading | 100% (7.84 GB / 7.84 GB), 24.59 MB/s, 6 / 8 tables done 
Recreating indexes - done       
Executing common postamble SQL                                          
8 chunks (40.00M rows, 7.84 GB) for 8 tables in 1 schemas were loaded in 4 min 6 sec (avg throughput 32.03 MB/s)
0 warnings were reported during the load.

#使用myloader導入(寫binlog)
[root@wusl-test-db1-1 soft]# time myloader -h 10.xx.xx.xx -u root -p xxxxxxxx -e -d /mydata/backup/shemafile
** (myloader:24020): WARNING **: 15:48:03.796: zstd command not found on any static location, use --exec-per-thread for non default locations

real    3m44.150s
user    0m4.855s
sys     0m4.606s

從以上實驗可以看出myloader還比mysqlshell導數工具快一點點,我想原因大概是myloader更輕量級,mysqlshell導數工具在數據遷移時可以查看進度、速度等,功能上豐富了不少。


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

-Advertisement-
Play Games
更多相關文章
  • 在WPF開發中,經常聽到各種屬性,如:依賴屬性,附加屬性,CLR屬性,那這些不同類型的屬性,具體又有什麼作用呢?今天以一些簡單的小例子,簡述一下WPF開發中,各種屬性的相關概念和應用,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 這是我本人編寫的一個排序演算法,主要就是解決複雜多組數字組合的這種文件名或者字元串的排序,排序主要規則就是從前往後對每一組數據進行排序,效果及截圖如下: 以下是使用方法: 第一步 搜索和安裝我的Nuget包 搜索和安裝zmjtool這個包,我寫的,如下圖: 第二步 使用HMSorter的Sort方法進 ...
  • Ubuntu 22.04 自帶ufw 無需下載 ufw是Uncomplicated Firewall的縮寫,是一個用戶友好的命令行工具,用於管理Ubuntu系統上的防火牆。通過ufw命令,用戶可以輕鬆地配置防火牆規則、查看當前的防火牆狀態、啟用或禁用防火牆等操作,幫助用戶保護系統安全並控制網路流量。 ...
  • 目錄3.5 ICMPv6 報文和報文類型1. ICMPv6 報頭2. ICMPv6 報文類型 3.5 ICMPv6 報文和報文類型 1. ICMPv6 報頭 ICMPv6的報頭由 type(8bit)\ code(8bit)\ checksum(16bit) 和 可變數據組成,由於可變數據太多,這裡 ...
  • 一、配置環境 1、虛擬機管理器:WMware Workstation Pro 17.0 2、虛擬機:22.04.1Ubuntu 二、概述 TotallySAF is a code that estimates the cosmological parameters constraints using ...
  • 這篇文章旨在教大家如何配置arch中文和中文輸入法和對時間的調整 主要解決三點問題 1.顯示中文 2.使用中文輸入法 3.顯示正確的時間 目錄這篇文章旨在教大家如何配置arch中文和中文輸入法和對時間的調整第一步,就是把arch切換成中文第二步,就是如何使用中文輸入法時間問題解決 我arch版本是a ...
  • fdisk -l命令用於查看CentOS系統中所有硬碟及其分區的詳細信息。該命令的輸出會顯示硬碟的大小、分區表結構、分區類型以及每個分區的起始和結束扇區等信息。 ...
  • 一:ansible劇本 1:簡介 一系列ansible命令的集合,使用yaml語言進行編寫的,從上往下的執行,支持很多的特性,比如,將某個命令的狀態作為變數給其他的任務執行,變數,迴圈,判斷,錯誤糾正,可以是一個playbook或者是多個playbook執行 2:yaml基本語法 1、yaml約束 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...