1. 程式人生 > >Xtrabackup 備份大資料庫(全量備份和增量備份)

Xtrabackup 備份大資料庫(全量備份和增量備份)

Xtrabackup

Xtrabackup是由percona開源的免費資料庫熱備份軟體,它能對InnoDB資料庫和XtraDB儲存引擎的資料庫非阻塞地備份(對於MyISAM的備份同樣需要加表鎖);mysqldump備份方式是採用的邏輯備份,其最大的缺陷是備份和恢復速度較慢,如果資料庫大於50G,mysqldump備份就不太適合。

Xtrabackup優點

 1)備份速度快,物理備份可靠
 2)備份過程不會打斷正在執行的事務(無需鎖表)
 3)能夠基於壓縮等功能節約磁碟空間和流量
 4)自動備份校驗
 5)還原速度快
 6)可以流傳將備份傳輸到另外一臺機器上

Xtrabackup原理

 Xtrabackup安裝完成後有4個可執行檔案,其中2個比較重要的備份工具是innobackupex、xtrabackup
1)xtrabackup 是專門用來備份InnoDB表的,不能備份非Innodb表,和mysql server沒有互動;

2)innobackupex 是一個指令碼,用來備份非InnoDB表,同時會呼叫xtrabackup命令來備份InnoDB表,還會和mysql  server互動,比如鎖表、獲取位置點等。簡單地說,就是在xtrabackup基礎上做了一層封裝;
3)xbcrypt 加密解密備份工具
4)xbstream 流傳打包傳輸工具,類似tar

1)在使用InnoDB引擎表內部會維護一個redo日誌檔案,我們也可以叫做事務日誌檔案。事務日誌會儲存每一個InnoDB表資料的記錄修改
2)xtrabackup在啟動時會記住log sequence number(LSN)日誌序列號,即當前的redo記錄的位置,並且複製所有資料檔案
3)複製過程需要一些時間,所以這期間如果資料檔案LSN有改動,它會執行一個後臺程序,用於監控事務日誌,並不停地將事務日誌中每個資料檔案的修改都記下來

Xtrabackup安裝

官網下載Xtrabackup
1 ##https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.3.5/binary/RedHat/6/x86_64/percona-xtrabackup-2.3.5-1.el6.x86_64.rpm

搜尋下載幾個依賴rpm包
##http://rpmfind.net/linux/RPM/ 
perl-DBI-1.609-4.el6.x86_64.rpm 
perl-DBD-MySQL-4.013-3.el6.x86_64.rpm 
libev-4.04-2.el6.x86_64.rpm

安裝完成後檢查rpm包安裝情況

[[email protected] tools]# rpm -ivh percona-xtrabackup-2.3.5-1.el6.x86_64.rpm 
warning: percona-xtrabackup-2.3.5-1.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY 
Preparing...                ########################################### [100%] 
  1:percona-xtrabackup    ########################################### [100%] 
[[email protected] tools]# rpm -qa|grep xtrabackup 
percona-xtrabackup-2.3.5-1.el6.x86_64 
[[email protected] tools]# rpm -ql percona-xtrabackup-2.3.5-1.el6.x86_64 
/usr/bin/innobackupex #innobackupex指令碼工具 
/usr/bin/xbcloud
/usr/bin/xbcloud_osenv
/usr/bin/xbcrypt
/usr/bin/xbstream
/usr/bin/xtrabackup #最主要的備份工具 
/usr/share/doc/percona-xtrabackup-2.3.5 
/usr/share/doc/percona-xtrabackup-2.3.5/COPYING
/usr/share/man/man1/innobackupex.1.gz 
/usr/share/man/man1/xbcrypt.1.gz 
/usr/share/man/man1/xbstream.1.gz 
/usr/share/man/man1/xtrabackup.1.gz

先對資料庫做一個全量備份
[[email protected] data]# innobackupex --defaults-file=/data/3306/my.cnf --user=root --password=li123456 /backup/full/ 
... 
60710 08:24:47 [00] Writing backup-my.cnf 
160710 08:24:47 [00]        ...done
160710 08:24:47 [00] Writing xtrabackup_info 
160710 08:24:47 [00]        ...done
xtrabackup: Transaction log of lsn (1672995) to (1672995) was copied. 
160710 08:24:47 completed OK!

此時可以看到/backup/full已經有了備份過來的資料檔案
[[email protected] full]# cd /backup/full/2016-07-10_08-24-43/ 
[[email protected] 2016-07-10_08-24-43]# ll 
總用量 131108 
-rw-r----- 1 root root      387 7月  10 08:24 backup-my.cnf 
-rw-r----- 1 root root 134217728 7月  10 08:24 ibdata1 
drwx------ 2 root root      4096 7月  10 08:24 lichengbing 
drwx------ 2 root root      4096 7月  10 08:24 lilongzi 
drwx------ 2 root root      4096 7月  10 08:24 mysql 
drwx------ 2 root root      4096 7月  10 08:24 performance_schema 
-rw-r----- 1 root root        21 7月  10 08:24 xtrabackup_binlog_info 
-rw-r----- 1 root root      113 7月  10 08:24 xtrabackup_checkpoints #記錄LSN號檔案 
-rw-r----- 1 root root      503 7月  10 08:24 xtrabackup_info 
-rw-r----- 1 root root      2560 7月  10 08:24 xtrabackup_logfile 
[[email protected] 2016-07-10_08-24-43]# cat xtrabackup_checkpoints  
backup_type = full-backuped #備份型別為全備 
from_lsn = 0 #起始LSN號(由於是全備所以起始LSN號為0開始) 
to_lsn = 1672995 #截止LSN號 
last_lsn = 1672995 
compact = 0 
recover_binlog_info = 0

現在全備已經完成了,我們來模擬破壞資料,然後恢復資料。
首先停掉資料庫
[[email protected] 3306]# mysqladmin -uroot -pli123456 -S /data/3306/mysql.sock shutdown 
[[email protected] 3306]# mv /data/3306/data/ /data/3306/data_bak/ 
[[email protected] 3306]# mkdir -p /data/3306/data/ #必須建立一個新的空data資料夾用來恢復,不然恢復會報錯 
Original data directory /data/3306/data is not empty!

此時我們在開啟資料庫,發現數據庫檔案被破壞無法啟動了
[[email protected] 3306]# mysqld_safe --defaults-file=/data/3306/my.cnf & 
160710 10:05:14 mysqld_safe Logging to '/data/3306/mysql_oldboy3306.err'. 
160710 10:05:14 mysqld_safe Starting mysqld daemon with databases from /data/3306/data
160710 10:05:15 mysqld_safe mysqld from pid file /data/3306/mysqld.pid ended 
# pid程序檔案無法啟動 
[1]+  Done                    mysqld_safe --defaults-file=/data/3306/my.cnf 
[[email protected] 3306]# tail mysql_oldboy3306.err  
160710 10:05:15 InnoDB: 5.5.32 started; log sequence number 1595668 
160710 10:05:15 [Note] Recovering after a crash using /data/3306/mysql-bin
160710 10:05:15 [Note] Starting crash recovery... 
160710 10:05:15 [Note] Crash recovery finished. 
160710 10:05:15 [Note] Server hostname (bind-address): '0.0.0.0'; port: 3306 
160710 10:05:15 [Note]  - '0.0.0.0' resolves to '0.0.0.0'; 
160710 10:05:15 [Note] Server socket created on IP: '0.0.0.0'. 
160710 10:05:15 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist #提示相關資料庫表未找到 
160710 10:05:15 mysqld_safe mysqld from pid file /data/3306/mysqld.pid ended

準備全量恢復
[[email protected] 3306]# innobackupex --defaults-file=/data/3306/my.cnf --user=root --password=li123456 --apply-log /backup/full/2016-07-10_08-24-43/ 
... 
InnoDB: Waiting for purge to start 
InnoDB: 5.6.24 started; log sequence number 1673228 
xtrabackup: starting shutdown with innodb_fast_shutdown = 1 
InnoDB: FTS optimize thread exiting. 
InnoDB: Starting shutdown... 
InnoDB: Shutdown completed; log sequence number 1673238 
160710 08:42:01 completed OK!

#這裡的apply-log引數意思就是在正真恢復資料庫資料之前,先將資料庫redo日誌狀態恢復

接下來才是將資料檔案恢復
[[email protected] 3306]# innobackupex --defaults-file=/data/3306/my.cnf --copy-back /backup/full/2016-07-10_08-24-43/ 
... 
160710 08:43:41 [01]        ...done
160710 08:43:41 [01] Copying ./mysql/user.frm to /data/3306/data/mysql/user.frm 
160710 08:43:41 [01]        ...done
160710 08:43:41 [01] Copying ./mysql/tables_priv.MYI to /data/3306/data/mysql/tables_priv.MYI 
160710 08:43:41 [01]        ...done
160710 08:43:41 [01] Copying ./mysql/proxies_priv.MYI to /data/3306/data/mysql/proxies_priv.MYI 
160710 08:43:41 [01]        ...done
160710 08:43:41 completed OK!

再更改資料檔案屬組,啟動資料庫成功
[[email protected] 3306]# chown -R mysql.mysql data 
[[email protected] data]# mysqld_safe --defaults-file=/data/3306/my.cnf & 
[1] 90409 
[[email protected] data]# mysql -uroot -pli123456 -S /data/3306/mysql.sock 
mysql> show databases; 
+--------------------+ 
| Database          | 
+--------------------+ 
| information_schema | 
| lichengbing        | #資料表恢復成功 
| lilongzi          | 
| mysql              | 
| performance_schema | 
+--------------------+ 
5 rows in set (0.00 sec)

再來模擬一下增量備份
新插入幾行資料
[[email protected] opt]# mysql -uroot -pli123456 -S /data/3306/mysql.sock lichengbing < /opt/test2.sql 
mysql> select * from lichengbing.test; 
+----+-------+ 
| id | name  | 
+----+-------+ 
|  1 | one  | 
|  2 | two  | 
|  3 | three | 
|  4 | four  | #此時4、5、6相當於資料庫增量檔案 
|  5 | five  | 
|  6 | six  | 
+----+-------+ 
6 rows in set (0.00 sec)

增量備份
[[email protected] opt]# innobackupex --defaults-file=/data/3306/my.cnf --user=root --password=li123456 --incremental /backup/add/ --incremental-basedir=/backup/full/2016-07-10_08-24-43/ 
... 
160710 08:55:15 [00] Writing xtrabackup_info 
160710 08:55:15 [00]        ...done
xtrabackup: Transaction log of lsn (1673693) to (1673693) was copied. 
160710 08:55:15 completed OK! 
[[email protected] add]# cd /backup/add/2016-07-10_08-55-12/ 
[[email protected] 2016-07-10_08-55-12]# cat xtrabackup_checkpoints  
backup_type = incremental 
from_lsn = 1672995 #增量備份的起始LSN號是靠讀取全備xtrabackup_checkpoints檔案得到的 
to_lsn = 1673693 #增量結束LSN號 
last_lsn = 1673693 
compact = 0 
recover_binlog_info = 0

增量恢復
增量恢復和全量恢復有著一些不同,需要注意的是:
1)需要在每個備份(包括完全備份和增量備份)上,將已經提交的事務進行“重放”,重放之後,所有的備份資料將合併到完全備份上;

2)基於所有備份將未提交的事務進行“回滾”

關閉資料庫
[[email protected] ~]# mysqladmin -uroot -pli123456 -S /data/3306/mysql.sock shutdown

執行完全備份的前滾

[[email protected] ~]# innobackupex --defaults-file=/data/3306/my.cnf --user=root --pli123456 --apply-log --redo-only /backup/full/2016-07-10_08-24-43/

##--redo-only 在做增量恢復時,全量和增量備份的資料檔案在恢復前必須將在重做日誌檔案中的已提交的事務前滾!此引數將會合並全備和增量備份的資料檔案,但不包括最後一次增量備份的資料檔案

將全備和增備合併
[[email protected] ~]# innobackupex --defaults-files=/data/3306/my.cnf --user=root --pli123456 --apply-log /backup/full/2016-07-10_08-24-43/ --incremental-dir=/backup/add/2016-07-10_08-55-12/ 
##/backup/full/2016-07-10_08-24-43/ 全備目錄 
##--incremental-dir=/backup/add/2016-07-10_08-55-12/ 增量目錄 
##--redo-only 只有一次增備,所以不需要加這個引數,如果有N次增備,依次恢復增備,除了最後一個每次都要加 --redo-only的引數

破壞資料庫,將全備和增備恢復回來
[[email protected] 3306]# rm -fr data_bak 
[[email protected] 3306]# mv data data_bak 
[[email protected] 3306]# innobackupex --defaults-file=/data/3306/my.cnf --copy-back /backup/full/2016-07-10_08-24-43/ 
... 
160710 09:54:54 [01]        ...done
160710 09:54:54 [01] Copying ./mysql/user.frm to /data/3306/data/mysql/user.frm 
160710 09:54:54 [01]        ...done
160710 09:54:54 [01] Copying ./mysql/tables_priv.MYI to /data/3306/data/mysql/tables_priv.MYI 
160710 09:54:54 [01]        ...done
160710 09:54:55 [01] Copying ./mysql/proxies_priv.MYI to /data/3306/data/mysql/proxies_priv.MYI 
160710 09:54:55 [01]        ...done
160710 09:54:55 completed OK! 
[[email protected] 3306]# chown -R mysql.mysql data

恢復成功,登陸檢視
1234567891011121314 [[email protected] data]# mysqld_safe --defaults-file=/data/3306/my.cnf & 
[[email protected] data]# mysql -uroot -pli123456 -S /data/3306/mysql.sock 
mysql> select * from lichengbing.test; 
+----+-------+ 
| id | name  | 
+----+-------+ 
|  1 | one  | 
|  2 | two  | 
|  3 | three | 
|  4 | four  | 
|  5 | five  | 
|  6 | six  | 
+----+-------+ 
6 rows in set (0.00 sec)

其他一些備份示例
指定資料庫備份
[[email protected] each]# innobackupex --defaults-file=/data/3306/my.cnf  --user=root --password=li123456 --databases="lichengbing" /backup/each/

指定表備份
[[email protected] each]# innobackupex --defaults-file=/data/3306/my.cnf  --user=root --password=li123456 --databases="lichengbing test" /backup/each/

以壓縮格式備份
[[email protected] full]# innobackupex --defaults-file=/data/3306/my.cnf  --user=root --password=li123456 --stream=tar /backup/full/|gzip>/backup/full/back_`date +%F`.tar.gz

相關推薦

Xtrabackup 備份資料庫備份增量備份

Xtrabackup Xtrabackup是由percona開源的免費資料庫熱備份軟體,它能對InnoDB資料庫和XtraDB儲存引擎的資料庫非阻塞地備份(對於MyISAM的備份同樣需要加表鎖);mysqldump備份方式是採用的邏輯備份,其最大的缺陷是備份和恢復速度較

MySQL 資料庫備份恢復探討mysqldump 增量mysqlbinlog

背景介紹: 在開發、測試以及生產環境中,每次修改MySQL資料庫,嚴格上來說,都應該事先備份資料庫,以便修改錯誤後導致資料庫掛掉或者不能用,能夠及時還原為修改前的資料庫;另外,在實際使用中也可能因為不正確的使用MySQL資料庫,導致資料庫不可用。因此,做好MySQL資料庫的備份和恢復具有重要的意

mysqldump 定時備份數據

off quick tar innodb 引擎 -a 管理工具 -1 l數據庫 MYSQL 數據庫備份有很多種(cp、tar、lvm2、mysqldump、xtarbackup)等等,具體使用哪一個還要看你的數據規模。下面給出一個表 #摘自《學會用各種姿態備份Mysql

[MySQL] innobackupex線上備份及恢復增量

Xtrabackup是由percona開發的一個開源軟體,它是innodb熱備工具ibbackup(收費的商業軟體)的一個開源替代品。Xtrabackup由個部分組成:xtrabackup和innobackupex,其中xtrabackup工具用於備份innodb和 xtr

關於Subversion主從備份方式的調整增量腳本更新

關於 是否 incr times ext style 否則 ges sla 本文引用於http://blog.chinaunix.net/uid-25266990-id-3369172.html 之前對Subversion服務器作了遷移,關於SVN的架構也走了調整,有單一的

mysql自動備份

備份環境:Linux 3.10.0-862.e17.x86_64 Mysql版本:5.7.0 本次備份使用crontab 定時執行備份指令碼方法,備份指令碼使用mysql 的mysqldump進行備份; 具體方法如下: 編寫備份指令碼: #!/bin/bash MY_USER="

MySQL定時備份備份+增量備份

參考 zone7_ 的 實戰-MySQL定時備份系列文章 說明 產品上線後,資料非常非常重要,萬一哪天資料被誤刪,那麼就gg了,準備跑路吧。 所以要對線上的資料庫定時做全量備份和增量備份。 增量備份的優點是沒有重複資料,備份量不大,時間短。但缺點也很明顯,需要建立在上次完全備份及完全備份之後所有的增量才

Mysql備份+增量+恢復方案操作記錄

1、開啟mysql的binlog日誌&檢視$備份 2、shell指令碼 mysqldump 變數說明 --all-databases針對所有資料庫進行備份  --databases databasename 針對單個數據庫進行備份 --flush-logs為結束當前

mysqldump備份+增量方案操作記錄

在日常運維工作中,對mysql資料庫的備份是萬分重要的,以防在資料庫表丟失或損壞情況出現,可以及時恢復資料。 線上資料庫備份場景:每週日執行一次全量備份,然後每天下午1點執行MySQLdump增量備份. 下面對這種備份方案詳細說明下:1.MySQLdump增量備份配置

MySQL資料庫+增量+二進位制日誌的備份與恢復

一、簡介資料的備份與恢復 1、為什麼備份? 災難恢復:人為錯誤、硬體故障(冗餘)、軟體故障(bug)、自然災害、黑客攻擊、誤操作、…; 測試; 2、備份時應該注意些什麼? 能容忍最多丟失多少資料; 恢復資料需要在多長時間內完成; 需要恢復哪些資料;

MySQL自動化+增量備份指令碼

文章轉自:http://www.it-hack.cn/forum.php?mod=viewthread&tid=220&extra=page%3D1一、MySQL的日常備份方案:全備+增量備份:1、週日凌晨三點進行全備;2、週一到週日增量備份。不是往常的週日全備份,週一到週六增量備份,這樣如果

svn備份指令碼備份增量備份

前段時間發現內網伺服器的備份目錄越來大,感覺有點不對勁,原來是備份指令碼有問題,遂重新寫了一下備份指令碼,並分為全量備份和增量備份。 一、增量備份指令碼 #!/bin/bash #svn 增量備份指令碼 repos_path="/home/svn/repos" repos=

mysql 備份增量備份

mysql備份mysql 全量備份:vim /root/mysql_bakup.sh #!/bin/bash#Date:2017/5/2#Author:wangpengtai#Blog:http://wangpengtai.blog.51cto.com#At Sunday, we will backup th

負責數據庫的備份,實現周一 之 周六增量備份,周日備份

數據庫 增量 備份 1、mysql全量備份、增量備份。開啟mysql的logbin日誌功能。在/etc/my.cnf文件中加入以下代碼: [mysqld]log-bin ="/home/mysql/logbin.log"binlog-format = ROWlog-bin-index ="/hom

在遠端伺服器上備份/恢復資料庫Oracle資料庫

備份用exp命令: exp 使用者名稱/密碼@遠端伺服器ip:埠號/使用者名稱 file=儲存的路徑 其中使用者名稱是在遠端伺服器中你要備份的庫的使用者名稱 案列:exp fund02/[email protected]遠端伺服器ip(略):1523/

mysql備份增量備份

mysql全量備份指令碼 #!/bin/bash Data_back="/data/data_backup/"; Date=`date +"%Y_%m_%d"` mysqldump -uroot -proot --quick --events --flush-logs --single-trans

Others-資料平臺Lambda架構淺析計算+增量計算

大資料平臺Lambda架構淺析(全量計算+增量計算) 2016年12月23日 22:50:53 scuter_victor 閱讀數:1642 標籤: spark大資料lambda 更多

PostgreSQL備份與恢復

www.wohedb.com  中文資料庫管理系統                                 PostgreSQL備份與恢復     PostgreSQL提供了三種備份和恢復的方式:SQL dump、檔案系統複製和聯機熱備份。 每一種備份方式都有自己的

MySQL第五天增量備份增量恢復

sfdsday05一、數據備份與恢復-增量備份和增量恢復a.binlog日誌介紹(二進制文件):使用Mysql數據庫服務日誌文件類型的一種。記錄除查詢之外的sql命令。默認沒啟用 查詢的sql包括:select desc show 不是查詢的命令:insert update delete create dr

springCloud分散式事務實戰分散式事務綜合測試,共10篇

啟動註冊中心,啟動redis ,啟動事務管理器 啟動mysql 啟動微服務1 ,啟動微服務2(1)正常事務測試:不丟擲異常,兩邊都插入 1 設計沒有故障整合服務@TxTransaction(isStart=true) //關鍵 4 @Overridebr/>@Transactionalpublic