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.gzcd 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)
後記
感謝您閱讀。