簡介:mysql
Mydumper、Myloader 是一個第三方的、開源的 MySQL 邏輯備份工具。
支持多線程,比起 mysqldump 要快不少,也能解決 innobackupex 備份工具對 MyISAM 引擎備份的不便。
多線程快速邏輯備份,恢復速度不咋地,支持快照功能。
呃,雖然這樣好、那樣好,但若是單庫、又很大的時候,備份仍是選擇 innobackupex 物理備份吧,速度就是快。c++
下載地址:https://launchpad.net/mydumper/0.9/0.9.1/+download/mydumper-0.9.1.tar.gz正則表達式
1、安裝 Mydumpersql
shell > yum -y install gcc gcc-c++ glib2-devel pcre-devel zlib-devel mysql-devel shell > cd /usr/local/src; wget https://launchpad.net/mydumper/0.9/0.9.1/+download/mydumper-0.9.1.tar.gz shell > tar zxf mydumper-0.9.1.tar.gz shell > cd mydumper-0.9.1 shell > cmake . && make && make install shell > /usr/local/bin/mydumper --help /usr/local/bin/mydumper: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory shell > find / -name "libmysqlclient.so.18" /usr/local/src/mysql-5.5.52/libmysql/libmysqlclient.so.18 /usr/local/mysql-5.5.52/lib/libmysqlclient.so.18 shell > ln -s /usr/local/mysql-5.5.52/lib/libmysqlclient.so.18 /usr/lib64/
2、Mydumper 全備shell
shell > /usr/local/bin/mydumper --help -B, --database 指定備份的數據庫,不指定時爲備份全庫(除 information_schema、performance_schema) -T, --tables-list 指定備份的表,逗號分隔 -o, --outputdir 指定備份目錄 -c, --compress 壓縮備份輸出 -e, --build-empty-files 即便表中無數據也備份成一個文件 -x, --regex 支持正則表達式 db.table,如 --regex '^(?!(mysql|test))' 不備份 mysql、test 庫 -m, --no-schemas 不備份表結構 -d, --no-data 不備份數據 -G, --triggers 備份 triggers -E, --events 備份 events -R, --routines 備份存儲過程跟函數 -k, --no-locks 不適用共享讀鎖,會致使數據不一致 -D, --daemon 以守護進程的方式啓動 -I, --snapshot-interval 快照間隔時間,默認 60 秒 -h, --host -u, --user -p, --password -P, --PORT -S, --socket -t, --threads 啓動幾個線程,默認 4 -C, --compress-protocol MySQL 鏈接上使用壓縮協議,建議遠程備份時使用 ... 還有一些不經常使用的指令 經過 --help 獲取
shell > /usr/local/bin/mydumper -u xxxx -p xxxx -e -c -B db_xxx -o /data/backup_db/2017-07/db_xxx_05 # 目錄 db_xxx_05 會自動建立 shell > ls -1 /data/backup_db/2017-07/db_xxx_05 db_xxx-schema-create.sql.gz db_xxx.table_1.sql.gz db_xxx.table_1-schema.sql.gz ... metadata # 備份目錄下會生成如上幾種類型的文件,可使用 gunzip 解壓後讀取、分析 # db_xxx-schema-create.sql.gz 備份的數據庫建立語句,也就是說恢復時不須要事先建立數據庫 # db_xxx.table_1.sql.gz 數據表數據文件 # db_xxx.table_1-schema.sql.gz 數據表結構文件 shell > cat /data/backup_db/2017-07/db_xxx_05/metadata Started dump at: 2017-07-05 14:57:56 SHOW MASTER STATUS: Log: mysql-bin.000024 Pos: 760137384 GTID:(null) Finished dump at: 2017-07-05 15:01:20 # metadata 記錄了備份時刻的 MASTER 信息(若是備份的是從庫,還會記錄 SLAVE STATUS),備份開始時間、結束時間
3、Myloader 全備恢復數據庫
shell > /usr/local/bin/myloader --help -d, --directory 指定備份數據存放目錄 -o, --overwarite-tables 如表存在,則覆蓋寫入 -B, --database 指定恢復的數據庫 -s, --source-db -e, --enable-binlog -h, --host -u, --user -p, --password -P, --PORT -S, --socket -t, --threads -C, --compress-protocol ...
shell > /usr/local/bin/myloader -u xxxx -p xxxx -B db_xxx -d /data/backup_db/2017-07/db_xxx_05 # 這是恢復單庫到一個新的 MySQL(不須要提早建立數據庫),不指定 -B 時,恢復備份中的全部數據 # 恢復單表時,解壓後直接 source .sql 便可 # 恢復到原庫時,須要添加 -o 參數,覆蓋寫入 # 機器性能容許的狀況下,添加 -t 參數,開啓多個並行線程恢復
4、如何加快恢復速度 ?多線程
shell > mysql -u xxxx -p xxxx mysql > show processlist; | 26 | root | localhost | baofeng_tv | Query | 2 | update | INSERT INTO `std_tj_sinideo` VALUES | | 27 | root | localhost | baofeng_tv | Query | 2 | update | INSERT INTO `std_alum_kwords` VALUES | 28 | root | localhost | baofeng_tv | Query | 1 | update | INSERT INTO `std_epode_qyi` VALUES | 29 | root | localhost | baofeng_tv | Query | 2 | update | INSERT INTO `std_alum_stams` VALUES
# 默認狀況下,能夠看到有 4 個線程在插入數據,一個線程負責一張表,執行完換下一張 ( myloader -u -p -B -d )
# 19G 的數據庫恢復了 82分22秒,簡直不能忍socket
shell > /usr/local/bin/mydumper -u root -c -e -B baofeng_tv -F 500 -o /data/backup_db/baofeng_tv_06 -t 8 shell > /usr/local/bin/myloader -u root -B baofeng_tv -o -d /data/backup_db/baofeng_tv_06 -t 8
# -F 按大小拆分備份,恢復的時候也並沒什麼效果,備份速度挺快,恢復不咋地!ide
# 那個,快照咋搞 ?函數