1. 程式人生 > >MySQL 系列連載之 XtraBackup 全量熱備 or 恢復實踐(2)

MySQL 系列連載之 XtraBackup 全量熱備 or 恢復實踐(2)

導讀

如果您在本文遇到任何問題或疑問請到QQ群中與我們交流。也可在下方進行評論。我將在第一時間和您進行交流,共同學習。
QQ群:201777608、526871767、1689067(加群時註明:運維派)

1、準備工作

#系統環境

[[email protected] tools]# cat /etc/redhat-release
CentOS release 6.8 (Final)
[[email protected] tools]# uname -r
2.6.32-642.el6.x86_64

#主資料庫版本

[[email protected] ~]# mysql -V
mysql Ver 14.14 Distrib 5.5.32, for Linux (x86_64) using readline 5.1

#檢查資料庫引擎

mysql> show engines;

#主從資料庫同步注意點 [mysqld]

#主從之間的id不能相同 server-id

#啟用二進位制日誌 log-bin

#一般在從庫開啟(可選) read_only #推薦使用InnoDB並做好相關配置

#檢查主從資料庫狀態

[[email protected] ~]# mysql -e “show global variables like ‘server_id’;”
+—————+——-+
| Variable_name | Value |
+—————+——-+
| server_id | 241 |
+—————+——-+
[

[email protected] ~]# mysql -e “show global variables like ‘server_id’;”
+—————+——-+
| Variable_name | Value |
+—————+——-+
| server_id | 242 |
+—————+——-+

2、安裝percona-xtrabackup

官網安裝包地址 – https://www.percona.com/downloads/XtraBackup/LATEST/

1)原始碼安裝Xtrabackup

將原始碼包下載到/usr/local/src下

原始碼包下載

cd /usr/local/src

#安裝依賴
yum -y install cmake gcc gcc-c++ libaio libaio-devel automake autoconf bzr bison libtool zlib-devel libgcrypt-devel libcurl-devel crypt* libgcrypt* python-sphinx openssl imake libxml2-devel expat-devel ncurses5-devel ncurses-devle vim-common libgpg-error-devel libidn-devel perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL

#下載原始碼包
wget http://www.percona.com/downloads/XtraBackup/XtraBackup-2.1.9/source/percona-xtrabackup-2.1.9.tar.gz

#解壓原始碼包
tar -zvxf percona-xtrabackup-2.1.9.tar.gz

cd percona-xtrabackup-2.1.9

[[email protected] percona-xtrabackup-2.1.9]# ./utils/build.sh //執行該安裝指令碼,會出現下面資訊
Build an xtrabackup binary against the specified InnoDB flavor.

Usage: build.sh CODEBASE
where CODEBASE can be one of the following values or aliases:
innodb51 | plugin build against InnoDB plugin in MySQL 5.1
innodb55 | 5.5 build against InnoDB in MySQL 5.5
innodb56 | 5.6,xtradb56, build against InnoDB in MySQL 5.6
| mariadb100,galera56
xtradb51 | xtradb,mariadb51 build against Percona Server with XtraDB 5.1
| mariadb52,mariadb53
xtradb55 | galera55,mariadb55 build against Percona Server with XtraDB 5.5

根據上面提示和你使用的儲存引擎及版本,選擇相應的引數即可。因為我用的是MySQL 5.5版本,所以執行如下語句安裝:

[[email protected] percona-xtrabackup-2.1.9]# ./utils/build.sh innodb55

以上語句執行成功後,表示安裝完成。

最後,把生成的二進位制檔案拷貝到一個自定義目錄下(本例中為/home/mysql/admin/bin/percona-xtrabackup-2.1.9),並把該目錄放到環境變數PATH中。

mkdir -p /home/mysql/admin/bin/percona-xtrabackup-2.1.9/

cp ./innobackupex /home/mysql/admin/bin/percona-xtrabackup-2.1.9/

mv /usr/local/src/percona-xtrabackup-2.1.9/src/xtrabackup_innodb55 xtrabackup_55

cp /usr/local/src/percona-xtrabackup-2.1.9/src/xtrabackup_55 /usr/local/src/percona-xtrabackup-2.1.9/src/xbstream /home/mysql/admin/bin/percona-xtrabackup-2.1.9/

vim /etc/profile

export PATH=$PATH:/home/mysql/admin/bin/percona-xtrabackup-2.1.9/

重新整理profile並測試下innobackupex是否正常使用

source /etc/profile

測試下innobackupex是否正常使用

innobackupex –help

3、全量備份和恢復

1)全量備份操作

執行下面語句進行全備: mysql的安裝目錄是/application/mysql/ mysql的配置檔案路徑/etc/my.cnf 全量備份後的資料存放目錄是/backup/mysql/data

mkdir -p /backup/mysql/data/

innobackupex –defaults-file=/etc/my.cnf –user=root /backup/mysql/data/

170404 12:46:29 innobackupex: Waiting for log copying to finish

xtrabackup: The latest check point (for incremental): ‘1639325’
xtrabackup: Stopping log copying thread.
.>> log scanned up to (1639325)

xtrabackup: Creating suspend file ‘/backup/mysql/data/2017-04-04_12-46-24/xtrabackup_log_copied’ with pid ‘21223’
xtrabackup: Transaction log of lsn (1639325) to (1639325) was copied.
170404 12:46:30 innobackupex: All tables unlocked

innobackupex: Backup created in directory ‘/backup/mysql/data/2017-04-04_12-46-24’
innobackupex: MySQL binlog position: filename ‘mysql-bin.000019’, position 967
170404 12:46:30 innobackupex: Connection to database server closed
170404 12:46:30 innobackupex: completed OK!

出現上面的資訊,表示備份已經ok。

上面執行的備份語句會將mysql資料檔案(即由my.cnf裡的變數datadir指定)拷貝至備份目錄下(/backup/mysql/data)

注意:如果不指定–defaults-file,預設值為/etc/my.cnf。 備份成功後,將在備份目錄下建立一個時間戳目錄(本例建立的目錄為/backup/mysql/data/2017-04-04_12-46-24),在該目錄下存放備份檔案。

      [[email protected] data]# ll /backup/mysql/data/
      總用量 4
      drwxr-xr-x 6 root root 4096 4月 4 16:56 2017-04-04_16-56-35
      [[email protected] data]# ll 2017-04-04_16-56-35/
      總用量 18468
      -rw-r–r– 1 root root 188 4月 4 16:56 backup-my.cnf
      -rw-r—– 1 root root 18874368 4月 4 16:56 ibdata1
      drwxr-xr-x 2 root root 4096 4月 4 16:56 mysql
      drwxr-xr-x 2 root root 4096 4月 4 16:56 performance_schema
      drwxr-xr-x 2 root root 4096 4月 4 16:56 test
      -rw-r–r– 1 root root 13 4月 4 16:56 xtrabackup_binary
      -rw-r–r– 1 root root 23 4月 4 16:56 xtrabackup_binlog_info
      -rw-r—– 1 root root 89 4月 4 16:56 xtrabackup_checkpoints
      -rw-r—– 1 root root 2560 4月 4 16:56 xtrabackup_logfile
    drwxr-xr-x 2 root root 4096 4月 4 16:56 xtra_test

還可以在遠端進行全量備份,命令如下:

innobackupex –defaults-file=/etc/my.cnf –user=root –host=127.0.0.1 –parallel=2 –throttle=200 /backup/mysql/data 2>/backup/mysql/data/bak.log 1>/backup/mysql/data/`data +%Y-%m-%d_%H-%M%S`

引數解釋:

–user=root 備份操作使用者名稱,一般都是root使用者

–host=127.0.0.1 主機ip,本地可以不加(適用於遠端備份)。注意要提前在mysql中授予連線的許可權,最好備份前先測試用命令中的使用者名稱、密碼和host能否正常連線mysql。

–parallel=2 –throttle=200 並行個數,根據主機配置選擇合適的,預設是1個,多個可以加快備份速度。

/backup/mysql/data 備份存放的目錄

2>/backup/mysql/data/bak.log 備份日誌,將備份過程中的輸出資訊重定向到bak.log

這種備份跟上面相比,備份成功後,不會自動在備份目錄下建立一個時間戳目錄,需要如上命令中自己定義。

[[email protected] src]# ll /backup/mysql/data/
總用量 8
drwxr-xr-x 6 root root 4096 4月 4 12:46 2017-04-04_12-46-24
-rw-r–r– 1 root root 106 4月 4 12:57 bak.log //備份資訊都記錄在這個日誌裡,如果備份失敗,可以到這裡日誌裡查詢

2)全量備份後的恢復操作

#進入資料庫
[[email protected] data]# mysql

#檢視當前所有資料庫
mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| mysql |
| performance_schema |
| test |
| xtra_test |
+——————–+
5 rows in set (0.09 sec)

#切換到 xtra_test資料庫下
mysql> use xtra_test;
Database changed

#檢視當前資料庫裡的表
mysql> show tables;
+———————+
| Tables_in_xtra_test |
+———————+
| I |
| M |
+———————+
2 rows in set (0.04 sec)

#刪除整個 xtra_test庫
mysql> drop database xtra_test;
Query OK, 2 rows affected (0.34 sec)

#現在已經看不到 xtra_test庫了
mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| mysql |
| performance_schema |
| test |
+——————–+
4 rows in set (0.00 sec)

注意:恢復之前

1)要先關閉資料庫

2)要刪除資料檔案和日誌檔案(也可以mv移到別的地方,只要確保清空mysql資料存放目錄就行)

[[email protected] data]# ps -ef|grep mysqld
root 10929 1 0 10:32 pts/0 00:00:00 /bin/sh /application/mysql/bin/mysqld_safe –datadir=/application/mysql/data –pid-file=/application/mysql/data/master.pid
mysql 11227 10929 0 10:32 pts/0 00:00:14 /application/mysql/bin/mysqld –basedir=/application/mysql –datadir=/application/mysql/data –plugin-dir=/application/mysql/lib/plugin –user=mysql –log-error=/application/mysql/data/master.err –pid-file=/application/mysql/data/master.pid –port=3306
root 21514 1896 0 13:55 pts/0 00:00:00 grep mysqld

由上面可以看出mysql的資料和日誌存放目錄是/application/mysql/data

#關閉MySQL資料庫服務
[[email protected] data]# service mysqld stop
Shutting down MySQL…. SUCCESS!

#移動資料檔案和日誌檔案到/tmp(當然刪除也可以)
[[email protected] data]# mv /application/mysql/data/* /tmp/

[[email protected] data]# innobackupex –defaults-file=/etc/my.cnf –user=root –use-memory=1G –apply-log /backup/mysql/data/2017-04-04_13-04-05/

[[email protected] data]# innobackupex –defaults-file=/etc/my.cnf –user=root –copy-back /backup/mysql/data/2017-04-04_13-04-05/

[[email protected] ~]# chown -R mysql.mysql /application/mysql/data/

可能報錯:

sh: xtrabackup: command not found
innobackupex: Error: no ‘mysqld’ group in MySQL options at /home/mysql/admin/bin/percona-xtrabackup-2.1.9/innobackupex line 4350.

解決:將xtrabackup_55複製成xtrabackup即可

[[email protected] src]# ls /home/mysql/admin/bin/percona-xtrabackup-2.1.9/
innobackupex xbstream xtrabackup_55 xtrabackup_innodb55

[[email protected] src]# cd /home/mysql/admin/bin/percona-xtrabackup-2.1.9/

[[email protected] percona-xtrabackup-2.1.9]# cp xtrabackup_55 xtrabackup

[[email protected] percona-xtrabackup-2.1.9]# ls
innobackupex xbstream xtrabackup xtrabackup_55 xtrabackup_innodb55

檢驗:執行之後就OK了

[[email protected] percona-xtrabackup-2.1.9]# innobackupex –defaults-file=/etc/my.cnf –user=root –copy-back /backup/mysql/data/2017-04-04_13-04-05/

innobackupex: Copying ‘/backup/mysql/data/2017-04-04_13-04-05/ib_logfile1’ to ‘/application/mysql/data/ib_logfile1’
innobackupex: Copying ‘/backup/mysql/data/2017-04-04_13-04-05/ib_logfile0’ to ‘/application/mysql/data/ib_logfile0’
innobackupex: Finished copying back files.

170404 14:24:07 innobackupex: completed OK!

出現上面的資訊,說明資料恢復成功了!!

從上面的恢復操作可以看出,執行恢復分為兩個步驟:

1)第一步恢復步驟是應用日誌(apply-log),為了加快速度,一般建議設定–use-memory(如果系統記憶體充足,可以使用加大記憶體進行備份 ),這個步驟完成之後,目錄/backup/mysql/data/2017-04-04_13-04-05/下的備份檔案已經準備就緒。

2)第二步恢復步驟是拷貝檔案(copy-back),即把備份檔案拷貝至原資料目錄下。

最後,啟動mysql,檢視資料是否恢復回來了

#啟動資料庫
[[email protected] ~]# /etc/init.d/mysqld start
Starting MySQL.. SUCCESS!

#進入MySQL
[[email protected] ~]# mysql

#顯示所有資料庫(可以看到我們之前刪除的xtra_test 庫已經恢復了)
mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| mysql |
| performance_schema |
| test |
| xtra_test |
+——————–+
5 rows in set (0.00 sec)

#進入xtra_test 庫
mysql> use xtra_test;
Database changed

#檢視xtra_test 庫內表內容(已經全部恢復)
mysql> show tables;
+———————+
| Tables_in_xtra_test |
+———————+
| I |
| M |
+———————+
2 rows in set (0.00 sec)

後記

感謝您閱讀。