天天看點

使用Xtrabackup備份--适用于mysql8

下載下傳安裝​

​xtrabackup​

​  

官方下載下傳位址:https://www.percona.com/downloads/Percona-XtraBackup-LATEST/
官方安裝步驟:https://www.percona.com/doc/percona-xtrabackup/8.0/installation/yum_repo.html

rpm安裝:
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-8.0.4/binary/redhat/7/x86_64/percona-xtrabackup-80-8.0.4-1.el7.x86_64.rpm

yum localinstall percona-xtrabackup-80-8.0.4-1.el7.x86_64.rpm   #需要EPEL源

xtrabackup -version      

epel.repo

[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
baseurl=http://mirrors.aliyun.com/epel/7/$basearch
failovermethod=priority
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

[epel-debuginfo]
name=Extra Packages for Enterprise Linux 7 - $basearch - Debug
baseurl=http://mirrors.aliyun.com/epel/7/$basearch/debug
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=0

[epel-source]
name=Extra Packages for Enterprise Linux 7 - $basearch - Source
baseurl=http://mirrors.aliyun.com/epel/7/SRPMS
failovermethod=priority
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
gpgcheck=0      

​xtrabackup​

​介紹

XtraBackup(PXB) 工具是 Percona 公司用 perl 語言開發的一個用于 MySQL 資料庫實體熱備的備份工具,支援 MySQl(Oracle)、Percona Server 和 MariaDB,并且全部開源,真可謂是業界良心。阿裡的 RDS MySQL 實體備份就是基于這個工具做的。      
由于是采取實體拷貝的方式來做的備份,是以速度非常快,幾十G資料幾分鐘就搞定了,而它巧妙的利用了mysql 特性做到了線上熱備份,不用像以前做實體備份那樣必須關閉資料庫才行,直接線上就能完成整庫或者是部分庫的全量備份和增量備份。      
新版本的xtrabackup改成了cmake安裝,和以前有點不一樣。

版本說明:2.3.3之後不備份死鎖,如果資料庫是mysql 5.7之後的必須要裝2.4.4才可以用,當然了, 會向下相容的。

`Xtrabackup`是由`percona`提供的`mysql`資料庫備份工具,據官方介紹,這也是世界上惟一一款開源的能夠對innodb和xtradb資料庫進行熱備的工具。特點:

1. 備份過程快速、可靠;
2. 備份過程不會打斷正在執行的事務;
3. 能夠基于壓縮等功能節約磁盤空間和流量;
4. 自動實作備份檢驗;
5. 還原速度快;      
xtrabackup選項

選項

--apply-log-only 
prepare備份的時候隻執行redo階段,對增量備份非常重要
--backup
建立備份并且放入--target-dir目錄中
--close-files
不保持檔案打開狀态,xtrabackup打開表空間的時候通常不會關閉檔案句柄目的是為了正确處理DDL操作。然而,如果表空間數量非常巨大并且不适合任何限制,一旦檔案不在被通路的時候這個選項可以關閉檔案句柄.打開這個選項會産生不一緻的備份。自己評估風險。。
--compact
建立一份沒有輔助索引的緊湊備份
--compress
壓縮所有輸出資料,包括事務日志檔案和中繼資料檔案,通過指定的壓縮算法,目前唯一支援的算法是quicklz.結果檔案是qpress歸檔格式,每個xtrabackup建立的*.qp檔案都可以通過qpress程式提取或者解壓縮
--compress-chunk-size=#
壓縮線程工作buffer的位元組大小,預設是64K
--compress-threads=#
xtrabackup進行并行資料壓縮時的worker線程的數量,該選項預設值是1,并行壓縮('compress-threads')可以和并行檔案拷貝('parallel')一起使用。例如:'--parallel=4 --compress --compress-threads=2'會建立4個IO線程讀取資料并通過管道傳送給2個壓縮線程
--create-ib-logfile
這個選項目前還沒有實作,目前建立Innodb事務日志,你還是需要prepare兩次bakcup
--datadir=DIRECTORY
backup的源目錄,mysql執行個體的資料目錄。從my.cnf中讀取,或者指令行指定
--defaults-extra-file=[MY.CNF]
在global files檔案之後讀取,必須在指令行的第一選項位置指定
--defaults-file=[MY.CNF]
唯一從給定檔案讀取預設選項,必須是個真實檔案,必須在指令行第一個選項位置指定
--defaults-group=GROUP-NAME
從配置檔案讀取的組,innobakcupex多個執行個體部署時使用
--export
為導出的表建立必要的檔案
--extra-lsndir=DIRECTORY
(for --bakcup):在指定目錄建立一份xtrabakcup_checkpoints檔案的額外的備份
--incremental-basedir=DIRECTORY
建立一份增量備份時,這個目錄是增量别分的一份包含了full bakcup的Base資料集
--incremental-dir=DIRECTORY
prepare增量備份的時候,增量備份在DIRECTORY結合full backup建立出一份新的full backup
--incremental-force-scan
建立一份增量備份時,強制掃描所有增在備份中的資料頁即使完全改變的page bitmap資料可用
--incremetal-lsn=LSN
建立增量備份的時候指定lsn。
--innodb-log-arch-dir
指定包含歸檔日志的目錄。隻能和xtrabackup --prepare選項一起使用
--innodb-miscellaneous
從My.cnf檔案讀取的一組Innodb選項。以便xtrabackup以同樣的配置啟動内置的Innodb。通常不需要顯示指定
--log-copy-interval=#
這個選項指定了log拷貝線程check的時間間隔(預設1秒)
--log-stream
xtrabakcup不拷貝資料檔案,将事務日志内容重定向到标準輸出直到--suspend-at-end檔案被删除。這個選項自動開啟--suspend-at-end
--no-defaults
不從任何選項檔案中讀取任何預設選項,必須在指令行第一個選項
--databases=#
指定了需要備份的資料庫和表
--database-file=#
指定包含資料庫和表的檔案格式為databasename1.tablename1為一個元素,一個元素一行
--parallel=#
指定備份時拷貝多個資料檔案并發的程序數,預設值為1
--prepare
xtrabackup在一份通過--backup生成的備份執行還原操作,以便準備使用
--print-default
列印程式參數清單并退出,必須放在指令行首位
--print-param
使xtrabackup列印參數用來将資料檔案拷貝到datadir并還原它們
--rebuild_indexes
在apply事務日志之後重建innodb輔助索引,隻有和--prepare一起才生效
--rebuild_threads=#
在緊湊備份重建輔助索引的線程數,隻有和--prepare和rebuild-index一起才生效
--stats
xtrabakcup掃描指定資料檔案并列印出索引統計
--stream=name
将所有備份檔案以指定格式流向标準輸出,目前支援的格式有xbstream和tar
--suspend-at-end
使xtrabackup在--target-dir目錄中生成xtrabakcup_suspended檔案。在拷貝資料檔案之後xtrabackup不是退出而是繼續拷貝日志檔案并且等待知道xtrabakcup_suspended檔案被删除。這項可以使xtrabackup和其他程式協同工作
--tables=name
正規表達式比對database.tablename。備份比對的表
--tables-file=name
指定檔案,一個表名一行
--target-dir=DIRECTORY
指定backup的目的地,如果目錄不存在,xtrabakcup會建立。如果目錄存在且為空則成功。不會覆寫已存在的檔案
--throttle=#
指定每秒操作讀寫對的數量
--tmpdir=name
當使用--print-param指定的時候列印出正确的tmpdir參數,除此之外沒有任何用。。
--to-archived-lsn=LSN
指定prepare備份時apply事務日志的LSN,隻能和xtarbackup --prepare選項一起用
--user-memory = #
通過--prepare prepare備份時候配置設定多大記憶體,目的像innodb_buffer_pool_size。預設值100M如果你有足夠大的記憶體。1-2G是推薦值,支援各種機關(1MB,1M,1GB,1G)
--version
列印xtrabackup版本并退出      

全量備份

#全量備份
xtrabackup --user=使用者名 --password=資料庫密碼 --databases=資料庫名稱   --backup  --target-dir=備份檔案路徑

xtrabackup --defaults-file=/etc/my.cnf --user=root --password=x3npq4uo0ae8sb7i1dhm --backup --target-dir=/backup/base

chown -R mysql:mysql /backup/base

#恢複備份:在同版本資料庫中執行;恢複不用啟動MySQL
xtrabackup --user=root --password=資料庫密碼  --datadir=/usr/local/mysql8/data/  --copy-back --target-dir=/backup/base

xtrabackup --prepare --target-dir=/backup/base

xtrabackup --user=root --password=x3npq4uo0ae8sb7i1dhm  --datadir=/usr/local/mysql8/data/  --copy-back --target-dir=/backup/base

chown -R mysql.mysql /data
chown -R mysql.mysql /usr/local/mysql/      

  

執行個體示範

備份:

#全量備份
xtrabackup --defaults-file=/etc/my.cnf --user=root --password=x3npq4uo0ae8sb7i1dhm --backup --target-dir=/backup/base
    ... ...
    MySQL binlog position: filename 'mysql-bin.000009', position '155'
    210913 18:03:04 [00] Writing /backup/base/backup-my.cnf
    210913 18:03:04 [00]        ...done
    210913 18:03:04 [00] Writing /backup/base/xtrabackup_info
    210913 18:03:04 [00]        ...done
    xtrabackup: Transaction log of lsn (19198828) to (19198828) was copied.
    210913 18:03:04 completed OK!

#拷貝到備機
scp -P 10088 base.tgz 10.3.65.18:/backup/      

備機恢複:

#停mysql
     /etc/init.d/mysql stop

 #解壓備份
     tar -zxvf base.tgz 

 #恢複,先prepare復原未送出事務;需要對未送出的事務進行復原以及對送出的事務進行前滾
    xtrabackup --prepare --target-dir=/backup/base

#備份恢複,datadir目錄必須為空
xtrabackup --user=root --password=x3npq4uo0ae8sb7i1dhm  --datadir=/data/mysql_3306/  --copy-back --target-dir=/backup/base

    xtrabackup: recognized server arguments: --datadir=/data/mysql_3306 --open_files_limit=65535 --log_bin=mysql-bin --server-id=7001 --innodb_data_home_dir=/data/mysql_3306 --innodb_data_file_path=ibdata1:10M:autoextend --innodb_log_group_home_dir=/data/mysql_3306 --innodb_buffer_pool_size=4096M --innodb_log_file_size=1024M --innodb_log_buffer_size=8M --innodb_flush_log_at_trx_commit=1 --datadir=/data/mysql_3306/ 
    xtrabackup: recognized client arguments: --port=3306 --socket=/var/run/mysql/mysql_3306.sock --user=root --password=* --copy-back=1 --target-dir=/backup/base 
    xtrabackup version 8.0.25-17 based on MySQL server 8.0.25 Linux (x86_64) (revision id: d27028b)
    Original data directory /data/mysql_3306/ is not empty!
    原來要空的才行,但是我的資料目錄下面還有别的東西,資料庫重新初始化再來一遍吧

    210914 14:46:12 [01] Copying ./xtrabackup_info to /data/mysql_3306/xtrabackup_info
    210914 14:46:12 [01]        ...done
    210914 14:46:12 [01] Copying ./xtrabackup_binlog_pos_innodb to /data/mysql_3306/xtrabackup_binlog_pos_innodb
    210914 14:46:12 [01]        ...done
    210914 14:46:12 [01] Copying ./xtrabackup_master_key_id to /data/mysql_3306/xtrabackup_master_key_id
    210914 14:46:12 [01]        ...done
    210914 14:46:12 [01] Copying ./ibtmp1 to /data/mysql_3306/ibtmp1
    210914 14:46:13 [01]        ...done
    210914 14:46:13 [01] Creating directory ./#innodb_temp
    210914 14:46:13 [01] ...done.
    210914 14:46:13 completed OK!

#由于我是用root執行,是以屬主要重新調整
    chown -R mysql.mysql /data
    chown -R mysql.mysql /usr/local/mysql/

#啟動資料庫并進行驗證
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | TEST1              |
    | TEST2              |
    | TEST3              |
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    | testDB             |
    +--------------------+      

增量備份

#先進行全量備份
xtrabackup --defaults-file=/etc/my.cnf --user=root --password=x3npq4uo0ae8sb7i1dhm --backup --target-dir=/backup/base

#基于全量備份,做增量備份
xtrabackup --defaults-file=/etc/my.cnf --user=root --password=x3npq4uo0ae8sb7i1dhm --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/base

#第二次建立增量備份
xtrabackup --defaults-file=/etc/my.cnf --user=root --password=x3npq4uo0ae8sb7i1dhm --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1

#檢查增量備份
cat /backup/inc1/xtrabackup_checkpoints      

恢複備份

#停止資料庫
/etc/init.d/mysql stop

#清空現有資料
rm -rf /data/mysql_3306/*

#prepare完整備份,注意使用--apply-log-only選項,防止日志復原,最後一個增量備份不用此選項
xtrabackup --prepare --apply-log-only --target-dir=/backup/base
xtrabackup --prepare --apply-log-only --target-dir=/backup/base --incremental-dir=/backup/inc1
xtrabackup --prepare --target-dir=/backup/base --incremental-dir=/backup/inc2

#還原資料庫
xtrabackup --user=root --password=x3npq4uo0ae8sb7i1dhm  --datadir=/data/mysql_3306/  --copy-back --target-dir=/backup/base/

#還原屬主為mysql
chown -R mysql.mysql /data
#chown -R mysql.mysql /usr/local/mysql/

#啟動資料庫檢查
/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --plugin-dir=/usr/local/mysql/lib/plugin --open-files-limit=65535 --pid-file=/var/run/mysql/mysql_3306.pid --user=mysql

mysql -u root -h localhost -p      
#先進行全量備份,上面做了,這一步省略
xtrabackup --defaults-file=/etc/my.cnf --user=root --password=x3npq4uo0ae8sb7i1dhm --backup --target-dir=/backup/base

#插入一條資料,好進行判斷
mysql -u root -h localhost -p
Enter password: 
    MySQL [(none)]> use testDB;
    Database changed
    MySQL [testDB]> select * from t;
    +------+--------+
    | a    | b      |
    +------+--------+
    |    1 | 小王   |
    +------+--------+
    1 row in set (0.02 sec)
    MySQL [testDB]> insert into t(a,b) values (2, "小李");
    Query OK, 1 row affected (0.23 sec)

    MySQL [testDB]> select * from t;
    +------+--------+
    | a    | b      |
    +------+--------+
    |    1 | 小王   |
    |    2 | 小李   |
    +------+--------+
    2 rows in set (0.00 sec)

#基于全量備份,做增量備份
xtrabackup --defaults-file=/etc/my.cnf --user=root --password=x3npq4uo0ae8sb7i1dhm --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/base

    MySQL binlog position: filename 'mysql-bin.000011', position '155'
    210914 15:49:32 [00] Writing /backup/inc1/backup-my.cnf
    210914 15:49:32 [00]        ...done
    210914 15:49:32 [00] Writing /backup/inc1/xtrabackup_info
    210914 15:49:32 [00]        ...done
    xtrabackup: Transaction log of lsn (19228665) to (19228665) was copied.
    210914 15:49:33 completed OK!

#同上,在插入一條資料,繼續做增量備份
    MySQL [testDB]> insert into t(a,b) values (3,"小王八");
    Query OK, 1 row affected (0.12 sec)

    MySQL [testDB]> select * from t;
    +------+-----------+
    | a    | b         |
    +------+-----------+
    |    1 | 小王      |
    |    2 | 小李      |
    |    3 | 小王八    |
    +------+-----------+
    3 rows in set (0.00 sec)

#基于增量備份inc1,做增量備份
xtrabackup --defaults-file=/etc/my.cnf --user=root --password=x3npq4uo0ae8sb7i1dhm --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1
    MySQL binlog position: filename 'mysql-bin.000012', position '155'
    210914 15:55:42 [00] Writing /backup/inc2/backup-my.cnf
    210914 15:55:42 [00]        ...done
    210914 15:55:42 [00] Writing /backup/inc2/xtrabackup_info
    210914 15:55:42 [00]        ...done
    xtrabackup: Transaction log of lsn (19231721) to (19231721) was copied.
    210914 15:55:43 completed OK!

#檢查增量備份
cat /backup/inc1/xtrabackup_checkpoints 
    backup_type = incremental
    from_lsn = 19198828
    to_lsn = 19228665
    last_lsn = 19228665
    flushed_lsn = 19228665

#######恢複資料#######
#停止資料庫
/etc/init.d/mysql stop

#清空現有資料
rm -rf /data/mysql_3306/*

#prepare完整備份,注意使用--apply-log-only選項,防止日志復原,最後一個增量備份不用此選項
xtrabackup --prepare --apply-log-only --target-dir=/backup/base
    .......
    Starting shutdown...
    Log background threads are being closed...
    Shutdown completed; log sequence number 19198828
    Number of pools: 1
    210914 19:31:58 completed OK!

xtrabackup --prepare --apply-log-only --target-dir=/backup/base --incremental-dir=/backup/inc1
    ......
    210914 19:33:38 [00] Copying /backup/inc1/mysql-bin.index to ./mysql-bin.index
    210914 19:33:38 [00]        ...done
    210914 19:33:39 completed OK!


xtrabackup --prepare --target-dir=/backup/base --incremental-dir=/backup/inc2
    ......
    Trying to access missing tablespace 4294967294
    Starting shutdown...
    Log background threads are being closed...
    Shutdown completed; log sequence number 19231756
    210914 19:34:11 completed OK!


#還原資料庫
xtrabackup --user=root --password=x3npq4uo0ae8sb7i1dhm  --datadir=/data/mysql_3306/  --copy-back --target-dir=/backup/base/
    ......
    210914 19:35:05 [01] Creating directory ./#innodb_temp
    210914 19:35:05 [01] ...done.
    210914 19:35:05 completed OK!


#還原屬主為mysql
chown -R mysql.mysql /data
#chown -R mysql.mysql /usr/local/mysql/

#啟動資料庫檢查
/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --plugin-dir=/usr/local/mysql/lib/plugin --open-files-limit=65535 --pid-file=/var/run/mysql/mysql_3306.pid --user=mysql

mysql -u root -h localhost -p

    mysql> use testDB;
    Database changed
    mysql> select * from t;
    +------+-----------+
    | a    | b         |
    +------+-----------+
    |    1 | 小王      |
    |    2 | 小李      |
    |    3 | 小王八    |
    +------+-----------+
    3 rows in set (0.01 sec)