mysql 備份和恢復 mysqldump xtrabackup

一、mysqldump備份


1)全量備份
mysqldump  -uroot -proot --all-databases --lock-all-tables --routines --triggers --master-data=2 --flush-logs > /data/mysql/mysql3306/myback/2017-1-11.17-25.full.sql
--all-databases 備份所有數據庫
  --lock-all-tables 所有表加讀鎖
--routinge 存儲過程與函數
--triggers 觸發器
其他參數:
` --add-locks  在每個表導出之前增加LOCK TABLES並且之後UNLOCK TABLE。 
--add-drop-table 在每個create語句之前增加一個drop table。   
--allow-keywords 允許創建是關鍵詞的列名字。這由表名前綴於每個列名做到。   
-c, --complete-insert 使用完整的insert語句(用列名字)。   
-C, --compress 如果客戶和服務器均支持壓縮,壓縮兩者間所有的信息。   
--delayed 用INSERT DELAYED命令插入行。   
-e, --extended-insert 使用全新多行INSERT語法。(給出更緊縮並且更快的插入語句)   
-#, --debug[=option_string] 跟蹤程序的使用(爲了調試)。   
-F, --flush-logs  在開始導出前,洗掉在MySQL服務器中的日誌文件。   
-f, --force  即使我們在一個表導出期間得到一個SQL錯誤,繼續。   
-h, --host=..  
-l, --lock-tables. 爲開始導出鎖定所有表。   
-t, --no-create-info  不寫入表創建信息(CREATE TABLE語句)   
-d, --no-data 不寫入表的任何行信息。如果你只想得到一個表的結構的導出,這是很有用的!   
-P port_num, --port=port_num
-q, --quick  不緩衝查詢,直接導出至stdout;使用mysql_use_result()做它。   
-u user_name, --user=user_name 與服務器連接時,MySQL使用的用戶名。缺省值是你的Unix登錄名。   
-O var=option, --set-variable var=option設置一個變量的值。可能的變量被列在下面。   
-v, --verbose冗長模式。打印出程序所做的更多的信息。   
-V, --version打印版本信息並且退出。   
-w, --where='where-condition'  只導出被選擇了的記錄;注意引號是強制的。
--opt  同--quick --add-drop-table --add-locks --extended-insert --lock-tables

2)mysqldump全量數據恢復
登錄mysql,執行 source + datapath.sql
3)場景模擬,假設我在表中新增數據後,不小心執行drop table操作,進行數據恢復
(1)創建一張表 mysql>  create table testBack(id int auto_increment primary key,name varchar(10));
(2) 插入幾條數據  insert into testBack(name) values('aaa'),('bbb'),('ccc'),('ddd'),('eee'),('fff');
(3)對該數據庫做一個備份   mysqldump  -uroot -proot  --lock-all-tables --routines --triggers --master-data=2 --flush-logs --database backup_test >         /data/mysql/mysql3306/myback/2017-1-12.10-31.backup_test.sql
(4)插入幾條數據  insert into testBack(name) values('ggg'),('hhh'),('iii');
(5)刪除表  drop table testBack;
(6)恢復之前的備份數據並設置不記錄日誌set global sql_log_bin=0;  source /data/mysql/mysql3306/myback/2017-1-12.10-44.backup_test.sql
(7)查看二進制日誌 mysqlbinlog binlog3306.000007
# at 420
#170112 13:09:57 server id 1  end_log_pos 555 CRC32 0x18c54f02Query thread_id=4exec_time=0 error_code=0
SET TIMESTAMP=1484197797/*!*/;
DROP TABLE `testBack` /* generated by server */
/*!*/;
# at 555
可知刪除操作是在420處做的
(8)將二進制日誌轉儲爲sql,並導入
mysqlbinlog --stop-position=420 binlog3306.000007>/data/mysql/mysql3306/myback/change.sql
source /data/mysql/mysql3306/myback/change.sql

二、使用xtrabackup進行完全備份、增量備份、熱備份
1)下載 、安裝
     下載:wget http://www.percona.com/downloads/XtraBackup/XtraBackup-2.1.2/binary/Linux/x86_64/percona-xtrabackup-2.1.2-611.tar.gz 
       安裝:
首先安裝相關的依賴
yum install libaio libaio-devel perl-Time-HiRes curl curl-devel zlib-devel openssl-devel perl cpio expat-devel gettext-devel perl-ExtUtils-MakeMaker perl-DBD-MySQL.* package -y
      然後解 壓:tar xvf percona-xtrabackup-2.1.2-611.tar.gz 
      cd percona-xtrabackup-2.1.2/bin
      然後將innobackupex、xtrabackup等文件copy到mysql程序目錄下/bin、目錄
      然後將mysql安裝目錄下的文件做軟鏈接到/usr/bin/目錄
      ln -s /data/mysql/mysql3306/bin/* /usr/bin/ 
      最後,測試是否安裝成功  innobackupex --help 
      爲備份建立一個只有備份權限的用戶
mysql> create user 'backup'@'localhost' identified by 'backup';
mysql> revoke all privileges,grant option from 'backup'@'localhost';
mysql> grant reload,lock tables,replication client on *.* to 'backup'@'localhost';
mysql> flush privileges;

2)完整備份
innobackupex --host=127.0.0.1 --user=backup --password=backup --defaults-file=/data/mysql/mysql3306/etc/my.cnf /data/mysql/mysql3306/myback
xtrabackup_checkpoints 備份類型(如完全或增量)、備份狀態(如是否已經爲prepared狀態)和LSN(日誌序列號)範圍信息;每個InnoDB頁(通常爲16k大小)
都會包含一個日誌序列號,即LSN。LSN是整個數據庫系統的系統版本號,每個頁面相關的LSN能夠表明此頁面最近是如何發生改變的。
xtrabackup_binlog_info mysql服務器當前正在使用的二進制日誌文件及至備份這一刻爲止二進制日誌事件的位置。
xtrabackup_binlog_pos_innodb 二進制日誌文件及用於InnoDB或XtraDB表的二進制日誌文件的當前position。
xtrabackup_binary 備份中用到的xtrabackup的可執行文件;
backup-my.cnf 備份命令用到的配置選項信息.

3)全量數據恢復
service mysqld stop
rm -rf /data/mysql/mysql3306/data/*
innobackupex --apply-log /data/mysql/mysql3306/myback/2017-01-12_15-09-25
--apply-log 的意義在於把備份時沒commit的事務撤銷,已經commit的但還在事務日誌中的應用到數據庫
innobackupex --copy-back /data/mysql/mysql3306/myback/2017-01-12_15-09-25/
--copy-back數據庫恢復,後面跟上備份目錄的位置
chown -R mysql:mysql /data/mysql/mysql3306/data
service mysqld start ##如果能啓動代表恢復正常

4)增量備份
首先在表中插入一些數據
mysql>  insert into testBack(name) values ('add1'), ('add2'), ('add3');
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0


mysql> commit;
Query OK, 0 rows affected (0.00 sec)
然後執行增量備份語句
innobackupex --user=backup --password=backup  --incremental --incremental-basedir=/data/mysql/mysql3306/myback/2017-01-12_15-09-25/ /data/mysql/mysql3306/myback
--incremental 指定是增量備份
--incremental-basedir 指定基於哪個完整備份做增量備份,最後是增量備份保存的目錄
增量備份只能對InnoDB引擎做增量備份,對MyISAM的表是完全複製

5)增量備份的恢復
(1)停庫:service mysqld stop
(2)刪除數據文件:rm -rf /data/mysql/mysql3306/data/*
(3)撤銷備份時沒有提交的事務、把備份時commit的但還在事務日誌中的應用到時數據
innobackupex --apply-log --redo-only /data/mysql/mysql3306/myback/2017-01-12_15-09-25
--redo-only 指的是把備份時commit的但還在事務日誌中的應用到時數據,但是還沒提交的不撤消,
因爲這個事務可能在增量備份中提交,假如的撤消了增量備份中就不提交,因爲事務已經不完整
(4)將增量備份全併到完整備份中去
innobackupex --apply-log /data/mysql/mysql3306/myback/2017-01-12_15-09-25/ \
--incremental-dir=/data/mysql/mysql3306/myback/2017-01-12_15-27-08/
/data/mysql/mysql3306/myback/2017-01-12_15-09-25/ 這個是完整備份的目錄
--incremental-dir 後跟的是增量備份的目錄
這個會使增量備份中的的數據合併到完整備份中,如果還有增量備份,繼續合併,恢復時恢復完整備份即可
(5)恢復數據,並起動MySQL
innobackupex --copy-back --defaults-file=/data/mysql/mysql3306/etc/my.cnf /data/mysql/mysql3306/myback/2017-01-12_15-09-25/
chown -R mysql:mysql  /data/mysql/mysql3306/data
service mysqld start

檢查數據


推薦一篇博客 地址是:http://www.cnblogs.com/zengkefu/p/5669512.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章