學會用各種姿勢備份MySQL數據庫
前言
我們試著想一想, 在生產環境中什么最重要?如果我們服務器的硬件壞了可以維修或者換新, 軟件問題可以修復或重新安裝, 但是如果數據沒了呢?這可能是最恐怖的事情了吧, 我感覺在生產環境中應該沒有什么比數據跟更為重要. 那么我們該如何保證數據不丟失、或者丟失后可以快速恢復呢?只要看完這篇文章, 大家應該就能對
MySQL
中實現數據備份和恢復能有一定的了解。
為什么需要備份數據?
在
前言
中大概說明了為什么要備份數據, 但是我們還是應該具體了解一下為什么要備份數據在生產環境中我們數據庫可能會遭遇各種各樣的不測從而導致數據丟失, 大概分為以下幾種.
硬件故障
軟件故障
自然災害
黑客攻擊
誤操作 (占比最大)
所以, 為了在數據丟失之后能夠恢復數據, 我們就需要定期的備份數據, 備份數據的策略要根據不同的應用場景進行定制, 大致有幾個參考數值, 我們可以根據這些數值從而定制符合特定環境中的數據備份策略
能夠容忍丟失多少數據
恢復數據需要多長時間
需要恢復哪一些數據
數據的備份類型
數據的備份類型根據其自身的特性主要分為以下幾組
完全備份
部分備份
完全備份指的是備份整個數據集( 即整個數據庫 )、部分備份指的是備份部分數據集(例如: 只備份一個表)
而部分備份又分為以下兩種
增量備份
差異備份
增量備份指的是備份自上一次備份以來(增量或完全)以來變化的數據; 特點: 節約空間、還原麻煩
差異備份指的是備份自上一次完全備份以來變化的數據 特點: 浪費空間、還原比增量備份簡單示意圖
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
進行增量備份或差異備份
實戰演練
使用cp進行備份
我們這里使用的是使用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)
##完成
使用mysqldump+復制BINARY LOG備份
我們這里使用的是使用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快照備份數據
做實驗之前我們先回顧一下
lvm2-snapshot
的知識
LVM
快照簡單來說就是將所快照源分區一個時間點所有文件的元數據進行保存,如果源文件沒有改變,那么訪問快照卷的相應文件則直接指向源分區的源文件,如果源文件發生改變,則快照卷中與之對應的文件不會發生改變??煺站碇饕糜谳o助備份文件。 這里只簡單介紹,點擊查看詳細介紹
部署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)
##完成
使用Xtrabackup備份
為了更好地演示, 我們這次使用
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熱備、對存儲引擎有要求 | 強大 | 較大規模的備份 |
其實我們還可以通過
Master-Slave Replication
進行數據備份、由于本文篇幅過長、遂放在下篇和大家分享作者水平很低, 如果有錯誤及時指出, 如果你覺得本文寫的好請點一波贊~(≧▽≦)/~
作者: AnyISaIln QQ: 1449472454
感謝: MageEdu
原創文章,作者:Net18-AnyISalIn,如若轉載,請注明出處:http://www.www58058.com/15423
不錯啊
@Net-18-黑人:哈哈、多謝