percona-xtrabackup實現數據庫完全,增量的備份和還原(含一些版本問題與坑)

注意:版本變化

xtrabackup版本升級到2.4後,相比之前的2.1有了比較大的變化:
innobackupex 功能全部集成到 xtrabackup 裏面,只有一個 binary程序,另外爲了兼容考慮,innobackupex作爲 xtrabackup 的軟鏈接,即xtrabacku現在支持非Innodb表備份,並且 Innobackupex 在下一版本中移除,建議通過xtrabackup替換innobackupex

這裏mariadb5.5,爲centos7默認版本,更高版有很多版本問題很嚴重

個人測試數據庫版本10以上均無法使用xtrabackup

本次使用數據庫5.5版本恢復主機10.4版本可行

首先安裝xtrabackup

yum install percona-xtrabackup 在EPEL源中

percona-xtrabackup實現數據庫完全,增量的備份和還原(含一些版本問題與坑)

yum install /root/percona-xtrabackup-24-2.4.13-1.el7.x86_64.rpm #用yum解決依賴性

percona-xtrabackup實現數據庫完全,增量的備份和還原(含一些版本問題與坑)

使用方法 :備份

備份:innobackupex [option] BACKUP-ROOT-DIR

選項說明:
--user:該選項表示備份賬號
--password:該選項表示備份的密碼
--host:該選項表示備份數據庫的地址
--databases:該選項接受的參數爲數據庫名,如果要指定多個數據庫,彼此間需要以空格隔開;如:"xtra_test dba_test",同時,在指定某數據庫時,也可以只指定其中的某張表。如:"mydatabase.mytable"。該選項對innodb引擎表無效,還是會備份所有innodb表
--defaults-file:該選項指定從哪個文件讀取MySQL配置,必須放在命令行第一個選項位置
--incremental:該選項表示創建一個增量備份,需要指定--incremental-basedir
--incremental-basedir:該選項指定爲前一次全備份或增量備份的目錄,與--incremental同時使用
--incremental-dir:該選項表示還原時增量備份的目錄
--include=name:指定表名,格式:databasename.tablename
--apply-log:一般情況下,在備份完成後,數據尚且不能用於恢復操作,因爲備份的數據中可能會包含尚未提交的事務或已經提交但尚未同步至數據文件中的事務。因此,此時數據文件仍處理不一致狀態。此選項作用是通過回滾未提交的事務及同步已經提交的事務至數據文件使數據文件處於一致性狀態--use-memory:和--apply-log選項一起使用prepare 備份時,做crashrecovery分配的內存大小,單位字節,也可1MB,1M,1G,1GB等,推薦1G
--export:表示開啓可導出單獨的表之後再導入其他Mysql中
--redo-only:此選項在prepare base full backup,往其中合併增量備份時候使
用,但不包括對最後一個增量備份的合併

還原

還原:innobackupex --copy-back [選項] BACKUP-DIR

選項

innobackupex --move-back [選項] [--defaults-group=GROUP-NAME] BACKUP-DIR
選項說明:
--copy-back:做數據恢復時將備份數據文件拷貝到MySQL服務器的datadir
--move-back:這個選項與--copy-back相似,唯一的區別是它不拷貝文件,
而是移動文件到目的地。這個選項移除backup文件,用時候必須小心。使用場
景:沒有足夠的磁盤空間同事保留數據文件和Backup副本

  • 還原注意事項:

    1.datadir 目錄必須爲空。除非指定innobackupex --force-non-emptydirectorires選項指定,否則--copy-backup選不會覆蓋
    2.在restore之前,必須shutdown MySQL實例,不能將一個運行中的實例restore到datadir目錄中
    3.由於文件屬性會被保留,大部分情況下需要在啓動實例之前將文件的屬主改爲mysql,這些文件將屬於創建備份的用戶chown -R mysql:mysql /data/mysql以上需要在用戶調用innobackupex之前完成
    4--force-non-empty-directories:指定該參數時候,使得innobackupex --copy-back或--move-back選項轉移文件到非空目錄,已存在的文件不會被覆蓋。如果--copy-back和--move-back文件需要從備份目錄拷貝一個在datadir已經存在的文件,會報錯失敗

  • 備份生成的相關文件

使用innobackupex備份時,其會調用xtrabackup備份所有的InnoDB表,複製所有關於表結構定義的相關文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關文件,同時還會備份觸發器和數據庫配置信息相關的文件。這些文件會被保存至一個以時間命名的目錄中,在備份時,innobackupex還會在備份目錄中創建如下文件:


(1)xtrabackup_info:innobackupex工具執行時的相關信息,包括版本,備份選項,
備份時長,備份LSN(log sequence number日誌序列號),BINLOG的位置


(2)xtrabackup_checkpoints:備份類型(如完全或增量)、備份狀態(如是否已經爲
prepared狀態)和LSN範圍信息,每個InnoDB頁(通常爲16k大小)都會包含一個日誌序
列號LSN。LSN是整個數據庫系統的系統版本號,每個頁面相關的LSN能夠表明此頁面
最近是如何發生改變的


(3)xtrabackup_binlog_info:MySQL服務器當前正在使用的二進制日誌文件及至備份
這一刻爲止二進制日誌事件的位置,可利用實現基於binlog的恢復


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


(5)xtrabackup_logfile:備份生成的日誌文件

1完全備份還原

  • 1查看當前數據庫列表
root:~ # mysqlshow 
+--------------------+
|     Databases      |
+--------------------+
| hellodb            |
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
  • 2創建備份文件夾
root:~ # mkdir /xbackup
#備份時確保xbackup文件夾空
  • 3備份
root:~ # xtrabackup --backup --target-dir=/xbackup

......

190506 12:38:27 Executing UNLOCK TABLES
190506 12:38:27 All tables unlocked
190506 12:38:27 Backup created in directory '/xbackup/'
190506 12:38:27 [00] Writing /xbackup/backup-my.cnf
190506 12:38:27 [00]        ...done
190506 12:38:27 [00] Writing /xbackup/xtrabackup_info
190506 12:38:27 [00]        ...done
xtrabackup: Transaction log of lsn (1628321) to (1628321) was copied.
190506 12:38:27 completed OK!

percona-xtrabackup實現數據庫完全,增量的備份和還原(含一些版本問題與坑)

  • 二進制日誌位置
    percona-xtrabackup實現數據庫完全,增量的備份和還原(含一些版本問題與坑)
root:~ # mysql -e 'show master logs;'
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       245 |
+------------------+-----------+
  • 開始結束的lsn號
    percona-xtrabackup實現數據庫完全,增量的備份和還原(含一些版本問題與坑)
  • 版本信息
root:~ # cat /xbackup/xtrabackup_info 
uuid = c991e905-6fb9-11e9-83d3-000c29f89546
name = 
tool_name = xtrabackup
tool_command = --backup --target-dir=/xbackup
tool_version = 2.4.13
ibbackup_version = 2.4.13
server_version = 5.5.60-MariaDB
start_time = 2019-05-06 12:45:33
end_time = 2019-05-06 12:45:35
lock_time = 0
binlog_pos = filename 'mysql-bin.000001', position '245'
innodb_from_lsn = 0
innodb_to_lsn = 1628321
partial = N
incremental = N
format = file
compact = N
compressed = N
encrypted = N
  • 4還原

注意:還原時必須停止服務
在另一臺主機上

root:~ # systemctl stop  mariadb.service 
root:~ # rm -rf /var/lib/mysql/*            
  • 5把文件拷至目標主機
    root:~ # scp -rp /xbackup/ 192.168.64.141:/data/backup/
  • 6還原
    1)預準備:確保數據一致,提交完成的事務,回滾未完成的事務
    root:~ # xtrabackup --prepare --target-dir=/data/backup/xbackup

    percona-xtrabackup實現數據庫完全,增量的備份和還原(含一些版本問題與坑)

2)複製到數據庫目錄
注意:數據庫目錄必須爲空,MySQL服務不能啓動

 root:~ # xtrabackup --copy-back --target-dir=/data/backup/xbackup --datadir=/var/lib/mysql
  • 7改權限

percona-xtrabackup實現數據庫完全,增量的備份和還原(含一些版本問題與坑)

chown -R mysql:mysql /var/lib/mysql/

percona-xtrabackup實現數據庫完全,增量的備份和還原(含一些版本問題與坑)

  • 8啓動服務

一些高版本備份出現的問題

root:~ # xtrabackup --backup --target-dir=/data/backup/
xtrabackup: recognized server arguments: 
xtrabackup: recognized client arguments: --backup=1 --target-dir=/data/backup/ 
190506 12:07:38  version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup' (using password: NO).
190506 12:07:38  version_check Connected to MySQL server
190506 12:07:38  version_check Executing a version check against the server...
190506 12:07:38  version_check Done.
190506 12:07:38 Connecting to MySQL server host: localhost, user: not set, password: not set, port: not set, socket: not set
Using server version 10.4.4-MariaDB
xtrabackup version 2.4.13 based on MySQL server 5.7.19 Linux (x86_64) (revision id: 3e7ca7c)
xtrabackup: uses posix_fadvise().
xtrabackup: cd to /var/lib/mysql/
xtrabackup: open files limit requested 0, set to 1024
xtrabackup: using the following InnoDB configuration:
xtrabackup:   innodb_data_home_dir = .
xtrabackup:   innodb_data_file_path = ibdata1:12M:autoextend
xtrabackup:   innodb_log_group_home_dir = ./
xtrabackup:   innodb_log_files_in_group = 2
xtrabackup:   innodb_log_file_size = 50331648
InnoDB: Number of pools: 1
InnoDB: Unsupported redo log format. The redo log was created with MariaDB 10.4.4. Please follow the instructions at http://dev.mysql.com/doc/refman/5.7/en/upgrading-downgrading.html

2增量備份與完全備份組合

準備:

root:~ # mkdir /xbackup/{base,inc1,inc2}
root:~ # tree /xbackup/
/xbackup/
├── base  #完全備份
├── inc1  #第一次增量備份
└── inc2   #第二次增量備份

3 directories, 0 files

1完全備份

root:~ # xtrabackup --backup --target-dir=/xbackup/base

2第一次修改數據,添加兩條記錄

insert teachers (name,age)value('xiaoming',30);
insert teachers (name,age)value('xiaoqiang',40);

3第一次增量備份

root:~ # xtrabackup --backup --target-dir=/xbackup/inc1 --incremental-basedir=/xbackup/base

----------------------------
xtrabackup: Transaction log of lsn (1628972) to (1628972) was copied.
190506 13:34:40 completed OK!

4第二次修改數據,添加兩條記錄

insert teachers (name,age)value('xiaohong',20);
insert teachers (name,age)value('xiaowang',30);
MariaDB [hellodb]> select * from teachers;
+-----+---------------+-----+--------+
| TID | Name          | Age | Gender |
+-----+---------------+-----+--------+
|   1 | Song Jiang    |  45 | M      |
|   2 | Zhang Sanfeng |  94 | M      |
|   3 | Miejue Shitai |  77 | F      |
|   4 | Lin Chaoying  |  93 | F      |
|   5 | xiaoming      |  30 | NULL   |
|   6 | xiaoqiang     |  40 | NULL   |
|   7 | xiaohong      |  20 | NULL   |
|   8 | xiaowang      |  30 | NULL   |
+-----+---------------+-----+--------+

5第二次增量備份

root:~ # xtrabackup --backup --target-dir=/xbackup/inc2 --incremental-basedir=/xbackup/inc1

6拷貝文件

root:~ # scp -r /xbackup/* 192.168.64.141:/data/backup

7在目標主機整理文件

  • 關閉mariadb
    1)預準備完全備份,此選項--apply-log-only 阻止回滾未完成的事務
    root:~ # xtrabackup --prepare --apply-log-only --target-dir=/data/backup/base

    2)合併第1次增量備份到完全備份

    root:~ # xtrabackup --prepare --apply-log-only --target-dir=/data/backup/base --incremental-dir=/data/backup/inc1

    3)合併第2次增量備份到完全備份:最後一次還原不需要加選項--apply-log-only

root:~ # xtrabackup --prepare --target-dir=/data/backup/base --incremental-dir=/data/backup/inc2

4)將整理好的文件複製到mariadb目錄

root:~ # rm -rf /var/lib/mysql/* 
root:~ # xtrabackup --copy-back --target-dir=/data/backup/base --datadir=/var/lib/mysql

5)還原屬性:chown -R mysql:mysql /var/lib/mysql
6)啓動服務:systemctl start mariadb
percona-xtrabackup實現數據庫完全,增量的備份和還原(含一些版本問題與坑)

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