1、備份方式
- 邏輯備份(文本表示:SQL 語句)
- 物理備份(數據文件的二進制副本)
- 基於快照的備份
- 基於復制的備份
- 增量備份(刷新二進制日志)
2、備份類型
2.1 熱備份
這些動態備份在讀取或修改數據的過程中進行,很少中斷或者不中斷傳輸或處理數據的功能。使用熱備份時,系統仍可供讀取和修改數據的操作訪問。
2.2冷備份
這些備份在用戶不能訪問數據時進行,因此無法讀取或修改數據。這些脫機備份會阻止執行任何使用數據的活動。這些類型的備份不會干擾正常運行的系統的性能。但是,對於某些應用程序,會無法接受必須在一段較長的時間里鎖定或完全阻止用戶訪問數據。
2.3溫備份
這些備份在讀取數據時進行,但在多數情況下,在進行備份時不能修改數據本身。這種中途備份類型的優點是不必完全鎖定最終用戶。但是,其不足之處在於無法在進行備份時修改數據集,這可能使這種類型的備份不適用於某些應用程序。在備份過程中無法修改數據可能產生性能問題。
3、物理備份
物理備份由存儲數據庫內容的目錄和文件的原始副本組成。這種類型的備份適用於需要在發生問題時快速恢復的大型重要數據庫。
3.1物理備份的特點
- 備份由數據庫目錄和文件的精確副本組成。通常這是全部或部分MySQL數據目錄的副本。
- 物理備份方法比邏輯更快,因為它們只涉及文件復制而無需轉換。
- 輸出比邏輯備份更緊湊。
- 由於備份速度和緊湊性對繁忙,重要的數據庫非常重要,MySQL企業備份產品可以執行物理備份。份的特點:
- 備份和恢復從整個數據目錄級別到單個文件級別的粒度范圍。這可能會也可能不會提供表級粒度,具體取決於存儲引擎。例如, InnoDB表可以分別放在一個單獨的文件中,或與其他InnoDB表共享文件存儲 ; 每個 MyISAM表格唯一對應一組文件。
- 除數據庫外,備份還可以包含任何相關文件,如日志或配置文件。
- 來自MEMORY表的數據很難以這種方式備份,因為它們的內容不存儲在磁盤上。(MySQL企業備份產品具有可以MEMORY在備份過程中從表中檢索數據的功能。)
- 備份只能移植到具有相同或相似硬件特性的其他機器。
- 備份可以在MySQL服務器不運行時執行。如果服務器正在運行,則需要執行適當的鎖定,以便服務器在備份期間不更改數據庫內容。MySQL Enterprise Backup會自動為需要它的表執行此鎖定。
- 物理備份工具包括 mysqlbackup MySQL企業備份的 InnoDB或任何其他桌,文件系統級的命令(如CP, SCP,焦油, rsync的),或mysqlhotcopy的 對MyISAM表。
- 為了恢復:
- MySQL企業備份還原InnoDB 和其他備份的表。
- ndb_restore恢復 NDB表格。
- 可以使用文件系統命令 將文件系統級別或使用mysqlhotcopy復制的文件 復制回原來的位置。
4、邏輯備份
邏輯備份保存表示為邏輯數據庫結構(CREATE DATABASE, CREATE TABLE語句)和內容(INSERT語句或分隔文本文件)的信息。這種類型的備份適用於可能編輯數據值或表結構的較小數據量,或者在不同的計算機體系結構上重新創建數據。
4.1邏輯備份的特點
- 備份是通過查詢MySQL服務器來獲得數據庫結構和內容信息。
- 備份比物理方法慢,因為服務器必須訪問數據庫信息並將其轉換為邏輯格式。如果輸出寫入客戶端,服務器也必須將其發送到備份程序。
- 輸出大於物理備份,特別是以文本格式保存時。
- 在服務器級別(所有數據庫),數據庫級別(特定數據庫中的所有表)或表級別都可以使用備份和還原粒度。無論存儲引擎如何,情況都是如此。
- 備份不包括日志或配置文件,或其他不屬於數據庫的與數據庫相關的文件。
- 以邏輯格式存儲的備份與機器無關並且非常便攜。
- 邏輯備份是在MySQL服務器運行的情況下執行的。服務器沒有脫機。
- 邏輯備份工具包括mysqldump 程序和SELECT ... INTO OUTFILE語句。這些適用於任何存儲引擎,甚至MEMORY。
- 要恢復邏輯備份,可以使用mysql客戶端處理SQL格式的轉儲文件。要加載分隔文本文件,請使用 LOAD DATA INFILE語句或 mysqlimport客戶端。
5、備份工具
1.mysqldump
- mysql原生自帶很好用的邏輯備份工具
2.mysqlbinlog
- 實現binlog備份的原生態命令
3.xtrabackup
- precona公司開發的性能很高的物理備份工具
5.1mysqldump介紹
5.1.1語法
Usage: mysqldump [OPTIONS] database [tables] OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...] OR mysqldump [OPTIONS] --all-databases [OPTIONS]
5.1.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)
5.2使用
5.2.1 全庫備份
[root@db02 ~]# mkdir /backup [root@db02 ~]# mysqldump -A >/backup/full.sql #注意:mysqldump恢復數據必須數據庫是開啟狀態下,假如數據庫數據目錄被刪除,那么此時就需要重新初始化數據庫,然后啟動數據庫,更新密碼,然后登陸數據庫,進行source 命令進行恢復
5.2.2 備份多個表
mysqldump庫1 表1 表2 表3 >庫1.sql mysqldump庫2 表1 表2 表3 >庫2.sql #單表備份: mysqldump -uroot -p123 oldboy test>/backup/test.sql
5.2.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 #提示:每個庫都會刷新一次
5.2.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
5.2.5 鎖表備份
- 鎖表:適合所有引擎(myisam,innodb)
-x, --lock-all-tables -l, --lock-tables mysqldump-B -x oldboy>/opt/t.sql
- 基於事務引擎:不用鎖表就可以獲得一致性的備份.
- 生產中99% 使用innodb事務引擎.
- ACID四大特性中的隔離性
5.2.6 壓縮備份:
mysqldump-B --master-data=2 oldboy|gzip>/opt/t.sql.gz 解壓: zcatt.sql.gz>t1.sql gzip-d t.sql.gz#刪壓縮包
5.2.7 innodb引擎的備份命令如下:
mysqldump-A -B -R --triggers --master-data=2 --single-transaction |gzip>/opt/all.sql.gz 適合多引擎混合(例如:myisam與innodb混合)的備份命令如下: mysqldump-A -B -R --triggers --
5.2.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);
6、使用Mysqldump備份進行恢復實踐
- 備份innodb引擎數據庫oldboy並壓縮:
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;”
7、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自帶的放置網絡連接的方法,但是需要加入配置文件重啟實例,等到恢復完成,再放開連接。
8、mysqldump企業級備份策略設計與實踐
- 全量備份概念
全量數據就是數據庫中所有的數據(或某一個庫的全部數據); 全量備份就是把數據庫中所有的數據進行備份。 mysqldump會取得一個時刻的一致性數據.
- 增量備份
增量數據就是指上一次全量備份數據之后到下一次全備之前數據庫所更新的數據 對於mysqldump,binlog就是增量數據.
- 設計備份策略
設計備份腳本和計划任務 定期的恢復演練
9、MySQL物理備份工具xtrabackup
9.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
9.2備份命令
xtrabackup innobackupex******
10、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、停庫
ill -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參數進行恢復
11、Xtrabackup備份
11.1 介紹
1、特點
物理備份工具,在同級數據量基礎上,都要比邏輯備份性能高特別是在數據量比較大的時候,體現的更價明顯
2、備份方式
- 拷貝數據文件
- 拷貝數據頁
3、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)。
11.2 備份原理(innodb)
1、對於innodb表,可以實現熱備
(1)在數據還有修改操作的時刻,直接將數據文件中的數據頁備份,此時備份走的數據對於當前mysql來講是不一致的
(2)將備份過程中的redo和undo一並備走
(3)為了恢復的時候,只要將保證備份出來的數據頁LSN能和redo的LSN匹配,那么數據就是一致的。需要做redo和undo的應用。(查看有沒有commit標記,有可以直接寫入數據,沒有可以回滾數據達成一致性)
2、對於myisam表,實現自動鎖表拷貝文件。
可以直接鎖表,然后就不能做任何修改了,實現了備份
3、增量備份
(1)起點問題
基於上一次備份進行增量
redo默認情況下是一組兩個文件並且有固定大小。是一種輪詢使用方式,不是永久的,有可能隨時被覆蓋。
(2)備份的是什么
1、可以使用binlog作為增量
2、自帶增量備份,基於上次備份后變化的數據頁,還要在備份過程中的redo和undo的變化
(3)怎么備份
#1、全備 innobackupex --user=root --password=123456 --use-memory=32M --no-timestamp /backup/xfull/ #2、對原庫進行修改數據 #3、增量備份 innobackupex --user=root --password=123456 --incremental --no-timestamp --incremental-basedir=/backup/xfull/ /backup/xinc1/
(4)怎么恢復
#1、應用全備日志(--apply-log),暫時不需要做回滾操作(--redo-only) innobackupex --apply-log --redo-only /backup/xfull/ #2、增量合並到全備中(一致性的合並) innobackupex --apply-log --incremental-dir=/backup/xinc1/ /backup/xfull/ #3、合並完成恢復
(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 准備恢復即可
12、Xtrabackup企業級增量備份實戰
背景:
某大型網站,mysql數據庫,數據量500G,每日更新量100M-200M
備份策略:
xtrabackup,每周六1:00進行全備,周一到周五及周日1:00進行增量備份。
故障場景:
周三下午2點出現數據庫意外刪除表操作。
如何恢復?
思路:
1.斷開所有應用?
2.檢查備份是否存在
3.怎么快速、安全恢復
具體流程
1、准備上周六全備,並--apply-log --redo-only
2、合並增量,周日
案例模擬
#1、創建目錄 [root@db02 backup]# mkdir -p /backup/full [root@db02 backup]# mkdir -p /backup/ inc1 inc2 #2、周日全備 [root@db02 ~]# innobackupex --user=root --password=123456 --no-timestamp /backup/full/ #3、模擬數據變化 mysql> use oldboy mysql> insert into test values(8,'outman',99); mysql> insert into test values(9,'outgirl',100); mysql> commit; #4、周一增量備份 [root@db02 ~]# innobackupex --user=root --password=123456 --incremental --no-timestamp --incremental-basedir=/backup/full/ /backup/inc1 #5、模擬周二數據變化 mysql> use oldboy mysql> insert into test values(10,'outman1',119); mysql> insert into test values(11,'outgirl1',120); mysql> commit; #6、周二增量備份 [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; #7、模擬場景:周二下午誤刪除test表 mysql> use oldboy; mysql> drop table test; #8、准備恢復 #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 * #9、恢復數據 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;