《MYSQL數據庫使用mydumper多線程備份MySQL數據庫》要點:
本文介紹了MYSQL數據庫使用mydumper多線程備份MySQL數據庫,希望對您有用。如果有疑問,可以聯系我們。
mysqldump:其特征之一是在處理過程中需要對列表加以鎖定,因此如果我們需要在工作時段執行備份工作,那么會引起DML阻塞.但一般現在的MySQL都有主從,備份也大部分在從上進行,所以鎖的問題可以不用考慮.這樣,mydumper能更好的完成備份任務.
Mydumper主要特性:是一個針對MySQL和Drizzle的高性能多線程備份和恢復工具,開發人員主要來自MySQL,Facebook,SkySQL公司.MYSQL實例
下載安裝:環境:Ubuntu 12.04MYSQL實例
安裝:解壓后,有安裝說明MYSQL實例
CMake Warning at docs/CMakeLists.txt:9 (message):
? Unable to find Sphinx documentation generatorMYSQL實例
-- ------------------------------------------------
-- 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
MYSQL實例
生成2個工具:mydumper(備份),myloader(導入)MYSQL實例
參數:
mydumper:
MYSQL實例
Help Options:
? -?, --help????????????????? Show help optionsMYSQL實例
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
MYSQL實例
myloader:
MYSQL實例
Help Options:
? -?, --help??????????????????????? Show help optionsMYSQL實例
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
MYSQL實例
測試:測試基本用法MYSQL實例
1:備份
MYSQL實例
備份analyzedxy數據庫到/home/zhoujy/bak/ 目錄中,查看是否多線程:MYSQL實例
上面顯示確實是4個線程(默認)在備份,查看備份文件:MYSQL實例
分析:mydumper把數據和表結構分開備份,并且把二進制日志備份出來單獨放到一個文件中.MYSQL實例
2:還原:還原到另一臺服務器,先建立要還原的數據庫(chushihua)MYSQL實例
和備份一樣查看是否多線程:MYSQL實例
上面顯示確實是4個線程(默認)在還原.
進一步測試:測試一些常用的參數
1):備份指定表(-T),并且不要導出表結構(-m)MYSQL實例
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
MYSQL實例
?2)壓縮備份文件(-c),備份binlog(-b),正則表達式備份表(-x)MYSQL實例
?MYSQL實例
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
?MYSQL實例
如上所示,備份文件已經是壓縮的了(用gzip -d 解壓),并且備份出了tmp.*匹配出來的所有表,二進制日志也被備份到了binlog_snapshot文件中,并且也是被壓縮的.
3)還原,表存在先刪除(-o):這里需要注意,使用該參數,備份目錄里面需要有表結構的備份文件.MYSQL實例
更多的參數效果,請自己測試.
最后測試:用mysqldump和mydumper進行對比測試.MYSQL實例
backup = os.system('')MYSQL實例
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" %tMYSQL實例
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" %tMYSQL實例
if __name__ =='__main__':
??? mysqldump_data()
??? mydumper_data()
MYSQL實例
測試了2個數據庫:MYSQL實例
1:MYSQL實例
mysqldump Cost Time :162s
mydumper Cost Time :61sMYSQL實例
2:MYSQL實例
mysqldump Cost Time :483s
mydumper Cost Time :337sMYSQL實例
從上面的時間來看,mydumper 確實提升了備份數據,還原也同理.MYSQL實例
總結:
從上面的測試分析中看出mydumper可以提升備份還原的效率,提升多少受限于磁盤的IO能力,在使用前做好磁盤IO的評估,大家可以嘗試使用該工具.MYSQL實例
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/5331.html