mysql備份與恢復

第1章 MySQL備份與恢復

1.1 備份的類型

²  邏輯備份(文本表示:SQL 語句)mysql

²  物理備份(數據文件的二進制副本)正則表達式

²  基於快照的備份算法

²  基於複製的備份sql

²  增量備份(刷新二進制日誌)數據庫

²  熱備份:安全

l  這些動態備份在讀取或修改數據的過程當中進行,不多中斷或者不中斷傳輸或處理數據的功能。使用熱備份時,系統仍可供讀取和修改數據的操做訪問。服務器

²  冷備份:網絡

l  這些備份在用戶不能訪問數據時進行,所以沒法讀取或修改數據。這些脫機備份會阻止執行任何使用數據的活動。這些類型的備份不會干擾正常運行的系統的性能。可是,對於某些應用程序,會沒法接受必須在一段較長的時間裏鎖定或徹底阻止用戶訪問數據。併發

²  溫備份:app

l  這些備份在讀取數據時進行,但在多數狀況下,在進行備份時不能修改數據自己。這種中途備份類型的優勢是沒必要徹底鎖定最終用戶。可是,其不足之處在於沒法在進行備份時修改數據集,這可能使這種類型的備份不適用於某些應用程序。在備份過程當中沒法修改數據可能產生性能問題。

1.2 物理備份與邏輯備份

物理備份由存儲數據庫內容的目錄和文件的原始副本組成。這種類型的備份適用於須要在發生問題時快速恢復的大型重要數據庫。

邏輯備份保存表示爲邏輯數據庫結構(CREATE DATABASE, CREATE TABLE語句)和內容(INSERT語句或分隔文本文件)的信息。這種類型的備份適用於可能編輯數據值或表結構的較小數據量,或者在不一樣的計算機體系結構上從新建立數據。

物理備份的特色:

²  備份由數據庫目錄和文件的精確副本組成。一般這是所有或部分MySQL數據目錄的副本。

²  物理備份方法比邏輯更快,由於它們只涉及文件複製而無需轉換。

²  輸出比邏輯備份更緊湊。

²  因爲備份速度和緊湊性對繁忙,重要的數據庫很是重要,MySQL企業備份產品能夠執行物理備份。份的特色:

²  備份和恢復從整個數據目錄級別到單個文件級別的粒度範圍。這可能會也可能不會提供表級粒度,具體取決於存儲引擎。例如, InnoDB表能夠分別放在一個單獨的文件中,或與其餘InnoDB表共享文件存儲 ; 每一個 MyISAM表格惟一對應一組文件。

²  除數據庫外,備份還能夠包含任何相關文件,如日誌或配置文件。

²  來自MEMORY表的數據很難以這種方式備份,由於它們的內容不存儲在磁盤上。(MySQL企業備份產品具備能夠MEMORY在備份過程當中從表中檢索數據的功能。)

²  備份只能移植到具備相同或類似硬件特性的其餘機器。

²  備份能夠在MySQL服務器不運行時執行。若是服務器正在運行,則須要執行適當的鎖定,以便服務器在備份期間不更改數據庫內容。MySQL Enterprise Backup會自動爲須要它的表執行此鎖定。

²  物理備份工具包括 mysqlbackup MySQL企業備份的 InnoDB或任何其餘桌,文件系統級的命令(如CP, SCP,焦油, rsync的),或mysqlhotcopy的 對MyISAM表。

²  爲了恢復:

l  MySQL企業備份還原InnoDB 和其餘備份的表。

l  ndb_restore恢復 NDB表格。

l  可使用文件系統命令 將文件系統級別或使用mysqlhotcopy複製的文件 複製回原來的位置。

邏輯備份的特色:

²  備份是經過查詢MySQL服務器來得到數據庫結構和內容信息。

²  備份比物理方法慢,由於服務器必須訪問數據庫信息並將其轉換爲邏輯格式。若是輸出寫入客戶端,服務器也必須將其發送到備份程序。

²  輸出大於物理備份,特別是以文本格式保存時。

²  在服務器級別(全部數據庫),數據庫級別(特定數據庫中的全部表)或表級別均可以使用備份和還原粒度。不管存儲引擎如何,狀況都是如此。

²  備份不包括日誌或配置文件,或其餘不屬於數據庫的與數據庫相關的文件。

²  以邏輯格式存儲的備份與機器無關而且很是便攜。

²  邏輯備份是在MySQL服務器運行的狀況下執行的。服務器沒有脫機。

²  邏輯備份工具包括mysqldump 程序和SELECT ... INTO OUTFILE語句。這些適用於任何存儲引擎,甚至MEMORY。

²  要恢復邏輯備份,可使用mysql客戶端處理SQL格式的轉儲文件。要加載分隔文本文件,請使用 LOAD DATA INFILE語句或 mysqlimport客戶端。

 

1.3 備份工具介紹

一、mysqldump

mysql原生自帶很好用的邏輯備份工具

二、mysqlbinlog

實現binlog備份的原生態命令

三、xtrabackup

precona公司開發的性能很高的物理備份工具

1.3.1 mysqldump工具

1.語法:

Usage: mysqldump [OPTIONS] database [tables]

OR    mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3…]

OR    mysqldump [OPTIONS] --all-databases [OPTIONS]

2.參數:

-A, --all-databases Dump all the databases. #全庫

-B, --databases    Dump several databases. #單庫

-d #僅表結構

-t #僅數據

--compact #減小無用數據輸出(調試)

-R, --routines #備份存儲過程和函數數據

--triggers #備份觸發器數據

--master-data={1|2} #告訴你備份後時刻的binlog位置,2:註釋;1:非註釋,要執行(主從複製)

--master-data #自動進行鎖表和釋放鎖

--single-transaction #對innodb引擎進行熱備

-x #鎖住全部備份表

-l #鎖住單表

-F, --flush-logs #刷新binlog日誌(回顧binlog)

3.使用:

3.1 全庫備份

 

[root@db02 ~]# mkdir /backup

[root@db02 ~]# mysqldump -A >/backup/full.sql

#注意:mysqldump恢復數據必須數據庫是開啓狀態下,假如數據庫數據目錄被刪除,那麼此時就須要從新初始化數據庫,而後啓動數據庫,更新密碼,而後登錄數據庫,進行source 命令進行恢復

3.2 備份多個表

 

mysqldump庫1 表1 表2 表3 >庫1.sql

mysqldump庫2 表1 表2 表3 >庫2.sql

#單表備份:

mysqldump -uroot -p123  oldboy  test>/backup/test.sql

3.3 分庫備份:for循環

 

mysqldump-uroot-p'oldboy123' -B oldboy…

mysqldump-uroot-p'oldboy123' -B oldboy_utf8 …

mysqldump-uroot-p'oldboy123' -B mysql…

for 循環:

for name in `mysql-e "show databases;"|sed1d`

do

mysqldump-uroot-p'oldboy123' -B $name

done

例子:天天晚上0點備份數據庫

mysqldump-A -B -F >/opt/$(date +%F).sql

[root@db02 ~]# ll/application/mysql/logs/

-rw-rw----1 mysqlmysql168 Jun 21 12:06 oldboy-bin.000001

-rw-rw----1 mysqlmysql168 Jun 21 12:06 oldboy-bin.000002

-rw-rw----1 mysqlmysql210 Jun 21 12:07 oldboy-bin.index

#提示:每一個庫都會刷新一次

3.4 指定備份的位置

 

[root@db02 logs]# sed-n '22p' /opt/t.sql

--CHANGE MASTER TO MASTER_LOG_FILE='oldboy-bin.000005', MASTER_LOG_POS=344;

[root@db02 logs]# mysqldump-B --master-data=2 oldboy>/opt/t.sql

3.5 鎖表備份

 

鎖表:適合全部引擎(myisam,innodb)

-x, --lock-all-tables

-l, --lock-tables

mysqldump-B -x oldboy>/opt/t.sql

基於事務引擎:不用鎖表就能夠得到一致性的備份.

生產中99% 使用innodb事務引擎.

ACID四大特性中的隔離性

3.6 壓縮備份:

 

mysqldump-B --master-data=2 oldboy|gzip>/opt/t.sql.gz

解壓:

zcatt.sql.gz>t1.sql

gzip-d t.sql.gz#刪壓縮包

3.7 innodb引擎的備份命令以下:

 

mysqldump-A -B -R --triggers --master-data=2 --single-transaction |gzip>/opt/all.sql.gz

適合多引擎混合(例如:myisam與innodb混合)的備份命令以下:

mysqldump-A -B -R --triggers --

3.8 擴展

 

例子1:全庫中全表的備份語句拼接

select concat("mysqldump"," -uroot -p123 " ,table_schema," ",table_name, " ",">/backup/",table_name,".sql") from information_schema.tables;

例子2:全部數據庫備份的語句拼接

    select concat("mysqldump"," -uroot -p123 -B " ,table_schema," ", " ",">/backup/",table_schema,".sql") from information_schema.tables group b

    y(table_schema);

1.3.2 使用Mysqldump備份進行恢復實踐

mysqldump-B -R --triggers --master-data=2 oldboy|gzip>/opt/alL_$(date +%F).sql.gz
人爲刪除oldboy數據庫:
[root@db02 opt]# mysql-e 「drop database oldboy;」

[root@db02 opt]# mysql-e 「show databases;」
恢復數據庫
使用gzip解壓

gzip-d xxx.gz

數據庫命令行

source /opt/alL_2017-06-22.sql

驗證數據:
[root@db02 opt]# mysql-e 「use oldboy;select* from test;」

1.3.3 Mysqldump+Mysqlbinlog企業級增量備份恢復實戰

背景環境:

    正在運行的網站系統,mysql數據庫,數據量25G,日業務增量10-15M。   

    備份方式:

    天天23:00點,計劃任務調用mysqldump執行全備腳本

    故障時間點:

    上午10點,誤刪除了一個表

如何恢復呢?

思路

1.使用測試庫,恢復全備 使用source

2.恢復此表從23:00到10點之間的binlog

2.1截取23:00到10點這段binlog在測試庫恢復

2.2導出刪除表

3.將刪除的表進行恢復 到生產庫

注意:在生產庫環境中,出現這種誤操做,數據損壞,那麼儘可能避免對數據庫進行進一步「傷害「了,iptables 3306端口關閉掉 ,skip-network mysql自帶的放置網絡鏈接的方法,可是須要加入配置文件重啓實例,等到恢復完成,再放開鏈接。

1.3.4 mysqldump企業級備份策略設計與實踐

1.全量備份概念:

全量數據就是數據庫中全部的數據(或某一個庫的所有數據);

全量備份就是把數據庫中全部的數據進行備份。

mysqldump會取得一個時刻的一致性數據.

2.增量備份

增量數據就是指上一次全量備份數據以後到下一次全備以前數據庫所更新的數據

對於mysqldump,binlog就是增量數據.

 

3.設計備份策略

設計備份腳本和計劃任務,按期恢復演練。

1.4 MySQL物理備份工具xtrabackup

1.4.1 安裝工具

wget-O /etc/yum.repos.d/epel.repohttp://mirrors.aliyun.com/repo/epel-6.repo

yum -y install perlperl-devellibaiolibaio-develperl-Time-HiResperl-DBD-MySQL

wgethttps://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

xtrabackup 參數說明(xtrabackup --help

--apply-log-only:prepare備份的時候只執行redo階段,用於增量備份。

--backup:建立備份而且放入--target-dir目錄中

--close-files:不保持文件打開狀態,xtrabackup打開表空間的時候一般不會關閉文件句柄,目的是爲了正確處理DDL操做。若是表空間數量很是巨大而且不適合任何限制,一旦文件不在被訪問的時候這個選項能夠關閉文件句柄.打開這個選項會產生不一致的備份。

--compact:建立一份沒有輔助索引的緊湊備份

--compress:壓縮全部輸出數據,包括事務日誌文件和元數據文件,經過指定的壓縮算法,目前惟一支持的算法是quicklz.結果文件是qpress歸檔格式,每一個xtrabackup建立的*.qp文件均可以經過qpress程序提取或者解壓縮

--compress-chunk-size=#:壓縮線程工做buffer的字節大小,默認是64K

--compress-threads=#:xtrabackup進行並行數據壓縮時的worker線程的數量,該選項默認值是1,並行壓縮('compress-threads')能夠和並行文件拷貝('parallel')一塊兒使用。例如:'--parallel=4 --compress --compress-threads=2'會建立4個IO線程讀取數據並經過管道傳送給2個壓縮線程。

--create-ib-logfile:這個選項目前尚未實現,目前建立Innodb事務日誌,你仍是須要prepare兩次。

--datadir=DIRECTORY:backup的源目錄,mysql實例的數據目錄。從my.cnf中讀取,或者命令行指定。

--defaults-extra-file=[MY.CNF]:在global files文件以後讀取,必須在命令行的第一選項位置指定。

--defaults-file=[MY.CNF]:惟一從給定文件讀取默認選項,必須是個真實文件,必須在命令行第一個選項位置指定。

--defaults-group=GROUP-NAME:從配置文件讀取的組,innobakcupex多個實例部署時使用。

--export:爲導出的表建立必要的文件

--extra-lsndir=DIRECTORY:(for --bakcup):在指定目錄建立一份xtrabakcup_checkpoints文件的額外的備份。

--incremental-basedir=DIRECTORY:建立一份增量備份時,這個目錄是增量別分的一份包含了full bakcup的Base數據集。

--incremental-dir=DIRECTORY:prepare增量備份的時候,增量備份在DIRECTORY結合full backup建立出一份新的full backup。

--incremental-force-scan:建立一份增量備份時,強制掃描全部增在備份中的數據頁即便徹底改變的page bitmap數據可用。

--incremetal-lsn=LSN:建立增量備份的時候指定lsn。

--innodb-log-arch-dir:指定包含歸檔日誌的目錄。只能和xtrabackup --prepare選項一塊兒使用。

--innodb-miscellaneous:從My.cnf文件讀取的一組Innodb選項。以便xtrabackup以一樣的配置啓動內置的Innodb。一般不須要顯示指定。

--log-copy-interval=#:這個選項指定了log拷貝線程check的時間間隔(默認1秒)。

--log-stream:xtrabakcup不拷貝數據文件,將事務日誌內容重定向到標準輸出直到--suspend-at-end文件被刪除。這個選項自動開啓--suspend-at-end。

--no-defaults:不從任何選項文件中讀取任何默認選項,必須在命令行第一個選項。

--databases=#:指定了須要備份的數據庫和表。

--database-file=#:指定包含數據庫和表的文件格式爲databasename1.tablename1爲一個元素,一個元素一行。

--parallel=#:指定備份時拷貝多個數據文件併發的進程數,默認值爲1。

--prepare:xtrabackup在一份經過--backup生成的備份執行還原操做,以便準備使用。

--print-default:打印程序參數列表並退出,必須放在命令行首位。

--print-param:使xtrabackup打印參數用來將數據文件拷貝到datadir並還原它們。

--rebuild_indexes:在apply事務日誌以後重建innodb輔助索引,只有和--prepare一塊兒才生效。

--rebuild_threads=#:在緊湊備份重建輔助索引的線程數,只有和--prepare和rebuild-index一塊兒才生效。

--stats:xtrabakcup掃描指定數據文件並打印出索引統計。

--stream=name:將全部備份文件以指定格式流向標準輸出,目前支持的格式有xbstream和tar。

--suspend-at-end:使xtrabackup在--target-dir目錄中生成xtrabakcup_suspended文件。在拷貝數據文件以後xtrabackup不是退出而是繼續拷貝日誌文件而且等待知道xtrabakcup_suspended文件被刪除。這項可使xtrabackup和其餘程序協同工做。

--tables=name:正則表達式匹配database.tablename。備份匹配的表。

--tables-file=name:指定文件,一個表名一行。

--target-dir=DIRECTORY:指定backup的目的地,若是目錄不存在,xtrabakcup會建立。若是目錄存在且爲空則成功。不會覆蓋已存在的文件。

--throttle=#:指定每秒操做讀寫對的數量。

--tmpdir=name:當使用--print-param指定的時候打印出正確的tmpdir參數。

--to-archived-lsn=LSN:指定prepare備份時apply事務日誌的LSN,只能和xtarbackup --prepare選項一塊兒用。

--user-memory = #:經過--prepare prepare備份時候分配多大內存,目的像innodb_buffer_pool_size。默認值100M若是你有足夠大的內存。1-2G是推薦值,支持各類單位(1MB,1M,1GB,1G)。

--version:打印xtrabackup版本並退出。

--xbstream:支持同時壓縮和流式化。須要客服傳統歸檔tar,cpio和其餘不容許動態streaming生成的文件的限制,例如動態壓縮文件,xbstream超越其餘傳統流式/歸檔格式的的優勢是,併發stream多個文件而且更緊湊的數據存儲(因此能夠和--parallel選項選項一塊兒使用xbstream格式進行streaming)。

 

1.4.2 MySQL物理備份工具xtrabackup案例實戰

1.全網備份

mkdir  -p /backup

[root@db02 full]# innobackupex  --user=root --password=123456  --socket=/tmp/mysql.sock --no-timestamp /backup/full1
innobackupex  --user=root --password=123456  --use-memory=32M --no-timestamp /backup/xfull/

2.恢復數據前的準備(合併xtabackup_log_file和備份的物理文件)

innobackupex--apply-log --use-memory=32M /backup/xfull/

3.停庫

Kill -9 pid

lsof -i:3306

4.破壞數據

cd/application/mysql/

mv data /opt/

5.恢復

#第一種

cp -a  /backup/xfull/* /application/mysql/data/

chown -R mysql.mysql /application/mysql/data/

#第二種

innobackupex --copy-back /backup/xfull/

chown -R mysql.mysql /application/mysql/data/

6.啓動數據庫並查詢

/etc/init.d/mysqld start

mysql -e "select * from oldboy.test"

注:咱們還可使用—copy-back參數進行恢復

 

1.5 Xtrabackup備份

1.5.1 介紹

物理備份工具,在同級數據量基礎上,都要比邏輯備份性能高特別是在數據量比較大的時候,體現的更價明顯.

備份方式:

²  拷貝數據文件

²  拷貝數據頁

 

1.5.2 xtrabackup 參數說明(xtrabackup --help )

--apply-log-only:prepare備份的時候只執行redo階段,用於增量備份。

--backup:建立備份而且放入--target-dir目錄中

--close-files:不保持文件打開狀態,xtrabackup打開表空間的時候一般不會關閉文件句柄,目的是爲了正確處理DDL操做。若是表空間數量很是巨大而且不適合任何限制,一旦文件不在被訪問的時候這個選項能夠關閉文件句柄.打開這個選項會產生不一致的備份。

--compact:建立一份沒有輔助索引的緊湊備份

--compress:壓縮全部輸出數據,包括事務日誌文件和元數據文件,經過指定的壓縮算法,目前惟一支持的算法是quicklz.結果文件是qpress歸檔格式,每一個xtrabackup建立的*.qp文件均可以經過qpress程序提取或者解壓縮

--compress-chunk-size=#:壓縮線程工做buffer的字節大小,默認是64K

--compress-threads=#:xtrabackup進行並行數據壓縮時的worker線程的數量,該選項默認值是1,並行壓縮('compress-threads')能夠和並行文件拷貝('parallel')一塊兒使用。例如:'--parallel=4 --compress --compress-threads=2'會建立4個IO線程讀取數據並經過管道傳送給2個壓縮線程。

--create-ib-logfile:這個選項目前尚未實現,目前建立Innodb事務日誌,你仍是須要prepare兩次。

--datadir=DIRECTORY:backup的源目錄,mysql實例的數據目錄。從my.cnf中讀取,或者命令行指定。

--defaults-extra-file=[MY.CNF]:在global files文件以後讀取,必須在命令行的第一選項位置指定。

--defaults-file=[MY.CNF]:惟一從給定文件讀取默認選項,必須是個真實文件,必須在命令行第一個選項位置指定。

--defaults-group=GROUP-NAME:從配置文件讀取的組,innobakcupex多個實例部署時使用。

--export:爲導出的表建立必要的文件

--extra-lsndir=DIRECTORY:(for --bakcup):在指定目錄建立一份xtrabakcup_checkpoints文件的額外的備份。

--incremental-basedir=DIRECTORY:建立一份增量備份時,這個目錄是增量別分的一份包含了full bakcup的Base數據集。

--incremental-dir=DIRECTORY:prepare增量備份的時候,增量備份在DIRECTORY結合full backup建立出一份新的full backup。

--incremental-force-scan:建立一份增量備份時,強制掃描全部增在備份中的數據頁即便徹底改變的page bitmap數據可用。

--incremetal-lsn=LSN:建立增量備份的時候指定lsn。

--innodb-log-arch-dir:指定包含歸檔日誌的目錄。只能和xtrabackup --prepare選項一塊兒使用。

--innodb-miscellaneous:從My.cnf文件讀取的一組Innodb選項。以便xtrabackup以一樣的配置啓動內置的Innodb。一般不須要顯示指定。

--log-copy-interval=#:這個選項指定了log拷貝線程check的時間間隔(默認1秒)。

--log-stream:xtrabakcup不拷貝數據文件,將事務日誌內容重定向到標準輸出直到--suspend-at-end文件被刪除。這個選項自動開啓--suspend-at-end。

--no-defaults:不從任何選項文件中讀取任何默認選項,必須在命令行第一個選項。

--databases=#:指定了須要備份的數據庫和表。

--database-file=#:指定包含數據庫和表的文件格式爲databasename1.tablename1爲一個元素,一個元素一行。

--parallel=#:指定備份時拷貝多個數據文件併發的進程數,默認值爲1。

--prepare:xtrabackup在一份經過--backup生成的備份執行還原操做,以便準備使用。

--print-default:打印程序參數列表並退出,必須放在命令行首位。

--print-param:使xtrabackup打印參數用來將數據文件拷貝到datadir並還原它們。

--rebuild_indexes:在apply事務日誌以後重建innodb輔助索引,只有和--prepare一塊兒才生效。

--rebuild_threads=#:在緊湊備份重建輔助索引的線程數,只有和--prepare和rebuild-index一塊兒才生效。

--stats:xtrabakcup掃描指定數據文件並打印出索引統計。

--stream=name:將全部備份文件以指定格式流向標準輸出,目前支持的格式有xbstream和tar。

--suspend-at-end:使xtrabackup在--target-dir目錄中生成xtrabakcup_suspended文件。在拷貝數據文件以後xtrabackup不是退出而是繼續拷貝日誌文件而且等待知道xtrabakcup_suspended文件被刪除。這項可使xtrabackup和其餘程序協同工做。

--tables=name:正則表達式匹配database.tablename。備份匹配的表。

--tables-file=name:指定文件,一個表名一行。

--target-dir=DIRECTORY:指定backup的目的地,若是目錄不存在,xtrabakcup會建立。若是目錄存在且爲空則成功。不會覆蓋已存在的文件。

--throttle=#:指定每秒操做讀寫對的數量。

--tmpdir=name:當使用--print-param指定的時候打印出正確的tmpdir參數。

--to-archived-lsn=LSN:指定prepare備份時apply事務日誌的LSN,只能和xtarbackup --prepare選項一塊兒用。

--user-memory = #:經過--prepare prepare備份時候分配多大內存,目的像innodb_buffer_pool_size。默認值100M若是你有足夠大的內存。1-2G是推薦值,支持各類單位(1MB,1M,1GB,1G)。

--version:打印xtrabackup版本並退出。

--xbstream:支持同時壓縮和流式化。須要客服傳統歸檔tar,cpio和其餘不容許動態streaming生成的文件的限制,例如動態壓縮文件,xbstream超越其餘傳統流式/歸檔格式的的優勢是,併發stream多個文件而且更緊湊的數據存儲(因此能夠和--parallel選項選項一塊兒使用xbstream格式進行streaming)。

1.5.3 備份原理(innodb)

1.對於innodb表,能夠實現熱備

(1)在數據還有修改操做的時刻,直接將數據文件中的數據頁備份,此時備份走的數據對於當前mysql來說是不一致的

(2)將備份過程當中的redo和undo一併備走

(3)爲了恢復的時候,只要將保證備份出來的數據頁LSN能和redo的LSN匹配,那麼數據就是一致的。須要作redo和undo的應用。(查看有沒有commit標記,有能夠直接寫入數據,沒有能夠回滾數據達成一致性)

2.對於myisam表,實現自動鎖表拷貝文件

能夠直接鎖表,而後就不能作任何修改了,實現了備份

3.增量備份

(1)起點問題:

基於上一次備份進行增量

redo默認狀況下是一組兩個文件而且有固定大小。是一種輪詢使用方式,不是永久的,有可能隨時被覆蓋

(2)備份的是什麼

a.可使用binlog做爲增量

b.自帶增量備份,基於上次備份後變化的數據頁,還要在備份過程當中的redo和undo的變化

(3)怎麼備份

#一、全備

innobackupex  --user=root --password=123456  --use-memory=32M --no-timestamp /backup/xfull/

#二、對原庫進行修改數據

#三、增量備份

innobackupex --user=root --password=123456  --incremental --no-timestamp --incremental-basedir=/backup/xfull/ /backup/xinc1/

(4)怎麼恢復

#一、應用全備日誌(--apply-log),暫時不須要作回滾操做(--redo-only)

innobackupex  --apply-log --redo-only /backup/xfull/

#二、增量合併到全備中(一致性的合併)

innobackupex  --apply-log --incremental-dir=/backup/xinc1/  /backup/xfull/

#三、合併完成恢復

(5)備份策略

週日進行全備

週一到週六 天天作上一天的增備

xfull      --apply-log --redo-only  保證last-lsn=週一增量開始lsn

xinc1        合併週一的增量到全備,並apply-log --redo-only  保證last-lsn=週二增量開始lsn

xinc2        合併週二的增量到全備,並apply-log --redo-only  保證last-lsn=週三增量開始lsn

xinc3      --

xinc4      ---

xinc5      ---

xinc6        合併週六的增量到全備,--apply-log  準備恢復便可

 

1.5.4 Xtrabackup企業級增量備份實戰

1.背景:

 

某大型網站,mysql數據庫,數據量500G,每日更新量100M-200M

2.備份策略:

xtrabackup,每週六1:00進行全備,週一到週五及週日1:00進行增量備份。

3.故障場景:

週三下午2點出現數據庫意外刪除表操做。

4.如何恢復?

思路:

1.斷開全部應用?

2.檢查備份是否存在

3.怎麼快速、安全恢復

5.具體流程

一、準備上週六全備,並--apply-log --redo-only

二、合併增量,週日

6.案例模擬

#一、建立目錄

[root@db02 backup]# mkdir -p /backup/full

[root@db02 backup]# mkdir -p /backup/ inc1 inc2

#二、週日全備

[root@db02 ~]# innobackupex --user=root --password=123456  --no-timestamp /backup/full/

#三、模擬數據變化

mysql> use oldboy

mysql> insert into test values(8,'outman',99);

mysql> insert into test values(9,'outgirl',100);

mysql> commit;

#四、週一增量備份

[root@db02 ~]# innobackupex --user=root --password=123456 --incremental --no-timestamp --incremental-basedir=/backup/full/ /backup/inc1

#五、模擬週二數據變化

mysql> use oldboy

mysql> insert into test values(10,'outman1',119);

mysql> insert into test values(11,'outgirl1',120);

mysql> commit;

#六、週二增量備份

[root@db02 ~]# innobackupex --user=root --password=123456 --incremental --no-timestamp --incremental-basedir=/backup/inc1 /backup/inc2

#在插入新的行操做

mysql> use oldboy

mysql> insert into test values(12,'outman2',19);

mysql> insert into test values(13,'outgirl2',20);

mysql> commit;

#七、模擬場景:週二下午誤刪除test表

mysql> use oldboy;

mysql> drop table test;

#八、準備恢復

#8.1準備XtraBackup備份

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/

#8.2確認binlog起點

[root@db02 ~]# cd /backup/inc2/

[root@db02 inc2]# cat xtrabackup_binlog_info

mysql-bin.000001    960

[root@db02 inc2]#

#8.2截取drop操做以前的binlog

mysqlbinlog --start-position=960 /tmp/mysql-bin.000001

#找到drop以前的events和position號作截取 ,假如到1437,導出binlog

 mysqlbinlog mysql-bin.000001 --start-position=554 --stop-position=771 > /backup/binlog.sql

#導入binlog

set sql_log_bin=0;

source /backup/binlog.sql

#8.4 關閉數據庫,備份二進制日誌

/etc/init.d/mysqld stop

cd /application/mysql/data/

cp mysql-bin.000001  /tmp/

#8.5 刪除MySQL全部數據

cd /application/mysql/data/

rm -rf *

#九、恢復數據

 innobackupex --copy-back /backup/full

 chown -R mysql:mysql /application/mysql/data/

/etc/init.d/mysqld start

問題:

恢復窗口要多長時間?------預計3個小時

數據很大,可是隻是誤刪除了一張表,那麼就只須要把這個表恢復了就能夠了。

(1)「導出」表 導出表是在備份的prepare階段進行的,所以,一旦徹底備份完成,就能夠在prepare過程當中經過--export選項將某表導出了: # innobackupex --apply-log --export /path/to/backup 此命令會爲每一個innodb表的表空間建立一個以.exp結尾的文件,這些以.exp結尾的文件則能夠用於導入至其它服務器。

 

(2)「導入」表 要在mysql服務器上導入來自於其它服務器的某innodb表,須要先在當前服務器上建立一個跟原表表結構一致的表,然後才能實現將表導入:

mysql> CREATE TABLE mytable (…)  ENGINE=InnoDB;

 而後將此表的表空間刪除: mysql> ALTER TABLE mydatabase.mytable  DISCARD TABLESPACE; 接下來,未來自於「導出」表的服務器的mytable表的mytable.ibd和mytable.exp文件複製到當前服務器的數據目錄,而後使用以下命令將其「導入」:

 mysql> ALTER TABLE mydatabase.mytable  IMPORT TABLESPACE;

相關文章
相關標籤/搜索