Mydumper
安裝mydumper
yum -y install glib2-devel zlib-devel pcre-devel cmake mysql-devel
wget https://launchpad.net/mydumper/0.9/0.9.1/+download/mydumper-0.9.1.tar.gz
tar zxvf mydumper-0.9.1.tar.gz;cd mydumper-0.9.1
cmake . && make && make install
如果報找不到mysql的錯,找到mysql_config 這個文件然后軟連接到
ln -s /usr/bin/mysql_config /usr/local/mysql/bin/mysql_config
或者指定對應的變量
cmake . -DMYSQL_INCLUDE_DIR=對應安裝目錄中的include文件夾
which mydumper #若報庫文件缺少,裝完數據庫后可將數據庫目錄下庫文件軟連或者復制到/usr/lib64目錄下即可,若安裝異常可確認zlib是否安裝了多個。
備份用戶授權
GRANT SELECT, RELOAD, FILE, SUPER, LOCK TABLES, REPLICATION SLAVE, REPLICATION CLIENT, PROCESS,SHOW VIEW ON *.* TO 'voole_back'@'localhost' IDENTIFIED BY 'voole_back'
進行備份
mydumper -u $user -p $pass -B dianzanpingfen -c -o $BACK_DIR -t 10 #dianzanpingfen為需要備份的數據庫
mydumper -u $user -p $pass --trx-consistency-only --regex '^(?!(mysql|test|ptcheck|performance_schema))' -c -o $BACK_DIR -t 10 #dianzanpingfen 為需要備份的數據庫 --regex是一個正則,里邊包括排除的庫
-B, --database 要備份的數據庫,不指定則備份所有庫
-T, --tables-list 需要備份的表,名字用逗號隔開
-o, --outputdir 備份文件輸出的目錄
-c, --compress 壓縮輸出文件
-e, --build-empty-files 如果表數據是空,還是產生一個空文件(默認無數據則只有表結構文件)
-x, --regex 是同正則表達式匹配 'db.table'
-i, --ignore-engines 忽略的存儲引擎,用都厚分割
-h, --host 連接的主機名
-u, --user 備份所使用的用戶
-p, --password 密碼
-P, --port 端口
-S, --socket 使用socket通信時的socket文件
-t, --threads 開啟的備份線程數,默認是4
-C, --compress-protocol 壓縮與mysql通信的數據
進行還原
myloader -d $BACK_DIR -o -u root -p 'mysql*()' -t 10 #還原,注意若mysql庫也還原,請先將原庫mysql庫提前備份,否則將覆蓋
備份文件需要找尋的數據同步點可查看備份文件夾內‘metadata’文件
Xtrabackup
安裝xtraback
yum -y install perl-DBD-mysql perl-DBI percona-xtrabackup-22 qpress
yum -y install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
給用戶授權
GRANT SELECT, RELOAD, FILE, SUPER, LOCK TABLES, REPLICATION SLAVE, REPLICATION CLIENT, PROCESS,SHOW VIEW ON *.* TO 'voole_back'@'localhost' IDENTIFIED BY 'voole_back'
flush privileges
備份
參數
--parallel=2 制定多線程備份
--no-timestamp 不生成時間戳目錄,而由自己指定目錄
全量備份(備份完成后可以對整個文件夾做壓縮)
/usr/bin/innobackupex --defaults-file=/opt/mysql56/etc/my.cnf --user=voole_back --password='voole_back' --slave-info --no-timestamp /opt/mysql_bak/base_backup
增量備份1
/usr/bin/innobackupex --defaults-file=/opt/mysql56/etc/my.cnf --user=voole_back --password=voole_back --incremental-basedir=/opt/mysql_bak/base_backup --incremental /opt/mysql_bak/incremental/incre1
增量備份2
/usr/bin/innobackupex --defaults-file=/opt/mysql56/etc/my.cnf --user=voole_back --password=voole_back --incremental-basedir=/opt/mysql_bak/incremental/incre1 --incremental /opt/mysql_bak/incremental/incre2
還原
解壓縮(到備份目錄里)
for i in `find . -iname "*.qp"`; do qpress -d $i $(dirname $i) && rm -f $i; done
全量恢復
innobackupex --defaults-file=/opt/mysql56/etc/my.cnf --apply-log --redo-only --use-memory=1G --user=voole_back --password=voole_back /opt/mysql_bak/base_backup
增量恢復1
innobackupex --defaults-file=/opt/mysql56/etc/my.cnf --apply-log --redo-only --use-memory=1G --user=my_back --password=mysql /opt/mysql_bak/base_backup --incremental-dir=/opt/mysql_bak/incremental/incre1
增量恢復2
innobackupex --defaults-file=/opt/mysql56/etc/my.cnf --apply-log --redo-only --use-memory=1G --user=my_back --password=mysql /opt/mysql_bak/base_backup --incremental-dir=/opt/mysql_bak/incremental/incre2
最后恢復
innobackupex --defaults-file=/opt/mysql56/etc/my.cnf --apply-log --use-memory=1G --user=voole_back --password=voole_back /opt/mysql_bak/base_backup
最后還原
innobackupex --defaults-file=/opt/mysql56/etc/my.cnf --copy-back --user=voole_back --password=voole_back /opt/mysql_bak/base_backup
更改還原后數據文件屬主屬組(具體需要更改數據庫的文件夾視情況而定)
chown -R mysql.mysql var redolog undolog
mysqldump
常用語法
mysqldump [OPTIONS] database [table1] [table2] 備份某個數據庫的某些表
mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2] 備份備份多個數據庫
mysqldump [OPTIONS] --all-databases [OPTIONS] 備份所有數據庫
常用參數
-u,--user=name 備份用戶名
-p,--password[=name] 備份密碼
--single-transaction 在一個事務中執行備份,InnoDB中使用,保持備份數據一致,需確保沒有其他DDL語句執行,因為事務并不隔離DDL操作。
-l,--lock-tables 在非事務型數據庫備份,進行鎖表來保持備份數據一致性。于--single-transaction是互斥的,不能同時使用,如果混合引擎,則只能使用鎖表
-x,--lock-all-tables 鎖定所有的表,保證所有數據庫下所有需要備份的表都是一致的,--lock-tables只會鎖定一個db下的所有表,保證單個數據庫的備份數據是一致的。
--master-data=[1/2] 值為1時,備份文件中只記錄了change master 語句,值為2時,change master 以注釋的形式出現。當制定了此參數時,而未指定--single-transaction,則會自動使用--lock-all-tables。
-R,--routines 備份存儲過程
--triggers 備份觸發器
-E,--events 備份調度事件
--hex-blob 對數據庫中存在的不可讀類型,備份為十六進制。
--tab=path 在制定路徑下,生成兩個文件,一個為表結構.sql,一個為表數據.txt,數據文件中用tab隔開便于閱讀。
-w,--where='過濾條件' 單表導出時,指定條件。
備份用戶授權
GRANT SELECT,RELOAD,LOCK TABLES,REPLICATION CLIENT,SHOW VIEW,PROCESS ON *.* to backup@'localhost' IDENTIFIED BY 'mysql*()'
備份實例
mysqldump -ubackup -p --master-data=2 --single-transaction --routines --triggers --events mc_orderdb > mc_orderdb.sql 備份mc_orderdb數據庫
mysqldump -ubackup -p --master-data=2 --single-transaction --routines --triggers --events mc_orderdb order_master > order_master.sql 備份mc_orderdb 數據庫中的order_master表
mysqldump -ubackup -p --master-data=1 --single-transaction --routines --triggers --events --all-databases > mc.sql 備份所有的數據庫,此備份的change master 不會被注釋。
--tab 備份數據庫 mc_orderdb
1、需要mysql對目錄有寫權限
2、用戶需要寫文件權限 grant file on *.* to backup@'localhost';
3、mysqldump -ubackup -p --master-data=2 --single-transaction --routines --triggers --events --tab="/tmp/db_backup/mc_orderdb" mc_orderdb
--where 備份數據庫 mc_orderdb中的order_master表的一部分數據
1、mysqldump -ubackup -p --master-data=2 --single-transaction --where "order_id>1000 and order_id<1050" mc_orderdb order_master > order_master_1000.sql
如何回復mysqldump備份的數據庫
mysql -u -p dbname < backup.sql
mysql> source /tmp/backup.sql
恢復指定--tab的備份數據
mysql > \. /tmp/mc_orderdb/region_info.sql
mysql > load data infile '/tmp/mc_orderdb/region_info.txt' into table region_info;
如何進行指定時間點的恢復
1、先決條件
具有指定時間點前的一個全備
具有自上次全備后到指定時間點的所有二進制日志
2、恢復全備,查看全備的最后的點,此處為84882
3、查看對應的binlog日志,找到需要恢復的時間點。
mysqlbinlog --base64-output=decode-rows -vv --start-position=84882 --database=mc_orderdb mysql-bin.000011 | grep -B3 DELETE
查找位置為84882后的,數據庫為mc_orderdb的,刪除語句,然后找到需要恢復的時間點,此處為169348
4、將時間點中間的數據寫入到sql文件中
mysqlbinlog --start-position=84882 --stop-position=169348 --database=mc_orderdb mysql-bin.000011 > mc_order_diff.sql
5、應用上一步得到的sql文件
mysql -uroot -p mc_orderdb < mc_order_diff.sql
實時二進制日志備份
1、創建帳號
grant replication slave on *.* to 'repl'@'localhost' identified by '123456';
2、創建目錄
mkdir binlog_bak;cd binlog_bak
3、實時進行二進制日志備份,其實就是開啟了一個IO線程,和slave一樣。
mysqlbinlog --raw --read-from-remote-server --stop-never --host localhost --port 3306 -urepl -p123456 mysql-bin.000010