課程大綱前端
一、備份的緣由 二、備份的方式 三、備份的工具 四、mysqldump備份工具的詳解 五、mysqldump+mysqlbinlog實現增量備份 六、企業級備份策略及恢復案例 七、xtrabackup備份恢復實戰
運維工做的核心簡單歸納就兩件事:mysql
第一個是保護公司的數據。sql
第二個是讓網站能7*24小時提供服務(用戶體驗)。數據庫
冷備份:關閉數據、中止業務centos
溫備份:枷鎖備份app
熱備份:在線備份,不會影響業務。運維
邏輯備份:socket
基於sql語句的備份:函數
①mysqldump--》建庫,建表,數據插入工具
②基於二進制日誌:數據庫的全部變化類的操做。
③基於複製的備份:將二進制日誌實時傳遞到另外一臺機器而且恢復。
物理備份:
①xtrabackup 進行物理備份
②拷貝數據文件(冷備)
①mysqldump
mysql原生自帶很好用的邏輯備份工具
②mysqlbinlog(根據始末position位置進行截取備份)
實現binlog備份的原生態命令
③xtrabackup
percona公司開發的性能很高的物理備份工具
mysqldump備份工具優缺點:
優勢:邏輯備份工具,都是sql語句,都是文本格式,便於查看和編輯,便於壓縮。
缺點:備份較慢,效率低。
mysqldump參數介紹:
-u -p -S -h -P
-A, 全庫備份
例子:
[root@centos6-kvm3 ~]# mysqldump -uroot -poldboy123 -A >/backup/mysqlfull.sql
單庫備份:
-B,增長建庫(create)及’use庫‘的語句,在未來恢復時,不須要手工建庫和use庫。
-B 選項還能夠實現,同時備份多個庫,備份到同一個文件中。(空格隔開)
[root@centos6-kvm3 ~]# mysqldump -uroot -poldboy123 -B lufei >/backup/mysqllufei.sql
[root@centos6-kvm3 ~]# mysqldump -uroot -poldboy123 lufei >/backup/mysqllufei1.sql
不加-B,恢復時候須要先建立庫,use庫下再進行恢復。
不加-B ,去備份他庫下的一個單表的意思。
生成環境下,也要加的額外參數:
-R:備份存儲過程和函數數據。
--triggers :備份觸發器數據。
-F,--flush-logs :刷新binlog日誌,爲了方便未來二進制日誌截取時的起點。
mysqldump -uroot -poldboy -A -F >/backup/mysqlfull.sql
--master-data={1|2} :告訴你備份時刻的binlog位置,通常咱們選擇2,以註釋的方式記錄二進制日誌的位置。
mysql> show master status;
鎖表:適合全部引擎(myisam,innodb)
-x,--lock-all-tables
-l,--lock-tables
--single-transaction 對innodb引擎進行熱備
[root@centos6-kvm3 ~]# mysqldump -uroot -poldboy123 -A --master-data=2 --single-transaction >/backup/mysqlfull.sql
經過快照的方式實現熱備。
壓縮備份:
[root@centos6-kvm3 ~]# mysqldump -uroot -poldboy123 -A -R --triggers --master-data=2 --single-transaction | gzip >/backup/mysqlfull_$(date +%F).sql
使用source 命令進行恢復 set sql_log_bin=0;(臨時關閉二進制日誌,防止恢復操做記錄到二進制日誌中) source /opt/xxx.sql; 企業實例: 背景環境: 正在運行的網站系統,mysql數據庫,數據量25G,日業務增量10-15M。 備份方式: 天天23:00點,計劃任務調用mysqldump執行全備腳本。 故障時間點: 上午10點,誤刪除了一個表。 如何恢復? 思路: ①斷開業務,防止對數據庫二次傷害,掛出維護頁面。 ②搭建備用庫,恢復全備。 ③截取昨天晚上23:00以後到上午10點誤刪除操做以前的二進制日誌。 ④恢復到備用庫,驗證數據可用性和完整性。 ⑤兩種恢復前端應用。 5.1備用庫導出誤刪除的表,導入到生產庫,開啓業務。 5.2直接將應用切割刀備用庫,替代生產庫,開啓業務。 模擬故障並恢復: 一、原始數據: mysql> create database oldboy; mysql> use oldboy mysql> create table t1 (id int,name varchar(20)); mysql> insert into t1 values (1,'zhang3'); mysql> insert into t1 values (2,'li4'); mysql> insert into t1 values (3,'wang5'); mysql> commit; 二、模擬前一天晚上23:00全備 mysqldump -A -R --triggers --master-data=2 --single-transaction |gzip >/backup/all_$(date +%F).sql.gz 三、模擬白天(23:00-10:00)業務對數據的修改 mysql> insert into t1 values (4,'zhang33'); mysql> insert into t1 values (5,'li44'); mysql> insert into t1 values (6,'wang54'); mysql> commit; 四、模擬故障 drop table t1; 五、恢復 (1)準備全備,並獲取到備份文件中的binlog的截取起點 gunzip all_2018-04-04.sql.gz -- CHANGE MASTER TO MASTER_LOG_FILE='my-bin.000004', MASTER_LOG_POS=731; (2)截取二進制日誌 mysqlbinlog --start-position=731 --stop-position=1126 /data/binlog/my-bin.000004 >/backup/binlog.sql ----- show binlog events in 'my-bin.000004'; ----》drop以前的position爲1126 ----- (3)恢復全備+binlog set sql_log_Bin=0; source /backup/all_2018-04-04.sql; source /backup/binlog.sql
Xtrabackup物理備份工具 percona公司的備份工具,性能比較高。物理備份工具。 特色: 物理備份工具,在同級數據量基礎上,都要比邏輯備份性能要好的多。 特別是在數據量比較大的時候,體現的更加明顯。 備份方式: 一、拷貝數據文件 二、拷貝數據頁 備份原理(innodb): 一、對於innodb表,能夠實現熱備 (1)在數據還有修改操做的時刻,直接將數據文件中的數據頁備份 此時,備份走的數據對於當前mysql來說是不一致。 (2) 將備份過程當中的redo和undo一併備走。 (3)爲了恢復的時候,只要保證備份出來的數據頁LSN能和redo LSN匹配, 未來恢復的就是一致的數據。redo應用和undo的應用。 二、對與myisam表,實現自動鎖表拷貝文件。 Xtrabackup軟件安裝: 一、安裝 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm yum -y install percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm 二、全備備份並恢復 mkdir /server/backup -p --user= --password= --socket= --no-timestamp 全備例子: innobackupex /server/backup/ innobackupex --no-timestamp /server/backup/full 全備恢復例子: 一、恢復數據前的準備(合併xtabackup_log_file和備份的物理文件) innobackupex --apply-log --use-memory=32M /server/backup/full/ 二、模擬故障 停庫: pkill mysqld 破壞數據: cd /application/mysql/data \rm -rf * 三、恢復 cp -a /server/backup/full/* /application/mysql/data 或者 innobackupex --copy-back /server/backup/full/ 注意:恢復時,要確認數據路徑是空的,而且數據庫是停掉的 chown -R mysql.mysql /application/mysql/data 啓動: /etc/init.d/mysqld start mysql -e "select * from oldboy.t1"
xtrabackup 實現增量備份及故障恢復 週日全備,週一到週六作增量 一、週日全備: mkdir /backup/full innobackupex --user=root --password=123 --no-timestamp /backup/full/ 二、模擬數據變化(週一數據變化) 。 。 。 三、第一增量(週一夜增量): innobackupex --user=root --password=123 --incremental --no-timestamp --incremental-basedir=/backup/full/ /backup/inc1 四、模擬數據變化(週二數據變化) 。 。 。 五、第二次增量(週二晚上增量): innobackupex --user=root --password=123 --incremental --no-timestamp --incremental-basedir=/backup/inc1 /backup/inc2 六、模擬數據損壞 n多的操做。。。。。 週三上午10:00時刻,刪除t1表 七、恢復數據: innobackupex --apply-log --redo-only /backup/full innobackupex --apply-log --redo-only --incremental-dir=/backup/inc1 /backup/full innobackupex --apply-log --incremental-dir=/backup/inc2 /backup/full innobackupex --apply-log /backup/full
背景: 一、xtrabackup備份策略每週日,full全備 二、xtrabackup週一到週六,inc1-inic6 三、總數據量200G 四、週三上午10點誤刪除表t1,數據量1G左右 五、週二晚上inc2備份完成以後到週三上午10點又作了不少操做 如何將數據庫恢復到t1表誤刪除以前狀態? 思路: 一、停業務,掛維護頁 二、找備用庫 三、合併full+inc1+inc2 四、截取週二晚上inc2備份後到週三上午10點,t1表刪除以前的binlog日誌 五、將合併後的full+截取的binlog恢復到備用庫 ( 根據備份日誌最後的position,再根據show binlog events in 'my-bin.000004';獲取最後的position) 六、驗證數據可用性和完整性 七、使用備用庫替代生產庫使用或者將t1表導出並導入回生產庫 八、業務恢復 ----------------- ----------------- 思考:以上恢復策略是否能夠優化? 爲了恢復1G表,須要將整個全備恢復,有必要嗎?有什麼好的解決辦法? 單獨恢復一個表: drop table t1; create table t1 (id int,name varchar(20)); alter table t1 discard tablespace; cd /application/mysql/data/oldboy cp /backup/full/oldboy/t1.ibd ./ chown -R mysql.mysql * alter table t1 import tablespace;