這些動態備份在讀取或修改數據的過程當中進行,不多中斷或者不中斷傳輸或處理數據的功能。使用熱備份時,系統仍可供讀取和修改數據的操做訪問。
這些備份在用戶不能訪問數據時進行,所以沒法讀取或修改數據。這些脫機備份會阻止執行任何使用數據的活動。這些類型的備份不會干擾正常運行的系統的性能。可是,對於某些應用程序,會沒法接受必須在一段較長的時間裏鎖定或徹底阻止用戶訪問數據。
這些備份在讀取數據時進行,但在多數狀況下,在進行備份時不能修改數據自己。這種中途備份類型的優勢是沒必要徹底鎖定最終用戶。可是,其不足之處在於沒法在進行備份時修改數據集,這可能使這種類型的備份不適用於某些應用程序。在備份過程當中沒法修改數據可能產生性能問題。
物理備份由存儲數據庫內容的目錄和文件的原始副本組成。這種類型的備份適用於須要在發生問題時快速恢復的大型重要數據庫。
邏輯備份保存表示爲邏輯數據庫結構(CREATE DATABASE, CREATE TABLE語句)和內容(INSERT語句或分隔文本文件)的信息。這種類型的備份適用於可能編輯數據值或表結構的較小數據量,或者在不一樣的計算機體系結構上從新建立數據。
1.mysqldumpmysql
2.mysqlbinlog正則表達式
3.xtrabackup算法
Usage: mysqldump [OPTIONS] database [tables] OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...] OR mysqldump [OPTIONS] --all-databases [OPTIONS]
-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)
[root@db02 ~]# mkdir /backup [root@db02 ~]# mysqldump -A >/backup/full.sql #注意:mysqldump恢復數據必須數據庫是開啓狀態下,假如數據庫數據目錄被刪除,那麼此時就須要從新初始化數據庫,而後啓動數據庫,更新密碼,而後登錄數據庫,進行source 命令進行恢復
mysqldump庫1 表1 表2 表3 >庫1.sql mysqldump庫2 表1 表2 表3 >庫2.sql #單表備份: mysqldump -uroot -p123 oldboy test>/backup/test.sql
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
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 #提示:每一個庫都會刷新一次
[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
-x, --lock-all-tables -l, --lock-tables mysqldump-B -x oldboy>/opt/t.sql
mysqldump-B --master-data=2 oldboy|gzip>/opt/t.sql.gz 解壓: zcatt.sql.gz>t1.sql gzip-d t.sql.gz#刪壓縮包
mysqldump-A -B -R --triggers --master-data=2 --single-transaction |gzip>/opt/all.sql.gz 適合多引擎混合(例如:myisam與innodb混合)的備份命令以下: mysqldump-A -B -R --triggers --
select concat("mysqldump"," -uroot -p123 " ,table_schema," ",table_name, " ",">/backup/",table_name,".sql") from information_schema.tables;
select concat("mysqldump"," -uroot -p123 -B " ,table_schema," ", " ",">/backup/",table_schema,".sql") from information_schema.tables group b y(table_schema);
mysqldump-B -R --triggers --master-data=2 oldboy|gzip>/opt/alL_$(date +%F).sql.gz
[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;」
背景環境: 正在運行的網站系統,mysql數據庫,數據量25G,日業務增量10-15M。 備份方式: 天天23:00點,計劃任務調用mysqldump執行全備腳本 故障時間點: 上午10點,誤刪除了一個表
如何恢復?sql
思路 1.使用測試庫,恢復全備 使用source 2.恢復此表從23:00到10點之間的binlog 2.1截取23:00到10點這段binlog在測試庫恢復 2.2導出刪除表 3.將刪除的表進行恢復 到生產庫 注意 在生產庫環境中,出現這種誤操做,數據損壞,那麼儘可能避免對數據庫進行進一步「傷害「了,iptables 3306端口關閉掉 ,skip-network mysql自帶的放置網絡鏈接的方法,可是須要加入配置文件重啓實例,等到恢復完成,再放開鏈接。
全量數據就是數據庫中全部的數據(或某一個庫的所有數據); 全量備份就是把數據庫中全部的數據進行備份。 mysqldump會取得一個時刻的一致性數據.
增量數據就是指上一次全量備份數據以後到下一次全備以前數據庫所更新的數據 對於mysqldump,binlog就是增量數據.
設計備份腳本和計劃任務 按期的恢復演練
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 innobackupex******
一、全備備份數據庫
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/
二、恢復數據前的準備(合併xtabackup_log_file和備份的物理文件)安全
innobackupex--apply-log --use-memory=32M /backup/xfull/
三、停庫bash
ill -9 pid lsof -i:3306
四、破壞數據服務器
cd/application/mysql/ mv data /opt/
五、恢復網絡
#第一種 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/
六、啓動併發
/etc/init.d/mysqld start mysql -e "select * from oldboy.test" 注:咱們還可使用—copy-back參數進行恢復
一、特色
物理備份工具,在同級數據量基礎上,都要比邏輯備份性能高特別是在數據量比較大的時候,體現的更價明顯
二、備份方式
三、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)。
一、對於innodb表,能夠實現熱備
(1)在數據還有修改操做的時刻,直接將數據文件中的數據頁備份,此時備份走的數據對於當前mysql來說是不一致的 (2)將備份過程當中的redo和undo一併備走 (3)爲了恢復的時候,只要將保證備份出來的數據頁LSN能和redo的LSN匹配,那麼數據就是一致的。須要作redo和undo的應用。(查看有沒有commit標記,有能夠直接寫入數據,沒有能夠回滾數據達成一致性)
二、對於myisam表,實現自動鎖表拷貝文件。
能夠直接鎖表,而後就不能作任何修改了,實現了備份
三、增量備份
(1)起點問題
基於上一次備份進行增量 redo默認狀況下是一組兩個文件而且有固定大小。是一種輪詢使用方式,不是永久的,有可能隨時被覆蓋。
(2)備份的是什麼
一、可使用binlog做爲增量 二、自帶增量備份,基於上次備份後變化的數據頁,還要在備份過程當中的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 準備恢復便可
背景:
某大型網站,mysql數據庫,數據量500G,每日更新量100M-200M
備份策略:
xtrabackup,每週六1:00進行全備,週一到週五及週日1:00進行增量備份。
故障場景:
週三下午2點出現數據庫意外刪除表操做。
如何恢復?
思路: 1.斷開全部應用? 2.檢查備份是否存在 3.怎麼快速、安全恢復
具體流程
一、準備上週六全備,並--apply-log --redo-only 二、合併增量,週日
案例模擬
#一、建立目錄 [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;