您好,登錄后才能下訂單哦!
這篇文章主要介紹了xtrabackup如何實現MySQL自動備份恢復,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
XtraBackup(PXB) 工具是 Percona 公司用 perl 語言開發的一個用于 MySQL 數據庫物理熱備的備份工具,支持 MySQl(Oracle)、Percona Server 和 MariaDB,并且全部開源,真可謂是業界良心。阿里的 RDS MySQL 物理備份就是基于這個工具做的。由于是采取物理拷貝的方式來做的備份,所以速度非常快,幾十G數據幾分鐘就搞定了,而它巧妙的利用了mysql 特性做到了在線熱備份,不用像以前做物理備份那樣必須關閉數據庫才行,直接在線就能完成整庫或者是部分庫的全量備份和增量備份。新版本的xtrabackup改成了cmake安裝,和以前有點不一樣。
版本說明:這里安裝的版本是2.4.6,而2.3.3之后不備份死鎖了,如果數據庫是mysql 5.7之后的必須要裝2.4.4才可以用,當然了, 會向下兼容的。
工具集:軟件包安裝后,有以下可執行文件(版本2.4.6)
bin/
├── innobackupex -> xtrabackup
├── xbcloud
├── xbcloud_osenv
├── xbcrypt
├── xbstream
└── xtrabackup
其中最主要的是 innobackupex 和 xtrabackup,前者是一個 perl 腳本,后者是 C/C++ 編譯的二進制。Percona 在2.3 版本用C重寫了 innobackupex ,innobackupex 功能全部集成到 xtrabackup 里面,只有一個 binary,另外為了使用上的兼容考慮,innobackupex 作為 xtrabackup 的一個軟鏈接。對于二次開發來說,2.3 擺脫了之前2個進程協作的負擔,架構上明顯要好于之前版本。(Percona XtraBackup 2.3 發布之后,推薦的備份方法是使用 xtrabackup 腳本)
xtrabackup 是用來備份 InnoDB 表的,不能備份非 InnoDB 表,和 mysqld server 沒有交互;innobackupex 腳本用來備份非 InnoDB 表,同時會調用 xtrabackup 命令來備份 InnoDB 表,還會和 mysqld server 發送命令進行交互,如加讀鎖(FTWRL)、獲取位點(SHOW SLAVE STATUS)等。簡單來說,innobackupex 在 xtrabackup 之上做了一層封裝。
一般情況下,我們是希望能備份 MyISAM 表的,雖然我們可能自己不用 MyISAM 表,但是 mysql 庫下的系統表是 MyISAM 的,因此備份基本都通過 innobackupex 命令進行;另外一個原因是我們可能需要保存位點信息。
另外幾個工具相對小眾些,xbcrypt 是加解密備份文件用的;xbstream 類似于tar,是 Percona 自己實現的一種支持并發寫的流文件格式;兩者在備份和解壓時都會用到(如果備份用了加密和并發)。xbcloud 工具的作用是:把全部或部分 xbstream 檔案從云上下載或上傳到云。
2.3版本之前 innobackupex 和 xtrabackup 這2個工具之間的交互和協調是通過控制文件的創建和刪除來實現的,2.3版本將 innobackupex 功能全部集成到 xtrabackup 里面,也就不需要他們之間的通信。這里介紹基于老的架構(2.2版本),但是原理和2.3是一樣的,只是實現上的差別。
整個備份過程如下圖:
1> innobackupex 在啟動后,會先 fork 一個進程,啟動 xtrabackup進程,然后就等待 xtrabackup 備份完 ibd 數據文件;
2> xtrabackup 在備份 InnoDB 相關數據時,是有2種線程的,1種是 redo 拷貝線程,負責拷貝 redo 文件,1種是 ibd 拷貝線程,負責拷貝 ibd 文件;redo 拷貝線程只有一個,在 ibd 拷貝線程之前啟動,在 ibd 線程結束后結束。xtrabackup 進程開始執行后,先啟動 redo 拷貝線程,從最新的 checkpoint 點開始順序拷貝 redo 日志;然后再啟動 ibd 數據拷貝線程,在 xtrabackup 拷貝 ibd 過程中,innobackupex 進程一直處于等待狀態(等待文件被創建)。
3> xtrabackup 拷貝完成idb后,通知 innobackupex(通過創建文件),同時自己進入等待(redo 線程仍然繼續拷貝);
4> innobackupex 收到 xtrabackup 通知后,執行FLUSH TABLES WITH READ LOCK (FTWRL),取得一致性位點,然后開始備份非 InnoDB 文件(包括 frm、MYD、MYI、CSV、opt、par等)。拷貝非 InnoDB 文件過程中,因為數據庫處于全局只讀狀態,如果在業務的主庫備份的話,要特別小心,非 InnoDB 表(主要是MyISAM)比較多的話整庫只讀時間就會比較長,這個影響一定要評估到。
5> 當 innobackupex 拷貝完所有非 InnoDB 表文件后,通知 xtrabackup(通過刪文件) ,同時自己進入等待(等待另一個文件被創建);
6> xtrabackup 收到 innobackupex 備份完非 InnoDB 通知后,就停止 redo 拷貝線程,然后通知 innobackupex redo log 拷貝完成(通過創建文件);
7> innobackupex 收到 redo 備份完成通知后,就開始解鎖,執行 UNLOCK TABLES;
8> 最后 innobackupex 和 xtrabackup 進程各自完成收尾工作,如資源的釋放、寫備份元數據信息等,innobackupex 等待 xtrabackup 子進程結束后退出。
在上面描述的文件拷貝,都是備份進程直接通過操作系統讀取數據文件的,只在執行 SQL 命令時和數據庫有交互,基本不影響數據庫的運行,在備份非 InnoDB 時會有一段時間只讀(如果沒有MyISAM表的話,只讀時間在幾秒左右),在備份 InnoDB 數據文件時,對數據庫完全沒有影響,是真正的熱備。
InnoDB 和非 InnoDB 文件的備份都是通過拷貝文件來做的,但是實現的方式不同,前者是以page為粒度做的(xtrabackup),后者是 cp 或者 tar 命令(innobackupex),xtrabackup 在讀取每個page時會校驗 checksum 值,保證數據塊是一致的,而 innobackupex 在 cp MyISAM 文件時已經做了flush(FTWRL),磁盤上的文件也是完整的,所以最終備份集里的數據文件都是寫入完整的。
PXB 是支持增量備份的,但是只能對 InnoDB 做增量,InnoDB 每個 page 有個 LSN 號,LSN 是全局遞增的,page 被更改時會記錄當前的 LSN 號,page中的 LSN 越大,說明當前page越新(最近被更新)。每次備份會記錄當前備份到的LSN(xtrabackup_checkpoints 文件中),增量備份就是只拷貝LSN大于上次備份的page,比上次備份小的跳過,每個ibd文件最終備份出來的是增量 delta 文件。
MyISAM 是沒有增量的機制的,每次增量備份都是全部拷貝的。
增量備份過程和全量備份一樣,只是在 ibd 文件拷貝上有不同。
如果看恢復備份集的日志,會發現和 mysqld 啟動時非常相似,其實備份集的恢復就是類似 mysqld crash后,做一次 crash recover。
恢復的目的是把備份集中的數據恢復到一個一致性位點,所謂一致就是指原數據庫某一時間點各引擎數據的狀態,比如 MyISAM 中的數據對應的是 15:00 時間點的,InnoDB 中的數據對應的是 15:20 的,這種狀態的數據就是不一致的。PXB 備份集對應的一致點,就是備份時FTWRL的時間點,恢復出來的數據,就對應原數據庫FTWRL時的狀態。
因為備份時 FTWRL 后,數據庫是處于只讀的,非 InnoDB 數據是在持有全局讀鎖情況下拷貝的,所以非 InnoDB 數據本身就對應 FTWRL 時間點;InnoDB 的 ibd 文件拷貝是在 FTWRL 前做的,拷貝出來的不同 ibd 文件最后更新時間點是不一樣的,這種狀態的 ibd 文件是不能直接用的,但是 redo log 是從備份開始一直持續拷貝的,最后的 redo 日志點是在持有 FTWRL 后取得的,所以最終通過 redo 應用后的 ibd 數據時間點也是和 FTWRL 一致的。
所以恢復過程只涉及 InnoDB 文件的恢復,非 InnoDB 數據是不動的。備份恢復完成后,就可以把數據文件拷貝到對應的目錄,然后通過mysqld來啟動了。
注:以上原理摘自阿里云數據庫內核月報。
1> 文件權限
xtrabackup以read-write模式打開innodb的數據文件,然后對其進行復制。其實它不會修改此文件。也就是說,運行xtrabackup的用戶,必須對innodb的數據文件具有讀寫權限。為什么要用rw模式呢?直接read模式不好么?因為xtrabackup采用了其內置的innodb庫來打開文件,而innodb庫打開文件的時候就是rw的。
2> 調整操作系統緩沖區
因為XtraBackup要從文件系統中復制大量的數據,所以它盡可能地使用 posix_fadvise(),來告訴OS不要緩存讀取到的數據,因為這些數據不會重用到了,從而提升性能。如果一次備份要緩存幾個G的數據,會對OS的虛擬內存造成很大的壓力,其它進程,比如mysqld很有可能被swap出去,這樣系統就會受到很大影響了。xtrabackup 就是通過 posix_fadvise() 來避免這種情況:
posix_fadvise(file,0,0,POSIX_FADV_DONTNEED)
而且, xtrabackup 要求操作系統對源文件進行更多的預讀優化:
posix_fadvise(file,0,0,POSIX_FADV_SEQUENTIAL)
3> 復制數據文件
在備份innodb page的過程中,XtraBackup 每次讀寫1MB的數據,1MB/16KB=64個page。這個不可配置。讀取1MB數據之后,XtraBackup一頁一頁地遍歷這1MB數據,并使用innodb的buf_page_is_corrupted()函數檢查此頁的數據是否正常,如果數據不正常,就重新讀取這一頁,最多重新讀取10次(注意:doublewrite buffer 中的 page 會跳過此檢查)。
在復制 transactions log(redo log) 的時候,每次讀寫512KB的數據。同樣不可以配置。
l rpm 安裝(下載:https://pan.baidu.com/s/1sl4jByP)
l 二進制安裝/解壓縮安裝(下載:https://pan.baidu.com/s/1c1Vyt3q)
l 編譯安裝
1> rpm 安裝
這種安裝方法比較簡單,只需下載相應的rpm安裝包安裝即可(注意根據提示安裝相應的依賴包)。其中需要的 libev.so.4() 安裝包:https://pan.baidu.com/s/1i4EZfwT
[root@orcl ~]# cat /etc/issue
Red Hat Enterprise Linux Server release 6.5 (Santiago)
[root@orcl ~]# uname -r
2.6.32-431.el6.x86_64
[root@orcl ~]# rpm -ivh libev-4.15-1.el6.rf.x86_64.rpm
warning: libev-4.15-1.el6.rf.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 6b8d79e6: NOKEY
Preparing... ########################################### [100%]
1:libev ########################################### [100%]
#### linux 6.5還需要安裝以下依賴
# yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL
[root@orcl ~]# rpm -ivh percona-xtrabackup-24-2.4.6-2.el6.x86_64.rpm
warning: percona-xtrabackup-24-2.4.6-2.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
Preparing... ########################################### [100%]
1:percona-xtrabackup-24 ########################################### [100%]
[root@orcl ~]# xtrabackup --version
xtrabackup version 2.4.6 based on MySQL server 5.7.13 Linux (x86_64) (revision id: 8ec05b7)
2> 二進制安裝/解壓縮安裝
這種安裝方法也很簡單,不需要安裝依賴,只需解壓安裝文件,為了方便可創建軟連接
# tar zxvf percona-xtrabackup-2.4.6-Linux-x86_64.tar.gz #解壓目錄下有3個目錄: bin man percona-xtrabackup-2.4-test
# mv percona-xtrabackup-2.4.6-Linux-x86_64 /usr/local/xtrabackup
# ln -sf /usr/local/xtrabackup/bin/* /usr/bin/ #給命令建個軟連接
[root@centos6 ~]# xtrabackup --version
xtrabackup version 2.4.6 based on MySQL server 5.7.13 Linux (x86_64) (revision id: 8ec05b7)
3> 編譯安裝
這種安裝方法比較麻煩,需要安裝很多依賴,也很耗時間,這里就不做介紹了
xtrabackup 工具有許多參數,具體可去官網查詢(xtrabackup 參數選項 | innobackupex 參數選項),這里簡單介紹 innobackupex 一些常用的參數。
--defaults-file=[MY.CNF] //指定配置文件:只能從給定的文件中讀取默認選項。 且必須作為命令行上的第一個選項;必須是一個真實的文件,它不能是一個符號鏈接。
--databases=# //指定備份的數據庫和表,格式為:--database="db1[.tb1] db2[.tb2]" 多個庫之間以空格隔開,如果此選項不被指定,將會備份所有的數據庫。
--include=REGEXP //用正則表達式的方式指定要備份的數據庫和表,格式為 --include=‘^mydb[.]mytb’ ,對每個庫中的每個表逐一匹配,因此會創建所有的庫,不過是空的目錄。--include 傳遞給 xtrabackup --tables。
--tables-file=FILE //此選項的參數需要是一個文件名,此文件中每行包含一個要備份的表的完整名稱,格式為databasename.tablename。該選項傳遞給 xtrabackup --tables-file,與--tables選項不同,只有要備份的表的庫才會被創建。
注意:部分備份(--include、--tables-file、--database)需要開啟 innodb_file_per_table 。
--compact //創建緊湊型備份,忽略所有輔助索引頁,只備份data page;通過--apply-log中重建索引--rebuild-indexs。
--compress //此選項指示xtrabackup壓縮備份的InnoDB數據文件,會生成 *.qp 文件。
--decompress //解壓縮qp文件,為了解壓縮,必須安裝 qpress 工具。 Percona XtraBackup不會自動刪除壓縮文件,為了清理備份目錄,用戶應手動刪除 * .qp文件:find /data/backup -name "*.qp" | xargs rm。
--no-timestamp //指定了這個選項備份將會直接存儲在 BACKUP-DIR 目錄,不再創建時間戳文件夾。
--apply-log //應用 BACKUP-DIR 中的 xtrabackup_logfile 事務日志文件。一般情況下,在備份完成后,數據尚且不能用于恢復操作,因為備份的數據中可能會包含尚未提交的事務或已經提交但尚未同步至數據文件中的事務。因此,此時數據文件仍處于不一致狀態。“準備”的主要作用正是通過回滾未提交的事務及同步已經提交的事務至數據文件使得數據文件處于一致性狀態。
--use-memory=# //此選項接受一個字符參數(1M/1MB,1G/1GB,默認100M),僅與--apply-log一起使用,該選項指定prepare時用于崩潰恢復(crash-recovery)的內存。
--copy-back //拷貝先前備份所有文件到它們的原始路徑。但原路徑下不能有任何文件或目錄,除非指定 --force-non-empty-directories 選項。
--force-non-empty-directories //恢復時指定此選項,可使 --copy-back 和 --move-back 復制文件到非空目錄,即原data目錄下可以有其他文件,但是不能有與恢復文件中同名的文件,否則恢復失敗。
--rsync //此選項可優化本地文件(非InnoDB)的傳輸。rsync工具一次性拷貝所有非InnoDB文件,而不是為每個文件單獨創建cp,在備份恢復很多數據庫和表時非常高效。此選項不能和 --stream 一起使用。
--incremental //這個選項告訴 xtrabackup 創建一個增量備份,而不是完全備份。它傳遞到 xtrabackup 子進程。當指定這個選項,可以設置 --incremental-lsn 或 --incremental-basedir。如果這2個選項都沒有被指定,--incremental-basedir 傳遞給 xtrabackup 默認值,默認值為:基礎備份目錄的第一個時間戳備份目錄。
--incremental-basedir=DIRECTORY //該選項接受一個字符串參數,該參數指定作為增量備份的基本數據集的完整備份目錄。它與 --incremental 一起使用。
--incremental-dir=DIRECTORY //該選項接受一個字符串參數,該參數指定了增量備份將與完整備份相結合的目錄,以便進行新的完整備份。它與 --incremental 選項一起使用。
--redo-only //在“準備基本完整備份” 和 “合并所有的增量備份(除了最后一個增備)”時使用此選項。它直接傳遞給xtrabackup的 xtrabackup --apply-log-only 選項,使xtrabackup跳過"undo"階段,只做"redo"操作。如果后面還有增量備份應用到這個全備,這是必要的。有關詳細信息,請參閱xtrabackup文檔。
--parallel=NUMBER-OF-THREADS //此選項接受一個整數參數,指定xtrabackup子進程應用于同時備份文件的線程數。請注意,此選項僅適用于文件級別,也就是說,如果您有多個.ibd文件,則它們將被并行復制; 如果您的表一起存儲在一個表空間文件中,它將不起作用。
--apply-log-only //這個選項使在準備備份(prepare)時,只執行重做(redo)階段,這對于增量備份非常重要。
## 創建用于備份恢復的用戶 pxb 并賦予權限
mysql> create user pxb@'localhost' identified by '123456';
mysql> grant reload,process,lock tables,replication client on *.* to pxb@localhost;
#### 這些權限僅僅只能完成:全備,增量備份,恢復;
一般如果需要部分備份,export表,import表,還需要:grant create tablespace on *.* to 'bkpuser'@'localhost';
如果還需要對備份的過程中對鎖進行一些優化,防止發生阻塞所有DML的情況,則還需要:
grant process,super on *.* to 'bkpuser'@'localhost';
## 創建存放備份目錄
[root@orcl ~]# mkdir -pv /data/pxb
mkdir: created directory `/data'
mkdir: created directory `/data/pxb'
[root@orcl ~]# innobackupex ----defaults-file=/etc/my.cnf --user=pxb --password=123456 --socket=/app/mysql/tmp/mysql.sock /data/pxb/
180321 11:29:47 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!".
180321 11:29:47 version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup;port=3306;mysql_socket=/app/mysql/tmp/mysql.sock' as 'pxb' (using password: YES).
180321 11:29:47 version_check Connected to MySQL server
180321 11:29:47 version_check Executing a version check against the server...
180321 11:29:47 version_check Done.
180321 11:29:47 Connecting to MySQL server host: localhost, user: pxb, password: set, port: 3306, socket: /app/mysql/tmp/mysql.sock
Using server version 5.5.32-log
innobackupex version 2.4.6 based on MySQL server 5.7.13 Linux (x86_64) (revision id: 8ec05b7)
xtrabackup: uses posix_fadvise().
xtrabackup: cd to /app/mysql-5.5.32/data/
xtrabackup: open files limit requested 0, set to 1024
xtrabackup: using the following InnoDB configuration:
xtrabackup: innodb_data_home_dir = .
xtrabackup: innodb_data_file_path = ibdata1:10M:autoextend
xtrabackup: innodb_log_group_home_dir = ./
xtrabackup: innodb_log_files_in_group = 2
xtrabackup: innodb_log_file_size = 5242880
InnoDB: Number of pools: 1
180321 11:29:47 >> log scanned up to (1610330)
xtrabackup: Generating a list of tablespaces
180321 11:29:48 [01] Copying ./ibdata1 to /data/pxb/2018-03-21_11-29-47/ibdata1
180321 11:29:48 [01] ...done
180321 11:29:48 >> log scanned up to (1610330)
180321 11:29:49 Executing FLUSH NO_WRITE_TO_BINLOG TABLES...
180321 11:29:49 Executing FLUSH TABLES WITH READ LOCK...
180321 11:29:49 Starting to backup non-InnoDB tables and files
。。。。。。。。。
180321 11:29:50 Executing UNLOCK TABLES
180321 11:29:50 All tables unlocked
180321 11:29:50 Backup created in directory '/data/pxb/2018-03-21_11-29-47/'
MySQL binlog position: filename 'mysql-bin.000001', position '366'
180321 11:29:50 [00] Writing backup-my.cnf
180321 11:29:50 [00] ...done
180321 11:29:50 [00] Writing xtrabackup_info
180321 11:29:50 [00] ...done
xtrabackup: Transaction log of lsn (1610330) to (1610330) was copied.
180321 11:29:50 completed OK!
可以看到整個備份過程:連接數據庫,開始拷貝redo log,拷貝innodb表文件,鎖表、拷貝非innodb表文件,停止拷貝redo log,解鎖。
[root@orcl ~]# ls -lrht /data/pxb/2018-03-21_11-29-47/
total 19M
-rw-r----- 1 root root 18M Mar 21 11:29 ibdata1
drwxr-x--- 2 root root 4.0K Mar 21 11:29 mysql
drwxr-x--- 2 root root 4.0K Mar 21 11:29 shaw_db
drwxr-x--- 2 root root 4.0K Mar 21 11:29 performance_schema
-rw-r----- 1 root root 21 Mar 21 11:29 xtrabackup_binlog_info
-rw-r----- 1 root root 2.5K Mar 21 11:29 xtrabackup_logfile
-rw-r----- 1 root root 113 Mar 21 11:29 xtrabackup_checkpoints
-rw-r----- 1 root root 417 Mar 21 11:29 backup-my.cnf
-rw-r----- 1 root root 530 Mar 21 11:29 xtrabackup_info
其中,mysql/, performance_schema/, shaw_db/ 下存放的是數據庫文件。
backup-my.cnf,備份命令用到的配置選項信息;
[root@orcl 2018-03-21_11-29-47]# cat backup-my.cnf
# This MySQL options file was generated by innobackupex.
# The MySQL server
[mysqld]
innodb_checksum_algorithm=innodb
innodb_log_checksum_algorithm=innodb
innodb_data_file_path=ibdata1:10M:autoextend
innodb_log_files_in_group=2
innodb_log_file_size=5242880
innodb_fast_checksum=false
innodb_page_size=16384
innodb_log_block_size=512
innodb_undo_directory=.
innodb_undo_tablespaces=0
server_id=3
redo_log_version=0
ib_buffer_pool, buffer pool 中的熱數據,當設置 innodb_buffer_pool_dump_at_shutdown=1 ,在關閉 MySQL 時,會把內存中的熱數據保存在磁盤里 ib_buffer_pool 文件中,位于數據目錄下。
ibdata1,備份的共享表空間文件;
[root@orcl 2018-03-21_11-29-47]# file ibdata1
ibdata1: data
xtrabackup_binlog_info,mysql服務器當前正在使用的二進制日志文件及至備份這一刻為止二進制日志事件的位置;
[root@orcl 2018-03-21_11-29-47]# cat xtrabackup_binlog_info
mysql-bin.000001 366
xtrabackup_checkpoints,備份類型(如完全或增量)、備份狀態(如是否已經為prepared狀態)和LSN(日志序列號)范圍信息;
[root@orcl 2018-03-21_11-29-47]# cat xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 1610330
last_lsn = 1610330
compact = 0
recover_binlog_info = 0
xtrabackup_info,記錄備份的基本信息,uuid、備份命令、備份時間、binlog、LSN、以及其他加密壓縮等信息。
[root@orcl 2018-03-21_11-29-47]# cat xtrabackup_info
uuid = 1cbf36cc-2cb8-11e8-8495-000c29ee24c9
name =
tool_name = innobackupex
tool_command = ----defaults-file=/etc/my.cnf --user=pxb --password=... --socket=/app/mysql/tmp/mysql.sock /data/pxb/
tool_version = 2.4.6
ibbackup_version = 2.4.6
server_version = 5.5.32-log
start_time = 2018-03-21 11:29:47
end_time = 2018-03-21 11:29:50
lock_time = 0
binlog_pos = filename 'mysql-bin.000001', position '366'
innodb_from_lsn = 0
innodb_to_lsn = 1610330
partial = N
incremental = N
format = file
compact = N
compressed = N
encrypted = N
xtrabackup_logfile,備份的重做日志文件。
[root@orcl 2018-03-21_11-29-47]# file xtrabackup_logfile
xtrabackup_logfile: data
## 關閉數據庫并刪除數據文件
mysql> create table shaw_db.t_zhongbak as select * from mysql.user; --沒做備份的數據會丟失
[root@orcl ~]# /etc/init.d/mysqld stop
Shutting down MySQL.... [ OK ]
[root@orcl ~]# cd /app/mysql/
[root@orcl mysql]# mv data/ data_bak/
[root@orcl mysql]# mkdir data
準備(prepare)一個完全備份(兩次prepare,第一次應用備份期間產生的redo log,進行前滾和回滾:replay在redo log中已經提交的事務,rollback沒有提交的事務): --apply-log ( /data/pxb/2018-03-21_11-29-47/ 為備份目錄,執行之后 xtrabackup_checkpoints 文件中的 backup_type = full-prepared )
[root@orcl ~]# innobackupex --apply-log /data/pxb/2018-03-21_11-29-47/
180321 11:51:10 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!".
。。。。。。
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: FTS optimize thread exiting.
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 1610792
180321 11:51:14 completed OK!
## --apply-log會調用 xtrabackup --prepare兩次,第一次前滾和回滾,第二次生成iblogfile[0|1]
直接將上面prepare好的所有文件,復制到mysqld的datadir目錄(會讀取my.cnf中的配置信息)。
--copy--back的注意事項:
1> datadir的目錄必須是空的,或者使用--force-non-empty-directories選項;
2> mysqld必須關閉,如果是--import部分恢復,則不能關閉;
3> --copy-back完成之后,需要修改datadir目錄下的文件權限: chown -R mysql:mysql /var/lib/mysql
## 執行恢復操作
[root@orcl ~]# innobackupex --defaults-file=/etc/my.cnf --copy-back --rsync /data/pxb/2018-03-21_11-29-47/
180321 12:20:29 innobackupex: Starting the copy-back operation
IMPORTANT: Please check that the copy-back run completes successfully.
At the end of a successful copy-back run innobackupex
prints "completed OK!".
innobackupex version 2.4.6 based on MySQL server 5.7.13 Linux (x86_64) (revision id: 8ec05b7)
Error: datadir must be specified.
## 添加datadir目錄
[root@orcl ~]# vi /etc/my.cnf
datadir =/app/mysql/data
[root@orcl ~]# innobackupex --defaults-file=/etc/my.cnf --copy-back --rsync /data/pxb/2018-03-21_11-29-47/
180321 12:25:39 innobackupex: Starting the copy-back operation
IMPORTANT: Please check that the copy-back run completes successfully.
At the end of a successful copy-back run innobackupex
prints "completed OK!".
innobackupex version 2.4.6 based on MySQL server 5.7.13 Linux (x86_64) (revision id: 8ec05b7)
180321 12:25:39 [01] Copying ib_logfile0 to /app/mysql/data/ib_logfile0
180321 12:25:39 [01] ...done
。。。。。。
Copying ./performance_schema/events_waits_summary_by_thread_by_event_name.frm to /app/mysql/data/performance_schema/events_waits_summary_by_thread_by_event_name.frm
180321 12:25:41 [01] ...done
180321 12:25:41 [01] Copying ./xtrabackup_info to /app/mysql/data/xtrabackup_info
180321 12:25:41 [01] ...done
180321 12:25:41 completed OK!
## 更改 data/ 目錄權限并啟動mysql
[root@orcl ~]# chown -R mysql. /app/mysql/data
## 啟動mysql服務
[root@orcl ~]# /etc/init.d/mysqld start
Starting MySQL.. [ OK ]
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| shaw_db |
+--------------------+
mysql> use shaw_db
Database changed
mysql> show tables;
+-------------------+
| Tables_in_shaw_db |
+-------------------+
| t_user |
| t_zhong |
+-------------------+
2 rows in set (0.00 sec)
增量備份之前,必須建立一個全備,第一次增量備份是在全備的基礎之上,第二次增量備份是在第一次增量備份的基礎之上的,依次類推
## 新建一張表,并插入寫數據,然后做增量備份
mysql> create table shaw_db.t_shaw as select * from mysql.user;
mysql> create table shaw_db.t_zhongbak as select * from shaw_db.t_zhong;
## 以全備為基準:(/data/pxb/2018-03-21_12-32-32/)
[root@orcl ~]# innobackupex --defaults-file=/etc/my.cnf --user=pxb --password=123456 --socket=/app/mysql/tmp/mysql.sock --incremental /data/pxb/inc --incremental-basedir=/data/pxb/2018-03-21_12-32-32/ --parallel=2
180321 12:47:17 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!".
180321 12:47:17 version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup;port=3306;mysql_socket=/app/mysql/tmp/mysql.sock' as 'pxb' (using password: YES).
。。。。。。
180321 12:47:20 Executing UNLOCK TABLES
180321 12:47:20 All tables unlocked
180321 12:47:20 Backup created in directory '/data/pxb/inc/2018-03-21_12-47-17/'
MySQL binlog position: filename 'mysql-bin.000001', position '350'
180321 12:47:20 [00] Writing backup-my.cnf
180321 12:47:20 [00] ...done
180321 12:47:20 [00] Writing xtrabackup_info
180321 12:47:20 [00] ...done
xtrabackup: Transaction log of lsn (1631682) to (1631682) was copied.
180321 12:47:20 completed OK!
[root@orcl ~]# cat /data/pxb/inc/2018-03-21_12-47-17/xtrabackup_checkpoints
backup_type = incremental ## 說明是增量備份
from_lsn = 1615487
to_lsn = 1631682
last_lsn = 1631682
compact = 0
recover_binlog_info = 0
## 再新建一些表,并插入寫數據,然后做增量備份
mysql> create table shaw_db.t_shaw2 as select * from mysql.user;
mysql> create table shaw_db.t_zhongbak2 as select * from shaw_db.t_zhong;
## 以增量1為基準:(/data/pxb/inc/2018-03-21_12-47-17/)
[root@orcl ~]# innobackupex --defaults-file=/etc/my.cnf --user=pxb --password=123456 --socket=/app/mysql/tmp/mysql.sock --incremental /data/pxb/inc/ --incremental-basedir=/data/pxb/inc/2018-03-21_12-47-17/ --parallel=4
180321 12:54:18 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!".
180321 12:54:18 version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup;port=3306;mysql_socket=/app/mysql/tmp/mysql.sock' as 'pxb' (using password: YES).
180321 12:54:18 version_check Connected to MySQL server
180321 12:54:18 version_check Executing a version check against the server...
180321 12:54:18 version_check Done.
180321 12:54:18 Connecting to MySQL server host: localhost, user: pxb, password: set, port: 3306, socket: /app/mysql/tmp/mysql.sock
。。。。。。
180321 12:54:22 Executing UNLOCK TABLES
180321 12:54:22 All tables unlocked
180321 12:54:22 Backup created in directory '/data/pxb/inc/2018-03-21_12-54-18/'
MySQL binlog position: filename 'mysql-bin.000001', position '589'
180321 12:54:22 [00] Writing backup-my.cnf
180321 12:54:22 [00] ...done
180321 12:54:22 [00] Writing xtrabackup_info
180321 12:54:22 [00] ...done
xtrabackup: Transaction log of lsn (1648889) to (1648889) was copied.
180321 12:54:22 completed OK!
[root@orcl ~]# cat /data/pxb/inc/2018-03-21_12-54-18/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 1631682
to_lsn = 1648889
last_lsn = 1648889
compact = 0
recover_binlog_info = 0
增量備份的恢復需要有3個步驟
1> 恢復完全備份
2> 恢復增量備份到完全備份(開始恢復的增量備份要添加--redo-only參數,到最后一次增量備份要去掉--redo-only)
3> 對整體的完全備份進行恢復,回滾未提交的數據
[root@orcl ~]# innobackupex --apply-log --redo-only /data/pxb/2018-03-21_12-32-32/
180321 14:21:11 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!".
。。。。。。
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 1615930
InnoDB: Number of pools: 1
180321 14:21:13 completed OK!
[root@orcl ~]# innobackupex --apply-log --redo-only /data/pxb/2018-03-21_12-32-32/ --incremental-dir=/data/pxb/inc/2018-03-21_12-47-17/
180321 14:22:41 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!".
。。。。。。
180321 14:22:44 [00] ...done
180321 14:22:44 [00] Copying /data/pxb/inc/2018-03-21_12-47-17//xtrabackup_info to ./xtrabackup_info
180321 14:22:44 [00] ...done
180321 14:22:44 completed OK!
[root@orcl ~]# innobackupex --apply-log /data/pxb/2018-03-21_12-32-32/ --incremental-dir=/data/pxb/inc/2018-03-21_12-54-18/
180321 14:24:29 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!".
[root@orcl ~]# innobackupex --apply-log /data/pxb/2018-03-21_12-32-32/
180321 14:26:11 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!".
。。。。。。
InnoDB: 5.7.13 started; log sequence number 1615930
InnoDB: xtrabackup: Last MySQL binlog file position 589, file name ./mysql-bin.000001
xtrabackup: error: The transaction log file is corrupted.
xtrabackup: error: The log was not applied to the intended LSN!
xtrabackup: Log applied to lsn 1615930
xtrabackup: The intended lsn is 1648889
## 先刪除data目錄
[root@orcl ~]# rm -rf /app/mysql/data
[root@orcl ~]# mkdir /app/mysql/data
## 恢復數據庫
[root@orcl ~]# innobackupex --defaults-file=/etc/my.cnf --copy-back --rsync /data/pxb/2018-03-21_12-32-32/
180321 14:31:56 innobackupex: Starting the copy-back operation
IMPORTANT: Please check that the copy-back run completes successfully.
At the end of a successful copy-back run innobackupex
prints "completed OK!".
。。。。。。
180321 14:31:58 [01] Copying ./xtrabackup_binlog_pos_innodb to /app/mysql/data/xtrabackup_binlog_pos_innodb
180321 14:31:58 [01] ...done
180321 14:31:58 completed OK!
[root@orcl ~]# chown -R mysql:mysql /app/mysql/data
[root@orcl ~]# /etc/init.d/mysqld start
Starting MySQL...The server quit without updating PID file [FAILED]sql/data/orcl.pid).
[root@orcl ~]# ps -ef |grep mysql
[root@orcl ~]# killall mysqld
[root@orcl ~]# /etc/init.d/mysqld start
Starting MySQL.. [ OK ]
mysql> use shaw_db;
Database changed
mysql> show tables;
+-------------------+
| Tables_in_shaw_db |
+-------------------+
| t_shaw |
| t_shaw2 |
| t_zhong |
| t_zhongbak |
| t_zhongbak2 |
+-------------------+
在備份非innodb數據庫時,會使用:flush tables with read lock 全局鎖鎖住整個數據庫。如果數據庫中有一個長查詢在運行,那么FTWRL就不能獲得,會被阻塞,進而阻塞所有的DML操作。此時即使我們kill掉FTWRL全局鎖也是無法從阻塞中恢復出來的。另外在我們成功的獲得了FTWRL全局鎖之后,在copy非事務因為的文件的過程中,整個數據庫也是被鎖住的。所以我們應該讓FTWRL的過程盡量的短。(在copy非事務引擎數據的文件時,會阻塞innodb事務引擎。當然也會阻塞所有其他非事務引擎。)
--ftwrl-wait-timeout=60 防止發生阻塞
--rsync 減少FTWRL時間 縮短備份非事務引擎表的鎖定時間
--parallel=4 開并行
--use-memory=4G crash recovery 期間使用的內存
--lock-wait-timeout=60 該選項表示:我們在FTWRL時,如果有長查詢,那么我們可以最多等待60S的時間,如果60秒之內長查詢執行完了,我們就可以成功執行FTWRL了,如果60秒之內沒有執行完,那么就直接報錯退出,放棄。默認值為0
--rsync 使用該選項來縮短備份非事務引擎表的鎖定時間,如果需要備份的數據庫和表數量很多時,可以加快速度。
--parallel=# 在備份階段,壓縮/解壓階段,加密/解密階段,--apply-log,--copy-back 階段都可以并行
--use-memory=# 在crash recovery 階段,也就是 --apply-log 階段使用該選項
# mkdir –p /data/pxb/baklog
#backup.sh
#!/bin/sh
#on xtrabackup 2.2.8
# 第一次執行它的時候它會檢查是否有完全備份,否則先創建一個全庫備份
# 當你再次運行它的時候,它會根據腳本中的設定來基于之前的全備或增量備份進行增量備份
#ocpyang@126.com
INNOBACKUPEX_PATH=innobackupex #INNOBACKUPEX的命令
INNOBACKUPEXFULL=/usr/bin/$INNOBACKUPEX_PATH #INNOBACKUPEX的命令路徑
#mysql目標服務器以及用戶名和密碼
MYSQL_CMD="--host=192.168.12.55 --user=root --password=111111 --port=3306"
MYSQL_UP=" --user=root --password='111111' --port=3306 " #mysqladmin的用戶名和密碼
TMPLOG="/data/pxb/innobackupex.$$.log"
MY_CNF=/etc/my.cnf #mysql的配置文件
MYSQL=/app/mysql/bin/mysql
MYSQL_ADMIN=/app/mysql/bin/mysqladmin
BACKUP_DIR=/data/pxb # 備份的主目錄
FULLBACKUP_DIR=$BACKUP_DIR/full # 全庫備份的目錄
INCRBACKUP_DIR=$BACKUP_DIR/incre # 增量備份的目錄
FULLBACKUP_INTERVAL=86400 # 全庫備份的間隔周期,時間:秒
KEEP_FULLBACKUP=1 # 至少保留幾個全庫備份
logfiledate=backup.`date +%Y%m%d%H%M`.txt
#開始時間
STARTED_TIME=`date +%s`
#############################################################################
# 顯示錯誤并退出
#############################################################################
error()
{
echo "$1" 1>&2
exit 1
}
# 檢查執行環境
if [ ! -x $INNOBACKUPEXFULL ]; then
error "$INNOBACKUPEXFULL未安裝或未鏈接到/usr/bin."
fi
if [ ! -d $BACKUP_DIR ]; then
error "備份目標文件夾:$BACKUP_DIR不存在."
fi
mysql_status=`netstat -nl | awk 'NR>2{if ($4 ~ /.*:3306/) {print "Yes";exit 0}}'`
if [ "$mysql_status" != "Yes" ];then
error "MySQL 沒有啟動運行."
fi
if ! `echo 'exit' | $MYSQL -s $MYSQL_CMD` ; then
error "提供的數據庫用戶名或密碼不正確!"
fi
# 備份的頭部信息
echo "----------------------------"
echo
echo "$0: MySQL備份腳本"
echo "開始于: `date +%F' '%T' '%w`"
echo
#新建全備和差異備份的目錄
mkdir -p $FULLBACKUP_DIR
mkdir -p $INCRBACKUP_DIR
#查找最新的完全備份
LATEST_FULL_BACKUP=`find $FULLBACKUP_DIR -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1`
# 查找最近修改的最新備份時間
LATEST_FULL_BACKUP_CREATED_TIME=`stat -c %Y $FULLBACKUP_DIR/$LATEST_FULL_BACKUP`
#如果全備有效進行增量備份否則執行完全備份
if [ "$LATEST_FULL_BACKUP" -a `expr $LATEST_FULL_BACKUP_CREATED_TIME + $FULLBACKUP_INTERVAL + 5` -ge $STARTED_TIME ] ; then
# 如果最新的全備未過期則以最新的全備文件名命名在增量備份目錄下新建目錄
echo -e "完全備份$LATEST_FULL_BACKUP未過期,將根據$LATEST_FULL_BACKUP名字作為增量備份基礎目錄名"
echo " "
NEW_INCRDIR=$INCRBACKUP_DIR/$LATEST_FULL_BACKUP
mkdir -p $NEW_INCRDIR
# 查找最新的增量備份是否存在.指定一個備份的路徑作為增量備份的基礎
LATEST_INCR_BACKUP=`find $NEW_INCRDIR -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1`
if [ ! $LATEST_INCR_BACKUP ] ; then
INCRBASEDIR=$FULLBACKUP_DIR/$LATEST_FULL_BACKUP
echo -e "增量備份將以$INCRBASEDIR作為備份基礎目錄"
echo " "
else
INCRBASEDIR=$INCRBACKUP_DIR/${LATEST_FULL_BACKUP}/${LATEST_INCR_BACKUP}
echo -e "增量備份將以$INCRBASEDIR作為備份基礎目錄"
echo " "
fi
echo "使用$INCRBASEDIR作為基礎本次增量備份的基礎目錄."
$INNOBACKUPEXFULL --defaults-file=$MY_CNF --use-memory=4G $MYSQL_CMD --incremental $NEW_INCRDIR --incremental-basedir $INCRBASEDIR > $TMPLOG 2>&1
#保留一份備份的詳細日志
cat $TMPLOG>/data/pxb/baklog/$logfiledate
if [ -z "`tail -1 $TMPLOG | grep 'completed OK!'`" ] ; then
echo "$INNOBACKUPEX命令執行失敗:"; echo
echo -e "---------- $INNOBACKUPEX_PATH錯誤 ----------"
cat $TMPLOG
rm -f $TMPLOG
exit 1
fi
THISBACKUP=`awk -- "/Backup created in directory/ { split( \\\$0, p, \"'\" ) ; print p[2] }" $TMPLOG`
rm -f $TMPLOG
echo -n "數據庫成功備份到:$THISBACKUP"
echo
# 提示應該保留的備份文件起點
LATEST_FULL_BACKUP=`find $FULLBACKUP_DIR -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1`
NEW_INCRDIR=$INCRBACKUP_DIR/$LATEST_FULL_BACKUP
LATEST_INCR_BACKUP=`find $NEW_INCRDIR -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1`
RES_FULL_BACKUP=${FULLBACKUP_DIR}/${LATEST_FULL_BACKUP}
RES_INCRE_BACKUP=`dirname ${INCRBACKUP_DIR}/${LATEST_FULL_BACKUP}/${LATEST_INCR_BACKUP}`
echo
echo -e '\e[31m NOTE:---------------------------------------------------------------------------------.\e[m' #紅色
echo -e "必須保留$KEEP_FULLBACKUP份全備即全備${RES_FULL_BACKUP}和${RES_INCRE_BACKUP}目錄中所有增量備份."
echo -e '\e[31m NOTE:---------------------------------------------------------------------------------.\e[m' #紅色
echo
else
echo "*********************************"
echo -e "正在執行全新的完全備份...請稍等..."
echo "*********************************"
$INNOBACKUPEXFULL --defaults-file=$MY_CNF --use-memory=4G $MYSQL_CMD $FULLBACKUP_DIR > $TMPLOG 2>&1
#保留一份備份的詳細日志
cat $TMPLOG>/data/pxb/baklog/$logfiledate
if [ -z "`tail -1 $TMPLOG | grep 'completed OK!'`" ] ; then
echo "$INNOBACKUPEX命令執行失敗:"; echo
echo -e "---------- $INNOBACKUPEX_PATH錯誤 ----------"
cat $TMPLOG
rm -f $TMPLOG
exit 1
fi
THISBACKUP=`awk -- "/Backup created in directory/ { split( \\\$0, p, \"'\" ) ; print p[2] }" $TMPLOG`
rm -f $TMPLOG
echo -n "數據庫成功備份到:$THISBACKUP"
echo
# 提示應該保留的備份文件起點
LATEST_FULL_BACKUP=`find $FULLBACKUP_DIR -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1`
RES_FULL_BACKUP=${FULLBACKUP_DIR}/${LATEST_FULL_BACKUP}
echo
echo -e '\e[31m NOTE:---------------------------------------------------------------------------------.\e[m' #紅色
echo -e "無增量備份,必須保留$KEEP_FULLBACKUP份全備即全備${RES_FULL_BACKUP}."
echo -e '\e[31m NOTE:---------------------------------------------------------------------------------.\e[m' #紅色
echo
fi
## 第一次備份:
[root@orcl ~]# sh mysqlbackup.sh
----------------------------
mysqlbackup.sh: MySQL備份腳本
開始于: 2018-03-21 16:11:21 3
*********************************
正在執行全新的完全備份...請稍等...
*********************************
數據庫成功備份到:/data/pxb/full/2018-03-21_16-11-21/
NOTE:---------------------------------------------------------------------------------.
無增量備份,必須保留1份全備即全備/data/pxb/full/2018-03-21_16-11-21.
NOTE:---------------------------------------------------------------------------------.
[root@orcl ~]# ls -lrht /data/pxb/full/
total 4.0K
drwxr-x--- 5 root root 4.0K Mar 21 16:11 2018-03-21_16-11-21
[root@orcl ~]# ls -lrht /data/pxb/incre/
total 0
[root@orcl ~]# ls -lrht /data/pxb/baklog/
total 20K
-rw-r--r-- 1 root root 18K Mar 21 16:11 backup.201803211611.txt
## 查看備份日志
[root@orcl ~]# tail -4 /data/pxb/baklog/backup.201803211611.txt
180321 16:11:23 [00] Writing xtrabackup_info
180321 16:11:23 [00] ...done
xtrabackup: Transaction log of lsn (1615930) to (1615930) was copied.
180321 16:11:23 completed OK!
## 第二次備份
[root@orcl ~]# sh mysqlbackup.sh
----------------------------
mysqlbackup.sh: MySQL備份腳本
開始于: 2018-03-21 16:15:11 3
完全備份2018-03-21_16-11-21未過期,將根據2018-03-21_16-11-21名字作為增量備份基礎目錄名
增量備份將以/data/pxb/full/2018-03-21_16-11-21作為備份基礎目錄
使用/data/pxb/full/2018-03-21_16-11-21作為基礎本次增量備份的基礎目錄.
數據庫成功備份到:/data/pxb/incre/2018-03-21_16-11-21/2018-03-21_16-15-11/
NOTE:---------------------------------------------------------------------------------.
必須保留1份全備即全備/data/pxb/full/2018-03-21_16-11-21和/data/pxb/incre/2018-03-21_16-11-21目錄中所有增量備份.
NOTE:---------------------------------------------------------------------------------.
## 第三次備份
[root@orcl ~]# sh mysqlbackup.sh
----------------------------
mysqlbackup.sh: MySQL備份腳本
開始于: 2018-03-21 16:15:50 3
完全備份2018-03-21_16-11-21未過期,將根據2018-03-21_16-11-21名字作為增量備份基礎目錄名
增量備份將以/data/pxb/incre/2018-03-21_16-11-21/2018-03-21_16-15-11作為備份基礎目錄
使用/data/pxb/incre/2018-03-21_16-11-21/2018-03-21_16-15-11作為基礎本次增量備份的基礎目錄.
數據庫成功備份到:/data/pxb/incre/2018-03-21_16-11-21/2018-03-21_16-15-50/
NOTE:---------------------------------------------------------------------------------.
必須保留1份全備即全備/data/pxb/full/2018-03-21_16-11-21和/data/pxb/incre/2018-03-21_16-11-21目錄中所有增量備份.
NOTE:---------------------------------------------------------------------------------.
## 備份日志
[root@orcl ~]# ls -lrht /data/pxb/baklog/
total 60K
-rw-r--r-- 1 root root 18K Mar 21 16:11 backup.201803211611.txt
-rw-r--r-- 1 root root 20K Mar 21 16:15 backup.201803211615.txt
-rw-r--r-- 1 root root 20K Mar 21 16:17 backup.201803211617.txt
## 先準備數據
mysql> use shaw_db
mysql> create table t_zhong(id int,name varchar(20));
mysql> insert into t_zhong values(100,'name');
## 然后執行一次備份腳本
[root@orcl ~]# sh mysqlbackup.sh
----------------------------
mysqlbackup.sh: MySQL備份腳本
開始于: 2018-03-21 16:26:28 3
完全備份2018-03-21_16-11-21未過期,將根據2018-03-21_16-11-21名字作為增量備份基礎目錄名
增量備份將以/data/pxb/incre/2018-03-21_16-11-21/2018-03-21_16-17-13作為備份基礎目錄
使用/data/pxb/incre/2018-03-21_16-11-21/2018-03-21_16-17-13作為基礎本次增量備份的基礎目錄.
數據庫成功備份到:/data/pxb/incre/2018-03-21_16-11-21/2018-03-21_16-26-28/
NOTE:---------------------------------------------------------------------------------.
必須保留1份全備即全備/data/pxb/full/2018-03-21_16-11-21和/data/pxb/incre/2018-03-21_16-11-21目錄中所有增量備份.
NOTE:---------------------------------------------------------------------------------.
## 刪除數據庫data目錄
[root@orcl ~]# rm -rf /app/mysql/data/
[root@orcl ~]# mkdir /app/mysql/data/
[root@orcl ~]# killall mysql
[root@orcl ~]# killall mysqld
[root@orcl ~]# /etc/init.d/mysqld start
Starting MySQL.The server quit without updating PID file (/[FAILED]l/data/orcl.pid).
## 準備恢復數據庫
=====>1 準備全備
[root@orcl ~]# innobackupex --apply-log --redo-only /data/pxb/full/2018-03-21_16-11-21/
# 應用增量備份
[root@orcl ~]# ls -lrht /data/pxb/incre/2018-03-21_16-11-21/
total 16K
drwxr-x--- 5 root root 4.0K Mar 21 16:15 2018-03-21_16-15-11
drwxr-x--- 5 root root 4.0K Mar 21 16:15 2018-03-21_16-15-50
drwxr-x--- 5 root root 4.0K Mar 21 16:17 2018-03-21_16-17-13
drwxr-x--- 5 root root 4.0K Mar 21 16:26 2018-03-21_16-26-28
=====>2 應用增量備份
[root@orcl ~]# innobackupex --apply-log --redo-only /data/pxb/full/2018-03-21_16-11-21/ --incremental-dir=/data/pxb/incre/2018-03-21_16-11-21/2018-03-21_16-15-11/
[root@orcl ~]# innobackupex --apply-log --redo-only /data/pxb/full/2018-03-21_16-11-21/ --incremental-dir=/data/pxb/incre/2018-03-21_16-11-21/2018-03-21_16-15-50/
[root@orcl ~]# innobackupex --apply-log --redo-only /data/pxb/full/2018-03-21_16-11-21/ --incremental-dir=/data/pxb/incre/2018-03-21_16-11-21/2018-03-21_16-17-13/
=====>3 應用最后一個增量備份
[root@orcl ~]# innobackupex --apply-log /data/pxb/full/2018-03-21_16-11-21/ --incremental-dir=/data/pxb/incre/2018-03-21_16-11-21/2018-03-21_16-17-13/
=====>4 執行完整應用,回滾未提交事務
[root@orcl ~]# innobackupex --apply-log /data/pxb/full/2018-03-21_16-11-21/
=====>5 恢復數據庫
[root@orcl ~]# innobackupex --defaults-file=/etc/my.cnf --copy-back --rsync /data/pxb/full/2018-03-21_16-11-21/
## 啟動數據庫,檢查
[root@orcl ~]# chown -R mysql. /app/mysql/data/
[root@orcl ~]# /etc/init.d/mysqld start
Starting MySQL.. [ OK ]
mysql> use shaw_db;
mysql> select * from t_zhong;
+------+------+
| id | name |
+------+------+
| 100 | name |
+------+------+
#### 根據情況修改
xtrabackup自動還原
************************************************************************************************
應用場景:
************************************************************************************************
1.備份目錄為/backup/full和/backup/incre的架構,前者保存全備,后者保存增量備份
2.如全備為/backup/full/2015-04-08_15-14-33則將全備的目錄名2015-04-08_15-14-33
作為/backup/incre/下增量備份的目錄名。這樣設計的初衷在于只要全備不過期,那么
這個全備文件之后的增量備份也不過期.
3.還原時,腳本會自動找到最新的全備和最新全備命名的增量備份目錄,并將增量備份
按照先后順序應用日志到全備中,最后完成還原.
************************************************************************************************
腳本
************************************************************************************************
#!/bin/sh
#
# 使用方法:
# ./restore.sh /增量備份父目錄
#ocpyang@126.com
#NOTE:恢復開始前請確保mysql服務停止以及數據和日志目錄清空,如
# rm -rf /usr/local/mysql/innodb_data/*
# rm -rf /usr/local/mysql/data/*
# rm -rf /usr/local/mysql/mysql_logs/innodb_log/*
INNOBACKUPEX=innobackupex
INNOBACKUPEX_PATH=/usr/local/xtrabackup/bin/$INNOBACKUPEX
TMP_LOG="/var/log/restore.$$.log"
MY_CNF=/usr/local/mysql/my.cnf
BACKUP_DIR=/backup # 你的備份主目錄
FULLBACKUP_DIR=$BACKUP_DIR/full # 全庫備份的目錄
INCRBACKUP_DIR=$BACKUP_DIR/incre # 增量備份的目錄
MEMORY=4096M # 還原的時候使用的內存限制數
ERRORLOG=`grep -i "^log-error" $MY_CNF |cut -d = -f 2`
MYSQLD_SAFE=/usr/local/mysql/bin/mysqld_safe
MYSQL_PORT=3306
#############################################################################
#顯示錯誤
#############################################################################
error()
{
echo "$1" 1>&2
exit 1
}
#############################################################################
# 檢查innobackupex錯誤輸出
#############################################################################
check_innobackupex_fail()
{
if [ -z "`tail -2 $TMP_LOG | grep 'completed OK!'`" ] ; then
echo "$INNOBACKUPEX命令執行失敗:"; echo
echo "---------- $INNOBACKUPEX的錯誤輸出 ----------"
cat $TMP_LOG
#保留一份備份的詳細日志
logfiledate=restore.`date +%Y%m%d%H%M`.txt
cat $TMP_LOG>/backup/$logfiledate
rm -f $TMP_LOG
exit 1
fi
}
# 選項檢測
if [ ! -x $INNOBACKUPEX_PATH ]; then
error "$INNOBACKUPEX_PATH在指定路徑不存在,請確認是否安裝或核實鏈接是否正確."
fi
if [ ! -d $BACKUP_DIR ]; then
error "備份目錄$BACKUP_DIR不存在."
fi
if [ $# != 1 ] ; then
error "使用方法: $0 使用還原目錄的絕對路徑"
fi
if [ ! -d $1 ]; then
error "指定的備份目錄:$1不存在."
fi
PORTNUM00=`netstat -lnt|grep ${MYSQL_PORT}|wc -l`
if [ $PORTNUM00 = 1 ];
then
echo -e '\e[31m NOTE:------------------------------------------.\e[m' #紅色
echo -e '\e[31m mysql處于運行狀態,請關閉mysql. \e[m' #紅色
echo -e '\e[31m NOTE:------------------------------------------.\e[m' #紅色
exit 0
fi
input_value=$1
intpu_res=`echo ${input_value%/*}`
# Some info output
echo "----------------------------"
echo
echo "$0: MySQL還原腳本"
START_RESTORE_TIME=`date +%F' '%T' '%w`
echo "數據庫還原開始于: $START_RESTORE_TIME"
echo
#PARENT_DIR=`dirname ${intpu_res}`
PARENT_DIR=${intpu_res}
if [ $PARENT_DIR = $FULLBACKUP_DIR ]; then
FULLBACKUP=${intpu_res}
echo "還原全備備份:`basename $FULLBACKUP`"
echo
else
if [ $PARENT_DIR = $INCRBACKUP_DIR ]; then
FULL=`ls -t $FULLBACKUP_DIR |head -1`
FULLBACKUP=$FULLBACKUP_DIR/$FULL
if [ ! -d $FULLBACKUP ]; then
error "全備:$FULLBACKUP不存在."
fi
INCR=`ls -t $INCRBACKUP_DIR/$FULL/ | head -1`
echo "還原將從全備$FULL開始,到增量$INCR結束."
echo
echo "Prepare:完整備份集..........."
echo "*****************************"
$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --redo-only --use-memory=$MEMORY $FULLBACKUP > $TMP_LOG 2>&1
check_innobackupex_fail
# Prepare增量備份集,即將增量備份應用到全備目錄中,按照增量備份順序即按照時間從舊到最新
for i in `find $PARENT_DIR/$FULL -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -n `;
do
#判斷最新全備的lsn
#check_full_file=`find $FULLBACKUP/ -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1`
check_full_lastlsn=$FULLBACKUP/xtrabackup_checkpoints
fetch_full_lastlsn=`grep -i "^last_lsn" ${check_full_lastlsn} |cut -d = -f 2`
######判斷增量備份中第一個增量備份的LSN
check_incre_file=`find $PARENT_DIR/$FULL -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -n | head -1`
check_incre_lastlsn=$PARENT_DIR/$FULL/$i/xtrabackup_checkpoints
fetch_incre_lastlsn=`grep -i "^last_lsn" ${check_incre_lastlsn} |cut -d = -f 2`
echo "完全備份的LSN:${fetch_full_lastlsn} "
echo "增量備份的LSN:${fetch_incre_lastlsn} "
if [ "${fetch_incre_lastlsn}" -eq "${fetch_full_lastlsn}" ];then
echo "*****************************************"
echo "LSN不需要prepare!"
echo "*****************************************"
echo
break
else
echo "Prepare:增量備份集$i........"
echo "*****************************"
$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --redo-only --use-memory=$MEMORY $FULLBACKUP --incremental-dir=$PARENT_DIR/$FULL/$i > $TMP_LOG 2>&1
check_innobackupex_fail
if [ $INCR = $i ]; then
break
fi
fi
######判斷LSN
done
else
error "未知的備份類型"
fi
fi
echo "prepare:全備集回滾那些未提交的事務..........."
$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --apply-log --use-memory=$MEMORY $FULLBACKUP > $TMP_LOG 2>&1
check_innobackupex_fail
echo "*****************************"
echo "數據庫還原中 ...請稍等"
echo "*****************************"
$INNOBACKUPEX_PATH --defaults-file=$MY_CNF --copy-back $FULLBACKUP > $TMP_LOG 2>&1
check_innobackupex_fail
rm -f $TMP_LOG
echo "1.恭喜,還原成功!."
echo "*****************************"
#修改目錄權限
echo "修改mysql目錄的權限."
mysqlcnf="/usr/local/mysql/my.cnf"
mysqldatadir=`grep -i "^basedir" $mysqlcnf |cut -d = -f 2`
`echo 'chown -R mysql:mysql' ${mysqldatadir}`
echo "2.權限修改成功!"
echo "*****************************"
#自動啟動mysql
INIT_NUM=1
if [ ! -x $MYSQLD_SAFE ]; then
echo "mysql安裝時啟動文件未安裝到$MYSQLD_SAFE或無執行權限"
exit 1 #0是執行成功,1是執行不成功
else
echo "啟動本機mysql端口為:$MYSQL_PORT的服務"
$MYSQLD_SAFE --defaults-file=$MY_CNF > /dev/null &
while [ $INIT_NUM -le 6 ]
do
PORTNUM=`netstat -lnt|grep ${MYSQL_PORT}|wc -l`
echo "mysql啟動中....請稍等..."
sleep 5
if [ $PORTNUM = 1 ];
then
echo "mysql ****啟動成功****"
exit 0
fi
INIT_NUM=$(($INIT_NUM +1))
done
echo -e "mysql啟動失敗或啟動時間過長,請檢查錯誤日志 `echo 'cat ' ${ERRORLOG}`"
echo "*****************************************"
exit 0
fi
END_RESTORE_TIME=`date +%F' '%T' '%w`
echo "數據庫還原完成于: $END_RESTORE_TIME"
exit 0
************************************************************************************************
執行結果:
************************************************************************************************
執行結果如下:
#./restore.sh /backup/incre/
----------------------------
./restore.sh: MySQL還原腳本
數據庫還原開始于: 2015-04-08 15:17:14 3
還原將從全備2015-04-08_15-14-33開始,到增量2015-04-08_15-16-06結束.
Prepare:完整備份集...........
*****************************
完全備份的LSN: 62974601
增量備份的LSN: 124278446
Prepare:增量備份集2015-04-08_15-15-25........
*****************************
完全備份的LSN: 124278446
增量備份的LSN: 185584722
Prepare:增量備份集2015-04-08_15-16-06........
*****************************
prepare:全備集回滾那些未提交的事務...........
*****************************
數據庫還原中 ...請稍等
*****************************
1.恭喜,還原成功!.
*****************************
修改mysql目錄的權限.
2.權限修改成功!
*****************************
啟動本機mysql端口為:3306的服務
3.mysql啟動中....請稍等...
3.mysql啟動中....請稍等...
3.mysql啟動中....請稍等...
mysql ****啟動成功****
感謝你能夠認真閱讀完這篇文章,希望小編分享的“xtrabackup如何實現MySQL自動備份恢復”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。