Mysql備份工具Xtrabackup


  Xtrabackup是一個開源的免費的熱備工具,在Xtrabackup包中主要有Xtrabackup和innobackupex兩個工具。其中Xtrabackup只能備份InnoDB和XtraDB兩種引擎; innobackupex則是封裝了Xtrabackup,同時增加了備份MyISAM引擎的功能。

  Xtrabackup備份時不能備份表結構、觸發器等等,也不能智能區分.idb數據文件。另外innobackupex還不能完全支持增量備份,需要和xtrabackup結合起來實現全備的功能。

(1).安裝xtrbackup

1)下載安裝包

  網址是https://www.percona.com/downloads/,然后網頁查找Xtrabackup,下載自己需要的版本,就是下載速度有點慢。我這里使用的是2.4.14版本。

  然后下載依賴包,網址是http://rpmfind.net/linux/atrpms/el6-x86_64/atrpms/stable/libev-4.04-2.el6.x86_64.rpm

  這兩個可以下載好上傳到CentOS服務器,也可以使用wget直接在服務器上下載。

2)解壓安裝

[root@youxi1 ~]# ls
anaconda-ks.cfg              mysql-5.7.16-1.el7.x86_64.rpm-bundle.tar
libev-4.04-2.el6.x86_64.rpm  Percona-XtraBackup-2.4.14-ref675d4-el7-x86_64-bundle.tar
Mysql
[root@youxi1 ~]# rpm -ivh libev-4.04-2.el6.x86_64.rpm 
警告:libev-4.04-2.el6.x86_64.rpm: 頭V4 DSA/SHA1 Signature, 密鑰 ID 66534c2b: NOKEY
准備中...                          ################################# [100%]
正在升級/安裝...
   1:libev-4.04-2.el6                 ################################# [100%]
[root@youxi1 ~]# tar -xf Percona-XtraBackup-2.4.14-ref675d4-el7-x86_64-bundle.tar 
[root@youxi1 ~]# ls
anaconda-ks.cfg                           Percona-XtraBackup-2.4.14-ref675d4-el7-x86_64-bundle.tar
libev-4.04-2.el6.x86_64.rpm               percona-xtrabackup-24-2.4.14-1.el7.x86_64.rpm
Mysql                                     percona-xtrabackup-24-debuginfo-2.4.14-1.el7.x86_64.rpm
mysql-5.7.16-1.el7.x86_64.rpm-bundle.tar  percona-xtrabackup-test-24-2.4.14-1.el7.x86_64.rpm
[root@youxi1 ~]# yum -y install percona-xtrabackup-24-2.4.14-1.el7.x86_64.rpm  //這里用yum安裝,因為還有其他的依賴包

3)配置文件

  修改配置文件/etc/my.cnf,保證[mysqld]模塊存在參數datadir=/var/lib/mysql(指向數據目錄),因為xtrbackup是根據/etc/my.cnf配置文件來獲取需要備份的文件。然后重啟mysqld。

(2).xtrbackup的使用

  一般使用的是innobackupex腳本,因為innobackupex是perl腳本對xtrbackup的封裝和功能擴展。

1)用戶權限說明

  在備份數據庫時會涉及到兩個用戶:系統用戶與數據庫內部的用戶。

  系統用戶需要在datadir(配置文件內設置的目錄)上具有讀寫執行權限(rwx)。而數據庫內部用戶需要:RELOAD和LOCK TABLES權限,為了執行FLUSH TABLES WITH READ LOCK;REPLICATION CLIENT權限,為了獲取binary log(二進制日志文件)位置;CREATE TABLESPACE權限,為了導入表,用戶表級別的恢復;SUPER權限,為了在slave環境下備份用來啟動和關閉slave線程。

2)常用命令格式和常用參數

  命令格式:

  innobackupex [參數] [目的地址|源地址]

  常用參數:

--user=[數據庫用戶]    以什么用戶身份進行操作
--password=[密碼]    數據庫用戶的密碼
--port=[端口號]    數據庫的端口號,默認3306
--stream=[tar|xbstream]  打包(數據流)
--defaults-file=[配置文件]  指定默認配置文件,默認讀取/etc/my.cnf
--no-timestamp  不創建時間戳文件,而改用目的地址(可以自動創建)
--copy-back  備份還原的主要選項
--incremental  使用增量備份,默認使用的完整備份
--incremental-basedir=[地址]  與--incremental選項聯合使用,該參數指定上一級備份的地址來做增量備份

3)完整備份和還原

  完整備份

[root@youxi1 ~]# innobackupex --user=root --password=123456 ./db_backup/  //這個會有大量輸出信息
[root@youxi1 ~]# innobackupex --user=root --password=123456 ./db_backup/ 2>>./db_backup/backup.log  //如果不想要輸出信息,可以將輸出信息重定向到指定文件或黑洞文件中
[root@youxi1 ~]# ls ./db_backup/
2019-06-16_15-49-44  2019-06-16_15-51-23  backup.log
[root@youxi1 ~]# ls ./db_backup/2019-06-16_15-49-44/
backup-my.cnf ibdata1 performance_schema xtrabackup_checkpoints xtrabackup_logfile
ib_buffer_pool mysql sys xtrabackup_info
[root@youxi1 ~]# innobackupex --user=root --password=123456 --no-timestamp ./db_backup/test/ 2>>./db_backup/backup.log  //不使用時間戳創建目錄,可自動創建目的地址
[root@youxi1 ~]# ls ./db_backup/
2019-06-16_15-49-44  2019-06-16_15-51-23  backup.log  test
[root@youxi1 ~]# ls ./db_backup/test/
backup-my.cnf   ibdata1  performance_schema  xtrabackup_checkpoints  xtrabackup_logfile
ib_buffer_pool  mysql    sys                 xtrabackup_info

  還原,注意:innobackupex -copy-back不會覆蓋已存在的文件。而且還原時需要先關閉服務,如果服務是啟動的,那么就不能還原到datadir

[root@youxi1 ~]# systemctl stop mysqld
[root@youxi1 ~]# rm -rf /var/lib/mysql/*  //危險操作,請在測試環境測試
[root@youxi1 ~]# innobackupex --copy-back ./db_backup/2019-06-16_15-49-44/ 2>>./db_backup/copyback.log
[root@youxi1 ~]# ll /var/lib/mysql
總用量 12324
-rw-r----- 1 root root      292 6月  16 17:08 ib_buffer_pool
-rw-r----- 1 root root 12582912 6月  16 17:08 ibdata1
drwxr-x--- 2 root root     4096 6月  16 17:08 mysql
drwxr-x--- 2 root root     8192 6月  16 17:08 performance_schema
drwxr-x--- 2 root root     8192 6月  16 17:08 sys
-rw-r----- 1 root root      423 6月  16 17:08 xtrabackup_info
[root@youxi1 ~]# chown -R mysql:mysql /var/lib/mysql  //重新授權,否則mysqld無法啟動
[root@youxi1 ~]# systemctl start mysqld
[root@youxi1 ~]# mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.26 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, 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 |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

4)增量備份和還原

  增量備份的實現,依賴於innodb頁上面的LSN(log sequence number),每次對數據庫的修改都會導致LSN自增。增量備份會復制指定LSN<日志序列號>之后的所有數據頁。

  查看完整備份的LSN

[root@youxi1 ~]# cat ./db_backup/2019-06-16_15-49-44/xtrabackup_checkpoints 
backup_type = full-backuped  //代表完整備份
from_lsn = 0
to_lsn = 2525919
last_lsn = 2525928
compact = 0
recover_binlog_info = 0
flushed_lsn = 2525928

  創建一些數據,然后以2019-06-16_15-49-44時間戳創建第一個增量備份,並查看LSN

[root@youxi1 ~]# mysql -uroot -p123456
mysql> create database test_db;
Query OK, 1 row affected (0.00 sec)

mysql> use test_db;
Database changed
mysql> create table user_tb(id int,name varchar(20));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into user_tb values(1,'zhangsan');
Query OK, 1 row affected (0.00 sec)

mysql> exit
Bye
[root@youxi1 ~]# innobackupex -uroot -p123456 --incremental --incremental-basedir=./db_backup/2019-06-16_15-49-44/ ./db_backup/ 2>>./db_backup/backup.log
[root@youxi1 ~]# ls db_backup/
2019-06-16_15-49-44  2019-06-16_15-51-23  2019-06-16_17-26-54  backup.log  copyback.log  test
[root@youxi1 ~]# cat db_backup/2019-06-16_17-26-54/xtrabackup_checkpoints 
backup_type = incremental  //表示增量備份
from_lsn = 2525919
to_lsn = 2530689
last_lsn = 2530698
compact = 0
recover_binlog_info = 0
flushed_lsn = 2530698

  再創建一些數據,以上一個增量備份創建新的增量備份,並查看LSN

[root@youxi1 ~]# mysql -u root -p123456
mysql> use test_db;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> insert into user_tb values(2,'lisi');
Query OK, 1 row affected (0.00 sec)

mysql> exit
Bye
[root@youxi1 ~]# innobackupex --user=root --password=123456 --incremental --incremental-basedir=db_backup/2019-06-16_17-26-54/ ./db_backup/ 2>>./db_backup/backup.log
[root@youxi1 ~]# ls db_backup/                        
2019-06-16_15-49-44  2019-06-16_17-26-54  backup.log    test
2019-06-16_15-51-23  2019-06-16_17-40-13  copyback.log
[root@youxi1 ~]# cat db_backup/2019-06-16_17-40-13/xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 2530689
to_lsn = 2530892
last_lsn = 2530901
compact = 0
recover_binlog_info = 0
flushed_lsn = 2530901

  增量備份的還原就比較麻煩了:

    第一步,從完整備份一步步升上來。首先是完整備份,innobackupex --apply-log --redo-only [完整備份的地址]。接着是除了想要還原到的增量備份,都需要innobackupex --apply-log --redo-only [完整備份的地址] --incremental-dir=[第1次到第n-1次增量備份地址],一個個執行過去。然后想要還原的增量備份innobackupex --apply-log [完整備份的地址] --incremental-dir=[第n次增量備份地址]。這時所有需要的日志就到了完整備份目錄下,最后執行innobackupex --apply-log [完整備份的地址],將未完成的日志執行。

    第二步、停止mysqld,恢復數據,恢復目錄及文件權限,啟動mysqld,檢查是否正常。

  還原實例:

[root@youxi1 ~]# innobackupex --apply-log --redo-only db_backup/2019-06-16_15-49-44/ 2>>db_backup/copyback.log
[root@youxi1 ~]# innobackupex --apply-log --redo-only db_backup/2019-06-16_15-49-44/ --incremental-dir=db_backup/2019-06-16_17-26-54/ 2>>db_backup/copyback.log
[root@youxi1 ~]# innobackupex --apply-log db_backup/2019-06-16_15-49-44/ --incremental-dir=db_backup/2019-06-16_17-40-13/ 2>>db_backup/copyback.log
[root@youxi1 ~]# innobackupex --apply-log db_backup/2019-06-16_15-49-44/ 2>>db_backup/copyback.log
[root@youxi1 ~]# systemctl stop mysqld
[root@youxi1 ~]# rm -rf /var/lib/mysql/*  //危險操作
[root@youxi1 ~]# innobackupex --copy-back db_backup/2019-06-16_15-49-44/ 2>db_backup/copyback.log
[root@youxi1 ~]# chown -R mysql:mysql /var/lib/mysql/
[root@youxi1 ~]# systemctl start mysqld
[root@youxi1 ~]# mysql -uroot -p123456
mysql> use test_db;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from user_tb;
+------+----------+
| id | name |
+------+----------+
| 1 | zhangsan |
| 2 | lisi |
+------+----------+
2 rows in set (0.00 sec)

5)--stream選項,數據流壓縮

  注意:使用--stream選項時,會輸出打包的數據流,並不會直接生成打包文件,此時需要使用重定向或其他命令對數據流進行處理。

  例如1:使用重定向生成壓縮文件

[root@mhaSpareMaster22 ~]# mkdir /db_backup
//將標准輸出重定向為tar文件,將標准錯誤重定向到日志文件
[root@mhaSpareMaster22 ~]# innobackupex --databases=test_db --user=root --password=123456 --stream=tar /db_backup/
 >/db_backup/`date +%F`.tar 2> /db_backup/backup.log 
[root@mhaSpareMaster22 ~]# ls /db_backup/
2019-09-29.tar  backup.log
[root@mhaSpareMaster22 ~]# cd /db_backup/
//注意:解壓的時候是散的,沒有文件夾
[root@mhaSpareMaster22 db_backup]# tar xf 2019-09-29.tar
[root@mhaSpareMaster22 db_backup]# ls
2019-09-29.tar  ib_buffer_pool  xtrabackup_binlog_info  xtrabackup_logfile
backup.log      ibdata1         xtrabackup_checkpoints
backup-my.cnf   test_db         xtrabackup_info

  例如2:使用ssh和cat組合命令,直接備份到其他服務器上

[root@mhaSpareMaster22 ~]# ssh-keygen
[root@mhaSpareMaster22 ~]# ssh-copy-id 192.168.5.70
[root@mhaSpareMaster22 ~]# innobackupex --databases=test_db --user=root --password=123456 --stream=tar 2> /db_backup/backup.log
 | ssh 192.168.5.70 "cat - > /`date +%F`.tar "
[root@mhaSpareMaster22 ~]# ssh 192.168.5.70
[root@Zabbix70 ~]# ls /  //可以看到確實存在打包文件了
2019-09-29.tar  boot  etc  lib   media  opt   root  sbin  sys  usr
bin             ceph  dev  home  lib64  mnt   proc  run   srv  tmp  var
[root@Zabbix70 ~]# mkdir /db
[root@Zabbix70 /]# tar xf /2019-09-29.tar -C /db/  //解壓下來看看
[root@Zabbix70 /]# ls /db
backup-my.cnf   ibdata1  xtrabackup_binlog_info  xtrabackup_info
ib_buffer_pool  test_db  xtrabackup_checkpoints  xtrabackup_logfile
[root@Zabbix70 ~]# exit
登出
Connection to 192.168.5.70 closed.

  例如3:使用gzip再壓縮一下

[root@mhaSpareMaster22 ~]# rm -rf /db_backup/*
[root@mhaSpareMaster22 ~]# innobackupex --databases=test_db --user=root --password=123456 --stream=tar /db_backup/
 2> /db_backup/backup.log | gzip > /db_backup/`date +%F`.tar.gz
[root@mhaSpareMaster22 ~]# ls /db_backup/
2019-09-29.tar.gz  backup.log
[root@mhaSpareMaster22 ~]# tar zxf /db_backup/2019-09-29.tar.gz -C /db_backup/
[root@mhaSpareMaster22 ~]# ls /db_backup/  //可以看到也能正常解壓
2019-09-29.tar.gz  ib_buffer_pool  xtrabackup_binlog_info  xtrabackup_logfile
backup.log         ibdata1         xtrabackup_checkpoints
backup-my.cnf      test_db         xtrabackup_info

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM