下載下傳安裝 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)