mysqldump:其特征之一是在處理過程中需要對列表加以鎖定,因此如果我們需要在工作時段執行備份工作,那麼會引起DML阻塞。但一般現在的MySQL都有主從,備份也大部分在從上進行,所以鎖的問題可以不用考慮。這樣,mydumper能更好的完成備份任務。
Mydumper主要特性:是一個針對MySQL和Drizzle的高性能多線程備份和恢復工具,開發人員主要來自MySQL,Facebook,SkySQL公司。
復制代碼 代碼如下:
1:輕量級C語言寫的
2:執行速度比mysqldump快10倍
3:事務性和非事務性表一致的快照(適用於0.2.2以上版本)
4:快速的文件壓縮
5:支持導出binlog
6:多線程恢復(適用於0.2.1以上版本)
7:以守護進程的工作方式,定時快照和連續二進制日志(適用於0.5.0以上版本)
8:開源 (GNU GPLv3)
下載安裝:環境:Ubuntu 12.04
復制代碼 代碼如下:
wget https://launchpad.net/mydumper/0.5/0.5.2/+download/mydumper-0.5.2.tar.gz
安裝:解壓後,有安裝說明
復制代碼 代碼如下:
apt-get install libglib2.0-dev libmysqlclient15-dev zlib1g-dev libpcre3-dev g++
cmake .
make
復制代碼 代碼如下:
root@dd:~/mydumper-0.5.2# cmake .
-- The CXX compiler identification is GNU
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Using mysql-config: /usr/bin/mysql_config
-- Found MySQL: /usr/include/mysql, /usr/lib/x86_64-linux-gnu/libmysqlclient_r.so;/usr/lib/x86_64-linux-gnu/libpthread.so;/usr/lib/x86_64-linux-gnu/libz.so;/usr/lib/x86_64-linux-gnu/libm.so;/usr/lib/x86_64-linux-gnu/librt.so;/usr/lib/x86_64-linux-gnu/libdl.so
CMake Warning at docs/CMakeLists.txt:9 (message):
Unable to find Sphinx documentation generator
-- ------------------------------------------------
-- MYSQL_CONFIG = /usr/bin/mysql_config
-- CMAKE_INSTALL_PREFIX = /usr/local
-- BUILD_DOCS = ON
-- RUN_CPPCHECK = OFF
-- Change a values with: cmake -D<Variable>=<Value>
-- ------------------------------------------------
--
-- Configuring done
-- Generating done
-- Build files have been written to: /root/mydumper-0.5.2
root@dd:~/mydumper-0.5.2# make
Scanning dependencies of target mydumper
[ 20%] Building C object CMakeFiles/mydumper.dir/mydumper.c.o
[ 40%] Building C object CMakeFiles/mydumper.dir/binlog.c.o
[ 60%] Building C object CMakeFiles/mydumper.dir/server_detect.c.o
[ 80%] Building C object CMakeFiles/mydumper.dir/g_unix_signal.c.o
Linking C executable mydumper
[ 80%] Built target mydumper
Scanning dependencies of target myloader
[100%] Building C object CMakeFiles/myloader.dir/myloader.c.o
Linking C executable myloader
[100%] Built target myloader
生成2個工具:mydumper(備份),myloader(導入)
參數:
mydumper:
復制代碼 代碼如下:
root@dd:~/mydumper-0.5.2# ./mydumper --help
Usage:
mydumper [OPTION...] multi-threaded MySQL dumping
Help Options:
-?, --help Show help options
Application Options:
-B, --database 需要備份的庫
-T, --tables-list 需要備份的表,用逗號分隔
-o, --outputdir 輸出文件的目錄
-s, --statement-size 生成插入語句的字節數, 默認 1000000
-r, --rows 分裂成很多行塊表
-c, --compress 壓縮輸出文件
-e, --build-empty-files 即使表沒有數據,還是產生一個空文件
-x, --regex 正則表達式: 'db.table'
-i, --ignore-engines 忽略的存儲引擎,用逗號分隔
-m, --no-schemas 不導出表結構
-k, --no-locks 不執行共享讀鎖 警告:這將導致不一致的備份
-l, --long-query-guard 設置長查詢時間,默認60秒
--kill-long-queries kill掉長時間執行的查詢
-b, --binlogs 導出binlog
-D, --daemon 啟用守護進程模式
-I, --snapshot-interval dump快照間隔時間,默認60s,需要在daemon模式下
-L, --logfile 日志文件
-h, --host The host to connect to
-u, --user Username with privileges to run the dump
-p, --password User password
-P, --port TCP/IP port to connect to
-S, --socket UNIX domain socket file to use for connection
-t, --threads 使用的線程數,默認4
-C, --compress-protocol 在mysql連接上使用壓縮協議
-V, --version Show the program version and exit
-v, --verbose 更多輸出, 0 = silent, 1 = errors, 2 = warnings, 3 = info, default 2
myloader:
復制代碼 代碼如下:
root@dd:~/mydumper-0.5.2# ./myloader --help
Usage:
myloader [OPTION...] multi-threaded MySQL loader
Help Options:
-?, --help Show help options
Application Options:
-d, --directory 備份文件所在的目錄
-q, --queries-per-transaction 每次執行查詢數量, 默認1000
-o, --overwrite-tables 如果表存在則先刪除。這裡注意下,使用該參數,需要備份時候要備份表結構,不然會出問題
-B, --database 需要還原的數據庫
-e, --enable-binlog 啟用二進制恢復數據
-h, --host The host to connect to
-u, --user Username with privileges to run the dump
-p, --password User password
-P, --port TCP/IP port to connect to
-S, --socket UNIX domain socket file to use for connection
-t, --threads 使用的線程數量,默認4
-C, --compress-protocol 連接上使用壓縮協議
-V, --version Show the program version and exit
-v, --verbose 更多輸出, 0 = silent, 1 = errors, 2 = warnings, 3 = info, default 2
測試:測試基本用法
1:備份
復制代碼 代碼如下:
./mydumper -u zjy -p ##### -h 192.168.220.245 -P 3306 -B chushihua -o /home/zhoujy/bak/
備份analyzedxy數據庫到/home/zhoujy/bak/ 目錄中,查看是否多線程:
復制代碼 代碼如下:
| 4937639 | zjy | 192.168.200.25:34781 | NULL| Query | 0 | NULL | show processlist |
| 4937677 | zjy | 192.168.200.25:34791 | NULL| Query | 10 | Writing to net | SELECT /*!40001 SQL_NO_CACHE */|
| 4937678 | zjy | 192.168.200.25:34792 | NULL| Query | 5 | Writing to net | SELECT /*!40001 SQL_NO_CACHE */ |
| 4937679 | zjy | 192.168.200.25:34793 | NULL| Query | 10 | Writing to net | SELECT /*!40001 SQL_NO_CACHE */ |
| 4937680 | zjy | 192.168.200.25:34794 | NULL| Query | 10 | Writing to net | SELECT /*!40001 SQL_NO_CACHE */ |
上面顯示確實是4個線程(默認)在備份,查看備份文件:
復制代碼 代碼如下:
root@zhoujy:/home/zhoujy/bak# ls -lh
-rw-r--r-- 1 root root 322 2013-11-14 17:59 chushihua.dba_hospital_all_name-schema.sql
-rw-r--r-- 1 root root 16M 2013-11-14 17:59 chushihua.dba_hospital_all_name.sql
-rw-r--r-- 1 root root 221 2013-11-14 17:59 chushihua.dba_hospital-schema.sql
-rw-r--r-- 1 root root 658 2013-11-14 17:59 chushihua.dba_hospital.sql
-rw-r--r-- 1 root root 198 2013-11-14 17:59 chushihua.dba_jobTitle-schema.sql
-rw-r--r-- 1 root root 300 2013-11-14 17:59 chushihua.dba_jobTitle.sql
-rw-r--r-- 1 root root 261 2013-11-14 17:59 chushihua.dba_locatedCity-schema.sql
-rw-r--r-- 1 root root 202K 2013-11-14 17:59 chushihua.dba_locatedCity.sql
分析:mydumper把數據和表結構分開備份,並且把二進制日志備份出來單獨放到一個文件中。
復制代碼 代碼如下:
metadata:元數據 記錄備份開始和結束時間,以及binlog日志文件位置。
table data:每個表一個文件
table schemas:表結構文件
binary logs: 啟用--binlogs選項後,二進制文件存放在binlog_snapshot目錄下
daemon mode:在這個模式下,有五個目錄0,1,binlogs,binlog_snapshot,last_dump。
備份目錄是0和1,間隔備份,如果mydumper因某種原因失敗而仍然有一個好的快照,當快照完成後,last_dump指向該備份。
2:還原:還原到另一台服務器,先建立要還原的數據庫(chushihua)
復制代碼 代碼如下:
./myloader -u root -p 123456 -h 192.168.200.25 -P 3307 -B chushihua -d /home/zhoujy/bak/
和備份一樣查看是否多線程:
復制代碼 代碼如下:
| 19 | root | | NULL | Query | 0 | init | show processlist|
| 30 | root | | chushihua | Query | 5 | update| INSERT INTO |
| 31 | root | | chushihua | Query | 5 | update| INSERT INTO |
| 32 | root | | chushihua | Query | 5 | update| INSERT INTO |
| 33 | root | | chushihua | Query | 5 | update| INSERT INTO |
上面顯示確實是4個線程(默認)在還原。
進一步測試:測試一些常用的參數
1):備份指定表(-T),並且不要導出表結構(-m)
復制代碼 代碼如下:
./mydumper -u root-p 123456 -h 192.168.220.252 -P 3306 -m -B test -T b,a,c,d,e,g,f,h,i -o /home/zhoujy/bak/
zhoujy@zhoujy:~/bak$ ls -lh
-rw-rw-r-- 1 zhoujy zhoujy 3.4K 2013-11-14 20:57 test.a.sql
-rw-rw-r-- 1 zhoujy zhoujy 1.6M 2013-11-14 20:57 test.b.sql
-rw-rw-r-- 1 zhoujy zhoujy 7.8M 2013-11-14 20:57 test.c.sql
-rw-rw-r-- 1 zhoujy zhoujy 1.7M 2013-11-14 20:57 test.d.sql
-rw-rw-r-- 1 zhoujy zhoujy 303K 2013-11-14 20:57 test.e.sql
-rw-rw-r-- 1 zhoujy zhoujy 517K 2013-11-14 20:57 test.f.sql
-rw-rw-r-- 1 zhoujy zhoujy 646K 2013-11-14 20:57 test.g.sql
-rw-rw-r-- 1 zhoujy zhoujy 394K 2013-11-14 20:57 test.h.sql
-rw-rw-r-- 1 zhoujy zhoujy 34K 2013-11-14 20:57 test.i.sql
-rw-rw-r-- 1 zhoujy zhoujy 75 2013-11-14 20:57 metadata
2)壓縮備份文件(-c),備份binlog(-b),正則表達式備份表(-x)
復制代碼 代碼如下:
./mydumper -u root -p 123456 -h 192.168.200.25 -P 3306 -m -c -b --regex=tmp.* -B test -o /home/zhoujy/bak/
drwx------ 2 zhoujy zhoujy 4.0K 2013-11-14 21:16 binlog_snapshot
-rw-rw-r-- 1 zhoujy zhoujy 133 2013-11-14 21:16 metadata
-rw-rw-r-- 1 zhoujy zhoujy 94K 2013-11-14 21:16 test.tmp_0808.sql.gz
-rw-rw-r-- 1 zhoujy zhoujy 75K 2013-11-14 21:16 test.tmp_0809.sql.gz
-rw-rw-r-- 1 zhoujy zhoujy 25K 2013-11-14 21:16 test.tmp_0813.sql.gz
-rw-rw-r-- 1 zhoujy zhoujy 208K 2013-11-14 21:16 test.tmp_0826.sql.gz
-rw-rw-r-- 1 zhoujy zhoujy 915 2013-11-14 21:16 test.tmp_0827.sql.gz
-rw-rw-r-- 1 zhoujy zhoujy 901 2013-11-14 21:16 test.tmp_0912.sql.gz
-rw-rw-r-- 1 zhoujy zhoujy 2.1K 2013-11-14 21:16 test.tmp_0916.sql.gz
-rw-rw-r-- 1 zhoujy zhoujy 622K 2013-11-14 21:16 test.tmp_0918_a.sql.gz
-rw-rw-r-- 1 zhoujy zhoujy 28M 2013-11-14 21:16 test.tmp_0918_ff.sql.gz
如上所示,備份文件已經是壓縮的了(用gzip -d 解壓),並且備份出了tmp.*匹配出來的所有表,二進制日志也被備份到了binlog_snapshot文件中,並且也是被壓縮的。
3)還原,表存在先刪除(-o):這裡需要注意,使用該參數,備份目錄裡面需要有表結構的備份文件。
復制代碼 代碼如下:
./myloader -u root -p 123456 -h 192.168.200.25 -P 3306 -o -B test -d /home/zhoujy/bak/
更多的參數效果,請自己測試。
最後測試:用mysqldump和mydumper進行對比測試。
復制代碼 代碼如下:
#!/usr/bin/env python
#coding=utf-8
import MySQLdb
import os
import sys
import time
backup = os.system('')
def mysqldump_data():
t1 = time.time()
backup = os.system('mysqldump --no-defaults -uroot -p123456 -h192.168.200.25 --default-character-set=utf8 test > /home/zhoujy/test.bak')
t2 = time.time()
t = round(t2-t1)
print "mysqldump Cost Time %s" %t
def mydumper_data():
t1 = time.time()
backup = os.system('mydumper -u root -p 123456 -h 192.168.200.25 -P 3306 -B test -o /home/zhoujy/bak/')
t2 = time.time()
t = round(t2-t1)
print "mydumper Cost Time %s" %t
if __name__ =='__main__':
mysqldump_data()
mydumper_data()
測試了2個數據庫:
1:
mysqldump Cost Time :162s
mydumper Cost Time :61s
2:
mysqldump Cost Time :483s
mydumper Cost Time :337s
從上面的時間來看,mydumper 確實提升了備份數據,還原也同理。
總結:
從上面的測試分析中看出mydumper可以提升備份還原的效率,提升多少受限於磁盤的IO能力,在使用前做好磁盤IO的評估,大家可以嘗試使用該工具。