MariaDB數據庫備份和還原php
-------------------------------------------------------------------------------------------------------------------------------------------
mysql
一、備份和恢復sql
(1)爲何要備份?數據庫
災難恢復:硬件故障、軟件故障、天然災害、******、誤操做vim
測試,作還原測試,用於測試備份的可用性緩存
(2)要注意的要點bash
能容忍最多丟失多少數據,99.999%比99.99%成功率是多了10倍服務器
恢復數據須要在多長時間內完成,儘量儘可能短的時間內恢復完成app
須要恢復哪些數據 ide
二、備份類型:
(1)徹底備份,部分備份
(2)徹底備份:整個數據集
(3)部分備份:只備份數據子集
三、還原要點
(1)作還原測試,用於測試備份的可用性
(2)還原演練,便於在發生萬一時能夠從容面對快速恢復數據
四、徹底備份、增量備分、差別備份
(1)增量備份:以某個固定時間爲週期,這個時間內到上一次變化的數據就是增量,僅備份最近一次徹底備份或增量備份(若是存在增量)以來變化的數據,還原時候徹底備份+增量備份1+增量備份2+...增量備份n,從徹底備份後有幾個增量備份就要加幾個增量備份,這種方式還原麻煩,但節省空間
(2)差別備份:僅備份最近一次徹底備份以來變化的數據,還原時候是徹底備份+差別備份,相對增量備份比較佔用空間
(3)通常使用策略是徹底備份+增量備份或者徹底備份+差別備份,不能增量備份和差別備份混用
五、熱備份、溫備份、冷備份
(1)熱備份:線上系統讀寫操做都可操做,mysql引擎不支持
(2)溫備份:線上系統讀操做可執行,但寫操做不行
(3)冷備份:線上系統讀寫操做不可執行
注意:MyISAM引擎:溫備,不能熱備;InnoDB,引擎:能夠作熱備、溫備
六、物理備份、邏輯備份
(1)物理備份:直接複製數據文件進行備份,只須要直接複製便可
(2)邏輯備份:從數據可中「導出」數據另存而進行的備份,須要專業的協議客戶端,與存儲引擎無關
七、備份時須要考慮的因素:
溫備持鎖多久、備份過程的時長、備份負載、恢復過程的時長
八、備分內容
數據、二進制日誌和InnoDB的事務日誌、代碼(存儲過程、存儲函數、觸發器、時間調度器)、服務器的配置文件
九、設計備份方案:
(1)數據集:徹底+增量
(2)備份手段:物理,邏輯
十、備份工具
(1)mysqldump:邏輯備份工具,適用全部存儲引擎,支持溫備,不支持熱備,但對於InnoDB存儲引擎支持熱備,該工具同時可作徹底備份、部分備份
(2)cp,tar等複製歸檔工具,物理備份工具,使用全部存儲引擎,只能作冷備,可用來作徹底備份和部分備份
(3)lvm2的快照:幾乎熱備,藉助於文件系統管理工具
(4)mysqlhotcopy:幾乎冷備,僅適用於MyISAM存儲引擎
(5)備份工具的選擇
<1>mysqldump+複製binlog(二進制日誌),時間較慢,支持遠程操做
mysqldump:徹底備份
複製binlog中指定時間範圍內的event完成作增量備份
<2>lvm2快照+複製binlog
lvm2快照:使用cp或tar等作物理備份,徹底備份
複製binlog中指定時間範圍內的event完成作增量備份
<3>xtrabackup
由Percona提供的支持對InnoDB作熱備(物理備份)的工具
徹底備份、增量備份
十一、邏輯備份工具
mysqldump、mydumper、phpMyAdmin
mysqldump:客戶端命令,經過mysql協議鏈接至mysqld服務器
mysqldump [OPTION] DBNAME [TBLNAME],語句中帶有[]內內容表明不是必須有的
-A,--all-databases
-B DBNAME,--databases DBNAME [TBLNAME]
區別: mysqldump DBNAME TBLNAME,不會自動建立數據庫,而-A,--all-databases和-B DBNAME,--databases DBNAME [TBLNAME]會自動建立數據庫
十二、實現冷備
(1)中止數據庫,進入數據庫存放目錄,tar Jcvf /DIR/SQL.tar /數據庫存放目錄/,過程當中若是日誌在其它目錄,也須要一併拷貝
(2)還原:中止服務,解壓備份數據,拷貝至須要還原的數據庫,解壓縮,檢查用戶權限組權限是否都爲mysql,以後配置文件放到對應的位置後,重啓數據庫服務
注意:拷貝單個數據庫時候最好打包後拷貝至須要還原的數據庫,同時拷貝事務日誌,同時注意文件的用戶和組權限
1三、邏輯卷快照實現數據庫幾乎熱備
(1)建立兩個邏輯卷(一個給數據庫,一個給二進制日誌),新建文件系統,並掛載新建的備份存放目錄
(2)vim /etc/my.cnf,在[mysqld_safe]下寫入信息datadir=/數據庫備份存放目錄/
(3)請求鎖定全部表:進入數據庫 FLUSH TABLES with READ LOCK;
(4)記錄二進制日誌文件及事件位置
<1>FLUSH LOGS;
<2>SHOW MASTER STATUS;,或者mysql -e 'SHOW MASTER STATUS' > /DIR/pos.`date + F%`,記下binlog的時間點
(5)建立快照lvcreate -L SIZE -n LVNAME-snap -p r -s /dev/LVMDIR/LVNAME,建立邏輯卷/dev/LVMDIR/LVNAME的快照,SIZE大小,名稱叫LVNAME-snap,只讀r屬性
(6)釋放鎖,進入數據庫UNLOCK TABLES;
(7)掛載邏輯卷快照臨時到某個目錄
(8)轉到快照目錄下,cp -a mysql/ /tmp
(9)備份完成後,刪除快照卷,lvremove
(10)制定好策略後,經過原卷備份二進制日誌,mysqlbinlog --start-position=7697 binlog.00001 > /root/binlog.sql,mysqlbinlog binlog.00002 >>binlog.sql,7697是剛纔記錄的binlog的時間點
(11)還原,將/tmp/mysql/拷貝至須要還原的數據庫存放目錄,將binlog放置對應目錄中,mysql < 導入後重啓mysql服務
1四、mysqldump的使用
(1)備份
mysqldump -uUSER --databases DBNAME > /DIR/*.sql,用重定向方式備份一個數據庫
mysqldump -uUSER --databases DB1 DB2 > /DIR/DB12.sql,備份多個數據庫
(2)鎖表
MyISAM、InnoDB實現溫備
mysqldump --lock-all-tables:鎖定全部庫的全部表
--lock-tables:對於每一個單獨的數據庫,在啓動備份以前鎖定該數據庫全部表
InnoDB實現熱備
mysqldump --single-transaction,啓動一個事務,當完成時纔會被提交,使用時配合-q一塊兒使用,不適用MyISAM引擎,使用時候須要確保其餘人不用增刪改和truncate命令
(3)其它選項
mysqldump -E,--events:備份指定數據庫相關的全部event scheduler,事件調度器
-R,--routines:備份指定數據庫可相關的全部存儲過程和存儲函數
--triggers:備份表相關的觸發器
--master-data=NUM,此選項須啓用二進制日誌,NUM爲1:所備份的數據以前加一條記錄爲CHANGE MASTER TO語句,非註釋,不指定#,默認爲1,記錄二進制日誌POS點,今後點以後沒作備份;NUM爲2:記錄爲註釋的CHANGE MASTER TO語句,此選項會自動關閉--lock-tables功能,自動打開-x | --lock-all-tables功能(除非開啓--single-transaction)
-F, --flush-logs :備份前滾動日誌,鎖定表完成後,執行flush logs命令,生成新的二進制日誌文件,配合-A 或 -B 選項時,會致使刷新屢次數據庫。建議在同一時刻執行轉儲和日誌刷新,可經過和--single-transaction或-x,--master-data 一塊兒使用實現,此時只刷新一第二天志
--compact 去掉註釋,適合調試,生產不使用
-d, --no-data 只備份表結構
-t, --no-create-info 只備份數據,不備份create table
-n,--no-create-db 不備份create database,可被-A或-B覆蓋
--flush-privileges 備份mysql或相關時須要使用
-f, --force 忽略SQL錯誤,繼續執行
--hex-blob 使用十六進制符號轉儲二進制列(例如,「abc」變爲0x616263),受影響的數據類型包括BINARY, VARBINARY,BLOB,BIT的列時使用,避免亂碼,生產中帶有二進制日誌數據建議加
-q, --quick 不緩存查詢,直接輸出,加快備份速度
1五、徹底備份,並還原至最新狀態
(1)啓用二進制日誌,並分離存放vim /etc/my.cnf,[mysqld]下log-bin=/DIR/
(2)mysqldump -A -F --single-transaction --master-data=2 | gzip > /data/`date +%F`.sql.gz
(3)模擬破壞,中止數據庫並刪庫
(4)還原到備份時狀態,直到還原結束一直不容許其餘用戶鏈接數據庫,解壓數據備份,gzip -d *.sql.gz,systemctl start mariadb(數據庫無內容),關閉二進制,進入數據庫,mysql >set sql_log_bin=off,mysql > source / *.sql.gz
(5)還原到最新狀態grep "CHANGE MASTER" /data/*.sql,查看position,好比說245
mysqlbin --start-potion=245 mysql-bin.0002 > /data/incr.sql
mysqlbin mysql-bin.0003 >> /data/incr.sql
mysqlbin mysql-bin.0004 >> /data/incr.sql
mysql
>set sql_log_bin=off
>source /data/incr.sql
>set sql_log_bin=on
附:備份時候壓縮:mysaldump -B DB | gzip > /DIR/*.sql.gz,解壓時候gzip -d
注意:二進制日誌文件不該該與數據文件放在同一磁盤
1六、恢復誤刪除
(1)開啓二進制日誌功能
(2)徹底備份:mysqldump -A -F --single-transaction --master-data=2 | gzip > /data/`date +%F`.sql.gz
(3)修改數據庫:產生變化二進制文件
刪除表:產生模擬事件
修改數據庫
(4)加讀鎖,flush tables with read lock,並拒絕用戶訪問數據庫
(5)還原:<1>中止服務,清空數據庫,啓動數據庫,解壓備份的數據
<2>mysql
> set sql_log_bin=off
>source /DIR/徹底備份的數據庫.sql
(6)分析二進制日誌,找到丟失的表的drop table指令
grep -i "change master" /data/all.sql 找到帶有drop table的二進制文件和pos點
mysqlbinlog --start-position=POSNUM binlog.0000* > /data/incr.sql
vim /data/incr.sql,註釋drop那一行
(7)還原
mysql>set sql_log_bin=off
mysql> source /data/incr.sql;
mysql>set sql_log_bin=on
(8)複查數據完整
(9)開放用戶
1七、分庫備份腳本
(1)mysql -e 'show databases' | grep -Ev '^Database|info|performanc'|while read dbname;do mysqldump -B $dbname | gzip > /data/${dbname}_bak`date +%F`.gz;done
(2)mysql -e 'show databases' | grep -Ev '^Database|info|performanc' |sed -r 's@(.*)@mysqldump -B \1| gzip > /data/\1__bak`date +%F`.gz@' |bash
(3)for db in `mysql -e 'show databases' | grep -Ev '^Database|info|performanc'`; do mysqldump -B $db |gzip > /data/${db}_bak`date +%F`.gz;done
1八、生產環境實戰備份策略
(1)InnoDB建議備份策略
mysqldump –uroot –A –F –E –R --single-transaction --master-data=1 --flush-privileges --triggers --default-character-set=utf8 --hex-blob >$BACKUP/fullbak_$BACKUP_TIME.sql
(2)MyISAM建議備份策略
mysqldump –uroot –A –F –E –R –x --master-data=1 --flush-privileges --triggers --default-character-set=utf8 --hex-blob >$BACKUP/fullbak_$BACKUP_TIME.sql
注:以上實驗在另外一篇文章中實現數據庫備份和還原實驗
1九、Xtrabackup
(1)特色:
<1>備份還原過程快速、可靠
<2>備份過程不會打斷正在執行的事務
<3>可以基於壓縮等功能節約磁盤空間和流量
<4>自動實現備份檢驗
<5>開源,免費
(2)xtrabackup是用來備份InnoDB表的,不能備份非InnoDB表,和MySQL沒有交互
(3)innobackupex 腳本用來備份非 InnoDB 表,同時會調用 xtrabackup 命令來備份 InnoDB 表,還會和 MySQL Server 發送命令進行交互,如加全局讀鎖(FTWRL)、獲取位點(SHOW SLAVE STATUS)等。即innobackupex是在 xtrabackup 之上作了一層封裝實現的
(4)雖然目前通常不用 MyISAM 表,只是 MySQL 庫下的系統表是 MyISAM 的,所以備份基本都經過 innobackupex 命令進行
(5)選項
--user:該選項表示備份帳號
--password:該選項表示備份的密碼
--host:該選項表示備份數據庫的地址
--databases:該選項接受的參數爲數據庫名,若是要指定多個數據庫,彼此間須要以空格隔開;如:"xtra_test dba_test",同時,在指定某數據庫時,也能夠只指定其中的某張表。如:"mydatabase.mytable"。該選項對innodb引擎表無效,仍是會備份全部innodb表
--defaults-file:該選項指定從哪一個文件讀取MySQL配置,必須放在命令行第一個選項位置
--incremental:該選項表示建立一個增量備份,須要指定--incremental-basedir
--incremental-basedir:該選項指定爲前一次全備份或增量備份的目錄,與--incremental同時使用
--incremental-dir:該選項表示還原時增量備份的目錄
--include=name:指定表名,格式:databasename.tablename
(6)Prepare:innobackupex --apply-log [option] BACKUP-DIR
選項說明:
--apply-log:通常狀況下,在備份完成後,數據尚且不能用於恢復操做,由於備份的數據中可能會包含還沒有提交的事務或已經提交但還沒有同步至數據文件中的事務。所以,此時數據文件仍處理不一致狀態。此選項做用是經過回滾未提交的事務及同步已經提交的事務至數據文件使數據文件處於一致性狀態
--use-memory:和--apply-log選項一塊兒使用,當prepare 備份時,作crash recovery分配的內存大小,單位字節,也可1MB,1M,1G,1GB等,推薦1G
--export:表示開啓可導出單獨的表以後再導入其餘Mysql中
--redo-only:此選項在prepare base full backup,往其中合併增量備份時候使用,不適用於最後一個增量備份
(7)還原:innobackupex --copy-back [選項] BACKUP-DIR,還原的時候須要中止服務
innobackupex --move-back [選項] [--defaults-group=GROUP-NAME] BACKUP-DIR
選項說明:
--copy-back:作數據恢復時將備份數據文件拷貝到MySQL服務器的datadir
--move-back:這個選項與--copy-back類似,惟一的區別是它不拷貝文件,而是移動文件到目的地。這個選項移除backup文件,用時候必須當心。使用場景:沒有足夠的磁盤空間同事保留數據文件和Backup副本
(8)還原注意事項:
<1>datadir目錄必須爲空。除非指定innobackupex --force-non-empty-directorires選項指定,不然--copy-backup選項不會覆蓋
<2>在restore以前,必須shutdown MySQL實例,不能將一個運行中的實例restore到datadir目錄中
<3>因爲文件屬性會被保留,大部分狀況下須要在啓動實例以前將文件的屬主改成mysql,這些文件將屬於建立備份的用戶
chown -R mysql:mysql /data/mysql
以上須要在用戶調用innobackupex以前完成
--force-non-empty-directories:指定該參數時候,使得innobackupex --copy-back或--move-back選項轉移文件到非空目錄,已存在的文件不會被覆蓋。若是--copy-back和--move-back文件須要從備份目錄拷貝一個在datadir已經存在的文件,會報錯失敗
(9)備份生成的相關文件
使用innobakupex備份時,其會調用xtrabackup備份全部的InnoDB表,複製全部關於表結構定義的相關文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關文件,同時還會備份觸發器和數據庫配置信息相關的文件。這些文件會被保存至一個以時間命名的目錄中,在備份時,innobackupex還會在備份目錄中建立以下文件:
<1>xtrabackup_info:innobackupex工具執行時的相關信息,包括版本,備份選項,備份時長,備份LSN(log sequence number日誌序列號),BINLOG的位置
<2>xtrabackup_checkpoints:備份類型(如徹底或增量)、備份狀態(如是否已經爲prepared狀態)和LSN範圍信息,每一個InnoDB頁(一般爲16k大小)都會包含一個日誌序列號,即LSN。LSN是整個數據庫系統的系統版本號,每一個頁面相關的LSN可以代表此頁面最近是如何發生改變的
<3>xtrabackup_binlog_info:MySQL服務器當前正在使用的二進制日誌文件及至備份這一刻爲止二進制日誌事件的位置,可利用實現基於binlog的恢復
<4>backup-my.cnf:備份命令用到的配置選項信息
<5>xtrabackup_logfile:備份生成的日誌文件
20、xtrabackup的備份和還原
舊版:
(1)xtrabackup使用進行熱備份,須要epel下載或者官網下載
<1>確認數據庫表格的引擎是InnoDB或者XtraDB
<2>vim /etc/my.cnf,在[mysqld]和[mysqld_safe]之間加入innodb_file_per_table=ON
<3>重啓數據庫服務
<4>建立臨時目錄 /backups
<5>innobackupex --user=root /backups,該指令會自動備份二進制日誌文件,是整庫備份,生成的文件夾以日期顯示
<6>scp -r /backups/2018-10-13_16-45-57/ 目標主機:/data/
(2)還原:
<1>注意vim /etc/my.cnf下[mysqld]內容中datadir指向路徑和預存放的數據庫路徑要一致,若是本身想在/data/mysql存放還原的數據庫,須要創建目錄後更改權限爲mysql.mysql,並在文件下添加datadir=/data/mysql
<2>vim /etc/my.cnf,在[mysqld]和[mysqld_safe]之間加入innodb_file_per_table=ON
<3>重啓數據庫服務
<4>將備份的數據庫傳至本機,移動至本機的備份目錄/backups
<5>innobackupex --apply-log /backups/日期顯示的文件夾
<6>中止數據庫服務,刪除原來全部數據庫
<7>徹底恢復:innobackupex --copy-back /backups/2018-10-13_16-45-57/
<8>更改/data/mysql目錄權限爲mysql.mysql
<9>重啓服務
新版:兩邊的配置文件須要同步
<1>在原主機作徹底備份到/data/backups
xtrabackup --backup --target-dir=/backups/
scp -r /backups/* 目標主機:/backups
<2>在目標主機上
[1]預準備:確保數據一致,提交完成的事務,回滾未完成的事務
xtrabackup --prepare --target-dir=/backups/
[2]複製到數據庫目錄
注意:數據庫目錄必須爲空,MySQL服務不能啓動
xtrabackup --copy-back --target-dir=/backups/
[3]還原屬性
chown -R mysql:mysql /var/lib/mysql
[4]啓動服務
systemctl start mariadb
2一、xtrabackup的增量備份和還原
舊版
(1)在原主機
innobackupex /backups
mkdir /backups/inc{1,2}
修改數據庫內容
innobackupex --incremental /backups/inc1 --incremental-basedir=/backups/2018-02-23_14-21-42(徹底備份生成的路徑)
再次修改數據庫內容
innobackupex --incremental /backups/inc2 --incremental-basedir=/backups/inc1/2018-02-23_14-26-17 (上次增量備份生成的路徑)
scp -r /backups/* 目標主機:/data/
(2)在目標主機
不啓動mariadb
rm -rf /var/lib/mysql/*
innobackupex --apply-log --redo-only /data/2018-02-23_14-21-42/
innobackupex --apply-log --redo-only /data/2018-02-23_14-21-42/ --incremental-dir=/data/inc1/2018-02-23_14-26-17
innobackupex --apply-log /data/2018-02-23_14-21-42/ --incremental-dir=/data/inc2/2018-02-23_14-28-29/
ls /var/lib/mysql/
innobackupex --copy-back /data/2018-02-23_14-21-42/
chown -R mysql.mysql /var/lib/mysql/
systemctl start mariadb
新版:
(1)備份過程
[1]徹底備份:xtrabackup --backup --target-dir=/backups/base
[2]第一次修改數據
[3]第一次增量備份:xtrabackup --backup --target-dir=/backups/inc1 --incremental-basedir=/backups/base
[4]第二次修改數據
[5]第二次增量:xtrabackup --backup --target-dir=/backups/inc2 --incremental-basedir=/backups/inc1
[6]scp -r /backups/* 目標主機:/backups/
(2)備份過程生成三個備份目錄
/backups/{base,inc1,inc2}
(3)還原過程
[1]預準備完成備份,此選項--apply-log-only阻止回滾未提完成的事務
xtrabackup --prepare --apply-log-only --target-dir=/backups/base
[2]合併第1次增量備份到徹底備份,xtrabackup --prepare --apply-log-only --target-dir=/backups/base --incremental-dir=/backups/inc1
[3]合併第2次增量備份到徹底備份:最後一次還原不須要加選項--apply-log-only
xtrabackup --prepare --target-dir=/backups/base --incremental-dir=/backups/inc2
[4]複製到數據庫目錄,注意數據庫目錄必須爲空,MySQL服務不能啓動
xtrabackup --copy-back --target-dir=/data/backups/base
[5]還原屬性:chown -R mysql:mysql /var/lib/mysql
[6]啓動服務:systemctl start mariadb
2二、Xtrabackup單表導出和導入
(1) 單表備份
innobackupex --include='hellodb.students' /backups
(2)備份表結構
mysql -e 'show create table hellodb.students' > student.sql
(3)刪除表
mysql -e 'drop table hellodb.students‘
(4)innobackupex --apply-log --export /backups/2018-02-23_15-03-23/
(5) 建立表
mysql>CREATE TABLE `students` (
`StuID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`Name` varchar(50) NOT NULL,
`Age` tinyint(3) unsigned NOT NULL,
`Gender` enum('F','M') NOT NULL,
`ClassID` tinyint(3) unsigned DEFAULT NULL,
`TeacherID` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`StuID`)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8
(6)刪除表空間
alter table students discard tablespace;
(7)cp /backups/2018-02-23_15-03-23/hellodb/students.{cfg,exp,ibd} /var/lib/mysql/hellodb/
(8)chown -R mysql.mysql /var/lib/mysql/hellodb/
(9)mysql>alter table students import tablespace;