Xtrabackup 2.4.14使用指南

lhrbest發表於2019-07-09

Xtrabackup 2.4.14使用指南


The innobackupex program is a symlink to the xtrabackup C program. It lets you perform point-in-time backups of InnoDB / XtraDB tables together with the schema definitions, MyISAM tables, and other portions of the server. In previous versions innobackupex was implemented as a Perl script.

This manual section explains how to use innobackupex in detail.

Warning: The innobackupex program is deprecated. Please switch to xtrabackup .

yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL //安裝依賴包
yum install cmake gcc gcc-c++ libaio libaio-devel automake autoconf bzr bison libtool ncurses-devel zlib-devel libgcrypt-devel perl-ExtUtils-MakeMaker perl-DBD-MySQL.* perl-Time-HiRes  -y 
# yum線上安裝
yum install -y  
yum list | grep percona-xtrabackup
yum install -y  percona-xtrabackup-24
yum install -y  percona-xtrabackup
yum install -y  percona-xtrabackup-80
[root@LHRDB bin]# xtrabackup2414 --version
xtrabackup2414: error while loading shared libraries: libgcrypt.so.20: cannot open shared object file: No such file or directory
[root@LHRDB bin]# yum list installed|grep libgcrypt
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
libgcrypt.x86_64                      1.4.5-11.el6_4                    @anaconda-RedHatEnterpriseLinux-201311111358.x86_64/6.5
檢視伺服器上的libgcrypt版本,發現是xtrabackup版本下載錯誤,下載對應的libgcrypt的版本的包就可以了.
percona-xtrabackup-2.4.14-Linux-x86_64.libgcrypt145.tar.gz
RHEL6.5:
tar -xvf Percona-XtraBackup-2.2.10-re623acb-el6-x86_64-bundle.tar 
yum install  perl-DBD-MySQL
rpm -ivh percona-xtrabackup-2.2.10-1.el6.x86_64.rpm
注意:XtraBackup-2.2.10不支援MySQL5.7
RHEL6.5:
tar -zxvf percona-xtrabackup-2.4.14-Linux-x86_64.libgcrypt183.tar.gz
mv percona-xtrabackup-2.4.14-Linux-x86_64 /usr/local/percona-xtrabackup-2.4.14-Linux-x86_64
ln -s /usr/local/percona-xtrabackup-2.4.14-Linux-x86_64  /usr/local/xtrabackup-2.4.14
ln -s /usr/local/percona-xtrabackup-2.4.14-Linux-x86_64/bin/innobackupex  /usr/bin/innobackupex2414
ln -s /usr/local/percona-xtrabackup-2.4.14-Linux-x86_64/bin/xtrabackup  /usr/bin/xtrabackup2414
innobackupex --version
xtrabackup --version
innobackupex --help


備份:

建庫:
create database ceshi; 
建表:
create table ceshi.users (id int primary key auto_increment,name varchar(20) not null unique,password varchar(100) not null,address varchar(200)) ENGINE=MyISAM; 
添資料:
insert into ceshi.users (id,name,password,address) values (1,'zhang','1234',null),(2,'wang','4321','湖北武漢'), (3,'li','5678','北京海淀'); 
 
建庫:
create database ceshi2;
建表:
create table ceshi2.articles (id int primary key auto_increment,content longtext not null) ENGINE=InnoDB; 
添資料:
insert into ceshi2.articles (id,content) values (11,'hahahahahaha'),(12,'xixixixixix'),(13,'aiaiaiaia'),(14,'hohoahaoaooo'); 
---完全備份恢復
innobackupex2414 --defaults-file=/etc/my.cnf --host=192.168.59.159 --user=root --password=lhr  --socket=/var/lib/mysql57/mysql5719/mysql.sock --port=3306 --target-dir=/backup/mysql5719_3306/full/ --backup
innobackupex2414 --prepare --target-dir=/backup/mysql5719_3306/full/
innobackupex2414 --copy-back --target-dir=/backup/mysql5719_3306/full/ --datadir=/var/lib/mysql57/mysql5719/data
chown -R mysql:mysql /var/lib/mysql57/mysql5719/data
--- 增量備份恢復
insert into ceshi.users (id,name,password,address) values (4,'zhang','1234',null),(5,'wang','4321','湖北武漢'), (6,'li','5678','北京海淀'); 
insert into ceshi2.articles (id,content) values (21,'hahahahahaha'),(22,'xixixixixix'),(23,'aiaiaiaia'),(24,'hohoahaoaooo'); 
--一級增量
innobackupex2414 --backup --target-dir=/backup/mysql5719_3306/inc1 --incremental-basedir=/backup/mysql5719_3306/full/
innobackupex2414 --prepare --apply-log-only --target-dir=/backup/mysql5719_3306/full/
innobackupex2414 --prepare --apply-log-only --target-dir=/backup/mysql5719_3306/full/ --incremental-dir=/backup/mysql5719_3306/inc1
innobackupex2414 --copy-back --target-dir=/backup/mysql5719_3306/full/ --datadir=/var/lib/mysql57/mysql5719/data
chown -R mysql:mysql /var/lib/mysql57/mysql5719/data
--二級增量
innobackupex2414 --backup --target-dir=/backup/mysql5719_3306/inc1 --incremental-basedir=/backup/mysql5719_3306/full/
innobackupex2414 --backup --target-dir=/backup/mysql5719_3306/inc2 --incremental-basedir=/backup/mysql5719_3306/inc1
innobackupex2414 --prepare --apply-log-only --target-dir=/backup/mysql5719_3306/full/
innobackupex2414 --prepare --apply-log-only --target-dir=/backup/mysql5719_3306/full/ --incremental-dir=/backup/mysql5719_3306/inc1
innobackupex2414 --prepare --apply-log-only --target-dir=/backup/mysql5719_3306/full/ --incremental-dir=/backup/mysql5719_3306/inc2
innobackupex2414 --copy-back --target-dir=/backup/mysql5719_3306/full/ --datadir=/var/lib/mysql57/mysql5719/data
chown -R mysql:mysql /var/lib/mysql57/mysql5719/data


-- yum線上安裝

下載:






Percona Xtrabackup 2.4.1

編譯及軟體依賴

centos5,6 需要升級cmake至2.8.2版本以上,解決:安裝cmake版本3.4.3測試透過

centos5 gcc g++ 需要升級gcc至4.4以上上 ,解決:安裝4.4.7測試透過

另外xtrabackcup另外Boost版本需要1.59.0版本或以上,目前centos5,6預設是1.41.0。解決:升級至1.59.0

GTID支援情況

測試5.6,5.7開啟GTID下可以正常備份,還原

對MySQL5.5,MySQL5.6版本支援

5.6在開啟和關閉gtid模式下都可以正常備份還原

5.5可以正常備份還原

5.6部分表匯出還原測試正常

對現有版本結合新特性的建議

目前線上版本大部分在1.6.3和1.5版本。很多需求是透過第三方工具支援。結合2.4.1的新特性和release歷史和目前情況,建議幾點如下:

* xtrabackup支援非Innodb表備份,並且Innobackupex在下一版本中移除,建議透過xtrabackup替換innobackupex

* 流式備份透過--stream指定格式為xbtream而替代tar,支援streaming格式的並行備份和壓縮

* 之前指令碼使用第三方壓縮工具pbzip2進行壓縮。建議透過--compress 和--compress-threads選項進行並行壓縮

* 指定--safe-slave-backup,增加備份的一致性。(這個選項停止SQL執行緒並且等到show status中的slave_open_temp_tables為0的時候開始備份,如果沒有開啟臨時表,bakcup會立刻開始,否則SQL執行緒啟動或者關閉知道沒有開啟的臨時表。如果slave_open_temp_tables在--safe-slave-backup-timeount(預設300秒)秒之後不為0,從庫sql執行緒會在備份完成的時候重啟)

* 指定--rsync選項,加速備份過程 (為了加速備份過程,同時減小FLUSH TBALES WITH READ LOCAK阻塞寫的時間,當該選項指定時innobackupex使用rsync複製所有的非InnoDB檔案替換cp。尤其適用於有大量的庫和表的時候會更快。innobackup會呼叫rsync兩次。1、執行flush tables with read lock前後 ;2、減少讀鎖被持有的時間內。因為第一呼叫在重新整理讀鎖之前,所以它僅僅同步那些非事務的資料的變化)

* 針對緊湊備份和增量備份在雖然某些場景下非常有用,與劉偉商討過暫時繼續先不做計劃做到統一版本中去

release歷史

2.4.1 支援MySQL5.7(5.7.10)

2.3.2 命令列語法跟隨MySQL5.6的變化而變化。另外命令列支援--datadir

2.3.1 innobackupex指令碼用c重寫,並且只是xtrabackup的符號連線。innobackupex支援2.2版本所有的特性,但是目前已降級在下個Major版本中移除,innobackupex將不支援所有新特性的語法,同時xtrabackup現在支援MyISAM的複製並且支援innobakcupex的所有特性。innobackupex先前特性的語法xtrabackup同樣支援

2.2.21 支援5.6(基於5.6.24版本)

2.2.8 基於5.6.22 (解決當總redo log超過4G,prepare會失敗的問題)

2.2.6 透過show variables讀取Mysql選項。在初始化表掃描的時候輸出更詳細資訊

2.2.5 基於5.6.21

2.2.1 移除xtrabackup_56 xtrabakcup_55,只保留xtrabakcup.移除Build指令碼,支援cmake編譯。基於5.6.16

2.1.6 innobackupex --force-non-empty-directories

2.1.4 MySQL versions 5.1.70, 5.5.30, 5.6.11 

innobackupex --no-lock ,複製非Innodb資料時不停止複製執行緒,但是條件是備份期間非事務型表上不能有DDL或者DML操作

innobackupex --decrypt and innobackupex --decompress,

2.1.1 支援緊湊備份,加密備份。不在支援5.0內建Innodb和5.1內建Innoddb。移除--remote-host選項

2.1.0 支援mysql5.6的所有特性(GTID, 可移動表空間,獨立undo表空間,5.6樣式的buffer pool匯出檔案)

支援5.6引入的innodb buffer pool預載。buffer pool dumps可以生成或者匯入加速啟動。在備份時buffer pool dump複製到備份目錄,在還原階段複製回data目錄,

--log-copy-interval 可配置log複製執行緒檢查的間隔時間

如果開啟gtid,xtrabackup_binlog_info儲存gtid的值

支援xtrabackup --export,這個選項生成5.6樣式的後設資料檔案。可以透過alter table import tablespace匯入

2.0.5 --defaults-extra-file 存備份使用者的使用者名稱和密碼的配置檔案

2.0.3 支援--move-back

1.9.1 支援壓縮備份,之前能能streaming備份之後透過外部工具壓縮

支援streaming增量備份

LRU DUMP

1.6.4 innobackupex支援--rsync選項 在datadir目錄進行兩階段rsync(首先沒有寫鎖,之後有寫鎖,)減少寫鎖持有的時間

 

————————————————————————————————————————————————————————————————————————————————————————————————————

xtrabackup主要功能測試

innobackupex

建立本地Full Backup(建立,prepare,還原)

之後隱去--defaults-file=/data1/mysql5711/my5711.cnf.bakuse --no-timestamp --slave-info --socket=/tmp/mysql5711.sock --user=mysqlha --password=xxx 等選項

建立一份備份

innobackupex /data1/dbatemp/5711back

160321 10:56:00 innobackupex: Starting the  backup operation

 

IMPORTANT: Please  check that the  backup run completes successfully.

            At the  end  of a successful  backup run innobackupex

           prints  "completed OK!" .

 

160321   10 : 56 : 00   version_check Connecting  to MySQL  server  with DSN  'dbi:mysql:;mysql_read_default_group=xtrabackup;port=5711;mysql_socket=/tmp/mysql5711.sock'   as  'mysqlha'   ( using  password: YES).

160321   10 : 56 : 00   version_check Connected  to MySQL  server

160321   10 : 56 : 00   version_check Executing a  version  check against the  server...

160321   10 : 56 : 00   version_check Done.

160321   10 : 56 : 00  Connecting  to MySQL  server host: localhost,  user: mysqlha,  passwordset, port:  5711 , socket: /tmp/mysql5711.sock

Using  server  version  5.7.11 - log

/usr/ local/xtrabackup/ bin/innobackupex  version  2.4.1  based  on MySQL  server  5.7.10  Linux (x86_64) (revision  id: a2dc9d4)

xtrabackup: uses posix_fadvise().

xtrabackup: cd  to /data1/mysql5711

xtrabackup:  open files  limit requested  set  to  204800

xtrabackup:  using the  following  InnoDB configuration:

xtrabackup:   innodb_data_home_dir = .

xtrabackup:   innodb_data_file_path = ibdata1: 100 M: autoextend

xtrabackup:   innodb_log_group_home_dir = .

xtrabackup:   innodb_log_files_in_group =  3

xtrabackup:   innodb_log_file_size =  1363148800

xtrabackup:  using O_DIRECT

InnoDBNumber   of pools:  1

160321   10 : 56 : 01  >>  log scanned up  to ( 4151116 )

xtrabackup: Generating a  list  of tablespaces

InnoDB: Allocated  tablespace  ID  30   for slow_query_log/global_query_review_history,  old maximum was 

160321   10 : 56 : 01  [ 01 ] Copying ./ibdata1  to /data1/dbatemp/ 5711 back/ibdata1

160321   10 : 56 : 02  >>  log scanned up  to ( 4151116 )

160321   10 : 56 : 02  [ 01 ]        ...done

160321   10 : 56 : 02  [ 01 ] Copying ./slow_query_log/global_query_review_history.ibd  to/data1/dbatemp/ 5711 back/slow_query_log/global_query_review_history.ibd

160321   10 : 56 : 02  [ 01 ]        ...done

160321   10 : 56 : 02  [ 01 ] Copying ./slow_query_log/global_query_review.ibd  to /data1/dbatemp/ 5711 back/slow_query_log/global_query_review.ibd

160321   10 : 56 : 02  [ 01 ]        ...done

160321   10 : 56 : 02  [ 01 ] Copying ./abc/object_info.ibd  to /data1/dbatemp/ 5711 back/abc/object_info.ibd

160321   10 : 56 : 02  [ 01 ]        ...done

160321   10 : 56 : 02  [ 01 ] Copying ./mysql/time_zone_transition.ibd  to /data1/dbatemp/ 5711 back/mysql/time_zone_transition.ibd

160321   10 : 56 : 02  [ 01 ]        ...done

160321   10 : 56 : 02  [ 01 ] Copying ./mysql/time_zone_name.ibd  to /data1/dbatemp/ 5711 back/mysql/time_zone_name.ibd

160321   10 : 56 : 02  [ 01 ]        ...done

160321   10 : 56 : 02  [ 01 ] Copying ./mysql/slave_worker_info.ibd  to /data1/dbatemp/ 5711 back/mysql/slave_worker_info.ibd

160321   10 : 56 : 02  [ 01 ]        ...done

160321   10 : 56 : 03  >>  log scanned up  to ( 4151116 )

160321   10 : 56 : 03  Executing  FLUSH  NO_WRITE_TO_BINLOG  TABLES...

160321   10 : 56 : 03  Executing  FLUSH  TABLES  WITH  READ  LOCK...

160321   10 : 56 : 03   Starting  to  backup non- InnoDB  tables  and files

160321   10 : 56 : 03  [ 01 ] Copying ./slow_query_log/db.opt  to /data1/dbatemp/ 5711 back/slow_query_log/db.opt

160321   10 : 56 : 03  [ 01 ]        ...done

160321   10 : 56 : 03  [ 01 ] Copying ./slow_query_log/global_query_review_history.frm  to/data1/dbatemp/ 5711 back/slow_query_log/global_query_review_history.frm

160321   10 : 56 : 03  [ 01 ]        ...done

160321   10 : 56 : 04  [ 01 ] Copying ./mysql/proc.MYI  to /data1/dbatemp/ 5711 back/mysql/proc.MYI

160321   10 : 56 : 04  [ 01 ]        ...done

160321   10 : 56 : 04  >>  log scanned up  to ( 4151116 )

160321   10 : 56 : 04  [ 01 ] Copying ./mysql/time_zone_transition_type.frm  to /data1/dbatemp/ 5711 back/mysql/time_zone_transition_type.frm

160321   10 : 56 : 04  [ 01 ]        ...done

160321   10 : 56 : 04  [ 01 ] Copying ./mysql/func.MYD  to /data1/dbatemp/ 5711 back/mysql/func.MYD

160321   10 : 56 : 06  [ 01 ]        ...done

160321   10 : 56 : 06  >>  log scanned up  to ( 4151116 )

160321   10 : 56 : 06  [ 01 ] Copying ./ sys/schema_auto_increment_columns.frm  to /data1/dbatemp/ 5711 back/ sys/schema_auto_increment_columns.frm

160321   10 : 56 : 07  [ 01 ]        ...done

160321   10 : 56 : 07  >>  log scanned up  to ( 4151116 )

160321   10 : 56 : 07  [ 01 ] Copying ./ sys/sys_config_update_set_user.TRN  to /data1/dbatemp/ 5711 back/ sys/sys_config_update_set_user.TRN

160321   10 : 56 : 07  [ 01 ]        ...done

160321   10 : 56 : 07  Finished backing up non- InnoDB  tables  and files

160321   10 : 56 : 07  [ 00 ] Writing xtrabackup_slave_info

160321   10 : 56 : 07  [ 00 ]        ...done

160321   10 : 56 : 07  [ 00 ] Writing xtrabackup_binlog_info

160321   10 : 56 : 07  [ 00 ]        ...done

160321   10 : 56 : 07  Executing  FLUSH  NO_WRITE_TO_BINLOG  ENGINE  LOGS...

xtrabackup: The latest  check point ( for incremental):  '4151107'

xtrabackup: Stopping  log copying  thread.

.160321   10 : 56 : 07  >>  log scanned up  to ( 4151116 )

 

160321   10 : 56 : 07  Executing  UNLOCK  TABLES

160321   10 : 56 : 07  All  tables unlocked

160321   10 : 56 : 07  [ 00 ] Copying ib_buffer_pool  to /data1/dbatemp/ 5711 back/ib_buffer_pool

160321   10 : 56 : 07  [ 00 ]        ...done

160321   10 : 56 : 07   Backup created  in  directory  '/data1/dbatemp/5711back'

MySQL  binlog  position: filename  'mysql-bin.000002' position  '154'

MySQL  slave  binlog  positionmaster host  '10.75.22.67' , filename  'mysql-bin.000007' position  '154

160321 10:56:07 [00] Writing backup-my.cnf

160321 10:56:07 [00]        ...done

160321 10:56:07 [00] Writing xtrabackup_info

160321 10:56:07 [00]        ...done

xtrabackup: Transaction log of lsn (4151107) to (4151116) was copied.

160321 10:56:07 completed OK!

prepare

innobackupex --apply-log /data1/dbatemp/5711back

```

160321 11:04:16 innobackupex: Starting the apply-log operation

IMPORTANT: Please check that the apply-log run completes successfully.

At the end of a successful apply-log run innobackupex

prints “completed OK!”.

/usr/local/xtrabackup/bin/innobackupex version 2.4.1 based on MySQL server 5.7.10 Linux (x86_64) (revision id: a2dc9d4)

xtrabackup: cd to /data1/dbatemp/5711back

xtrabackup: This target seems to be not prepared yet.

InnoDB: Number of pools: 1

xtrabackup: xtrabackup_logfile detected: size=8388608, start_lsn=(4151107)

xtrabackup: using the following InnoDB configuration for recovery:

xtrabackup: innodb_data_home_dir = .

xtrabackup: innodb_data_file_path = ibdata1:100M:autoextend

xtrabackup: innodb_log_group_home_dir = .

xtrabackup: innodb_log_files_in_group = 1

xtrabackup: innodb_log_file_size = 8388608

xtrabackup: using the following InnoDB configuration for recovery:

xtrabackup: innodb_data_home_dir = .

xtrabackup: innodb_data_file_path = ibdata1:100M:autoextend

xtrabackup: innodb_log_group_home_dir = .

xtrabackup: innodb_log_files_in_group = 1

xtrabackup: innodb_log_file_size = 8388608

。。。。。

160321   12 : 21 : 48  [ 00 ] Copying  /data1/ dbatemp /2016-03-21_12-19-21//xtrabackup_info to ./ xtrabackup_info

160321   12 : 21 : 48  [ 00 ]        ...done

160321   12 : 21 : 48  completed OK!

 

[root@hebe211 dbatemp]# cat 2016-03-21_12-02-03/xtrabackup_checkpoints 

backup_type = log-applied

from_lsn = 0

to_lsn = 4151355

last_lsn = 4151364

compact = 0

recover_binlog_info = 0

[root@hebe211 dbatemp]# cat 2016-03-21_12-19-21/xtrabackup_checkpoints 

backup_type = incremental

from_lsn = 4151355

to_lsn = 4151355

last_lsn = 4151364

compact = 0

recover_binlog_info = 0

prepare(base+incremental) 可選

壓縮備份

innobackupex --compress --compress-threads=8 /data1/dbatemp/

生成QP檔案

解壓縮:

innobackupex --decompress /data1/dbatemp/2016-03-21_12-32-46/

需要安裝qpress

備份還原單表

建立單表的Backup

innobackupex --include='abc.weibo_asset_info' /data1/dbatemp/

prepare單表bakcup

innobackupex --apply-log --export /data1/dbatemp/2016-03-21_12-46-24/


xtrabackup: export metadata of table 'abc/weibo_asset_info' to file `./abc/weibo_asset_info.exp` (4 indexes)
xtrabackup: name=PRIMARY, id.low=68, page=3
xtrabackup: name=ip_in, id.low=69, page=4
xtrabackup: name=owner, id.low=70, page=5


-rw-r--r-- 1 root root 1309 Mar 21 12:49 weibo_asset_info.cfg
-rw-r----- 1 root root 16384 Mar 21 12:49 weibo_asset_info.exp
-rw-r----- 1 root root 8980 Mar 21 12:46 weibo_asset_info.frm
-rw-r----- 1 root root 589824 Mar 21 12:46 weibo_asset_info.ibd

還原單表

還原機上執行:

alter table weibo_asset_info discard tablespace;

將weibo_asset_info.exp和weibo_asset_ibd檔案傳到目標機目標目錄中

執行:

alter table weibo_asset_info import tablespace;

xtrabackup

fullbackup

建立full backup

xtrabackup --backup --target-dir=/data1/dbatemp/testx/

prepare backup

xtrabackup --prepare --target-dir=/data1/dbatemp/testx/

增量backup

建立一個full backup

xtrabackup --backup --target-dir=/data1/dbatemp/testa/

建立增量

xtrabackup --backup --target-dir=/data1/dbatemp/testa_incremental --incremental-basedir=/data1/dbatemp/testa

prepare base

xtrabackup --prepare --apply-log-only --target-dir=/data1/dbatemp/testa/

prepare incremental

xtrabackup --prepare --apply-log-only --target-dir=/data1/dbatemp/testa/ --incremental-dir=/data1/dbatemp/testa_incremental

prepare base+incremental

xtrabackup --prepare --target-dir=/data1/dbatemp/testa/

還原備份(需手動)

mkdir mysql5711

cd /data1/dbatemp/testa

rsync -rvt --exclude 'xtrabackup_checkpoints' --exclude 'xtrabackup_logfile' ./ /data1/mysql5711

cp my5711.cnf /data1/mysql5711

chown -R my5711:mysql mysql5711

建立基於GTID的SLAVE

建立全備

xtrabackup --backup --target-dir=/data1/dbatemp/testb/


MySQL binlog position: filename 'mysql-bin.000002', position '1099', GTID of the last change 'a34b5a32-e04e-11e5-a5bf-782b22675711:1'
MySQL slave binlog position: master host '10.75.22.67', purge list 'a34b5a32-e04e-11e5-a5bf-782b22675711:1'

prepare

xtrabackup --prepare --target-dir=/data1/dbatemp/testb/

restore,將backup移動到目標目錄或者伺服器

配置開啟gtid的slave

set global gtid_purged=“a34b5a32-e04e-11e5-a5bf-782b22675711:1”;

change master to master_host='10.75.22.67', master_user='replica', master_password='eHnNCaQE3ND',MASTER_PORT=5711,MASTER_AUTO_POSITION = 1;

 

 

 

 

 

 

 

————————————————————————————————————————————————————————————————————————————————————————————————————

 

xtrabackup2.4.1文件

  • innobackupex innobackupex只是xtrabackup的一個符號連結,innobackupex仍然支援像2.2版本一樣支援所有的特性及語法,在將來的版本中會被降級或者移除
  • xtrabackup 備份整個MySQL例項的MyISAM,InnoDB表,XtraDB表
  • xbcrpt 加密和解密備份檔案
  • xbstream 允許streaming和透過xbstream格式中提取檔案
  • xbcloud 從雲中上傳或者下載全部或者部分xbstream歸檔檔案
  • 2.3之後的版本推薦透過xtrabackup指令碼備份

Percona Xtrabackup Features

  • 熱備
  • 增量複製
  • 將壓縮後的備份stream到其他server
  • 線上的在mysql server例項之間移動表
  • 更輕易的搭建新的從庫
  • 備份不增加server的壓力

Innobackupex

  • 前提
    • 連線和許可權 連線server,databases user透過--user和--password選項,如果不指定,xtrabackup認為是系統使用者執行

$   innobackupex  -- user=DBUSER  -- password=SECRET   /path/to/backup/dir/

$   innobackupex  -- user=LUKE   -- password=US3TH3F0RC3  -- stream=tar   . /   |   bzip2  -

$   xtrabackup  -- user=DVADER  -- password=14MY0URF4TH3R  -- backup  -- target - dir=/data/bkps/

    • 其他連線選項
  • Option
  • Description
  • --port
  • 透過TCP/IP連線資料庫的埠號
  • --socket
  • 本地連線sockect
  • --host
  • 透過TCP/IP連線的資料庫的IP
  • 許可和許可權
    連線資料庫之後,需要server檔案系統層面datadir目錄的讀寫和執行許可權
    至於資料庫層面,需要如下許可權:
    1,RELOAD和LOCK TABLES許可權
    需要在複製檔案之前FLUSH TABLES WITH READLOCKS和FLUSH ENGINE LOGS。另外當開啟Backup Locks,執行LOCK TABLES FOR BACKUP和LOCK BINLOG FOR BACKUP需要這兩樣許可權
    2,REPLICATION CLIENT許可權 獲得binlog的點位
    3,CREATE TABLESPACE許可權 目的是為了匯入tables
    4,PROCESS許可權 show processlist
    5, SUPER許可權 複製環境下start slave 和stop slave
    6,CREATE許可權 目的是建立PERCONA_SECHEMA.xtrabackup_history資料庫和表
    7,INSERT許可權 在PERCONA_SCHEAM.xtrabackup_history表中增加歷史記錄
    8,SELECT許可權 使用innobackupex --incremental-history-name 或者innobackupex --incremental-history-uuid目的是為了查詢PERCONA_SCHEMA.xtrabackup表中innodb_tolsn的值
    建立一個能夠full backup最小許可權的資料庫使用者:
    mysql>  CREATE USER  'bkpuser' @ 'localhost'  IDENTIFIED  BY  's3cret' ;
  • mysql> GRANT RELOAD,LOCK TABLES,REPLICATION CLIENT  ON *.*  TO  'bkpuser' @ 'localhost' ;
  • mysql> FLUSH PRIVILEGES;

  • 全量備份生命週期-FULL Backups
    透過Innobackupex建立一個備份

innobackupex是一個透過xtrabackup結合了xbstream和xbcrypt等來備份一整個資料庫例項的工具

蔣健一個完整備份,除了連線資料庫的選項還只需要一個引數,備份儲存目錄的路徑

$ innobackupex --user=DBUSER --password=DBUSERPASS  /path/ to /BACKUP-DIR/

之後檢查確認資訊輸出的最後一行:

innobackupex: Backup created in directory ’/path/to/BACKUP-DIR/ 2013 - 03 - 25 _00- 00 - 09

innobackupex: MySQL binlog position: filename ’mysql-bin .000003 ’, position  1946

111225   00 : 00 : 53   innobackupex: completed OK!

備份會最終儲存在以時間戳命名的目錄內 

在底層,在後臺,innobackupex被稱作二進位制xtrabackup來備份Innodb所有表的資料並且複製所有的frm表定義檔案,資料,和MyISAM,MERGE,CSV表相關的檔案,觸發器,資料庫配置檔案到一個時間戳的目錄中去

其他需要考慮的選項

--no-timestamp:告訴innobackupex不要建立一個時間戳目錄來儲存備份

--defaults-file:可以提供innobackupex其他的資料庫配置檔案。唯一的限制就是必須放在第一個引數的位置

innobackupex  -- defaults - file=/tmp/other - my . cnf  -- user=XXX  -- password=XXX   /path/to/backup

PREPARE階段,用innobackupex prepare Full Backup

在建立了一個backup之後,資料還不能用於還原,因為有未提交的事務未完成或者事務日誌需要重放,做這些待定的操作需要資料檔案一致.這些都是prepare階段的目的,一旦這些完成,資料就可以用了

需要指定選項apply-log:

innobakupex --apply- log /path/to/BACKUP- DIR

如果成功了,innobackupex操作之後,資料是立刻可用的

在後臺,innobackupex透過讀取backup-my.cnf開始prepare程式,在之後,innobackupe重放已提交的事務並回滾未提交的事務,一旦這些操作完成,所有資訊在表空間中(innodb檔案),Log檔案被重建.這些說明了呼叫xtrabackup --prepare兩次。

注意這個preparation不適合增量備份,如果基於增量備份,將無法'add'增量部分

透過Innobackupex還原Full Backup

--copy-back選項,在server的datadir目錄執行一份備份的還原

innobakupex -- copy-back / path /to/BACKUP- DIR

--copy-back:做資料恢復時將備份資料檔案複製到MySQL伺服器的datadir 

會跟具體my.cnf檔案裡的配置,複製所有資料相關的檔案到datadir。

注意:

1.datadir目錄必須為空。除非指定innobackupex --force-non-empty-directorires選項指定,否則--copy-backup選項不會覆蓋

2.在restore之前,必須shutdown MySQL例項,你不能將一個執行中的例項restore到datadir目錄中

3.由於檔案屬性會被保留,大部分情況下你需要在啟動例項之前將檔案的屬主改為mysql,這些檔案將屬於建立備份的使用者

chown -R my5711:mysql /data1/dbrestore

以上需要在使用者呼叫Innobackupex之前完成

其他型別備份

透過Innobackupex進行增量備份

在每個備份之間並不是所有的資訊都有變化,增量備份的目的是減少需要的儲存容量和建立一份備份的時間

這些可以完成是因為每個InnoDB的頁都有一個LSN,這個LSN相當於一整個資料庫的版本號碼,每次資料庫更改,這個Number就會遞增

增量備份就是複製某一個指定LSN開始的所有page

一旦這些pages以他們各自的順序被放到一起,應用這些日誌將重新建立影響資料庫的程式,在建立backup時刻產生資料

透過innobakupex建立一份增量備份

首先,建立一份全量備份作為基礎用於之後的增量備份

innobackupex  /data1/ dbbackup 

將會在/data1/dbbackup目錄生成一個帶有時間戳的目錄,比如假裝置份是在上個月月底最後一天建立.BASEDIR是/data1/dbbackup/2016-02-29_23-01-18

可以透過innobackupex --no-timestamp選項覆蓋這種行為,備份將會被建立在指定的目錄中

如果檢查BASE-DIR目錄中的xtrabackup-checkpoints檔案,你能看到如下:

backup_type = full-backuped

from_lsn = 0

to_lsn = 1291135

第二天建立一份增量備份,透過--incremental選項並提供BASEDIR:

innobackupex  -- incremental   /data1/backups  -- incremental - basedir=BASEDIR

會在/data1/backups目錄裡生成另一份帶有時間戳的目錄,就是/data1/backups/2016-03-01_23-01-18,該目錄包含了增量備份,我們稱之為INCREMENTAL-DIR-1,如果檢查該目錄的xtrabackup-checkpoints檔案。會看到如下:

backup_type = incremental

from_len = 1291135

to_lsn = 1352113

類似的,第三天建立另一份增量備份。但是第二天的增量備份變成了BASEDIR

innobackupex --incremental / data / backups --incremental- basedir=INCRENMENTAL-DIR-1

結果生成/data1/backups/2016-03-02_23-01-18,用INCREMENTAL-DIR-2來表示:

backup_type = incremental

from_lsn = 1352113

to_lsn  = 1358967

像我們之前所說,增量備份只複製LSN大於一個指定值的pages,提供LSN會產生相同資料的目錄:

innobackupex  -- incremental   /data/backups  -- incremental - lsn=1291135

innobackupex  -- incremental   /data/bakcups  -- incremental - lsn=1358967

因為全備或上一個增備並不是總在系統中(如備份後傳輸到遠端),用這種方法做增量備份非常有用。這種過程只能影響XtraDB和InnoDB表,其他引擎的表如MyISAM.在做增量備份的過程中時候會複製全部。

透過innobakupex prepare一份增量備份

prepare增量備份與全量備份不同。這裡需要額外注意:

  • 首先只有提交過的事務需要在每份備份中個重放 (apply-log BASEDIR)
  • 這些將增量的部分合併到全量備份的base中去()
  • 然後,未提交的事務必須回滾,為了有一個隨時可用的備份

如果在基於base backup中重放提交事務回滾未提交事務,是不能add增量的。如果對於增量的這樣做,是不能add從那刻起的資料和其餘的增量。

--redo-only --apply-log:

強制備份日誌時只redo ,跳過rollback。這在做增量備份時非常必要

innobackupex --apply- log  -- redo- only BASE-DIR

然後,第一個增量Backup能apply給base backup:

innobackupex --apply- log --redo-only BASE- DIR --incremental- dir=INCRENMENTAL- DIR-1

 

如果沒有--incremental-dir被設定了,innobackupex會選擇在basedir裡最近建立的一個子目錄

此時,BASE-DIR包含了一直到第一次增量備份的資料,注意全備永遠都在base backup目錄裡

然後在第二個增量備份上重複這個過程:

innobackupex --apply- log BASE- DIR --incremental- dir=INCREMENTAL- DIR-2

如果出現'complete ok',最終的資料會都merge到base backup目錄中去(BASE-DIR)

注意:--redo-only用於merging所有的增量除了最後一個

你可以透過以上的過程給base增加更多的增量,只要按照備份的完成的時間順序依次即可。如果用錯誤的順序Merge增量,備份就完全無用了。如果對apply的順序有疑問,可以檢查每個目錄的xtrabackup_checkpoints檔案

一旦你對base backup目錄merge完所有的增量,接下來prepare,回滾未提交的事務:

innobackupex --apply- log BASE- DIR  (innobackupex回滾未提交的事務)

此時的backup可以立刻用於還原了,此步preparation是可選的,然和,如果你還原沒有這步,database server會開始rollback未提交的事務。如果發生crash時,database server會做同樣的工作。這會延遲db server的啟動時間,如果此步prepare則會避免

注意innobacupex不會建立iblog*這些檔案,如果想要建立,用xtrabackup -prepare作用於該目錄,否則,這些檔案在server啟動的時候被建立

透過innobackupex還原增量備份

preparing增量備份之後,base dir就是一個full backup,還原方式:

innobackupex -- copy-back BASE- DIR

透過xbstream和tar進行增量流式備份

使用xbstream streaming選項,備份可以被打包成自定義的xbstream格式,同樣需要一個Base backup

innobakcupex  / data/bakcups

本地備份:

innobackupex  -- incremental  -- incremental - lsn=LSN - number  -- stream=xbstream   . /  >  incremental . xbstream

解壓備份:

xbstream -x < incremental.xbstream

做一份本地備份並streaming到遠端伺服器然後解壓:

innobackupex  --incremental --incremental-lsn=LSN-number --stream=xbstream . / | /

ssh user@hostname  " cat - | xbstream -x -C > /backup-dir/"

--stream=[tar]

備 份檔案輸出格式, tar時使用tar4ibd , 該檔案可在XtarBackup binary檔案中獲得.如果備份時有指定--stream=tar, 則tar4ibd檔案所處目錄一定要在$PATH中(因為使用的是tar4ibd去壓縮, 在XtraBackup的binary包中可獲得該檔案)。

在 使用引數stream=tar備份的時候,你的xtrabackup_logfile可能會臨時放在/tmp目錄下,如果你備份的時候併發寫入較大的話 xtrabackup_logfile可能會很大(5G+),很可能會撐滿你的/tmp目錄,可以透過引數--tmpdir指定目錄來解決這個問題

部分備份

只備份部分的表或者db,前提是開啟innodb_file_per_table選項,每張表有獨立的表空間。你不能透過簡單地將prepared的部分備份使用--copy-back選項直接複製回資料目錄,而是要透過匯入表的方向來實現還原。當然,有些情況下,部分備份也可以直接透過--copy-back進行還原,但這種方式還原而來的資料多數會產生資料不一致的問題,因此,無論如何不推薦使用這種方式。

建立部分備份

有三種方法指定備份那部分資料

  • --include選項 使用正規表示式方式時,要求為其指定匹配要備份的表的完整名稱,即databasename.tablename

innobackupex --include= '^mydatabase[.]mytable'   /path/ to/backup

上面的指令只備份表名相匹配的資料。--include選項傳遞給xtrabackup --tables,對每個庫中的每個表逐一匹配,因此會建立所有的庫,不過是空的目錄。

  • --tables-file選項 此選項的引數需要是一個檔名,此檔案中每行包含一個要備份的表的完整名稱,格式為databasename.tablename。

echo  "mydatabase.mytable"  > /tmp/tables.txt

innobackupex --tables-file=/tmp/tables.txt /path/to/backup

該選項傳遞給xtrabackup --tables-file,與--table選項不同,只有要備份的表的庫才會被建立

  • --databases選項 此選項接受的引數為資料名,如果要指定多個資料庫,彼此間需要以空格隔開;同時,在指定某資料庫時,也可以只指定其中的某張表。此外,此選項也可以接受一個檔案為引數,檔案中每一行為一個要備份的物件

innobackupex --databases= "mydatabase.mytable mysql"   /path/ to/backup

該選項對innodb引擎表無效,還是會備份的

prepare部分備份

prepare部分備份的過程類似於匯出表的過程,要使用--export選項進行:

innobackupex --apply-log --export /path/to/partial/backup

此命令執行過程中,innobackupex會呼叫xtrabackup命令從資料字典中移除缺失的表,因此,會顯示出許多關於“表不存在”類的警告資訊。同時,也會顯示出為備份檔案中存在的表建立.exp檔案的相關資訊。

還原部分備份

還原部分備份的過程跟匯入表的過程相同。當然,也可以透過直接複製prepared狀態的備份直接至資料目錄中實現還原,不要此時要求資料目錄處於一致狀態。

壓縮備份

備份innodb表的時候可能會忽略輔助索引,會使備份更緊湊並且節約磁碟空間。缺點是輔助索引重建導致backup prepare的過程會需要更長的時間。備份大小區別取決於輔助索引大小的區別。。例如沒有加--compat選項的full backup.

注意:壓縮備份不支援系統表空間,,所以需要開啟innodb-file-per-table選項

建立壓縮備份

innobackupex --compact /data/backups

會在/data/backups目錄下建立個時間戳目錄

如果檢查BASE-DIR裡面的xtrabackup_checkpoints檔案,能看到如下:


backup_type = full-backuped
from_lsn = 0
to_lsn = 2888984349
last_lsn = 2888984349
compact = 1

沒有--compact選項compact的值為0,這種方法方便的檢查備份是否包含輔助索引

preparing壓縮備份

preparing壓縮備份需要重建索引,prepare backup需要--rebuild-index跟隨--apply-logs


innobackupex --apply-log --rebuild-indexes /data/backups/2016-03-14_10-29-48

命令輸出,除了標準innobackupex輸出,還包含了索引重建的資訊

還原壓縮備份

innnobackupex有一個--copy-back選項。作用是講一份backup還原到server的datadir目錄中去


innobackupex --copy-back /path/to/backup-dir

會將所有資料相關的所有檔案複製到datadir目錄,由my.cnf配置檔案定義

加密備份

2.1版本引入,加密或者解密本地備份或者由xbstream選項備份的流式備份,加密由libgcrypt庫實現

建立加密備份

加密需要指定以下選項(--encrypt-key和--encrypt-key-file只需指定其中之一即可)

  • --encryption=ALGORITHM 目前支援的演算法有ASE128,AES192,AES256
  • --encrypt-key=ENCRYPTION_KEY 使用合適長度加密key,因為會記錄到命令列,所以不推薦使用
  • --encrypt-key-file=KEYFILE 檔案必須是一個簡單二進位制或者文字檔案 加密key可透過以下命令列命令生成,生成的值可用於Key   openssl rand -base64 24 

--encrypt-key選項使用栗子:


innobackupex --encrypt=AES256 --encrypt-key="GCHFLrDFVx6UAsRb88uLVbAVWbK+Yzfs" /data/backups

最佳化加密過程

引入兩個新的選項加速加密過程,--encrypt-threads和--encrypt-chunk-size

--encrypt-threads選項並行加密,--encrypt-chunk-size指定每個加密執行緒buffer的大小(位元組,預設64K)

解密加密備份

可透過xbcrypt二進位制解密,以下一行解密所有目錄:


for i in ‘find . -iname "*\.xbcrypt"‘; do xbcrypt -d --encrypt-key-file=/root/secret_key --encrypt-

prepare加密備份

在備份解密之後,可以透過full backup一樣的方式透過--apply-logs prepare


innobackupex --apply-log /data/backups/2016-03-14_08-31-35/

注意,xtrabackup不會自動移除加密檔案,為了清理Backup目錄,需要使用者手動rm *.xbcrypt檔案

還原加密備份

--copy-back選項,透過複製檔案到datadir目錄還原備份


innobackupex --copy-back /path/to/BACKUP-DIR

高階特性

流式和壓縮備份

streaming模式,傳送backup以tar或者xbstream格式到標準輸出,取代複製檔案到backup目錄,這樣允許你使用其他程式過濾bakcup的輸出提供更靈活的備份,比如,透過管道將backup的輸出壓縮工具進行壓縮,流式備份其中的一項好處是是透過unix管道備份可以自動加密

使用streaming特性,需要使用--stream選項並提供stream的格式(tar或者stream),和在哪裡存臨時檔案


innobackpex --stream=tar /tmp

innobackup以--log-stream模式在子程式中啟動xtrabackup,並且重定向日誌到臨時檔案,之後使用xbstream以特殊的xbstream格式將所有資料檔案stream到標準輸出。

開啟壓縮時,xtrabakup以指定的壓縮演算法,壓縮所有資料,除了後設資料和非innodb檔案等不被壓縮檔案,目前演算法只支援quicklz。結果檔案為qpress歸檔檔案

使用xbstream作為stream選項,備份可以並行複製和壓縮,大大的加速了備份過程,以防止備份同時壓縮和加密。需要首先先解密之後再解壓縮

使用xbstream栗子

儲存完整備份到單一檔案


innobackupex --stream=xbstream /root/backup/ > /root/backup/backup.xbtream

stream並且壓縮這個備份:


innobackupex --stream=xbstream --compress /root/backup/ > /root/backup/backup.xbstream

解包到/root/backup/目錄:


xbstream -x < backup.xbstream -C /root/backup/

將壓縮backup傳送到其他host並解壓縮:

innobackupex --compress --stream=xbstream  /root/ backup / | ssh user@otherhost "xbstream -x -C / root/

使用tar的栗子

將完整的backup存到一個tar歸檔


innobackupex --stream=tar /root/backup/ > /root/backup/out.tar

將tar歸檔傳送到其他host


innobackupex --stream=tar ./ | ssh user@destination \ "cat - > /data/backups/backup.tar"

注意提取percona xtrabackup歸檔需要指定-i選項


tar -xizf backup.tar.gz

可指定喜歡的壓縮工具:


innobackupex --stream=tar ./ | gzip - > backup.tar.gz
innobackupex --stream=tar ./ | bzip2 - > backup.tar.bz2

需要注意的是,流式備份需要在還原之前Prepare,流模式不需要prepare

複製環境中備份

從庫備份需要指定以下選項:

  • --slave-info選項
    從庫備份,它會列印binlog的點位,還有主庫的名字,同樣會將這些資訊座位change master語句寫入xtrabckup_slave_info檔案
    使用場景,可以透過以此備份搭建一個建立這個主庫的從庫。
  • --safe-slave-backup
    為保證一致性複製狀態,這個選項停止SQL執行緒並且等到show status中的slave_open_temp_tables為0的時候開始備份,如果沒有開啟臨時表,bakcup會立刻開始,否則SQL執行緒啟動或者關閉知道沒有開啟的臨時表。如果slave_open_temp_tables在--safe-slave-backup-timeount(預設300秒)秒之後不為0,從庫sql執行緒會在備份完成的時候重啟
    強烈推薦

加速備份過程

  • 透過--parallel複製和-compress-threads加速 當進行本地備份或者透過xbstream選項流式備份時,可以透過--parallel選項多個檔案併發複製,這個選項指定xtrabackup建立生成的執行緒數來複製資料檔案 前提需要開啟innodb_file_per_table和共享表空間存在多個ibdata檔案中,此特性實施級別為檔案級別,在高碎片化的資料檔案做併發檔案轉換會增加IO負載,因為極大的隨機讀請求重疊,你可以考慮對檔案系統調優以獲得最大的效能 如果資料存到單一檔案中,這個選項沒有任何影響。使用方法: 本地:   innobackupex --parallel=4 /path/to/backup   如果使用xbstream在流式備份中可以透過--compress-threads選項加速壓縮過程。這個選項指定了由並行資料壓縮中xtrabackup建立的執行緒數,預設值為1 使用這個特性,只需加上該選項  innobackupex --stream=xbstream --compress --compress-threads=4 ./ > backup.xbstream 

在applying log之前,壓縮檔案需要被解壓縮

  • 透過--rsync選項加速

為了加速備份過程,同時減小FLUSH TBALES WITH READ LOCAK阻塞寫的時間,當該選項指定時,innobackupex使用rsync複製所有的非InnoDB檔案替換cp。尤其適用於有大量的庫和表的時候會更快。innobackup會呼叫rsync兩次。1、執行flush tables with read lock之前;2、減少讀鎖被持有的時間內。因為第一呼叫在重新整理讀鎖之前,所以它僅僅同步那些非事務的資料的變化

(它不能和--remote-host、--stream一起使用)

節流(Throttling)備份

雖然innobackupex不會阻塞任何資料庫的操作,但是備份這個過程會給系統增加Load,如果系統沒有更多的IO能力,那麼可以限制innoabckupex讀寫Innodb資料的頻率,透過--throttle選項控制

該選項直接傳給xtrabackup二進位制程式,並僅限制了innodb表的日誌和檔案操作的

iostat命令可以檢查系統上IO操作,

注意innobackup --throttle選項只在備份階段工作,innobackupex --apply-log and innobackupex --copy-back並不工作

--throttle選項很像mysqlbackup中的--sleep選項

還原單表

早於5.6b版本,是不可能在server中間複製檔案來複製表。然而透過Xtrabackup,你可以任何innodb資料庫中間匯出單個表,並且把它們匯入到MySQL5.6中(source不一定是MySQL5.6,但是destination必須是),並且只對獨立ibd檔案有效

匯出表

exporting不是在建立backup的時候,而是在prepare階段完成,一旦full backup建好,用--export選項prepare它


innobackupex --apply-log --export /path/to/backup

會為每個有獨立表空間的Innodb建立一個.exp擴充套件的檔案。

舉個例子:


find /data/backups/mysql/ -name export_test.*
/data/backups/mysql/test/export_test.exp
/data/backups/mysql/test/export_test.ibd
/data/backups/mysql/test/export_test.cfg

有三個檔案需要匯入線上5.6的表中

MySQL透過dump成一種特別格式的的Innodb字典的.cfg檔案,這種格式不同於.exp。嚴格來說,.cfg檔案不需要匯入mysql5.6表空間。表空間即使從不同的server上也會匯入成功。如果相關的.cfg檔案在同樣的目錄中,innodb會做schema驗證

每個.exp(或者.cfg)用來匯入表

注意:innodb 慢停例項(full purge+change buffer merge)透過on --export,否則表空間會不一致並且不會被匯入。所有常見的效能問題會被考慮:足夠的buffer pool(例如--use-memory,預設100M)和足夠的儲存,否則將會耗費很久完成匯出

匯入表

將一張表匯入到其他伺服器上,首先以同樣的表結構建立一張新表用於匯入:


OTHERSERVER|mysql> CREATE TABLE mytable (...) ENGINE=InnoDB;

然後丟棄表空間:


OTHERSERVER|mysql> ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;

然後,複製mytable.ibd和mytable.exp(如果匯入到5.6則是mytable.cfg)到資料庫家目錄,然後匯入表空間:


OTHERSERVER|mysql> ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;

一旦執行完成。匯入表的書庫是立刻可用的

基於時間點恢復

透過innobackupex和二進位制日誌可恢復指定時間點的資料

注意二進位制日誌包含從過去的一個時間點開始資料庫的改變操作,你需要一個full datadir作為base,然後可以從二進位制日誌中apply一系列的操作使資料匹配你想要的那個時間點的操作

做一份snapshot,我們可以透過innobackupex做一份全備full backup


innobackupex /path/to/backup --no-timestamp

出於方便使用--no-timestamp選項。之後我們開始prepare,為了之後做好還原的準備


innobackupex --apply-log /path/to/bakcup

現在,假設過去了一段時間,你希望還原資料庫到過去的某個特定點,想下製作快照時點的限制

想要找出二進位制日誌情況,執行show binary logs和show master status

然後找出快照生成時候的pos點。找到backup目錄下的xtrabackup_binlog_info


cat /path/to/backup/xtrabackup_binlog_info
mysql-bin.000003 57

這會告訴備份的時間點的binlog日誌及Pos點,這個pos點在還原備份時候非常有效


innobackupex --copy-back /path/to/backup

下一步就是從二進位制日誌中用mysqlbinlog從快照的pos點開始提前查詢語句並重定向到一個檔案中


mysqlbinlog /path/to/datadir/mysql-bin.000003 /path/to/datadir/mysql-bin.000004 --start-position=57 > mybinlog.sql

注意如果有多個binlog,需要列出所有

時刻觀察來決定哪個POS點或者時間點是你要還原的那個點。一旦決定好了。管道傳向server,假設時間點是11-12-25 01:00:00:


mysqlbinlog /path/to/datadir/mysql-bin.000003 /path/to/datadir/mysql-bin.000004 \
--start-position=57 --stop-datetime="11-12-25 01:00:00" | mysql -u root -p

提升FLUSH TABLES WITH READ LOCKING handling

備份時,FLUSH TABLES WITH READ LOCK會在備份非innodb檔案之前使用來保證備份的一致性,FLUSH TABLES WITH READ LOCK甚至有查詢執行了幾個小時的時候仍可以執行,這種情況下,任何都會鎖在Waiting for table flush or Waiting for master to send event這兩種狀態下,kill掉也不解決任何問題。只有kill掉導致FLUSH鎖住的慢查才能讓server重新正常執行。這就意味著如果長時間執行的查詢時,FLUSH TABLES WITH READ LOCK會被卡住,

注意,上述情況在backup locks是無效的,Percona Server 5.6+中特性,XtraBackup會自動複製非Innodb資料避免阻塞修改InnoDB表的DML查詢

兩件事可以避免上述問題:

innobackupex 等待好時機

innobackupex 可以Kill阻止獲得全域性鎖的查詢(所有或者僅select查詢)

等待查詢完成

獲取全域性鎖的好時機是指所有長查詢都執行完畢,為防止innobackupex等待執行LUSH太長時間。新選項被引入:

innobakcupex --ftwrl-wait-timeout選項,限制等待時間,一旦超時就會報錯退出。預設值為0,關閉此特性

另一個是設定等待查詢的型別,innobackupex --ftwrl-sait-query-type,可選址為all和update,設定為all時,innobackupex會在執行FLUSH TABLES WITH READ LOCK之前等待所有長時查詢完成(執行時間超過innobackupex--ftwrl-wait-threshold),當值為update時會等待UPDATE/ALTER/REPLACE/INSERT查詢完成

--lock-wait-threshold用來定義 --locl-wait-query-type中的長執行查詢,如果超過--lock-wait-threshold都算長執行查詢。

kill掉阻塞查詢

可以透過指定--kill-long-queries-timeout用來指定執行FLUSH TABLES WITH READ LOCK後還可以執行的時間,0為不kill,--kill-long-query-type用來指定超時之後,kill的查詢型別,可以是all或者select


innobackupex --lock-wait-threshold=40 --lock-wait-query-type=all --lock-wait-timeout=180 --kill-long-queries-timeout=20 --kill-long-query-type=all /data/backups/

innobacupex花費不超過3分鐘時間等待超過40秒的查詢完成,FLUSH之後,innobackupex會等待20秒時間獲取全域性鎖,如果超過20秒仍然沒有獲得,會kill所有的執行時間超過FLUSH命令的查詢

innobackupex是如何工作的

2.3起innobackupex用c重寫並且作為xtrabackup的符號連線,innobackupex支援2.2版本的所有特性和語法。但是現在已降級並且在下一個major版本中將被移除,。新的特性語法將加在xtrabakup中,而不是innobackupex中

making a backup

如果沒有模式指定,innobakucpex預設為backup模式

預設的,innobackupex透過--suspend-at-end選項啟動xtrabackup,並且讓它複製innodb資料檔案,當xtrabackup完成,innobackupex看著它建立xtarbackup_suspended_2檔案並且執行FLUSH TABLES WITH READ LOCK.

innoabackupex之後檢查MySQL變數來決定server支援哪些特性,特別是backup locks,change page bitmaps,GTID mode等等,如果一切順利,二進位制作為一個子程式啟動

innobackupex在設定--safe-slave-backup選項後等待同步,並且flush所有表with read lock.阻止所有myisam表寫入(除非指定--mo-lock)。

一旦完成,開始備份所有非Innodb檔案,.frm,.MRG,.MYD,.MYI,.CSV,.OPT檔案等等

當所有檔案備份後,執行ibbackup並且等待直到完成備份完成複製事務完成。之後,表被解鎖,開啟同步(如果指定--safe-slave-backup)並且與server的連線關閉。之後,移除xtrabackup_suspended_2檔案並允許xtrabackup退出

同時在備份的目錄建立如下檔案:

xtrabackcup_checkpoints 包含備份型別和LSN

xtrabackcup_binlog_info 包含開啟備份時刻的binlog和POS

xtrabackcup_binlog_pos_innodb 包含開始備份InnoDB事務相關的binlog的POS

xtrabackup_slave_info 包含master的binlog和POS(需指定--slave-info)

backup-my.cnf 備份需要的my.cnf中的選項

xtrabackup_binary 包含backup需要的二進位制檔案

mysql-stderr

mysql-stdout

最終binlog pos列印在標準錯誤輸出並且Innobackupex退出碼為0退出

透過備份還原

還原備份透過--copy-back選項

innobackupex讀取my.cnf中的變數並檢查相關目錄是否存在

之後複製MyISAM表,索引等等。首先是innodb表其次索引,最後是log檔案。複製時保留檔案屬性。

作為替換,--move-back選項用來還原備份。這個選項與--copy-back相似。唯一的區別是它不複製檔案,而是移動檔案到目的地。這個選項移除backup檔案,用時候必須小心。使用場景:沒有足夠的磁碟空間同事保留資料檔案和Backup副本

innobackupex 命令列選項

選項

  • --apply-log 
    透過apply名叫xtrabackup_logfile的事務日誌來在BACKUP-DIR目錄中Prepare一個backup,同樣,建立新的事務日誌。innodb配置從生成bakcup過程中innobakcupex建立的backup-my.cnf檔案讀取,innobackupex --apply-log 預設使用bakcup-my.cnf中的innodb配置.這裡說的Innodb配置指的是影響資料格式的系統變數,例如:innodb_page_size,innodb_log_block_size等等,本地相關變數例如innodb_log_group_home_dir或者innodb_data_file_path.
    一般情況下,在備份完成後,資料尚且不能用於恢復操作,因為備份的資料中可能會包含尚未提交的事務或已經提交但尚未同步至資料檔案中的事務。因此,此時資料檔案仍處理不一致狀態。“準備”的主要作用正是透過回滾未提交的事務及同步已經提交的事務至資料檔案也使得資料檔案處於一致性狀態。
    對xtrabackup的--prepare引數的封裝
  • --backup-locks
    僅支援percona server5.6,如果server不支援,開啟不讀私人和產生影響
  • --close-files
    2.2.5引入的新特性
    關閉不再訪問的檔案控制程式碼,這個選項直接傳遞給xtrabackup,當xtrabackup開啟表空間通常並不關閉檔案控制程式碼目的是正確的處理DDL操作。如果表空間數量巨大,這是一種可以關閉不再訪問的檔案控制程式碼的方法。使用該選項有風險,會有產生不一致備份的可能
  • --compact
    建立一份沒有輔助索引的緊湊的備份,該選項直接傳遞給xtrabackup
  • --compress
    該選項指導xtrabackup壓縮innodb資料檔案的backup的複製,直接傳遞給xtrabackup的子程式
  • --compress-threads = #
    該選項指定並行壓縮的worker執行緒的數量,直接傳遞給xtrabackup的子程式
  • --compress-chunk-size = #
    這個選項指定每個壓縮執行緒的內部worker buffer的大小。單位是位元組,預設是64K。直接傳遞給xtrabackup子程式
  • --copy-back
    執行還原操作,從備份目錄中最近的一份備份中複製所有檔案到datadir,innobackupex --copy-back選項除非指定innobackupex --force-non-empty-directories選項,否則不會複製覆蓋所有的檔案
  • --databases=LIST
    指定innoabckupex備份的DB列表,該選項接受一個一個字串引數或者包含DB列表的檔案的全路徑。如果沒有指定該選項,所有包含innodb和myam表的DB會被備份,請確認--databases包含所有的innodb資料庫和表,,以便所有的innodb.frm檔案也同樣備份,如果列表非常長的話。可以以檔案代替
  • --decompress
    解壓所有值錢透過--compress選項壓縮成的.qp檔案。innodbakcupex --parallel選項允許多個檔案同時解壓。為了解壓,qpress工具必須有安裝並且訪問這個檔案的許可權。這個程式將在同一個位置移除原來的壓縮/加密檔案
  • --decrypt=ENCRYPTION-ALGORITHM
    解密所有之前透過--encrypt選項加密的.xbcrypt檔案。--innobackup --parallel選項允許同時多個檔案解密
  • --defaults-file=[MY.CNF]
    該選項指定了從哪個檔案讀取MySQL配置,必須放在命令列第一個選項的位置
  • --defaults-extra-file=[MY.CNF]
    指定了在標準defaults-file之前從哪個額外的檔案讀取MySQL配置,必須在命令列的第一個選項的位置
  • --default-group=GROUP-NAME
    這個選項接受了一個字串引數指定讀取配置檔案的group,在一機多例項的時候需要指定
  • --encrypt=ENCRYPTION_ALGORITHM
    該選項指定了xtrabackup透過ENCRYPTION_ALGORITHM的演算法加密innodb資料檔案的備份複製,該選項直接傳遞給xtrabackup子程式
  • --encrypt-key=ENCRYPTION_KEY
    指導xtrabackup使用了--encrypt選項時候使用ENCRYPTION_KEY這個KEY,直接傳遞給xtrabackup子程式
  • --encrypt-key-file=ENCRYPTION_KEY_FILE
    這個選項告訴xtrabackup使用--encrypt的時候。Key存在了ENCRYPTION_KEY_FILE這個檔案中
  • --encrypt-chunk-size=#
    這個選項指定了每個加密執行緒內部worker buffer的大小,單位位元組,直接傳遞給xtrabackup子程式
  • --export=DIRECTORY
    這個選項直接傳遞給 xtrabackup --export選項。開啟可匯出單獨的表之後再匯入其他Mysql中
  • --extra-lsndir=DIRECTORY
    這個選項接受一個字串引數指定儲存額外一份xtrabackup_checkpoints檔案的目錄,直接傳遞給xtrabackup --extra-lsndir選項
  • --force-non-empty-directories
    指定該引數時候,使得innobackupex --copy-back或innobackupex --move-back選項轉移檔案到非空目錄,已存在的檔案不會被覆蓋,如果--copy-back和--move-back檔案需要從備份目錄複製一個在datadir已經存在的檔案,會報錯失敗
  • --galera-info
    該選項生成了包含建立備份時候本地節點狀態的檔案xtrabackup_galera_info檔案,該選項只適用於備份PXC。
  • --history=NAME
    percona server5.6的備份歷史記錄在percona_schema.xtrabackup_history表
  • --host=HOST
    選項指定了TCP/IP連線的資料庫例項IP
  • --ibbackup=IBBACKUP-BINARY
    這個選項指定了使用哪個xtrabackup二進位制程式。IBBACKUP-BINARY是執行percona xtrabackup的命令,。這個選項適用於xtrbackup二進位制不在你是搜尋和工作目錄,如果指定了該選項,innoabackupex自動決定用的二進位制程式
  • --include=REGEXP
    正規表示式匹配表的名字[db.tb],直接傳遞給xtrabackup --tables選項。
  • --incremental
    這個選項告訴xtrabackup建立一個增量備份,直接傳遞給xtrabakcup子程式,當這個選項指定,需要同時指定--incremental-lisn或者--incremental-basedir。如果沒有指定,預設傳給xtrabackup --incremental-basedir,值為Backup BASE目錄中的第一個時間戳目錄
  • --incremental-basedir=DIRECTORY
    這個選項接受了一個字串引數指定含有full backup的目錄為增量備份的base目錄,與--incremental同時使用
  • --incremental-dir=DIRECTORY
    指定了增量備份的目錄,結合full backup生成生成一份新的full bakcup
  • --incremettal-history-name=NAME
    這個選項指定了儲存在PERCONA_SCHEMA.xtrabackup_history基於增量備份的歷史記錄的名字。Percona Xtrabackup搜尋歷史表查詢最近(innodb_to_lsn)成功備份並且將to_lsn值作為增量備份啟動出事lsn.與innobackupex--incremental-history-uuid互斥。如果沒有檢測到有效的lsn,xtrabackup會返回error
  • --incremetal-history-uuid=UUID
    這個選項指定了儲存在percona_schema.xtrabackup_history基於增量備份的特定歷史記錄的UUID
  • --incremental-lsn=LSN
    這個選項指定增量備份的LSN,與--incremental選項一起使用
  • --kill-long-queries-timeout=SECONDS
    這個選項指定innobackupex從開始執行FLUSH TABLES WITH READ LOCK到kill掉阻塞它的這些查詢之間等待的秒數,預設值為0.以為著Innobakcupex不會kill任何查詢,使用這個選項xtrabackup需要有Process和super許可權。
  • --kill-long-query-type=all|select
    指定kill的型別,預設是all
  • --ftwrl-wait-timeout=SECONDS
    執行FLUSH TABLES WITH READ LOCK之前,innobackupex等待阻塞查詢執行完成等待秒數,超時的時候如果查詢仍然沒有執行完,innobackupex會終止並報錯,預設為0,innobakcupex不等待查詢完成立刻FLUSH
  • --ftwrl-wait-threshold=SECONDS
    指定innoabckupex檢測到長查詢和 innobackupex --ftwrl-wait-timeount不為0,這個長查詢可以執行的閾值,
  • --ftwrl-wait-query-type=all|update
    指定innobakcupex獲得全域性鎖之前允許那種查詢完成,預設是ALL
  • --log-copy-interval=#
    這個選項指定了每次複製log執行緒完成檢查之間的間隔(毫秒)
  • --move-back
    從備份目錄中將最近一份備份中的所有檔案移動到datadir目錄中
  • --no-lock
    關閉FTWRL的表鎖,只有在你所有表都是Innodb表並且你不關心backup的binlog pos點
    如果有任何DDL語句正在執行或者非InnoDB正在更新時(包括mysql庫下的表),都不應該使用這個選項,後果是導致備份資料不一致
    如果考慮備份因為獲得鎖失敗,,可以考慮--safe-slave-backup立刻停止複製執行緒
  • --no-timestamp
    這個選項阻止在BACKUP-ROOT-DIR裡建立一個時間戳子目錄,指定了該選項的話,備份在BACKUP-ROOT-DIR完成
  • --no-version-check
    這個選項禁用由--version-check開啟的version check
  • --parallel=NUMBER-OF-THREADS
    指定xtrabackup並行複製的子程式數。注意是檔案級別並行,如果有多個ibd檔案,他們會並行複製,如果所有的表存在一個表空間檔案中,沒有任何作用。。直接傳遞給xtrabakcup --parallel選項
  • --password=PASSWORD
  • --port=PORT
  • --rebuild-indexes
    與--apply-log一起用時候才有效。並且直接傳遞給xtrabackup,在apply log之後重建所有輔助索引,該選項用於Prepare緊湊備份。
  • --rebuild-threads=NUMBER-OF-THREADS
    與--apply-log和--rebuild-index選項一起用時候才生效,重建索引的時候,xtrabacup以指定的執行緒數並行的處理表空間檔案
  • --redo-only
    這個選項在prepare base full backup,往其中merge增量備份(但不包括最後一個)時候使用。傳遞給xtrabackup --apply-log-only的選項。這個強制xtrabackup跳過rollback並且只重做redo
  • --rsync 
    透過rsync工具最佳化本地傳輸,當指定這個選項,innobackupex使用rsync複製非Innodb檔案而替換cp,當有很多DB和表的時候會快很多。不能--stream一起使用
  • --safe-slave-backup
    指定的時候innobackupex會在執行FLUSH TABLES WITH READ LOCK停止sql執行緒,並且直到show status裡slave_open_temp_tables的值為0的時候start backup,。如果沒有開啟的臨時表,就開始備份,否則sql執行緒start或者stop直到沒有開啟的臨時表,如果在innobackupex --safe-slave-backup-timeout之後slave_open_temp_tables的值仍沒有變成0備份就會失敗。SQL執行緒會在backup完成之後重啟。
  • --safe-slave-backup-timeout=SECONDS
    innobackupex --safe-slave-backup應該等多少秒等slave_open_temp_tables變成0,預設是300秒
  • --scpopt=SCP-OPTIONS
    當--remost-host指定的時候,指定傳給scp的命令列選項。如果沒有指定,預設為-Cp -c arcfour
  • --slave-info
    對slave進行備份的時候使用,列印出master的名字和binlog pos,同樣將這些資訊以change master的命令寫入xtrabackup_slave_info檔案。可以透過基於這份備份啟動一個從庫並且儲存在xtrabackup_slave_info檔案中的binlog pos點建立一個新的從庫
  • --socket
    連線本地例項的時候使用
  • --sshopt=SSH-OPTIONS
    在指定了--remost-host的時候,指定傳給ssh的命令列選項
  • --stream=STREAMNAME
    流式備份的格式,backup完成之後以指定格式到STDOUT,目前只支援tar和xbstream。使用xbstream為percona xtrabakcup髮型版本,如果在這個選項之後指定了路徑。會理解值為tmpdir
  • --tables-file=FILE
    指定含有表列表的檔案,格式為database.table,該選項直接傳給xtrabackup's --tables-file
  • --throttle=IOS
    指定每秒IO操作的次數,直接傳遞給xtrabackup --throttle選項。只作用於bakcup階段有效。apply-log和--copy-back不生效不要一起用
  • --tmpdir=DIRECTORY
    指定--stream的時候,指定臨時檔案存在哪裡,在streaming和複製到遠端server之前,事務日誌首先存在臨時檔案裡。
  • --use-memory=#
    只能和--apply-log選項一起使用,prepare a backup的時候,xtrabackup做crash recovery分配的記憶體大小,單位位元組。也可(1MB,1M,1G,1GB),直接傳給xtrabackup --use-memory選項
  • --version
    顯示Innobackupex版本和版權資訊後退出
  • --version-check
    innobackupex在與server建立連線之後的備份階段進行版本檢查

Xtrabackup 二進位制

get started

配置xtrabackup

xtrabackup讀取配置檔案中的[mysqld]和[xtrabackup]部分,讀取datardir和innodb選項,可以透過將這些都指定在[xtrabackup]部分。越靠後,越優先。

最簡單的在[xtrabackup]部分只指定target_dir,該選項指定backup預設放的目錄,例如:

[xtrabackup]

target_dir = /data/backups/mysql

Xtrabackup-FULL BAKCUPS

建立一個備份

執行xtrabackup指定--backup ,--target_dir,--datadir.

如果不指定target_dir,xtrabacup會建立它。如果目錄存在且為空,xtrabackup會成功,xtrabackup不會覆蓋已有檔案。會報“file exist”的錯誤

這個工具將工作目錄轉換到datadir,並且執行兩項主要的任務:(後臺執行的log掃描執行緒掃描redo log,ibdata1上的檔案複製執行緒)

  • 後臺啟動一個複製日誌的執行緒,這個執行緒關注innodb日誌檔案,當redo log有變化,這個執行緒複製變化的塊到到target目錄成為xtrabackup_logfile的檔案
  • 複製Innodb資料檔案到目標目錄,這不是個簡單複製檔案那麼簡單,它像Innodb那樣開啟讀取檔案,讀取資料字典並且依次的複製一個page
    當複製完資料檔案,xtrabackup停止log-copying執行緒,並在target目錄生成包含了備份型別和開頭和結尾的lsn號的xtarabckup_checkpoints檔案,
    舉例命令如下:

    xtrabakcup --backup --datadir=/data1/mysql/ --target-dir=/data/backups/

    備份/data1/mysql目錄並儲存在/data/backups/mysql/。如果你指定一個相對路徑,target目錄會關聯到當前路徑
    在備份過程期間,你能看到一大堆輸出展示了檔案正在複製中,同時log file執行緒重複的掃描redo log,並且檔案複製執行緒將innodb資料檔案複製到target目錄
    最後一件需要關注的事情是,LSN的值在哪裡成為一個數字決定於你的系統
    注意:log複製執行緒每秒檢查事務日誌去看是否寫入了新的日誌記錄需要複製,也有偶然的log複製執行緒趕不上大量的寫入事務日誌的速度,redo log在被讀取之前就被覆蓋了,就會報錯!!!!
    當Backup結束,target目錄包含了:

    /data/backups/ibdata11
    /data/backups/test
    /data/backups/test/tbl1.ibd
    /data/backups/xtrabackup_checkpoints
    /data/backups/xtrabackup_logfile

    備份會持續時間決定於資料庫大小,在任何時間cancel都是安全的,因為它並不改變資料庫
    下一步要讓backup變為可還原:prepare backup

preparing the backup

用--backup生成備份後,下一步就是prepare。資料檔案不是時間點一致的直到他們被prepare,因為他們在程式執行時不同時間複製,並且發生時已經改變了,如果你嘗試用這些資料檔案啟動innodb,之後會檢測到崩潰,並且crash自己來防止在損壞的資料上繼續執行。--prepare階段讓這些檔案在任意時間都一致性,所以你可以在上面執行Innodb

注意:innobakcupex --apply-log 自動從bakcup-my.cnf讀取innodb配置,或者--defaults-file=bakcup-my.cnf選項傳遞給xtrabackup。否則會導致不正確還原因為xtrabackup已經用了錯誤的配置選項

你可以在任何機器上執行Prepare操作,不需要在備份機上或者還原機上操作,你可以複製backup到一臺專門的中控機並且在prepare

注意:你可以用新版本prepare一個較老版本建立的backup,但反過來不行。在一臺不支援的Mysql server版本上prepare一個bakcup應該用支援該server的最新版本,例如,如果透過1.6版本xtrabackup備份mysql5.0,用2.2prepare是不支援的。因為2.1版本中移除了5.0

在prepare階段,xtarbackup嵌入了修改過的innodb,禁止了innodb的檢查,比如日誌檔案大小是否準確。

prepare階段就是使用這個嵌入的innodb來做透過日誌檔案對資料檔案進行crash恢復

xtrabackup --prepare -- target -dir=/ data /backups/mysql

完成之後,可以看到innodb shutdown的資訊和lsn

你的備份現在是乾淨並且一致的了,並且準備好還原,然而,你可能希望額外的步驟讓還原更快。這需要第二次Prepare。第一次prepare讓資料檔案完美的一致性。但是不常見新鮮的Innodb日誌檔案,如果這時候還原備份並且啟動Mysql,它需要建立新的日誌檔案,這需要一段時間。你也許不想等待。如果你第二次執行--prepare,xtrabackup會建立日誌檔案,redo log的大小決定於mysql的配置檔案

xtrabackup  --prepare --target-dir=/data/backups/mysql/

xtrabackup: This target seems  to  be already prepared.

xtrabackup: notice: xtrabackup_logfile was already used  to  ’ --prepare’.

101107   16 : 54 : 10  InnoDB: Log  file  ./ib_logfile0 did not exist:  new   to  be created InnoDB: Setting  log   file  ./ib_logfile0 size  to  <SIZE> MB

InnoDB: Database physically writes the  file  full:  wait ...

101107   16 : 54 : 10  InnoDB: Log  file  ./ib_logfile1 did not exist:  new   to  be created InnoDB: Setting  log   file  ./ib_logfile1 size  to  <SIZE> MB

InnoDB: Database physically writes the  file  full:  wait ...

101107   16 : 54 : 15  InnoDB: Shutdown completed;  log  sequence  number   1284108

第二次或者第三次prepare不會改變已經Prepare的資料檔案,你可以看輸出:


xtrabackup: This target seems to be already prepared.
xtrabackup: notice: xtrabackup_logfile was already used to ’--prepare’.

不推薦prepare的時候中斷xtrabackup程式,會導致資料檔案損壞並且backup不可用,中斷prepare程式不保證backup可用性

如果以後會拿這份這份backup作為基礎而進行增量備份,prepare的時候要使用--apply-log-only選項,否則你無法apply增量備份到這份basic全備。

還原全備

xtrabackup沒有還原備份的功能。由使用者來做,你可以透過rsync或者cp來還原,你應該檢查還原檔案有正確的屬主和許可權

注意:datadir在還原備份之前必須為空,同樣重要的是Mysql server需要還原之前shutdown,你不能在Mysql執行時還原到datadir目錄(除非是匯入部分備份)

rsync命令還原:


rsync -avrP /data1/backup/ /data1/mysql

檔案屬性保留,大多數情況下需要在啟動例項之前改變檔案的屬主


chown -R mysql5711:mysql /data1/mysql5711

注意,xtrabackup只備份Innodb資料,你必須單獨還原mysql系統庫,myisam資料,表定義檔案。或者innobakcupex

其他型別備份

增量備份

xtrabackup和Innobacupex都支援增量備份,意味著可以只複製自從上次全備之後變化的資料,你可以在每個full backup之間做很多份增量備份,這樣你可以做這樣一個備份程式一週做一次full backup每天一次增量,或者一天做一次full backup每小時做一次增量

增量備份原理,每個Innodb頁都有一個LSN號,一份增量備份複製每個比上次增量備份或者全備LSN更新的page。

有兩個演算法可以找到這樣的需要複製的Page的集合

  • 對於所有server和版本可用,透過讀取所有的資料頁檢查page的LSN
  • 僅對Percona Server適用,忽略

增量備份不會不會實際的和上次的備份比較資料檔案。你如果知道LSN的話甚至在沒有先前備份的情況下使用透過--incremental-lsn執行一次增量備份。增量備份簡單的讀取page並且比較他們的LSN與上次備份的LSN。然而你仍然需要一個full bakcup來恢復增量的變化。如果沒有一個full bakcup作為一個base,增量備份是沒有用的

建立一份增量備份

建立一份增量備份,需要從一個full backup開始,xtrabakcup寫一個叫xtrabackup_checkporints的檔案到備份目標目錄,這個檔案包含一行顯示to_lsn(backup結束時候的lsn)


xtrabackup --backup --target-dir=/data/backups/base --datadir=/data1/mysql5711

xtrabakcup_checkpoints檔案包括


backup_type = full-bakcuped
from_lsn =0
to_lsn =1291135

基於這個full backup建立一份增量:


xtrabackup --backup --target-dir=/data/backups/inc1 --incremental-basedir=/data/backups/base --datadir=/data1/mysql5711

/data/backup/inc1/目錄包含了增量的檔案,比如ibdata1.delta和test/table1.idb.delta ,代表了從LSN1291135以來的變化,如果檢查這個目錄的xtrabacup_checkpoints檔案,會看見如下:


bacup_type = incremental
from_lsn = 1291135
to_lsn = 1291340

現在可以拿inc1當做接下來增量備份的base目錄:


xtrabackup --backup --target-dir=/data/backups/inc2 --incremental-basedir=/data/backups/inc1 --datadir=/data1/mysql5711/

prepare增量備份

增量備份的--prepare階段與正常備份不同,在正常備份中,執行兩種型別操作來保證資料庫一致性,已提交的事務會在資料檔案中重放,未提交的事務回滾,prepare備份的時候你需要跳過未提交事務的回滾,因為在備份的那個時刻未提交的事務正在進行中,並且明顯的它們會在下次增量備份的提交。你需要使用--apply-log-only選項來阻止回滾階段

如果你不用--apply-log-only選項阻止回滾,那麼之後的增量備份就無效了。事務如果被回滾,那之後的增量備份就不能被重放

從你開始建立的full backup,你可以Prepare它,之後重放增量的區別,回憶你已經有如下備份base/,inc1/,inc2/

prepare base備份,然後阻止回滾:


xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base

輸出顯示lsn為1291135.

備份如果現在還原是非常安全的,甚至回滾的步驟被跳過了,如果你現在還原並啟動MySQL,InnoDB會檢測到回滾沒有執行,之後再在後臺進行開始crash恢復,通知你資料沒有被正常關閉

重放第一個增量備份給full backup:


xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base --incremental-dir=/data/backups/inc1

這樣給/data/backups/base目錄重放delta檔案。將備份的時間前進到增量備份的時間點,之後照常重放事務日誌,最終資料是在/data/backups/base並不在增量目錄裡.

顯示如下:


incremental backup from 1291135 is enabled.
xtrabackup: cd to /data/backups/base/
xtrabackup: This target seems to be already prepared.
xtrabackup: xtrabackup_logfile detected: size=2097152, start_lsn=(1291340)
Applying /data/backups/inc1/ibdata1.delta ...
Applying /data/backups/inc1/test/table1.ibd.delta ...
.... snip
101107 20:56:30 InnoDB: Shutdown completed; log sequence number 1291340

如果透過/data/backups/base目錄還原,你可以看見資料庫的狀態是第一次備份時的狀態

prepare第二次增量備份以同樣的步驟,apply增量到上步的base,將資料的時間點同步到第二次增量備份的時間點


xtrabackup --prepare --target-dir=/data/backups/base --incremental-dir=/data/backups/inc2

--apply-log-only用在merging所有增量除最後一個。最後一步仍然可以用,備份最終也是一直的但是server不會執行回滾步驟

部分備份

需要開啟innodb_file_per_table,有三種方式支援部分備份

注意:如果任何匹配的或者列入的表在備份期間刪除,xtrabackup會失敗

  • 使用--tables選項匹配databasename.tablename   xtrabackup --backup --datadir=/data1/mysql5711 --target-dir=/data/backups/ --tables="^test[.].*"   備份整個test庫
  • 使用--tables-file選項
  • 使用 --databases 和 --databases-file選項 #### prepare 部分備份 會用--prepare選項進行部分備份的時候,你會看到相關表不存在的報警,原因是這些表存在於InnoDB的資料字典中但是對應的.ibd檔案不存在,他們沒有被複製到備份目錄中去,這些表將會從資料字典中移除,但是當你還原備份並且啟動InnoDB的時候,他們講不會存在並在日誌檔案中報錯

壓縮備份

不包含輔助索引頁,佔用更少磁碟空間,缺點是prepare的時間更長因為需要重建輔助索引

注意:壓縮備份不支援系統表空間,所以應該開啟innodb-file-per-table選項

建立壓縮備份

透過--compact選項


xtrabackup --bakcup --compact --target-dir=/data/backups

檢查target-dir目錄下的xtrabackup-checkpoints檔案。如下:


backup_type = full-backuped
from_lsn = 0
to_lsn = 2888984349
last_lsn = 2888984349
compact = 1

如果不使用--compact的話--value的值為0,這個方法可以快速檢測備份是否包含輔助索引頁

prepare 壓縮備份

透過--rebuild-indexes和--apply-logs一起使用


xtrabackup --prepare --rebuild-indexes /data/backups

透過--rebuild-threads選項多執行緒重建索引


xtrabackup --prepare --rebuild-indexes --rebuild-threads=16 /data/backups/

還原壓縮備份

沒有現成工具,可以透過rsync或者cp完成,需要檢查還原檔案是否有正確許可權

高階特性:

throttling備份

xtrabackup不會阻塞資料庫讀寫,backup增加系統壓力,可以透過--throttle選項,這個選項限制IO操作的數量為每秒每MB

在--backup模式,這個選項限制了xtrabackup每秒執行的對(read和write)。如果你建立一個增量備份。然後限制每秒讀IO的數量

預設,no throttling,xtrabackup最快的讀寫資料,如果你IO限制過於嚴格,備份會非常慢並且追不上innodb寫事務日誌的速度,備份將永遠無法完成

編寫備份指令碼

suspending after copying

在備份模式中,xtarbackup在後臺複製日誌檔案,前端執行緒複製資料檔案,,之後停止日誌執行緒並完成。如果你使用--suspend-at-end選項而不是停止日誌執行緒並完成。xtrabacup會繼續複製日誌檔案,並在target目錄生成一個xtrabackup_suspended檔案,之後要這個檔案存在,xtrabackup會繼續觀察事務日誌並把他們複製到target目錄中xtrabackup_logfile檔案。當這個檔案移除的時候,xtrabackup會停止複製事務日誌並退出

該功能協調備份Innodb資料和其他動作時非常有用,最明顯的是複製表定義檔案(.frm)以便備份能被還原,你可以後臺啟動xtrabakcup,等待xtrabackup_suspended檔案被建立,然後複製所有你需要完成這個備份的任何檔案。。這個就是innobakcupex工具做的工作

生成後設資料

備份包含任何你需要還原備份時候需要的資訊是個好主意,xtarbackup能列印my.cnf檔案中需要還原的資料和日誌檔案的內容,如果增加--print-param選項。會列印如下內容:

```

This MySQL options file was generated by XtraBackup.

[mysqld]

datadir = /data/mysql/

innodb_data_home_dir = /data/innodb/

innodb_data_file_path = ibdata1:10M:autoextend

innodb_log_group_home_dir = /data/innodb-logs/

```

可以重定向輸出到backup的target目錄

協商source目錄

配置檔案或者其他因素會導致xtrabackup從不同的位置備份資料。為了防止這些,你可以用--print-param來查詢從哪裡copy資料。你可以用輸出來保證xtrabackup和你的指令碼處理同樣的資料集

log streaming

可以透過--log-stream 讓xtrabackup將redo log檔案streaming而不是複製,這樣會自動新增--suspend-at-end選項。你的指令碼可以執行

stream遠端備份並透過管道將log檔案傳給ssh並且透過rsync或者xbstream等工具將資料複製到遠端伺服器上

分析表統計資訊

xtrabackup以只讀模式分析InnoDB資料檔案並提供給統計。可以透過--stats選項。可以同--ables選項一起使用限制檢查的的檔案。還有--use-memory選項。

你可以在一臺執行例項的機器上執行分析,在分析期間資料更改會有出錯的機率。或者可以分析備份的複製。如果需要使用統計的特性,你需要一個乾淨的複製包括正確的Logfile大小,,所以你需要在一次備份上執行--prepare兩次

使用binlog

xtrabakcup提取了innodb事務日誌關於對應已提交事務的binlog pos,這個可以列印出backup對應的binlog pos,你可以透過搭建一些列從庫或者進行基於時間點的恢復

找到binlog pos

一旦backup prepare之後你可以找到binlog pos,透過執行xtrabakcup --prepare或者innobackupex --apply-log都可以完成。如果bakcup是來源開啟binlog的例項。xtrabackup會在target目錄建立一個xtrabakcup_binglog_info的檔案。這個檔案包含了與prepare對應的binlog名字和pos點位

輸出的資訊在xtrabakcup_binlog_pos_info檔案中找到,只有使用innodb引擎才會準確

其他引擎,比如myisam,你應該使用xtrabackup_binlog_info檔案獲得位置

基於時間點恢復

從一份xtrabackup的備份裡基於時間點的恢復,你需要prepare並且還原備份,之後重放xtrabackup_binlog_info中記錄的點開始的binlog

搭建一個新的從庫

需要先prepare,然後在新從庫的data目錄中還原,之後使用change master to命令,使用xtrabackup_binlog_info檔案的binlog和pos啟動複製

還原單獨表

在5.6版本之前,即使開啟innodb_file_per_table選項,仍然不可能透過在例項之間透過複製檔案來複製表。然而,透過Xtrabackup你可以從任何InnoDB資料庫中匯出單表,並且匯入到5.6中去(source不必是5.6但是destination必須是!!!!!)只在獨立.ibd檔案生效,如果沒有獨立ibd檔案是不能夠匯出單表的!!!!!

匯出單表

這個表必須在開啟innodb_file_per_table模式下建立。所以在在--bakcup建立一份備份之後,.ibd檔案應該已經存在於target目錄中

當你prepare的時候,需要額外加--export命令:


xtrabacup --prepare --export --target-dir=/data/backups/mysql5711

現在你可以在target目錄找到.exp檔案


$ find /data/backups/mysql5711/ -name export_test.*
/data/backups/mysql5711/test/export_test.exp
/data/backups/mysql5711/test/export_test.ibd
/data/backups/mysql711/test/export_test.cfg

這三個檔案是你將表匯入5.6的所有檔案

說明:mysql使用cfg檔案,這個檔案包含了Innodb字典dump。這種格式不同於xtrabDB的.exp檔案。嚴格來講,.cfg檔案在5.6以及之後是不在需要的。如果存在cfg檔案,那麼Innodb會透過cfg檔案做schema驗證

匯入表

在5.6,以同樣表結構建立一張表,然後執行以下步驟:

  • 執行alter table test.export_test discard tablespace;需要開啟innodb_file_per_table
  • 複製之前匯出到檔案目的伺服器的資料目錄test/子目錄
  • 執行alter table test.export_test import tablespace; 這張表現在已經匯入,你可以透過select命令檢視匯入資料 ### LRU dump備份 這個特性減少了透過在例項重啟之後從ib_lru_dump檔案還原buffer pool狀態的預熱時間。xtrabakcup自動發現ib_lru_dump並且自動備份 如果my.cnf中開啟buffer還原選項,buffer pool會在從備份還原之後自動預熱。只在Percona server中有這個選項。mysql沒有

實施

xtrabakcup的限制

有以下需要注意:

* 如果xtrabakcup_logfile超過4G,32位系統上的xtrabakcup在--prepare階段會失敗

* xtrabackup在第一次--prepare的不會生成新的redo log檔案,必須--prepare兩次,在第二次的時候才會生成

* 不支援my.cnf裡有--set-variable這種格式設定

實施細節

檔案許可權

xtrabacup以讀寫方式開啟源資料檔案,但不更改這些檔案,意味著你必須以有寫這些檔案許可權的使用者來執行xtrabackup。以讀寫模式開啟檔案的原因是xtrabakcup使用內建的Innodb庫來開啟讀寫檔案,並且Innodb以讀寫模式開啟因為正常假設是需要寫這些檔案了

調整os buffers

因為xtrabackup讀取檔案系統的大量資料,可能它使用posix_fadvise()指導作業系統不要嘗試快取從磁碟讀取的block。沒有這個提示。假設xtrabackup很快再次需要這些塊,作業系統更願意快取這些塊。快取如此大的檔案會給作業系統的虛擬記憶體增加壓力併到底其他程式,比如資料庫swap out。xtrabakcup工具透過source和destination如下提示來避免這種情況發生:


posix_fadvise(file,0,0,POSIX_FADV_DONTNEED)

另外,xtrabackup讓作業系統在原始檔上來執行更挑戰性的read-ahead最佳化


posix_fadvise(file, 0, 0, POSIX_FADV_SEQUENTIAL)

複製資料檔案

當向target目錄複製資料檔案的時候,xtrabakcup一次讀寫1MB資料。這是不可配置的。當複製事務日誌,xtrabackup一次讀寫512位元組。著同樣不能配置。是符合Innodb的(percona server的解決辦法是有額外的引數innodb_log_block_size)

讀取檔案之後,xtrabackup一次1MBbuffer遍歷page。並透過innodb buf_page_is corrupted()函式檢查每個Page的corruption。如果page損壞,便會重讀並且每個page重試10次,二次寫buffer會跳過這個檢查

手冊

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版本並退出

xbstream

支援同時壓縮和流式化。需要客服傳統歸檔tar,cpio和其他不允許動態streaming生成的檔案的限制,例如動態壓縮檔案,xbstream超越其他傳統流式/歸檔格式的的優點是,併發stream多個檔案並且更緊湊的資料儲存(所以可以和--parallel選項選項一起使用xbstream格式進行streaming)

像tar一樣使用:

* -x 選項 從標準輸入stream read中提取檔案到當前目錄,除非指定其他-C選項

* -c 選項 stream命令列指定的檔案到標準輸出

目的,透過posix_fadvise()呼叫減少對OS page cache的影響

xtrabackup開啟壓縮的時候素有資料被壓縮,包括事務日誌和後設資料檔案,透過指定的壓縮演算法,唯一當前支援度呃演算法是quicklz,結果檔案是qpress歸檔個事。每隔xtrabakcup生成的.qp檔案可以透過qpress檔案歸檔提取或者解壓縮。這就意味著不需要透過tar.gz解壓縮整個bakcup來還原一個單表

檔案可以透過qpress解壓縮,qpress支援多執行緒解壓縮

xtrabakcup工作原理

xtrabackup基於InnoDB crash-recovery功能,複製innodb資料檔案,這會導致資料內部不一致,,但是之後它在檔案上執行crash recovery使資料檔案一致

innodb維護redo log又稱事務日誌。redo log日誌中包含innodb資料的每次變動。當innodb啟動時會去檢查資料檔案和事務日誌,然後又兩個步驟,1,apply應用已提交的事務日誌到資料檔案,2,已更改但未提交的事務進行undo操作

percona xtrabackup在啟動的時候記錄LSN,然後複製資料檔案,這會需要一些時間,,所以如果檔案改變了,它反映出不同時間點資料庫的狀態,。同時,xtrabakcup啟動一個後臺進行監控事務日誌,並複製變動(複製修改).xtrabakcup需要持續執行以上因為事務日誌是迴圈寫的,過段時間之後會被複用,xtrabackup需要每次資料檔案變化對應的事務日誌記錄

上述是備份的程式,下一步是prepare的程式,在這個過程中,xtarabakcup透過已複製的事務日誌在已複製的資料檔案上執行crash recovery。之後,資料庫已經可以進行還原並可以使用了

以上透過編譯好的二進位制xtrabakcup實施了。

Innobackup在此基礎上增加了更多功能,比如備份Myisam表和.frm檔案。它啟動xtrabakcup並且等待它完成複製檔案,之後執行FLUSH TABLES WITH READ LOCK防止mysql資料更改,得到表全域性鎖,然後flush所有的myisam表到磁碟,之後再釋放表全域性鎖

備份的myisam和innodb表最終會一致,因為在prepare(recovery)之後,innodb資料會前滾到備份完成時候的時間點,而不是回滾到備份開始時候的時間點。這個時間點與 FLUSH TABLES WITH READ LOCK 發生時一致,所有myisam與已prepare過的Innodb資料是同步的

percona xtrabakcup是一些列如下的工具:

innobackupex:xtrabackup的符號連線,innobakcupex支援2.2版本的所有特性和語法,但是現在已經降級並且在以一個主要版本中remove

xtrabackup:編譯的C程式提供備份一整個資料庫例項myisam和Innodb表

xbstream:以xbstream格式streaming和提取檔案



使用innobackupex對部分備份進行恢復 


實驗環境

此次實驗的環境如下

  • MySQL 5.7.26

  • Redhat 6.10

  • 作業系統賬號:mysql

  • 資料庫備份賬號:backup

上節我們說了如何進行部分備份,這部分我們說如何對其進行還原

關於還原部分備份,只有一個注意點,即不能使用傳統的prepare和copy back命令,需要使用export和import的形式

1. prepare階段

上節我們介紹瞭如何使用innobackupex對資料庫進行部分備份

結束後我們得到了一個非一致性的備份檔案,即需要對未提交的事務進行回滾對提交的事務進行前滾

這個過程在xtrabackup中叫做準備階段(prepare stage)

對部分備份的資料檔案需要加上--export選項

1.1 prepare 備份

使用--apply-log --export 進行恢復動作,相當於Oracle的recover動作

後面接部分備份的目錄

如果記憶體有空閒,可使用--use-memory加快速度

innobackupex --apply-log --export  --use-memory=1G   /oradata/data/mysql/xtra/2019-11-06_10-39-58

在apply-log時候會有如下提示

1.png

這是由於為備份這些表,需要從資料字典中刪除

2.png

這說明已經建立了用於import的檔案了

結束後會出現如下提示

150806 01:01:57 InnoDB: Shutdown completed; log sequence number 1609228 150806 01:01:57 innobackupex: completed OK!

這時備份的檔案會變成如下形式

3.png

每張表新加了cfg和exp檔案,這些是我們需要的

2. 匯入表

2.1 建立相同結構的表

首先我們需要在新的伺服器上建立與需要匯入的表相同結構的表

新伺服器

use test
 CREATE TABLE `innodb_table` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `name` varchar(20) NOT NULL,
        `age` tinyint(3) NOT NULL,
        PRIMARY KEY (`id`)
    ) ENGINE=innodb DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

2.2 破壞表空間

OTHERSERVER|mysql> ALTER TABLE test.innodb_table DISCARD TABLESPACE;

該命令會刪除innodb_table的idb檔案,frm檔案還在

2.3 匯入表

首先複製innodb_table的cfg,exp,ibd檔案複製至資料庫目錄,即test目錄下

OTHERSERVER|mysql> ALTER TABLE test.innodb_table IMPORT TABLESPACE;

4.png



xtrabackup 使用說明(續)

背景:

      關於物理備份工具xtrabackup的一些說明可以先看之前寫過的文章說明: xtrabackup 安裝使用。現在xtrabackup版本升級到了2.4.4,相比之前的2.1有了比較大的變化: innobackupex 功能全部整合到  xtrabackup 裡面,只有一個 binary,另外為了使用上的相容考慮, innobackupex作為  x trabackup 的一個軟鏈,即xtrabackup現在支援非Innodb表備份,並且Innobackupex在下一版本中移除,建議透過xtrabackup替換innobackupex。還有其他的一些新特性,更多的說明可以看 xtrabackup新版詳細說明,原理說明可以看 Percona XtraBackup 備份原理說明【轉】本篇文章將介紹xtrabackup的使用方法。

innobackupex引數說明( innobackupex --help ):

1)備份:

innobackupex [--compress] [--compress-threads=NUMBER-OF-THREADS] [--compress-chunk-size=CHUNK-SIZE]
             [--encrypt=ENCRYPTION-ALGORITHM] [--encrypt-threads=NUMBER-OF-THREADS] [--encrypt-chunk-size=CHUNK-SIZE]
             [--encrypt-key=LITERAL-ENCRYPTION-KEY] | [--encryption-key-file=MY.KEY]
             [--include=REGEXP] [--user=NAME]
             [--password=WORD] [--port=PORT] [--socket=SOCKET]
             [--no-timestamp] [--ibbackup=IBBACKUP-BINARY]
             [--slave-info] [--galera-info] [--stream=tar|xbstream]
             [--defaults-file=MY.CNF] [--defaults-group=GROUP-NAME]
             [--databases=LIST] [--no-lock] 
             [--tmpdir=DIRECTORY] [--tables-file=FILE]
             [--history=NAME]
             [--incremental] [--incremental-basedir]
             [--incremental-dir] [--incremental-force-scan] [--incremental-lsn]
             [--incremental-history-name=NAME] [--incremental-history-uuid=UUID]
             [--close-files] [--compact]     
             BACKUP-ROOT-DIR

引數說明: 

--compress:該選項表示壓縮innodb資料檔案的備份。--compress-threads:該選項表示並行壓縮worker執行緒的數量。--compress-chunk-size:該選項表示每個壓縮執行緒worker buffer的大小,單位是位元組,預設是64K。--encrypt:該選項表示透過ENCRYPTION_ALGORITHM的演算法加密innodb資料檔案的備份,目前支援的演算法有ASE128,AES192,AES256。--encrypt-threads:該選項表示並行加密的worker執行緒數量。--encrypt-chunk-size:該選項表示每個加密執行緒worker buffer的大小,單位是位元組,預設是64K。--encrypt-key:該選項使用合適長度加密key,因為會記錄到命令列,所以不推薦使用。--encryption-key-file:該選項表示檔案必須是一個簡單二進位制或者文字檔案,加密key可透過以下命令列命令生成:openssl rand -base64 24。--include:該選項表示使用正規表示式匹配表的名字[db.tb],要求為其指定匹配要備份的表的完整名稱,即databasename.tablename。--user:該選項表示備份賬號。--password:該選項表示備份的密碼。--port:該選項表示備份資料庫的埠。--host:該選項表示備份資料庫的地址。--databases:該選項接受的引數為資料名,如果要指定多個資料庫,彼此間需要以空格隔開;如:"xtra_test dba_test",同時,在指定某資料庫時,也可以只指定其中的某張表。如:"mydatabase.mytable"。該選項對innodb引擎表無效,還是會備份所有innodb表。此外,此選項也可以接受一個檔案為引數,檔案中每一行為一個要備份的物件。--tables-file:該選項表示指定含有表列表的檔案,格式為database.table,該選項直接傳給--tables-file。--socket:該選項表示mysql.sock所在位置,以便備份程式登入mysql。--no-timestamp:該選項可以表示不要建立一個時間戳目錄來儲存備份,指定到自己想要的備份資料夾。--ibbackup:該選項指定了使用哪個xtrabackup二進位制程式。IBBACKUP-BINARY是執行percona xtrabackup的命令。這個選項適用於xtrbackup二進位制不在你是搜尋和工作目錄,如果指定了該選項,innoabackupex自動決定用的二進位制程式。--slave-info:該選項表示對slave進行備份的時候使用,列印出master的名字和binlog pos,同樣將這些資訊以change master的命令寫入xtrabackup_slave_info檔案。可以透過基於這份備份啟動一個從庫。--safe-slave-backup:該選項表示為保證一致性複製狀態,這個選項停止SQL執行緒並且等到show status中的slave_open_temp_tables為0的時候開始備份,如果沒有開啟臨時表,bakcup會立刻開始,否則SQL執行緒啟動或者關閉知道沒有開啟的臨時表。如果slave_open_temp_tables在--safe-slave-backup-timeount(預設300秒)秒之後不為0,從庫sql執行緒會在備份完成的時候重啟。--rsync:該選項表示透過rsync工具最佳化本地傳輸,當指定這個選項,innobackupex使用rsync複製非Innodb檔案而替換cp,當有很多DB和表的時候會快很多,不能--stream一起使用。--kill-long-queries-timeout:該選項表示從開始執行FLUSH TABLES WITH READ LOCK到kill掉阻塞它的這些查詢之間等待的秒數。預設值為0,不會kill任何查詢,使用這個選項xtrabackup需要有Process和super許可權。--kill-long-query-type:該選項表示kill的型別,預設是all,可選select。--ftwrl-wait-threshold:該選項表示檢測到長查詢,單位是秒,表示長查詢的閾值。--ftwrl-wait-query-type:該選項表示獲得全域性鎖之前允許那種查詢完成,預設是ALL,可選update。--galera-info:該選項表示生成了包含建立備份時候本地節點狀態的檔案xtrabackup_galera_info檔案,該選項只適用於備份PXC。--stream:該選項表示流式備份的格式,backup完成之後以指定格式到STDOUT,目前只支援tar和xbstream。--defaults-file:該選項指定了從哪個檔案讀取MySQL配置,必須放在命令列第一個選項的位置。--defaults-extra-file:該選項指定了在標準defaults-file之前從哪個額外的檔案讀取MySQL配置,必須在命令列的第一個選項的位置。一般用於存備份使用者的使用者名稱和密碼的配置檔案。----defaults-group:該選項表示從配置檔案讀取的組,innobakcupex多個例項部署時使用。--no-lock:該選項表示關閉FTWRL的表鎖,只有在所有表都是Innodb表並且不關心backup的binlog pos點,如果有任何DDL語句正在執行或者非InnoDB正在更新時(包括mysql庫下的表),都不應該使用這個選項,後果是導致備份資料不一致,如果考慮備份因為獲得鎖失敗,可以考慮--safe-slave-backup立刻停止複製執行緒。--tmpdir:該選項表示指定--stream的時候,指定臨時檔案存在哪裡,在streaming和複製到遠端server之前,事務日誌首先存在臨時檔案裡。在 使用引數stream=tar備份的時候,你的xtrabackup_logfile可能會臨時放在/tmp目錄下,如果你備份的時候併發寫入較大的話 xtrabackup_logfile可能會很大(5G+),很可能會撐滿你的/tmp目錄,可以透過引數--tmpdir指定目錄來解決這個問題。--history:該選項表示percona server 的備份歷史記錄在percona_schema.xtrabackup_history表。--incremental:該選項表示建立一個增量備份,需要指定--incremental-basedir。--incremental-basedir:該選項表示接受了一個字串引數指定含有full backup的目錄為增量備份的base目錄,與--incremental同時使用。--incremental-dir:該選項表示增量備份的目錄。--incremental-force-scan:該選項表示建立一份增量備份時,強制掃描所有增量備份中的資料頁。--incremental-lsn:該選項表示指定增量備份的LSN,與--incremental選項一起使用。--incremental-history-name:該選項表示儲存在PERCONA_SCHEMA.xtrabackup_history基於增量備份的歷史記錄的名字。Percona Xtrabackup搜尋歷史表查詢最近(innodb_to_lsn)成功備份並且將to_lsn值作為增量備份啟動出事lsn.與innobackupex--incremental-history-uuid互斥。如果沒有檢測到有效的lsn,xtrabackup會返回error。--incremental-history-uuid:該選項表示儲存在percona_schema.xtrabackup_history基於增量備份的特定歷史記錄的UUID。--close-files:該選項表示關閉不再訪問的檔案控制程式碼,當xtrabackup開啟表空間通常並不關閉檔案控制程式碼目的是正確的處理DDL操作。如果表空間數量巨大,這是一種可以關閉不再訪問的檔案控制程式碼的方法。使用該選項有風險,會有產生不一致備份的可能。--compact:該選項表示建立一份沒有輔助索引的緊湊的備份。--throttle:該選項表示每秒IO操作的次數,只作用於bakcup階段有效。apply-log和--copy-back不生效不要一起用。

2)prepare:

innobackupex --apply-log [--use-memory=B]
             [--defaults-file=MY.CNF]
             [--export] [--redo-only] [--ibbackup=IBBACKUP-BINARY]
             BACKUP-DIR

引數說明:

--apply-log:該選項表示同xtrabackup的--prepare引數,一般情況下,在備份完成後,資料尚且不能用於恢復操作,因為備份的資料中可能會包含尚未提交的事務或已經提交但尚未同步至資料檔案中的事務。因此,此時資料 檔案仍處理不一致狀態。--apply-log的作用是透過回滾未提交的事務及同步已經提交的事務至資料檔案使資料檔案處於一致性狀態。--use-memory:該選項表示和--apply-log選項一起使用,prepare 備份的時候,xtrabackup做crash recovery分配的記憶體大小,單位位元組。也可(1MB,1M,1G,1GB),推薦1G。--defaults-file:該選項指定了從哪個檔案讀取MySQL配置,必須放在命令列第一個選項的位置。--export:這個選項表示開啟可匯出單獨的表之後再匯入其他Mysql中。--redo-only:這個選項在prepare base full backup,往其中merge增量備份(但不包括最後一個)時候使用。

3)解壓解密:

innobackupex [--decompress] [--decrypt=ENCRYPTION-ALGORITHM]
             [--encrypt-key=LITERAL-ENCRYPTION-KEY] | [--encryption-key-file=MY.KEY]
             [--parallel=NUMBER-OF-FORKS] BACKUP-DIR

引數說明:

--decompress:該選項表示解壓--compress選項壓縮的檔案。--parallel:該選項表示允許多個檔案同時解壓。為了解壓,qpress工具必須有安裝並且訪問這個檔案的許可權。這個程式將在同一個位置移除原來的壓縮/加密檔案。--decrypt:該選項表示解密透過--encrypt選項加密的.xbcrypt檔案。

4)還原:

innobackupex --copy-back [--defaults-file=MY.CNF] [--defaults-group=GROUP-NAME] BACKUP-DIR
innobackupex --move-back [--defaults-file=MY.CNF] [--defaults-group=GROUP-NAME] BACKUP-DIR

引數說明:

--copy-back:做資料恢復時將備份資料檔案複製到MySQL伺服器的datadir。--move-back:這個選項與--copy-back相似,唯一的區別是它不複製檔案,而是移動檔案到目的地。這個選項移除backup檔案,用時候必須小心。使用場景:沒有足夠的磁碟空間同事保留資料檔案和Backup副本
注意:1.datadir目錄必須為空。除非指定innobackupex --force-non-empty-directorires選項指定,否則--copy-backup選項不會覆蓋2.在restore之前,必須shutdown MySQL例項,你不能將一個執行中的例項restore到datadir目錄中3.由於檔案屬性會被保留,大部分情況下你需要在啟動例項之前將檔案的屬主改為mysql,這些檔案將屬於建立備份的使用者chown -R my5711:mysql /data1/dbrestore
以上需要在使用者呼叫Innobackupex之前完成
--force-non-empty-directories:指定該引數時候,使得innobackupex --copy-back或--move-back選項轉移檔案到非空目錄,已存在的檔案不會被覆蓋。如果--copy-back和--move-back檔案需要從備份目錄複製一個在datadir已經存在的檔案,會報錯失敗。

  5)應用場景:

①.普通全量備份、還原:(庫:dba_test、xtra_test)

1.先prepare,利用--apply-log的作用是透過回滾未提交的事務及同步已經提交的事務至資料檔案使資料檔案處於一致性狀態
3.改許可權
++++++++++++++++++
#備份所有資料庫:指定備份目錄

innobackupex --defaults-file=/etc/mysql/my.cnf --user=root --password=123 --no-timestamp /home/zhoujy/xtrabackup/
#還原同上
++++++++++++++++++
先prepare,利用--apply-log的作用是透過回滾未提交的事務及同步已經提交的事務至資料檔案使資料檔案處於一致性狀態
++++++++++++++++++

#備份指定表

備份不同庫下的不同表
1: innobackupex --defaults-file=/etc/mysql/my.cnf --user=root --password=123 --no-timestamp --databases=" dba_test.tb1 xtra_test.M" /home/zhoujy/xtrabackup/
備份一個庫下面的表,支援正則,如:--include='^mydatabase[.]mytable' 
2:
innobackupex --defaults-file=/etc/mysql/my.cnf --user=root --password=123 --no-timestamp --include=' xtra_test.I' /home/zhoujy/xtrabackup/
備份指定檔案裡的表,檔案裡每行的格式是:dbname.tbname
3: innobackupex --defaults-file=/etc/mysql/my.cnf --user=root --password=123 --no-timestamp --tables-file= /tmp/tbname.txt  /home/zhoujy/xtrabackup/
#還原
同指定資料庫還原一樣,需要還原ibdata。注意,還原的時候可以這樣還原:
innobackupex --apply-log --export xtrabackup/
生成如下幾個檔案:
-rw-r--r-- 1 root root  425  9月 23 17:16 I.cfg
-rw-r----- 1 root root  16K  9月 23 17:16 I.exp
-rw-r----- 1 root root 8.4K  9月 23 17:15 I.frm
-rw-r----- 1 root root  96K  9月 23 17:15 I.ibd

  然後:

  alter table I  discard tablespace;

  將I.exp和I檔案傳到目標機目標目錄中執行:

  alter table I  import tablespace;

②.普通增量備份、還原

--defaults-=/etc/mysql/my.cnf --user=root --password=  /home/zhoujy/xtrabackup/--defaults-=/etc/mysql/my.cnf --user=root --password=  --incremental-basedir=/home/zhoujy/xtrabackup/   /home/zhoujy/increment_data/--defaults-=/etc/mysql/my.cnf --user=root --password=  --incremental-basedir=/home/zhoujy/increment_data/  /home/zhoujy/increment_data1/---incremental- /home/zhoujy/ /home/zhoujy/xtrabackup/ --user-memory=1G  --incremental-=/home/zhoujy/increment_data/ /home/zhoujy/xtrabackup/ --user-memory=1G  --incremental-=/home/zhoujy/increment_data1/ /home/zhoujy/xtrabackup/

③.打包壓縮備份, 注意:--compress不能和--stream=tar一起使用

#壓縮備份
innobackupex --defaults-file=/etc/mysql/my.cnf --user=root --password=123 --compress --compress-threads=8 --no-timestamp --databases="xtra_test.I" /home/zhoujy/xtrabackup/#在perpare之前需要decompress,需要安裝qpress
innobackupex --decompress /home/zhoujy/xtrabackup/#prepare
innobackupex --apply-log /home/zhoujy/xtrabackup/最後還原方法和上面一致
#打包備份
innobackupex --defaults-file=/etc/mysql/my.cnf --user=root --password=123 --stream=tar --no-timestamp --databases="xtra_test" /home/zhoujy/xtrabackup/ 1>/home/zhoujy/xtrabackup/xtra_test.tar#解包tar ixvf xtra_test.tar最後還原方法和上面一致
#第三方壓縮備份:
innobackupex --defaults-file=/etc/mysql/my.cnf --user=root --password=123 --compress --compress-threads=8 --parallel=4 --stream=tar --no-timestamp --databases="xtra_test" /home/zhoujy/xtrabackup/ | gzip >/home/zhoujy/xtrabackup/xtra_test.tar.gz
#prepare之前先解壓tar izxvf xtra_test.tar.gz 
#prepare
innobackupex --apply-log /home/zhoujy/xtrabackup/

④.

說明:在引數說明裡看到加密備份的幾個引數:--encrypt、--encrypt-threads、--encrypt-key、--encryption-key-file。其中encrypt-key和encryption-key-file不能一起使用,encryption-key需要把加密的密碼寫到命令列,不推薦。
#加密備份:
先生成key:openssl rand -base64 24把Key寫到檔案:echo -n "Ue2Wp6dIDWszpI76HQ1u57exyjAdHpRO" > keyfile 
最後備份:
innobackupex --defaults-file=/etc/mysql/my.cnf --user=root --password=123 --compress --compress-threads=3 --no-timestamp --encrypt=AES256 --encrypt-key-file=/home/zhoujy/keyfile ----encrypt-threads=3 --parallel=5 /home/zhoujy/xtrabackup2/#解密:for i in `find . -iname "*\.xbcrypt"`; do xbcrypt -d --encrypt-key-file=/home/zhoujy/keyfile --encrypt-algo=AES256 < $i > $(dirname $i)/$(basename $i .xbcrypt) && rm $i; done#解壓:
innobackupex --decompress /home/zhoujy/xtrabackup2/#prepare:
innobackupex --apply-log /home/zhoujy/xtrabackup2/#還原copy
innobackupex --defaults-file=/etc/mysql/my.cnf --move-back /home/zhoujy/xtrabackup2/

⑤.複製環境中的備份:一般生產環境大部分都是主從模式,主提供服務,從提供備份。

--defaults-=/etc/mysql/my.cnf --user=root --password= --no-timestamp --databases= /home/zhoujy/xtrabackup/
#還原
還原方法同上

總結:關於更多的innobackupex的備份可以看 和 xtrabackup 安裝使用,引數可以參考本文上面的介紹說明,透過上面的幾個說明看到innobackupex可以實現:全量、增量、壓縮、打包、加密備份,並且支援多執行緒的備份,並且也提供了長查詢超過閥值自動kill的方法,大大提升備份效率。

xtrabackup  引數說明( xtrabackup  --help  ): 

--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兩次。--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版本並退出。
--xbstream:支援同時壓縮和流式化。需要客服傳統歸檔tar,cpio和其他不允許動態streaming生成的檔案的限制,例如動態壓縮檔案,xbstream超越其他傳統流式/歸檔格式的的優點是,併發stream多個檔案並且更緊湊的資料儲存(所以可以和--parallel選項選項一起使用xbstream格式進行streaming)。

xtrabackup大部分常用引數都和innobackupex差不多,大家可以自己去 上看說明,最重要的一點是 xtraback支援MyISAM的備份

應用場景:

①.普通全量備份、還原:

#備份:1:指定--defaults-filextrabackup --defaults-file=/etc/mysql/my.cnf --user=root --password=123  --backup --target-dir=/home/zhoujy/xtrabackup/2:用--datadir取代--defaults-filextrabackup --user=root --password=123  --backup --datadir=/var/lib/mysql/ --target-dir=/home/zhoujy/xtrabackup/#還原:1:(關閉mysql)先prepare
xtrabackup --prepare --target-dir=/home/zhoujy/xtrabackup/2:再copy
rsync -avrP /home/zhoujy/xtrabackup/* /var/lib/mysql/3:改許可權、啟動chown -R mysql.mysql *

②.普通增量備份、還原 

--user=root --password= =/var/lib/mysql/ ==/home/zhoujy/xtrabackup/--user=root --password= =/var/lib/mysql/ ==/home/zhoujy/xtrabackup1/=/home/zhoujy/xtrabackup/=/home/zhoujy/xtrabackup/=/home/zhoujy/xtrabackup/ --incremental-=/home/zhoujy/xtrabackup1/=/home/zhoujy/xtrabackup/:最後copy、改許可權。
和innobackupex一樣,用--databases=dbname.tablename和

③.打包壓縮備份, 注意:--compress不能和--stream=tar一起使用

##壓縮備份
xtrabackup --user=root --password=123 --datadir=/var/lib/mysql/ --backup --parallel=3 --compress --compress-threads=5 --databases="xtra_test dba_test" --target-dir=/home/zhoujy/xtrabackup/#解壓,在perpare之前需要安裝qpressfor f in `find ./ -iname "*\.qp"`; do qpress -dT2 $f  $(dirname $f) && rm -f $f; done #prepare
xtrabackup --prepare --target-dir=/home/zhoujy/xtrabackup/#copy,改許可權
##打包備份,compress不支援tar。
xtrabackup --user=root --password=123 --datadir=/var/lib/mysql/ --backup --parallel=3 --compress --compress-threads=5 --stream=xbstream --target-dir=/home/zhoujy/xtrabackup/ >/home/zhoujy/xtrabackup/alldb.xbstream
#解包
xbstream -x < alldb.xbstream 
#解壓for f in `find ./ -iname "*\.qp"`; do qpress -dT2 $f  $(dirname $f) && rm -f $f; done #prepare
xtrabackup --prepare --target-dir=/home/zhoujy/xtrabackup
#copy,改許可權
##第三方壓縮備份:
 xtrabackup --user=root --password=123 --datadir=/var/lib/mysql/ --backup --parallel=3 --stream=tar --target-dir=/home/zhoujy/xtrabackup/ | gzip /home/zhoujy/xtrabackup/alldb.tar.gz
#解壓:tar izxvf alldb.tar.gz
#prepare
xtrabackup --prepare --target-dir=/home/zhoujy/xtrabackup
#copy,改許可權

④.加密備份

#壓縮加密全量備份所有資料庫1:生成加密key:
openssl rand -base64 24把Key寫到檔案:echo -n "Ue2Wp6dIDWszpI76HQ1u57exyjAdHpRO" > keyfile 
2:壓縮加密全量備份
xtrabackup --user=root --password=123 --datadir=/var/lib/mysql/ --backup --no-timestamp --compress --compress-threads=3 --encrypt=AES256 --encrypt-key-file=/home/zhoujy/keyfile ----encrypt-threads=3 --parallel=5 --target-dir=/home/zhoujy/xtrabackup/#還原1:解密for i in `find . -iname "*\.xbcrypt"`; do xbcrypt -d --encrypt-key-file=/home/zhoujy/keyfile --encrypt-algo=AES256 < $i > $(dirname $i)/$(basename $i .xbcrypt) && rm $i; done2:解壓for f in `find ./ -iname "*\.qp"`; do qpress -dT2 $f  $(dirname $f) && rm -f $f; done 3:prepare
xtrabackup --prepare --target-dir=/home/zhoujy/xtrabackup/4:copy,改許可權
rsync -avrP /home/zhoujy/xtrabackup/* /var/lib/mysql/
chown -R mysql.mysql *

⑤.複製環境中的備份:一般生產環境大部分都是主從模式,主提供服務,從提供備份。

說明:備份 5個執行緒備份2個資料庫,並且檔案xtrabackup_slave_info記錄GTID和change的資訊
#備份
xtrabackup --user=root --password=123 --datadir=/var/lib/mysql/ --backup --no-timestamp --slave-info --safe-slave-backup --parallel=5 --databases='xtra_test dba_test' --target-dir=/home/zhoujy/xtrabackup/#還原1:prepare
xtrabackup --prepare --target-dir=/home/zhoujy/xtrabackup/2:copy,改許可權

總結關於更多的innobackupex的備份可以看 和 xtrabackup 安裝使用,引數可以參考本文上面的介紹說明,透過上面的幾個說明看到xtrabackup可以實現:全量、增量、壓縮、打包、加密備份,並且支援多執行緒的備份,並且也提供了長查詢超過閥值自動kill的方法,大大提升備份效率。

最後,明白 Percona XtraBackup備份的原理之後,根據自己備份場景的特點,選擇合理的引數,定製適合自己需求的備份指令碼進行工作。

 





About Me

........................................................................................................................

● 本文作者:小麥苗,部分內容整理自網路,若有侵權請聯絡小麥苗刪除

● 本文在itpub( http://blog.itpub.net/26736162)、部落格園( http://www.cnblogs.com/lhrbest)和個人weixin公眾號( xiaomaimiaolhr)上有同步更新

● 本文itpub地址: http://blog.itpub.net/26736162

● 本文部落格園地址: http://www.cnblogs.com/lhrbest

● 本文pdf版、個人簡介及小麥苗雲盤地址: http://blog.itpub.net/26736162/viewspace-1624453/

● 資料庫筆試面試題庫及解答: http://blog.itpub.net/26736162/viewspace-2134706/

● DBA寶典今日頭條號地址:

........................................................................................................................

● QQ群號: 230161599(滿) 、618766405

● weixin群:可加我weixin,我拉大家進群,非誠勿擾

● 聯絡我請加QQ好友 646634621 ,註明新增緣由

● 於 2019-07-01 06:00 ~ 2019-07-31 24:00 在西安完成

● 最新修改時間:2019-07-01 06:00 ~ 2019-07-31 24:00

● 文章內容來源於小麥苗的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解

● 版權所有,歡迎分享本文,轉載請保留出處

........................................................................................................................

小麥苗的微店

小麥苗出版的資料庫類叢書http://blog.itpub.net/26736162/viewspace-2142121/

小麥苗OCP、OCM、高可用網路班http://blog.itpub.net/26736162/viewspace-2148098/

小麥苗騰訊課堂主頁https://lhr.ke.qq.com/

........................................................................................................................

使用 weixin客戶端掃描下面的二維碼來關注小麥苗的weixin公眾號( xiaomaimiaolhr)及QQ群(DBA寶典)、新增小麥苗weixin, 學習最實用的資料庫技術。

........................................................................................................................

歡迎與我聯絡

 

 



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26736162/viewspace-2649981/,如需轉載,請註明出處,否則將追究法律責任。

相關文章