常用的MySQL數據庫備份

常用的MySQL數據庫備份方式


前言

我們試著想一想, 在生產環境中什么最重要?如果我們服務器的硬件壞了可以維修或者換新, 軟件問題可以修復或重新安裝, 但是如果數據沒了呢?這可能是最恐怖的事情了吧, 我感覺在生產環境中應該沒有什么比數據跟更為重要. 那么我們該如何保證數據不丟失、或者丟失后可以快速恢復呢?只要看完這篇文章, 大家應該就能對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

以上的幾種解決方案分別針對于不同的場景

  1. 如果數據量較小, 可以使用第一種方式, 直接復制數據庫文件

  2. 如果數據量還行, 可以使用第二種方式, 先使用mysqldump對數據庫進行完全備份, 然后定期備份BINARY LOG達到增量備份的效果

  3. 如果數據量一般, 而又不過分影響業務運行, 可以使用第三種方式, 使用lvm2的快照對數據文件進行備份, 而后定期備份BINARY LOG達到增量備份的效果

  4. 如果數據量很大, 而又不過分影響業務運行, 可以使用第四種方式, 使用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數據庫進行熱備的工具。特點:

  1. 備份過程快速、可靠;

  2. 備份過程不會打斷正在執行的事務;

  3. 能夠基于壓縮等功能節約磁盤空間和流量;

  4. 自動實現備份檢驗;

  5. 還原速度快;

xtrabackup實現完全備份

我們這里使用xtrabackup的前端配置工具innobackupex來實現對數據庫的完全備份

使用innobackupex備份時, 會調用xtrabackup備份所有的InnoDB表, 復制所有關于表結構定義的相關文件(.frm)、以及MyISAM、MERGE、CSVARCHIVE表的相關文件, 同時還會備份觸發器和數據庫配置文件信息相關的文件, 這些文件會被保存至一個以時間命名的目錄.

備份過程

[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

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 進行數據備份。


原創文章,作者:renjin,如若轉載,請注明出處:http://www.www58058.com/78889

(0)
renjinrenjin
上一篇 2015-06-12
下一篇 2015-06-15

相關推薦

  • 用戶和組相關的配置文件總結

    前言: 在用戶管理,組管理過程中,最基本的四個文件就是/etc下面的passwd,shadow,group,gshadow。他們記錄了與用戶和組相關的信息。是學習和深入了解用戶,組的基本。 除了這些基本的配置文件 還有與初始化相關的配置文件。定義用戶添加時初始狀態的配置文件/etc/default/useradd。 以及用戶家目錄的內容文件參考目錄/etc/…

    Linux干貨 2016-10-24
  • 網卡別名與bonding配置

    我們知道,一般來說,一個硬件地址對應與一個IP地址。但在一些情況下,我們可以通過一些方法打破硬件地址與IP地址的一一對應關系。下面就來說一下網卡別名與bonding配置。 網卡別名就是將多個IP地址綁定到一個網絡接口上,其命名方式為IFACE:num,如eth0:1等。需要注意的是,網卡別名僅對虛擬主機有效。創建網卡別名有兩種方式: 1、ifconfig命令…

    Linux干貨 2016-09-05
  • 初涉Linux基本要點概括(2)

    linux上的文件查看與管理類命令 mkdir 作用: 創建目錄 語法: mkdir [OPTION]… DIRECTORY… 示例: mkdir -p /tmp/x/y/z             &nb…

    Linux干貨 2016-10-15
  • web 服務進階 httpd配置成https

    web服務進階 自建CA/https詳解 一、SSL與https 1、引言 我們網上購物、網上訂票,以及使用支付寶支付過程中都會在網上直接輸入賬號和密碼。這些信息都是非常重要的,如何才能在輸入的過程中,不被別人看見和竊取,就需要對你輸入的信息進行加密處理。 早期的兩主機通信之間是沒有加解密程序,后來就在傳輸層與應用層之間加了一個SSL庫,完成加密解密功能。 …

    Linux干貨 2016-12-11
  • 第六周總結

    請詳細總結vim編輯器的使用并完成以下練習題 vim: 模塊化的編輯器   基本模式: 編輯模式,命令模式 輸入模式 末行模式: 打開文件: # vim [options] [file..] +#:打開文件后,直接讓光標處于第#行的行首; +/PATTERN:打開文件后,直接讓光標處于第一個被PATTERN匹配到的行的行首; 模式轉換: 編輯模式:…

    Linux干貨 2017-08-07
  • sed命令用法

    sed命令 [option]  “script”  file sed命令是一種行編輯工具,他是逐行對文件進行編輯。sed命令有一個模式空間,他將一行命令讀取進模式空間進行編輯,完成后將本行數據打印再讀取下一行數據進行處理。 option: -n:靜默模式不顯示模式空間內容 -f:從指定文件中讀取 -i:修改源文件(-i.###會自動將原文…

    Linux干貨 2016-08-12
欧美性久久久久