MySQL(五)

MySQL備份與恢復前端

一、備份的類型
  冷備份:關閉數據、中止業務
  溫備份:加鎖備份
  熱備份:在先備份,不會影響到也正常運行mysql

二、備份方式
  邏輯備份:基於SQL語句的備份
    (1)mysqldump建庫、建表、數據插入
    (2)基於二進制日誌:數據庫的全部變化類的操做
    (3)基於複製的備份:將二進制日誌實時傳送到另外一臺機器而且恢復
  物理備份
    (1)xtrabackup進行物理備份
    (2)拷貝數據文件(冷備)sql

三、備份工具
(1)mysqldump
  mysql原生自帶很好用的邏輯備份工具
(2)mysqlbinlog
  實現binlog備份的原生態命令
(3)xtrabackup
  precona公司開發的性能很高的物理備份工具數據庫

四、mysqldump備份工具使用app

  優勢:邏輯備份工具,都是SQL語句,都是文本格式,便於查看和編輯,更便於壓縮
  缺點:備份效率較慢socket


mysqldump經常使用參數:函數

  -u -p -h -S -P
(1)全庫備份
  -A,  
  例子:
  mysqldump -uroot -p123 -A >/backup/full.sql工具

 

(2)單庫備份 性能

  例子:
  mysqldump -uroot -p123 -B lufei >/backup/lufei.sql
  mysqldump -uroot -p123 lufei >/backup/lufei1.sql
  -B,增長建庫(create)及「use庫」的語句,在未來恢復時,不須要手工進行建庫和use
  不加-B,須要恢復時,先建立庫,use庫下再進行恢復
  另外,-B選項還能夠實現,同時備份多個庫,備份到同一個文件中
    mysqldump -uroot -p123 -B lufei oldboy>/backup/lufei_oldboy.sql
  如下例子,若是不加-B,去備份,他的功能是備份路飛數據庫下的oldboy表
    mysqldump -uroot -p123 lufei oldboy>/backup/lufei_oldboy.sql
    mysqldump 庫1 表1 表2 表3 >庫1.sql優化

  生產環境下,也要加的額外參數:
  -R, 備份存儲過程和函數數據
  --triggers, 備份觸發器數據

    mysqldump -uroot -p123 -A -R --triggers >/backup/full.sql


-------------------------------------------------------------------------------------------------

 

  -F, --flush-logs 刷新binlog日誌,爲了方便未來二進制日誌截取時的起點 有多少個庫就會刷新多少個二進制日誌

    mysqldump -uroot -p123 -A -F >/backup/full.sql


  --master-data={1|2} 告訴你備份時刻的binlog位置,通常咱們選擇使用2,以註釋的方式記錄二進制日誌位置

鎖表:適合全部引擎(myisam,innodb)
    -x, --lock-all-tables
    -l, --lock-tables

  --single-transaction 對innodb引擎進行熱備
  經過快照的方式實現熱備

  壓縮備份:

    mysqldump -uroot -p123 -A -R --triggers --master-data=2 --single-transaction |gzip >/backup/all_$(date +%F).sql.gz

-------
mysqldump備份的恢復
  使用source命令進行恢復:

    gunzip all_2018-04-04.sql.gz
  mysql>set sql_log_bin=0;
  mysql> 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)截取二進制日誌

   mysql>show binlog events in 'my-bin.000004';    經過讀取二進制文件信息獲取到刪除是的結束位置,獲得截取點信息
   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恢復到備用庫
六、驗證數據可用性和完整性
七、使用備用庫替代生產庫使用或者將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;

相關文章
相關標籤/搜索