今天給你們帶來的是關於數據庫備份與恢復的教程,當咱們手賤或者不知道什麼緣由致使數據庫的崩潰,甚至刪除數據庫時怎麼辦,總不能跑路吧?因此咱們作好平常的備份和相關的災後重建頗有必要。
mysql
那麼備份都有什麼方式,方法呢?一,文件備份,就是很笨的把全部的文件的都一一拷貝到咱們準備好的各類存儲設備上,可是此種方法缺少時效性,須要冷備,就是把服務停掉,慢慢拷,並且只能做用與少許數據備份,太多的話裝不下,功能性賊弱,二,邏輯備份,重數據庫中導出數據而另進行的備份,優勢是編輯器簡單,恢復簡單,缺點是備份是數據較大時,備份較慢,因此咱們推出了徹底備份和差別備份還有增量備份,徹底備份顧名思義就是把數據庫徹底備份下來,不過咱們能夠把它和差別備份和增量備份相結合,差別備份就是備份的數據是上一次全備份以後新增長的和修改過的數據,增量備份就是備份的數據是上一次備份後增長的和修改過的數據,有的小夥伴就蒙圈了,這是什麼鬼?那麼給你一張圖就能很好的體現出三種方式備份的區別。sql
總的來講咱們的徹底備份和增量備份,是和樓梯結構差很少,一級一級的去備份,當咱們恢復的時候,固然也是一級一級的去恢復,而差別備份則否則,它和徹底備份結合時,是相對於全備份而言的,當有一天數據丟失時,直接使用全備份和前一天的備份就能很快找到咱們的數據。
數據庫
今天咱們就先來實驗一下徹底備份+增量備份。
vim
徹底備份咱們使用的是mysqldump工具,增量備份咱們使用的是二進制日誌方式實現,那麼具體怎麼操做呢?
centos
實驗環境:centos7虛擬機一臺,安裝完成mysql
app
第一步:準備備份目錄,更改所屬人,所屬組編輯器
mkdir /backup
ide
chown mysql:mysql /backup/
工具
第二步:準備備份數據庫及表
centos7
mysql
create database qiangge;
use qiangge;
create tabel zao(id int not null,name char(20));
第三步:進行完整備份
mysqldump --all-databases --lock-all-tables --flush-log --master-data=2 >/backup/`date +%F-%T`-all.sql
# --all-databases:所有的數據庫
# --lock-all-tables:鎖所有表(爲了保持數據一致性)
# --flush-log:刷新二進制文件從內存寫入硬盤
# --master-data=2:導出的語句chage master to被註釋
第四步:向表中插入數據
mysql
use qiangge;
insert into zao values (01,'jerry'),(02,'tom'),(03,'dog'),(04,'cat');
第五步:進行增量備份,備份稱二進制日誌
vim /etc/my.cnf
[mysqld]
log-bin=bl
systemctl restart mariadb
mysqlbinlog --start-position=NUM1 --stop-position=NUM2 /var/lib/mysql/bl.000002 > /backup/`date +%F-%T`-bl.sql
#NMU1,NUM2都是查看bl.000002,具體的方法是mysqlbinlog bl.000002,若是bl.000002沒有,那就找一下bl.000001,at NUM1開頭,中間夾着SQL語句,COMMIT/*!*/;結尾的一段,上面有end_log_pos NUM2。
第六步:繼續插入數據,在沒有備份的狀況下刪除數據庫,模擬誤操做
mysql
use qiangge;
insert into zao values (06,'mile fly'),(07,'usaf');
drop database qiangge;
第七步:數據恢復,因爲最後咱們沒有備份就刪除了數據庫,因此咱們首先須要保護最後的二進制日誌,查看刪除操做以前的position值:mysqlbinlog 二進制文件。
第八步:將最後操做的二進制日誌備份
mysqlbinlog --start-position=NUM3 --stop-position=NMU4 二進制日誌 >/backup/`date +%F-%T`-bl2.sql
第九步:導入以前備份的數據庫
mysql </backup/完整備份日誌
mysql </backup/二進制日誌
mysql </backup/最後的備份
第十步:查看數據庫的恢復
mysql
select * from qiangge.zao;
完成。咱們能夠查看到咱們成功的完成了數據庫的恢復。
而後,咱們第二個實驗的方法是基於一個小工具xtrabackup,它有更簡單的命令和備份速度快,還原快,備份可靠,節省磁盤的等等一大堆優勢,還能夠自動實現備份檢驗。
首先,咱們先要安裝一個包,yum源就能夠
yum install percona-xtrabackup
而後新建一個目錄專門存儲備份數據
mkdir /backup
1 徹底備份
innobackupex --user=root /backup/
2 添加數據
mysql
create database qiangge;
use qiangge;
create table six(id int,name char(20));
insert into six values (1,'haha'),(2,'hehe');
3 增量備份
innobackupex --incremental /backup/ --incremental-basedir=/backup/2017-11-16_23-55-11/
4 刪除數據庫
mysql
drop database qiangge;
5 數據恢復前準備
爲何要準備呢?由於由於備份的數據中可能會包含還沒有提交的事務或已經提交但還沒有同步至數據文件中的事務。所以,此時數據文件仍處理不一致狀態,因此已提交的事務要重放,合併到徹底備份上,沒提交事務的要回滾.
innobackupex --apply-log --redo-only /backup/2017-11-16_23-55-11
innobackupex --apply-log --redo-only /backup/2017-11-16_23-55-11 --incremental-dir=/backup/2017-11-16_23-57-12
#必定要用絕對路徑,此處爲坑,筆者當時切到該目錄下,能夠補全,覺得可使用相對路徑,結果排了半下午的錯
6 恢復階段,數據恢復
innobackupex --copy-back /backup/2017-11-16_23-55-11
此時它會提醒咱們/var/lib/mysql是非空的,這是爲何呢?由於該目錄下的是數據庫數據,它會直接把全部的數據恢復到該目錄,咱們直接刪除此目錄。
rm -rf /var/lib/mysql/*
再次執行該命令,發現還有問題,咱們更改一下目錄的全部人,所屬組
chown -R mysql.mysql /var/lib/mysql
systemctl restart mysql
而後成功,進入瞅一眼,數據庫徹底ok的啦!
最後咱們要再來一個lvm2快照和binlog的結合,就是邏輯卷快照和二進制日誌結合使用的數據備份和恢復。
1 首先添加一塊硬盤,做爲邏輯卷
2 添加物理卷
pvcreate /dev/sdb1
3 添加捲組
vgcreate myvg /dev/sdb1
4 添加邏輯卷
lvcreate -n mydata -L 5G myvg
5 格式化邏輯卷
mkfs.ext4 /dev/mapper/myvg-mydata
6 掛載邏輯卷
mount /dev/mapper/myvg-mydata /lvm_data
7 修改mysql配置文件,使得數據文件在邏輯捲上 datadir=/lvm_data
8 重啓mariadb服務
9 建立數據庫,進行操做
mysql
create database qiangge;
use qiangge;
create table six(id int,name char(20));
insert into six values (1,'six'),(2,'sixsix');
10 鎖定表
mysql
flush tables read lock;
11 建立快照卷
lvcreate -L 1G -n mydata-snap -p r -s /dev/mapper/myvgmydata
12 解鎖全部表
mysql
unlock tables;
13 掛載快照卷
mount /dev/myvg/mydata-snap /lvm_snap/
14 打包物理備份
tar cvf /tmp/mysqlback.tar ./*
15 卸載snap
umount /lvm_snap/
16 刪除snap
lvremove myvg mydata-snap
17 刪除數據庫
rm -rf /lvm_data/*
18 解壓恢復數據庫
tar -xvf /tmp/mysqlback.tar ./
19 驗證數據是否恢復
上面的三種方式能夠應付平常管理備份恢復了,那麼具體他們的區別是什麼呢?筆者總結了一下