咱們試着想想, 在生產環境中什麼最重要?若是咱們服務器的硬件壞了能夠維修或者換新, 軟件問題能夠修復或從新安裝, 可是若是數據沒了呢?這多是最恐怖的事情了吧, 我感受在生產環境中應該沒有什麼比數據跟更爲重要. 那麼咱們該如何保證數據不丟失、或者丟失後能夠快速恢復呢?只要看完這篇, 你們應該就能對
MySQL
中實現數據備份和恢復能有必定的瞭解。
其實在
前言
中也大概說明了爲何要備份數據, 可是咱們仍是應該具體瞭解一下爲何要備份數據在生產環境中咱們數據庫可能會遭遇各類各樣的不測從而致使數據丟失, 大概分爲如下幾種.
硬件故障
軟件故障
天然災害
黑客攻擊
誤操做 (佔比最大)
因此, 爲了在數據丟失以後可以恢復數據, 咱們就須要按期的備份數據, 備份數據的策略要根據不一樣的應用場景進行定製, 大體有幾個參考數值, 咱們能夠根據這些數值從而定製符合特定環境中的數據備份策略
可以容忍丟失多少數據
恢復數據須要多長時間
須要恢復哪一些數據
數據的備份類型根據其自身的特性主要分爲如下幾組
徹底備份
部分備份
徹底備份指的是備份整個數據集( 即整個數據庫 )、部分備份指的是備份部分數據集(例如: 只備份一個表)
而部分備份又分爲如下兩種
增量備份
差別備份
增量備份指的是備份自上一次備份以來(增量或徹底)以來變化的數據; 特色: 節約空間、還原麻煩
差別備份指的是備份自上一次徹底備份以來變化的數據 特色: 浪費空間、還原比增量備份簡單示意圖
在
MySQl
中咱們備份數據通常有幾種方式
熱備份
溫備份
冷備份
熱備份指的是當數據庫進行備份時, 數據庫的讀寫操做均不是受影響
溫備份指的是當數據庫進行備份時, 數據庫的讀操做能夠執行, 可是不能執行寫操做
冷備份指的是當數據庫進行備份時, 數據庫不能進行讀寫操做, 即數據庫要下線
MySQL
中進行不一樣方式的備份還要考慮存儲引擎是否支持
MyISAM
熱備 ×
溫備 √
冷備 √
InnoDB
熱備 √
溫備 √
冷備 √
咱們在考慮完數據在備份時, 數據庫的運行狀態以後還須要考慮對於
MySQL
數據庫中數據的備份方式物理備份通常就是經過
tar
,cp
等命令直接打包複製數據庫的數據文件達到備份的效果
邏輯備份通常就是經過特定工具從數據庫中導出數據並另存備份(邏輯備份會丟失數據精度)
物理備份
邏輯備份
定製備份策略前, 咱們還須要考慮一些問題
咱們要備份什麼?
通常狀況下, 咱們須要備份的數據分爲如下幾種
數據
二進制日誌, InnoDB事務日誌
代碼(存儲過程、存儲函數、觸發器、事件調度器)
服務器配置文件
備份工具
這裏咱們列舉出經常使用的幾種備份工具
mysqldump
: 邏輯備份工具, 適用於全部的存儲引擎, 支持溫備、徹底備份、部分備份、對於InnoDB存儲引擎支持熱備cp, tar 等歸檔複製工具
: 物理備份工具, 適用於全部的存儲引擎, 冷備、徹底備份、部分備份lvm2 snapshot
: 幾乎熱備, 藉助文件系統管理工具進行備份mysqlhotcopy
: 名存實亡的的一個工具, 幾乎冷備, 僅支持MyISAM存儲引擎xtrabackup
: 一款很是強大的InnoDB/XtraDB熱備工具, 支持徹底備份、增量備份, 由percona
提供
針對不一樣的場景下, 咱們應該制定不一樣的備份策略對數據庫進行備份, 通常狀況下, 備份策略通常爲如下三種
直接cp,tar複製數據庫文件
mysqldump+複製BIN LOGS
lvm2快照+複製BIN LOGS
xtrabackup
以上的幾種解決方案分別針對於不一樣的場景
若是數據量較小, 可使用第一種方式, 直接複製數據庫文件
若是數據量還行, 可使用第二種方式, 先使用mysqldump對數據庫進行徹底備份, 而後按期備份BINARY LOG達到增量備份的效果
若是數據量通常, 而又不過度影響業務運行, 可使用第三種方式, 使用
lvm2
的快照對數據文件進行備份, 然後按期備份BINARY LOG達到增量備份的效果若是數據量很大, 而又不過度影響業務運行, 可使用第四種方式, 使用
xtrabackup
進行徹底備份後, 按期使用xtrabackup
進行增量備份或差別備份
咱們這裏使用的是使用yum安裝的
mysql-5.1
的版本, 使用的數據集爲從網絡上找到的一個員工數據庫
查看數據庫的信息
mysql> SHOW DATABASES; #查看當前的數據庫, 咱們的數據庫爲employees
+--------------------+
| Database |
+--------------------+
| information_schema |
| employees |
| mysql |
| test |
+--------------------+
4 rows in set (0.00 sec)
mysql> USE employees;
Database changed
mysql> SHOW TABLES; #查看當前庫中的表
+---------------------+
| Tables_in_employees |
+---------------------+
| departments |
| dept_emp |
| dept_manager |
| employees |
| salaries |
| titles |
+---------------------+
6 rows in set (0.00 sec)
mysql> SELECT COUNT(*) FROM employees; #因爲篇幅緣由, 咱們這裏只看一下employees的行數爲300024
+----------+
| COUNT(*) |
+----------+
| 300024 |
+----------+
1 row in set (0.05 sec)
向數據庫施加讀鎖
mysql> FLUSH TABLES WITH READ LOCK; #向全部表施加讀鎖
Query OK, 0 rows affected (0.00 sec)
備份數據文件
[root@node1 ~]# mkdir /backup #建立文件夾存放備份數據庫文件
[root@node1 ~]# cp -a /var/lib/mysql/* /backup #保留權限的拷貝源數據文件
[root@node1 ~]# ls /backup #查看目錄下的文件
employees ibdata1 ib_logfile0 ib_logfile1 mysql mysql.sock test
模擬數據丟失並恢復
[root@node1 ~]# rm -rf /var/lib/mysql/* #刪除數據庫的全部文件
[root@node1 ~]# service mysqld restart #重啓MySQL, 若是是編譯安裝的應該不能啓動, 若是rpm安裝則會從新初始化數據庫
mysql> SHOW DATABASES; #由於咱們是rpm安裝的, 鏈接到MySQL進行查看, 發現數據丟失了!
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
3 rows in set (0.00 sec)
[root@node1 ~]# rm -rf /var/lib/mysql/* #這一步能夠不作
[root@node1 ~]# cp -a /backup/* /var/lib/mysql/ #將備份的數據文件拷貝回去
[root@node1 ~]# service mysqld restart #重啓MySQL
#從新鏈接數據並查看
mysql> SHOW DATABASES; #數據庫已恢復
+--------------------+
| Database |
+--------------------+
| information_schema |
| employees |
| mysql |
| test |
+--------------------+
4 rows in set (0.00 sec)
mysql> USE employees;
mysql> SELECT COUNT(*) FROM employees; #表的行數沒有變化
+----------+
| COUNT(*) |
+----------+
| 300024 |
+----------+
1 row in set (0.06 sec)
##完成
咱們這裏使用的是使用yum安裝的
mysql-5.1
的版本, 使用的數據集爲從網絡上找到的一個員工數據庫咱們經過mysqldump進行一次徹底備份, 再修改表中的數據, 而後再經過binary log進行恢復 二進制日誌須要在mysql配置文件中添加 log_bin=on 開啓
mysqldump
命令介紹
mysqldump
是一個客戶端的邏輯備份工具, 能夠生成一個重現建立原始數據庫和表的SQL語句, 能夠支持全部的存儲引擎, 對於InnoDB支持熱備
#基本語法格式
shell> mysqldump [options] db_name [tbl_name ...] 恢復須要手動CRATE DATABASES
shell> mysqldump [options] --databases db_name ... 恢復不須要手動建立數據庫
shell> mysqldump [options] --all-databases 恢復不須要手動建立數據庫
其餘選項:
-E, --events: 備份事件調度器
-R, --routines: 備份存儲過程和存儲函數
--triggers: 備份表的觸發器; --skip-triggers
--master-date[=value]
1: 記錄爲CHANGE MASTER TO 語句、語句不被註釋
2: 記錄爲註釋的CHANGE MASTER TO語句
基於二進制還原只能全庫還原
--flush-logs: 日誌滾動
鎖定表完成後執行日誌滾動
查看數據庫的信息
mysql> SHOW DATABASES; #查看當前的數據庫, 咱們的數據庫爲employees
+--------------------+
| Database |
+--------------------+
| information_schema |
| employees |
| mysql |
| test |
+--------------------+
4 rows in set (0.00 sec)
mysql> USE employees;
Database changed
mysql> SHOW TABLES; #查看當前庫中的表
+---------------------+
| Tables_in_employees |
+---------------------+
| departments |
| dept_emp |
| dept_manager |
| employees |
| salaries |
| titles |
+---------------------+
6 rows in set (0.00 sec)
mysql> SELECT COUNT(*) FROM employees; #因爲篇幅緣由, 咱們這裏只看一下employees的行數爲300024
+----------+
| COUNT(*) |
+----------+
| 300024 |
+----------+
1 row in set (0.05 sec)
使用mysqldump
備份數據庫
[root@node1 ~]# mysql -e 'SHOW MASTER STATUS' #查看當前二進制文件的狀態, 並記錄下position的數字
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 106 | | |
+------------------+----------+--------------+------------------+
[root@node1 ~]# mysqldump --all-databases --lock-all-tables > backup.sql #備份數據庫到backup.sql文件中
mysql> CREATE DATABASE TEST1; #建立一個數據庫
Query OK, 1 row affected (0.00 sec)
mysql> SHOW MASTER STATUS; #記下如今的position
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 191 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
[root@node1 ~]# cp /var/lib/mysql/mysql-bin.000003 /root #備份二進制文件
[root@node1 ~]# service mysqld stop #中止MySQL
[root@node1 ~]# rm -rf /var/lib/mysql/* #刪除全部的數據文件
[root@node1 ~]# service mysqld start #啓動MySQL, 若是是編譯安裝的應該不能啓動(需從新初始化), 若是rpm安裝則會從新初始化數據庫
mysql> SHOW DATABASES; #查看數據庫, 數據丟失!
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
3 rows in set (0.00 sec)
mysql> SET sql_log_bin=OFF; #暫時先將二進制日誌關閉
Query OK, 0 rows affected (0.00 sec)
mysql> source backup.sql #恢復數據,所需時間根據數據庫時間大小而定
mysql> SET sql_log_bin=ON; 開啓二進制日誌
mysql> SHOW DATABASES; #數據庫恢復, 可是缺乏TEST1
+--------------------+
| Database |
+--------------------+
| information_schema |
| employees |
| mysql |
| test |
+--------------------+
4 rows in set (0.00 sec)
[root@node1 ~]# mysqlbinlog --start-position=106 --stop-position=191 mysql-bin.000003 | mysql employees #經過二進制日誌增量恢復數據
mysql> SHOW DATABASES; #如今TEST1出現了!
+--------------------+
| Database |
+--------------------+
| information_schema |
| TEST1 |
| employees |
| mysql |
| test |
+--------------------+
5 rows in set (0.00 sec)
#完成
作實驗以前咱們先回顧一下
lvm2-snapshot
的知識
LVM
快照簡單來講就是將所快照源分區一個時間點全部文件的元數據進行保存,若是源文件沒有改變,那麼訪問快照卷的相應文件則直接指向源分區的源文件,若是源文件發生改變,則快照卷中與之對應的文件不會發生改變。快照卷主要用於輔助備份文件。 這裏只簡單介紹,點擊查看詳細介紹
部署lvm環境
添加硬盤; 這裏咱們直接實現SCSI硬盤的熱插拔, 首先在虛擬機中添加一塊硬盤, 不重啓
[root@node1 ~]# ls /dev/sd* #只有如下幾塊硬盤, 可是咱們不重啓可讓系統識別新添加的硬盤
/dev/sda /dev/sda1 /dev/sda2
[root@node1 ~]# echo '- - -' > /sys/class/scsi_host/host0/scan
[root@node1 ~]# echo '- - -' > /sys/class/scsi_host/host1/scan
[root@node1 ~]# echo '- - -' > /sys/class/scsi_host/host2/scan
[root@node1 ~]# ls /dev/sd* #看!sdb識別出來了
/dev/sda /dev/sda1 /dev/sda2 /dev/sdb
[root@node1 ~]# fdisk /dev/sdb #分區
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0xd353d192.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-2610, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): +15G
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 8e
Changed system type of partition 1 to 8e (Linux LVM)
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
You have new mail in /var/spool/mail/root
[root@node1 ~]# partx -a /dev/sdb
BLKPG: Device or resource busy
error adding partition 1
##建立邏輯卷
[root@node1 ~]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created
[root@node1 ~]# vgcreate myvg /dev/sdb1
Volume group "myvg" successfully created
[root@node1 ~]# lvcreate -n mydata -L 5G myvg
Logical volume "mydata" created.
[root@node1 ~]# mkfs.ext4 /dev/mapper/myvg-mydata #格式化
[root@node1 ~]# mkdir /lvm_data
[root@node1 ~]# mount /dev/mapper/myvg-mydata /lvm_data #掛載到/lvm_data
[root@node1 ~]# vim /etc/my.cnf #修改mysql配置文件的datadir以下
datadir=/lvm_data
[root@node1 ~]# service mysqld restart #重啓MySQL
####從新導入employees數據庫########略過####
查看數據庫的信息
mysql> SHOW DATABASES; #查看當前的數據庫, 咱們的數據庫爲employees
+--------------------+
| Database |
+--------------------+
| information_schema |
| employees |
| mysql |
| test |
+--------------------+
4 rows in set (0.00 sec)
mysql> USE employees;
Database changed
mysql> SHOW TABLES; #查看當前庫中的表
+---------------------+
| Tables_in_employees |
+---------------------+
| departments |
| dept_emp |
| dept_manager |
| employees |
| salaries |
| titles |
+---------------------+
6 rows in set (0.00 sec)
mysql> SELECT COUNT(*) FROM employees; #因爲篇幅緣由, 咱們這裏只看一下employees的行數爲300024
+----------+
| COUNT(*) |
+----------+
| 300024 |
+----------+
1 row in set (0.05 sec)
建立快照卷並備份
mysql> FLUSH TABLES WITH READ LOCK; #鎖定全部表
Query OK, 0 rows affected (0.00 sec)
[root@node1 lvm_data]# lvcreate -L 1G -n mydata-snap -p r -s /dev/mapper/myvg-mydata #建立快照卷
Logical volume "mydata-snap" created.
mysql> UNLOCK TABLES; #解鎖全部表
Query OK, 0 rows affected (0.00 sec)
[root@node1 lvm_data]# mkdir /lvm_snap #建立文件夾
[root@node1 lvm_data]# mount /dev/myvg/mydata-snap /lvm_snap/ #掛載snap
mount: block device /dev/mapper/myvg-mydata--snap is write-protected, mounting read-only
[root@node1 lvm_data]# cd /lvm_snap/
[root@node1 lvm_snap]# ls
employees ibdata1 ib_logfile0 ib_logfile1 mysql mysql-bin.000001 mysql-bin.000002 mysql-bin.000003 mysql-bin.index test
[root@node1 lvm_snap]# tar cf /tmp/mysqlback.tar * #打包文件到/tmp/mysqlback.tar
[root@node1 ~]# umount /lvm_snap/ #卸載snap
[root@node1 ~]# lvremove myvg mydata-snap #刪除snap
恢復數據
[root@node1 lvm_snap]# rm -rf /lvm_data/*
[root@node1 ~]# service mysqld start #啓動MySQL, 若是是編譯安裝的應該不能啓動(需從新初始化), 若是rpm安裝則會從新初始化數據庫
mysql> SHOW DATABASES; #查看數據庫, 數據丟失!
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
3 rows in set (0.00 sec)
[root@node1 ~]# cd /lvm_data/
[root@node1 lvm_data]# rm -rf * #刪除全部文件
[root@node1 lvm_data]# tar xf /tmp/mysqlback.tar #解壓備份數據庫到此文件夾
[root@node1 lvm_data]# ls #查看當前的文件
employees ibdata1 ib_logfile0 ib_logfile1 mysql mysql-bin.000001 mysql-bin.000002 mysql-bin.000003 mysql-bin.index test
mysql> SHOW DATABASES; #數據恢復了
+--------------------+
| Database |
+--------------------+
| information_schema |
| employees |
| mysql |
| test |
+--------------------+
4 rows in set (0.00 sec)
##完成
爲了更好地演示, 咱們此次使用
mariadb-5.5
的版本, 使用xtrabackup
使用InnoDB可以發揮其最大功效, 而且InnoDB的每一張表必須使用單獨的表空間, 咱們須要在配置文件中添加innodb_file_per_table = ON
來開啓
下載安裝xtrabackup
咱們這裏經過wget percona官方的rpm包進行安裝
[root@node1 ~]# wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.3.4/binary/redhat/6/x86_64/percona-xtrabackup-2.3.4-1.el6.x86_64.rpm
[root@node1 ~]# yum localinstall percona-xtrabackup-2.3.4-1.el6.x86_64.rpm #須要EPEL源
xtrabackup
介紹
Xtrabackup
是由percona
提供的mysql
數據庫備份工具,據官方介紹,這也是世界上唯一一款開源的可以對innodb和xtradb數據庫進行熱備的工具。特色:
備份過程快速、可靠;
備份過程不會打斷正在執行的事務;
可以基於壓縮等功能節約磁盤空間和流量;
自動實現備份檢驗;
還原速度快;
摘自馬哥的文檔
xtrabackup
實現徹底備份
咱們這裏使用
xtrabackup
的前端配置工具innobackupex
來實現對數據庫的徹底備份使用
innobackupex
備份時, 會調用xtrabackup
備份全部的InnoDB表, 複製全部關於表結構定義的相關文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關文件, 同時還會備份觸發器和數據庫配置文件信息相關的文件, 這些文件會被保存至一個以時間命名的目錄.
備份過程
[root@node1 ~]# mkdir /extrabackup #建立備份目錄
[root@node1 ~]# innobackupex --user=root /extrabackup/ #備份數據
###################提示complete表示成功*********************
[root@node1 ~]# ls /extrabackup/ #看到備份目錄
2016-04-27_07-30-48
通常狀況, 備份完成後, 數據不能用於恢復操做, 由於備份的數據中可能會包含還沒有提交的事務或已經提交但還沒有同步至數據文件中的事務。所以, 此時的數據文件仍不一致, 因此咱們須要」準備」一個徹底備份
[root@node1 ~]# innobackupex --apply-log /extrabackup/2016-04-27_07-30-48/ #指定備份文件的目錄
#通常狀況下下面三行結尾表明成功*****************
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 369661462
160427 07:40:11 completed OK!
[root@node1 ~]# cd /extrabackup/2016-04-27_07-30-48/
[root@node1 2016-04-27_07-30-48]# ls -hl #查看備份文件
total 31M
-rw-r----- 1 root root 386 Apr 27 07:30 backup-my.cnf
drwx------ 2 root root 4.0K Apr 27 07:30 employees
-rw-r----- 1 root root 18M Apr 27 07:40 ibdata1
-rw-r--r-- 1 root root 5.0M Apr 27 07:40 ib_logfile0
-rw-r--r-- 1 root root 5.0M Apr 27 07:40 ib_logfile1
drwx------ 2 root root 4.0K Apr 27 07:30 mysql
drwx------ 2 root root 4.0K Apr 27 07:30 performance_schema
drwx------ 2 root root 4.0K Apr 27 07:30 test
-rw-r----- 1 root root 27 Apr 27 07:30 xtrabackup_binlog_info
-rw-r--r-- 1 root root 29 Apr 27 07:40 xtrabackup_binlog_pos_innodb
-rw-r----- 1 root root 117 Apr 27 07:40 xtrabackup_checkpoints
-rw-r----- 1 root root 470 Apr 27 07:30 xtrabackup_info
-rw-r----- 1 root root 2.0M Apr 27 07:40 xtrabackup_logfile
恢復數據
[root@node1 ~]# rm -rf /data/* #刪除數據文件
***不用啓動數據庫也能夠還原*************
[root@node1 ~]# innobackupex --copy-back /extrabackup/2016-04-27_07-30-48/ #恢復數據, 記清使用方法
#########咱們這裏是編譯安裝的mariadb因此須要作一些操做##########
[root@node1 data]# killall mysqld
[root@node1 ~]# chown -R mysql:mysql ./*
[root@node1 ~]# ll /data/ #數據恢復
total 28704
-rw-rw---- 1 mysql mysql 16384 Apr 27 07:43 aria_log.00000001
-rw-rw---- 1 mysql mysql 52 Apr 27 07:43 aria_log_control
-rw-rw---- 1 mysql mysql 18874368 Apr 27 07:43 ibdata1
-rw-rw---- 1 mysql mysql 5242880 Apr 27 07:43 ib_logfile0
-rw-rw---- 1 mysql mysql 5242880 Apr 27 07:43 ib_logfile1
-rw-rw---- 1 mysql mysql 264 Apr 27 07:43 mysql-bin.000001
-rw-rw---- 1 mysql mysql 19 Apr 27 07:43 mysql-bin.index
-rw-r----- 1 mysql mysql 2166 Apr 27 07:43 node1.anyisalin.com.err
[root@node1 data]# service mysqld restart
MySQL server PID file could not be found! [FAILED]
Starting MySQL.. [ OK ]
MariaDB [(none)]> SHOW DATABASES; #查看數據庫, 已經恢復
+--------------------+
| Database |
+--------------------+
| information_schema |
| employees |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec
增量備份
#########建立連兩個數據庫以供測試#####################
MariaDB [(none)]> CREATE DATABASE TEST1;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> CREATE DATABASE TEST2;
Query OK, 1 row affected (0.00 sec)
[root@node1 ~]# innobackupex --incremental /extrabackup/ --incremental-basedir=/extrabackup/2016-04-27_07-30-48/
[root@node1 ~]# ls /extrabackup/2016-04-27_07-57-22/ #查看備份文件
total 96
-rw-r----- 1 root root 386 Apr 27 07:57 backup-my.cnf
drwx------ 2 root root 4096 Apr 27 07:57 employees
-rw-r----- 1 root root 49152 Apr 27 07:57 ibdata1.delta
-rw-r----- 1 root root 44 Apr 27 07:57 ibdata1.meta
drwx------ 2 root root 4096 Apr 27 07:57 mysql
drwx------ 2 root root 4096 Apr 27 07:57 performance_schema
drwx------ 2 root root 4096 Apr 27 07:57 test
drwx------ 2 root root 4096 Apr 27 07:57 TEST1
drwx------ 2 root root 4096 Apr 27 07:57 TEST2
-rw-r----- 1 root root 21 Apr 27 07:57 xtrabackup_binlog_info
-rw-r----- 1 root root 123 Apr 27 07:57 xtrabackup_checkpoints
-rw-r----- 1 root root 530 Apr 27 07:57 xtrabackup_info
-rw-r----- 1 root root 2560 Apr 27 07:57 xtrabackup_logfile
BASEDIR指的是徹底備份所在的目錄,此命令執行結束後,
innobackupex
命令會在/extrabackup
目錄中建立一個新的以時間命名的目錄以存放全部的增量備份數據。另外,在執行過增量備份以後再一次進行增量備份時,其--incremental-basedir
應該指向上一次的增量備份所在的目錄。須要注意的是,增量備份僅能應用於InnoDB或XtraDB表,對於MyISAM表而言,執行增量備份時其實進行的是徹底備份。
整理增量備份
[root@node1 ~]# innobackupex --apply-log --redo-only /extrabackup/2016-04-27_07-30-48/
[root@node1 ~]# innobackupex --apply-log --redo-only /extrabackup/2016-04-27_07-30-48/ --incremental-dir=/extrabackup/2016-04-27_07-5
7-22/
恢復數據
[root@node1 ~]# rm -rf /data/* #刪除數據
[root@node1 ~]# innobackupex --copy-back /extrabackup/2016-04-27_07-30-48/ #整理增量備份以後能夠直接經過全量備份還原
[root@node1 ~]# chown -R mysql.mysql /data/
[root@node1 ~]# ls /data/ -l
total 28732
-rw-rw---- 1 mysql mysql 8192 Apr 27 08:05 aria_log.00000001
-rw-rw---- 1 mysql mysql 52 Apr 27 08:05 aria_log_control
drwx------ 2 mysql mysql 4096 Apr 27 08:05 employees
-rw-r----- 1 mysql mysql 18874368 Apr 27 08:05 ibdata1
-rw-r----- 1 mysql mysql 5242880 Apr 27 08:05 ib_logfile0
-rw-r----- 1 mysql mysql 5242880 Apr 27 08:05 ib_logfile1
drwx------ 2 mysql mysql 4096 Apr 27 08:05 mysql
-rw-rw---- 1 mysql mysql 245 Apr 27 08:05 mysql-bin.000001
-rw-rw---- 1 mysql mysql 19 Apr 27 08:05 mysql-bin.index
-rw-r----- 1 mysql mysql 1812 Apr 27 08:05 node1.anyisalin.com.err
-rw-rw---- 1 mysql mysql 5 Apr 27 08:05 node1.anyisalin.com.pid
drwx------ 2 mysql mysql 4096 Apr 27 08:05 performance_schema
drwx------ 2 mysql mysql 4096 Apr 27 08:05 test
drwx------ 2 mysql mysql 4096 Apr 27 08:05 TEST1
drwx------ 2 mysql mysql 4096 Apr 27 08:05 TEST2
-rw-r----- 1 mysql mysql 29 Apr 27 08:05 xtrabackup_binlog_pos_innodb
-rw-r----- 1 mysql mysql 530 Apr 27 08:05 xtrabackup_info
MariaDB [(none)]> SHOW DATABASES; #數據還原
+--------------------+
| Database |
+--------------------+
| information_schema |
| TEST1 |
| TEST2 |
| employees |
| mysql |
| performance_schema |
| test |
+--------------------+
7 rows in set (0.00 sec)
#關於xtrabackup還有不少強大的功能沒有敘述、有興趣能夠去看官方文檔
備份方法 | 備份速度 | 恢復速度 | 便捷性 | 功能 | 通常用於 |
---|---|---|---|---|---|
cp | 快 | 快 | 通常、靈活性低 | 很弱 | 少許數據備份 |
mysqldump | 慢 | 慢 | 通常、可無視存儲引擎的差別 | 通常 | 中小型數據量的備份 |
lvm2快照 | 快 | 快 | 通常、支持幾乎熱備、速度快 | 通常 | 中小型數據量的備份 |
xtrabackup | 較快 | 較快 | 實現innodb熱備、對存儲引擎有要求 | 強大 | 較大規模的備份 |