Linux命令:MySQL系列之十四--MySQL備份與還原(xtrabackup工具重要章節)

一、percona-xtrabckup安裝
環境:redhat 6.0
數據庫:mysql 5.5.28  (編譯安裝)

1,官網下載並安裝(下載地址文章尾部)

[root@lamp ~]# rpm -ivh percona-xtrabackup-2.0.0-417.rhel6.x86_64.rpm 

warning: percona-xtrabackup-2.0.0-417.rhel6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY

error: Failed dependencies:

mysql is needed by percona-xtrabackup-2.0.0-417.rhel6.x86_64

提示安裝percona-xtrabackup需要mysql(因爲編譯安裝的路徑與yum安裝的目錄不同所以需要通過yum安裝mysql,但是不啓用該方式安裝的mysql)

[root@lamp ~]# yum install mysql

Loaded plugins: refresh-packagekit, rhnplugin

--> Running transaction check

---> Package mysql.x86_64 0:5.1.47-4.el6 set to be updated

--> Finished Dependency Resolution

...........

Installing:

 mysql                x86_64                5.1.47-4.el6                Server                889 k

Transaction Summary

====================================================================================================

Warning: RPMDB altered outside of yum.

  Installing     : mysql-5.1.47-4.el6.x86_64                                                    1/1 

Installed:

  mysql.x86_64 0:5.1.47-4.el6                                                                       

Complete!                  #yum安裝mysql完成

[root@lamp ~]# rpm -ivh percona-xtrabackup-2.0.0-417.rhel6.x86_64.rpm   #再次執行rpm安裝 

warning: percona-xtrabackup-2.0.0-417.rhel6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY

Preparing...                ########################################### [100%]

   1:percona-xtrabackup     ########################################### [100%]

# percona-xtrabackup 安裝完成

[root@lamp ~]# rpm -ql percona-xtrabackup  #查看安裝的相關目錄 (綠色目錄爲主要使用目錄及運行程序)

/usr/bin/innobackupex

/usr/bin/innobackupex-1.5.1

/usr/bin/xbstream

/usr/bin/xtrabackup

/usr/bin/xtrabackup_51

/usr/bin/xtrabackup_55

/usr/share/doc/percona-xtrabackup-2.0.0

/usr/share/doc/percona-xtrabackup-2.0.0/COPYING

/usr/share/percona-xtrabackup-test

/usr/share/percona-xtrabackup-test/bootstrap.sh

/usr/share/percona-xtrabackup-test/disabled

/usr/share/percona-xtrabackup-test/disabled/ib_include.sh

/usr/share/percona-xtrabackup-test/disabled/tar_compressed.sh

/usr/share/percona-xtrabackup-test/disabled/xb_lru_dump.sh

/usr/share/percona-xtrabackup-test/experimental

...............

[root@lamp ~]# innobackupex --help  #查看相關幫助

注意:
1,之前我安裝的2.2.9,但是提示perl-DBI,perl-DBD-mysql的問題,一直無法解決,換成低版本的xtrabackup就可以。
2,如果提示mysql sock問題,在參數中指定sock的路徑。

二、使用


備份
備份時無法指定備份名,每一個備份文件夾都是以時間來命名的,裏面存放的是數據文件、日誌文件,目錄需存在,沒有則先創建。

1,全量備份
[root@lamp ~]# innobackupex --user=root --password=redhat --host=127.0.0.1 /backup/

  #--user:指定mysql用戶  --password:指定用戶的密碼  --host:指定主機(如果是本機,可以省略此選項)   /backup:指定備份至的目錄

***如果要使用一個最小權限的用戶進行備份,則可基於如下命令創建此類用戶:

mysql > CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 'redhat'; #創建用戶bkpuser備份用戶,並通過IDENTIFIED BY 'password'設定密碼。

mysql > REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'bkpuser'; #revoke取消ALL PRIVILEGES所有授權,GRANT OPTION授權選項從bkpuser用戶中。及把bkpuser所有的

操作數據庫的權限取消掉

mysql>GRANT RELOAD,LOCK TABLES,REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost'; 

#GRANT授權,RELOAD:重新加載的權限,LOCK TABLES:鎖表的權限,REPLICATION CLIENT:

複製客戶端的權限,ON *.*:對於那些數據有權限,TO:指定授權給那個用戶。

mysql > FLUSH PRIVILEGES;  #刷新權限列表,使得權限生效。



1、執行一次完全備份

在備份的同時,innobackupex還會在備份目錄中創建如下文件:

(1)xtrabackup_checkpoints ---該文件記錄備份類型(如完全或增量)、備份狀態(如是否已經爲prepared狀態)和LSN(日誌系列號)範圍信息,每個InnoDB頁(通常爲16K大小)都會包含一個

日誌系列號,即LSN,LSN是整個數據庫系統的系統版本號,每個頁面相關的LSN能夠表明此頁面

最近是如何發生改變的。

(2)xtrabackup_binlog_info ---mysql服務器當前正在使用的二進制日誌文件及至備份這一刻爲止二進制日誌事件的位置。

(3)xtrabackup_binlog_pos_innodb ---二進制日誌文件及用於InnoDB或XtraDB表的二進制日誌文件的當前position。

(4)xtrabackup_binary  ---備份中用到的xtrabackup的可執行文件;

(5)backup-my.cnf  ---備份命令用到的配置選項信息;

在使用innobackupex進行備份時,還可以使用--no-timestamp選項來阻止命令自動創建一個以時間命名的目錄;如此一來,innobackupex命令將會創建一個BACKUP-DIR目錄來存儲備份數據。

2、執行完全備份後的準備:

一般情況下,在完全備份後,數據尚且不能用於恢復操作,因爲備份的數據中可能會包含尚未提交的事務或已經提交但尚未同步至數據文件中的事務。因此,此時數據文件仍處理不一致的狀態。‘準備’的主要作用正是通過回滾未提交的事務及同步已經提交的事務至數據文件也使得數據文件處於一致性狀態。

innobackupex命令的--apply-log選項可用於實現上述功能,如下面的命令;

[root@lamp ~]# innobackupex --apply-log /PATH/TO/BACKUP-DIR  #/PATH/TO/BACKUP-DIR爲剛纔執行完全備份所保存的目錄。

如果執行正確,其 最後輸出的幾行信息通常如下:

xtrabackup: starting shutdown with innodb_fast_shutdown = 1

170610 17:26:33 InnoDB: Starting shutdown...

170610 17:26:46 InnoDB: Shutdown completed; log sequence number 92036620

170610 17:26:58 innobackupex: completed OK!

在實現“準備”的過程中,innobackupex通常還可以使用--use-memory選項來指定其可以使用的內存的大小,默認通常爲100M。如果有足夠的內存可用,可以多劃分一些內存給prepare的過程,

以提高其完成的速度。

3、從一個完全備份中恢復數據

innobackupex 命令的--copy-back選項用於執行恢復操作,其通過複製所有數據文件相關的文件至mysql服務器DATADIR目錄中來執行恢復過程,innobackupex通過backup-my.cnf來獲取DATADIR目錄的相關信息。



4,使用innobackupex進行增量備份

每個InnoDB的頁面都會包含一個LSN信息,每當相關的數據發生改變,相關的頁面的LSN就會自動增長,這正式InnoDB表可以進行增量備份的基礎,即innobackupex通過備份上次完全備份之後發生改變的頁面來實現。

要實現第一次增量備份,可以使用下面的命令進行:

# innobackupex --user=root --password=redhat --host=127.0.0.1 --incremental /backup --incremental-basedir=BASEDIR  #--user:指定用戶,--password:指定密碼,--host:指定需要備份的主機(如果備份本機可以省略此選項),--incremental:指定增量備份存放的目錄,--incremental-basedir:指定完全備份的所在的目錄。

[root@lamp ~]# innobackupex --user=root --password=redhat --

host=127.0.0.1  --incremental  /backup/ --incremental-basedir=/backup/2017-06-09_16-34-35/ 

***執行增量備份命令後,innobackuppex 命令會在/backup目錄中創建一個新的以時間命名的目錄以存放所有的增量備份數據,另外,在執行增量備份後再一次進行增量備份時,--incremental-basedir應該指向上一次的增量備份所在的目錄。

需要注意的是,增量備份僅能用於InnoDB或xtraDB表,對於MyISAM表而言,執行增量備份時其實進行的是完全備份。

**準備**(prepare)增量備份與準備完全備份有着一些不同,尤其要注意的是:

(1)需要在每個備份(包括完全和各個增量備份)上,將已經提交的事務進行“重放”,“重放”之後,所有的備份數據將合併到完全備份上。

(2)基於所有的備份將未提交的事務進行“回滾”

於是,準備操作就變成了:

  1、先準備完全備份的操作:

[root@lamp ~]# innobackupex --apply-log --redo-only BASE-DIR #執行完全備份的準備,

BASE-DIR:是完全備份存放的路徑,--redo-only:執行事務選擇redo

  2、執行提交第一次增量備份的操作:

[root@lamp ~]# innobackupex -apply-log -redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1  #其中BASE-DIR:指的是完全備份所在的目錄,而INCREMENTAL-DIR-1指的是第一次增量備份的目錄

  3、執行提交第二次增量備份的操作:

[root@lamp ~]# innobackupex -apply-log -redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2  #其中BASE-DIR:指的是完全備份所在的目錄,而INCREMENTAL-DIR-2指的是第二次增量備份的目錄

 如果有多次增量備份,每一次備份完後都要執行如上準備操作,纔可以用於後期的恢復操作。執行完整備份和多次增量備份準備工作後,所有數據都會保存在指定的完全備份BASE-DIR路徑,後期恢復的時候

只要執行innobackupex --copy-back BASE-DIR  就可以把所有數據恢復回來。BASE-DIR爲完全備份存放的目錄。



5、導入或導出單張表:

默認情況下,InnoDB表不能通過直接複製表文件的方式再mysql服務器之間進行移植,及時使用innodb_file_per_table選項,而使用Xtrabackup工具可以實現此種功能,不過,此時需要“導出”表的mysql服務器啓用了innodb_file_per_table選項(嚴格來說,是要“導出”的表在其創建之前,mysql服務

器就啓用了innodb_file_per_table選項及每表一個表空間),並且“導入”表的服務器同時啓用了innodb_file_per_table和innodb_expand_import選項。

  (1)“導出”表

   導出表是在備份的prepare階段進行的,因此,一旦完全備份完成,就可以在prepare過程中通過

--export選項將某表導出了;

[root@lamp ~]# innobackupex --apply-log --export /path/to/backup

#此命令會在每個innodb表的表空間創建一個以.exp結尾的文件,這些以.exp結尾的文件則可以用於導入至其他服務器。

  (2)“導入”表

    要在mysql服務器上導入來自於其他服務器的某innodb表,需要先在當前服務器上創建一個跟原來表表結構一致的表,而後才能實現將表導入:

 mysql> CREATE TABLE mytable (...) ENGINE=InnoDB;

然後將此表的表空間刪除;

 mysql> ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;

接下來,將來自於“導出”表的服務器的mytable表的mytable.ibd和mytable.exp文件複製到當前服務器的數據目錄,然後使用如下命令將其“導入”;

mysql> ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;



***************************************************************************************

實例:執行備份恢復過程及步驟

先執行一次完全備份操作:

[root@lamp ~]# innobackupex --user=root --password=redhat /backup #執行完全備份

InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy

and Percona Inc 2009-2012.  All Rights Reserved.

This software is published under

..............................

170609 16:34:54  innobackupex: All tables unlocked

170609 16:34:54  innobackupex: Connection to database serve               r closed

innobackupex: Backup created in directory '/backup/2017-06-09_16-34-35'

innobackupex: MySQL binlog position: filename 'mysql-bin.000002', position 107

170609 16:34:54  innobackupex: completed OK!   #備份完成

[root@lamp ~]# ls /backup  #紅色字體目錄爲剛纔備份的數據目錄

2017-06-09_16-34-35     incremental-2017-06-06-17-01-41.sql

full-backup-2017-06-06  master-2017-06-06.info

[root@lamp ~]#  cd /backup/2017-06-09_16-34-35/

[root@lamp 2017-06-09_16-34-35]# ls

backup-my.cnf  jiaowu  performance_schema  testdb                  xtrabackup_checkpoints

hellodb        mydb    stu                 xtrabackup_binary       xtrabackup_logfile

ibdata1        mysql   test                xtrabackup_binlog_info

[root@lamp ~]# innobackupex --apply-log --redo-only /backup/2017-06-09_16-34-35  #執行完全備份的準備,把相關事務寫入到完全備份目錄中。

InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy

and Percona Inc 2009-2012.  All Rights Reserved.

This software is published under

..........................................

xtrabackup: starting shutdown with innodb_fast_shutdown = 1

170612 11:38:51  InnoDB: Starting shutdown...

170612 11:38:56  InnoDB: Shutdown completed; log sequence number 1631244

170612 11:38:56  innobackupex: completed OK!  #執行準備完成

然後把相關的二進制日誌備份好,以備到時還原所用。

[root@lamp data]# cp -a mysql-bin.* /backup/  #複製二進制日誌文件至備份目錄 -a:複製文件時連帶權限屬性一起復制。

[root@lamp data]#  ls /backup/

2017-06-09_16-34-35     incremental-2017-06-06-17-01-41.sql  mysql-bin.000001  mysql-bin.000003      mysql-bin.000002    mysql-bin.index

[root@lamp data]# service mysqld stop  #停止mysqld服務

Shutting down MySQL..                                      [  OK  ]

[root@lamp data]# rm -rf ./*   #模擬mysqld數據目錄丟失

[root@lamp data]# ls

[root@lamp data]# pwd

/mydata/data

[root@lamp data]# service mysqld start  #啓動mysqld服務,此時由於數據丟失無法啓動

Starting MySQL....The server quit without updating PID file[FAILED]a/data/lamp.pid).

[root@lamp ~]# innobackupex --copy-back /backup/2017-06-09_16-34-35/   #執行完全備份的數據恢復

(不用初始化數據庫,可以直接執行數據恢復操作)

InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy

and Percona Inc 2009-2012.  All Rights Reserved.

This software is published under

the GNU GENERAL PUBLIC LICENSE Version 2, June 1991.

IMPORTANT: Please check that the copy-back run completes successfully.

           At the end of a successful copy-back run innobackupex

           prints "completed OK!".

innobackupex: Starting to copy files in '/backup/2017-06-09_16-34-35'

innobackupex: back to original data directory '/mydata/data'

...............................................

innobackupex: in '/backup/2017-06-09_16-34-35'

innobackupex: back to original InnoDB log directory '/mydata/data'

innobackupex: Finished copying back files.

170612 14:46:18  innobackupex: completed OK!   #數據恢復完成

[root@lamp data]# pwd

/mydata/data

[root@lamp data]# ll  #恢復完成後數據目錄的屬主和屬主都爲root,所以需要更改數據目錄的屬主和屬組。

total 28712

drwxr-xr-x. 2 root root     4096 Jun 12 14:46 hellodb

-rw-r-----. 1 root root 18874368 Jun 12 11:38 ibdata1

-rw-r--r--. 1 root root  5242880 Jun 12 14:46 ib_logfile0

-rw-r--r--. 1 root root  5242880 Jun 12 14:46 ib_logfile1

drwxr-xr-x. 2 root root     4096 Jun 12 14:46 jiaowu

drwxr-xr-x. 2 root root     4096 Jun 12 14:46 mydb

drwxr-xr-x. 2 root root     4096 Jun 12 14:46 mysql

drwxr-xr-x. 2 root root     4096 Jun 12 14:46 performance_schema

drwxr-xr-x. 2 root root     4096 Jun 12 14:46 stu

drwxr-xr-x. 2 root root     4096 Jun 12 14:46 test

drwxr-xr-x. 2 root root     4096 Jun 12 14:46 testdb

-rw-r--r--. 1 root root       24 Jun 12 14:46 xtrabackup_binlog_pos_innodb

-rw-r--r--. 1 root root       77 Jun 12 14:46 xtrabackup_checkpoints

[root@lamp data]# chown -R mysql:mysql /mydata/data  #修改目錄的屬主和屬組,使得mysql用戶有權限操作該目錄下的所有文件,-R遞歸修改。

[root@lamp data]# ll

total 28712

drwxr-xr-x. 2 mysql mysql     4096 Jun 12 14:46 hellodb

-rw-r-----. 1 mysql mysql 18874368 Jun 12 11:38 ibdata1

-rw-r--r--. 1 mysql mysql  5242880 Jun 12 14:46 ib_logfile0

-rw-r--r--. 1 mysql mysql  5242880 Jun 12 14:46 ib_logfile1

drwxr-xr-x. 2 mysql mysql      4096 Jun 12 14:46 jiaowu

drwxr-xr-x. 2 mysql mysql     4096 Jun 12 14:46 mydb

drwxr-xr-x. 2 mysql mysql    4096 Jun 12 14:46 mysql

drwxr-xr-x. 2 mysql mysql     4096 Jun 12 14:46 performance_schema

drwxr-xr-x. 2 mysql mysql     4096 Jun 12 14:46 stu

drwxr-xr-x. 2 mysql mysql     4096 Jun 12 14:46 test

drwxr-xr-x. 2 mysql mysql    4096 Jun 12 14:46 testdb

-rw-r--r--. 1 mysql mysql       24 Jun 12 14:46 xtrabackup_binlog_pos_innodb

-rw-r--r--. 1 mysql mysql       77 Jun 12 14:46 xtrabackup_checkpoints

[root@lamp data]#  service mysqld start  #啓動mysqld服務

Starting MySQL..                                           [  OK  ]

[root@lamp data]# mysql -uroot -p  #登錄mysql客戶端

Enter password: 

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 2

Server version: 5.5.28-log Source distribution

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SHOW DATABASES;    #完全備份的數據已經恢復。

+--------------------+

| Database           |

+--------------------+

| information_schema |

| hellodb            |

| jiaowu             |

| mydb               |

| mysql              |

| performance_schema |

| stu                |

| test               |

| testdb             |

+--------------------+

9 rows in set (0.00 sec)

mysql> SELECT * FROM tutors;  #查看錶內容

+-----+--------------+--------+------+

| TID | Tname        | Gender | Age  |

+-----+--------------+--------+------+

|   1 | HongQigong   | M      |   93 |

|   2 | HuangYaoshi  | M      |   63 |

|   3 | Miejueshitai | F      |   72 |

|   4 | OuYangfeng   | M      |   76 |

|   5 | YiDeng       | M      |   90 |

|   6 | YuCanghai    | M      |   56 |

|   7 | Jinlunfawang | M      |   67 |

|   8 | HuYidao      | M      |   42 |

|   9 | NingZhongze  | F      |   49 |

+-----+--------------+--------+------+

9 rows in set (0.00 sec)

打開另一個終端連接,把二進制日誌導出

[root@lamp ~]#mysqlbinlog /backup/mysql-bin.000001 > /tmp/test.sql #導出二進制日誌文件至

/tmp目錄下的test.sql以便實現及時點恢復


mysql> SET sql_log_bin=0;  #導入二進制日誌文件時,先關閉二進制日誌記錄功能

Query OK, 0 rows affected (0.00 sec)

mysql> SOURCE /tmp/test.sql   #導入二進制日誌文件test.sql到數據庫 source相當於./

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM tutors;

+-----+--------------+--------+------+

| TID | Tname        | Gender | Age  |

+-----+--------------+--------+------+

|   1 | HongQigong   | M      |   93 |

|   2 | HuangYaoshi  | M      |   63 |

|   3 | Miejueshitai | F      |   72 |

|   4 | OuYangfeng   | M      |   76 |

|   5 | YiDeng       | M      |   90 |

|   6 | YuCanghai    | M      |   56 |

|   7 | Jinlunfawang | M      |   67 |

|   8 | HuYidao      | M      |   42 |

|   9 | NingZhongze  | F      |   49 |

+-----+--------------+--------+------+

9 rows in set (0.00 sec)

mysql> SET sql_log_bin=1;  #恢復完二進制日誌後,千萬別忘記把二進制日誌記錄功能打開。

Query OK, 0 rows affected (0.00 sec)


對於增量備份也可以通過增量備份準備把所有增量備份的數據都寫入到完全備份保存的目錄,到時候恢復只要直接回復完全備份的內容即可,當然下一次再次執行數據備份時,需再次做一次完全備份,然後再做增量備份。

**準備**(prepare)增量備份與準備完全備份有着一些不同,尤其要注意的是:

(1)需要在每個備份(包括完全和各個增量備份)上,將已經提交的事務進行“重放”,“重放”之後,所有的備份數據將合併到完全備份上。

(2)基於所有的備份將未提交的事務進行“回滾”

於是,準備操作就變成了:

  1、先準備完全備份的操作:

[root@lamp ~]# innobackupex --apply-log --redo-only BASE-DIR #執行完全備份的準備,

BASE-DIR:是完全備份存放的路徑,--redo-only:執行事務選擇redo

  2、執行提交第一次增量備份的操作:

[root@lamp ~]# innobackupex -apply-log -redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1  #其中BASE-DIR:指的是完全備份所在的目錄,而INCREMENTAL-DIR-1指的是第一次增量備份的目錄

  3、執行提交第二次增量備份的操作:

[root@lamp ~]# innobackupex -apply-log -redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2  #其中BASE-DIR:指的是完全備份所在的目錄,而INCREMENTAL-DIR-2指的是第二次增量備份的目錄

 如果有多次增量備份,每一次備份完後都要執行如上準備操作,纔可以用於後期的恢復操作。執行完整備份和多次增量備份準備工作後,所有數據都會保存在指定的完全備份BASE-DIR路徑,後期恢復的時候

只要執行innobackupex --copy-back BASE-DIR  就可以把所有數據恢復回來。BASE-DIR爲完全備份存放的目錄。


**************************************************************************************************


遠程備份
壓縮備份
[root@lamp ~]#  innobackupex  --user=root --password=redhat --host=127.0.0.1 --stream=tar /tmp | ssh [email protected]  "gzip - > /tmp/bak.tar.gz"
或者
[root@lamp ~]#  innobackupex  --user=root --password=redhat --host=127.0.0.1 --stream=tar /tmp | gzip | ssh [email protected]  " /tmp/bak.tar.gz"
--stream=tar:tar格式
gzip:壓縮
非壓縮備份
[root@lamp ~]# innobackupex  --user=root --password=redhat --host=127.0.0.1 --stream=tar /tmp | ssh [email protected]  "cat - > /tmp/bak.tar"


遠程恢復
數據壓縮的文件需要加上 “i”

[root@lamp ~]# tar -izxvf bak.tar.gz




percona-xtrabackup-2.0.0-417.rhel6.x86_64.rpm

下載地址:https://www.percona.com/downloads/XtraBackup/LATEST/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章