【Xtrabackup】Xtrabackup全備、增量備份及恢復示例

恩強Boy發表於2021-01-08

一、  全庫備份與恢復

備份時需要啟動MySQL ,恢復時需要關閉 MySQL ,清空 MySQL 資料目錄且不能重新初始化。

1.  執行備份

# mkdir -p /xtrabackup/full

#   innobackupex --socket=/usr/local/mysql/data/mysql.sock --user=root --password='P@ssw0rd' /xtrabackup/full

2.  檢視備份資料夾內容

# pwd

/xtrabackup/full/2021-01-06_14-27-09

# ls -l

backup-my.cnf   # 備份用到的配置選項檔案

ib_buffer_pool

ibdata1   # 資料檔案

mysql

performance_schema

sys

xtrabackup_binlog_info   #MySQL 伺服器當前使用的 binlog

xtrabackup_checkpoints   # 備份的型別、狀態

xtrabackup_info

xtrabackup_logfile   # 備份的日誌檔案

3.  執行恢復

恢復可以恢復到本機或其他機器,執行步驟如下:

1)  停止資料庫

# service mysqld stop

2)  清理資料檔案

# rm -rf /usr/local/mysql/data/

3)  重演回滾(回滾日誌檔案,恢復資料檔案)

-- 回滾日誌

# innobackupex --apply-log /xtrabackup/full/2021-01-06_14-27-09/

-- 恢復資料檔案

# innobackupex --copy-back /xtrabackup/full/2021-01-06_14-27-09/

4)  修改許可權

# chown -R mysql:mysql  /usr/local/mysql/data

5)  啟動資料庫

# systemctl start mysqld

二、  增量備份恢復

在進行增量備份時,首先要進行一次全量備份,第一次增量備份是基於全備的,之後的增量備份都是基於上一次的增量備份的,以此類推。

1.  資料驗證準備

mysql> create database test_db;

mysql> use test_db;

mysql> create table test_tab(id int);

-- 插入“ 1

mysql> insert into test_tab values(1);

mysql> select * from test_tab;

+------+

| id      |

+------+

|    1   |

+------+

1 row in set (0.00 sec)

2.  執行完全備份

# innobackupex --user=root --password='P@ssw0rd' --socket= /usr/local/mysql/data/mysql.sock  /xtrabackup

3.  插入資料2

mysql> insert into test_tab values(2);

mysql> select * from test_tab;

+------+

| id   |

+------+

|    1 |

|    2 |

+------+

2 rows in set (0.00 sec)

4.  執行增量備份

# innobackupex --user=root --password='P@ssw0rd' --socket=/usr/local/mysql/data/mysql.sock --incremental /xtrabackup   --incremental - basedir=/xtrabackup/2021-01-06_15-33-55

注:

--incremental: 增量備份存放路徑

--incremental-basedir: 基於哪個目錄增量

5.  插入資料3

mysql> insert into test_tab values(3);

mysql> select * from test_tab;

+------+

| id   |

+------+

|    1 |

|    2 |

|    3 |

+------+

3 rows in set (0.00 sec)

6.  再次執行增量備份

# innobackupex --user=root --password='P@ssw0rd' --socket=/usr/local/mysql/data/mysql.sock --incremental /xtrabackup --incremental-basedir=/xtrabackup/2021-01-06_15-41-53

注:由於這裡是第二次增量備份,那麼 --incremental-basedir 的指向應為第一次增量備份的路徑

7.  檢視增量的備份

# cd /xtrabackup/increment/

# ls -lrt

2021-01-06_15-33-55

2021-01-06_15-41-53

2021-01-06_15-49-48

其中,第一個目錄為全量備份,第二、三個目錄分別為第一次增量和第二次增量的備份。注意第二次增量備份是針對第一次增量的。

8.  增量的恢復

1)  停止資料庫

# ps -ef|grep mysql

# service mysqld stop

2)  清理資料檔案

# rm -rf /usr/local/mysql/data

3)  依次重演回滾redo log (恢復資料)

# innobackupex --apply-log --redo-only /xtrabackup/ 2021-01-06_15-33-55 /

# innobackupex --apply-log --redo-only /xtrabackup/ 2021-01-06_15-33-55 / --incremental-dir= /xtrabackup/ 2021-01-06_15-41-53 /

# innobackupex --apply-log --redo-only /xtrabackup/ 2021-01-06_15-33-55 /   --incremental-dir= /xtrabackup/ 2021-01-06_15-49-48 /

注: --apply-log --redo-only 用於合併全備目錄資料,確保資料的一致性

--apply-log --redo-only --incremental-dir 用於將全備和增量備份資料目錄進行合併,合併到全備目錄中

2021-01-06_15-33-55 為全備的目錄

2021-01-06_15-41-53 為第一次增量備份的目錄

2021-01-06_15-49-48 為第二次增量備份的目錄

恢復資料檔案

# innobackupex --copy-back /xtrabackup/2021-01-06_15-33-55/

注:資料檔案的備份位於第一次全量備份的路徑下

4)  修改許可權

# chown -R mysql:mysql /usr/local/mysql/data

5)  啟動資料庫

# service mysqld start

6)  驗證資料

mysql> use test_db;

mysql> select * from test_tab;

+------+

| id   |

+------+

|    1 |

|    2 |

|    3 |

+------+

3 rows in set (0.00 sec)

三、  差異增量備份

差異增量備份需要先執行一個全量備份,後面的每一個增量備份都是針對全量的,而不是針對上一次增量。所以在恢復時,只需要使用最後一次的增量就行。

1.  資料驗證準備

mysql> create database test_db;

mysql> use test_db;

mysql> create table test_tab(id int);

-- 插入“ 1

mysql> insert into test_tab values(1);

mysql> select * from test_tab;

+------+

| id      |

+------+

|    1   |

+------+

1 row in set (0.00 sec)

2.  執行完全備份

# innobackupex --user=root --password='P@ssw0rd' --socket=/usr/local/mysql/data/mysql.sock  /xtrabackup

3.  插入資料2

mysql> insert into test_tab values(2);

mysql> select * from test_tab;

+------+

| id   |

+------+

|    1 |

|    2 |

+------+

2 rows in set (0.00 sec)

4.  執行差異備份(基於全備)

# innobackupex --user=root --password='P@ssw0rd' --socket=/usr/local/mysql/data/mysql.sock --incremental /xtrabackup   --incremental - basedir=/xtrabackup/ 2021-01-08_10-34-36

: 2021-01-08_10-34-36 為全備目錄

5.  插入資料3

mysql> insert into test_tab values(3);

mysql> select * from test_tab;

+------+

| id   |

+------+

|    1 |

|    2 |

|    3 |

+------+

3 rows in set (0.00 sec)

6.  再次差異增量備份(基於全備)

(命令與上一次增量備份一模一樣)

# innobackupex --user=root --password='P@ssw0rd' --socket=/usr/local/mysql/data/mysql.sock --incremental /xtrabackup   --incremental - basedir=/xtrabackup/ 2021-01-08_10-34-36

: 2021-01-08_10-34-36 為全備目錄

7.  檢視增量的備份

# cd /xtrabackup/increment/

# ls -lrt

2021-01-08_10-34-36

2021-01-08_10-39-28

2021-01-08_10-42-53

其中,第一個目錄為全量備份,第二、三個目錄分別為第一次增量和第二次增量的備份,注意兩次增量的備份都是針對全量的。

8.  增量的恢復

1)  停止資料庫

# ps -ef|grep mysql

# service mysqld stop

2)  清理資料檔案

# rm -rf /usr/local/mysql/data

3)  重演回滾redo log (恢復資料)

# innobackupex --apply-log --redo-only /xtrabackup/ 2021-01-08_10-34-36 /

# innobackupex --apply-log --redo-only /xtrabackup/ 2021-01-08_10-34-36 / --incremental-dir= /xtrabackup/ 2021-01-08_10-42-53 /

注:--apply-log --redo-only 用於合併全備目錄資料,確保資料的一致性

--apply-log --redo-only --incremental-dir 用於將全備和增量備份資料目錄進行合併,合併到全備目錄中

2021-01-08_10-34-36 為全備的目錄

2021-01-08_10-42-53 為最後一次增量備份的目錄

恢復資料檔案

# innobackupex --copy-back /xtrabackup/ 2021-01-08_10-34-36 /

注:資料檔案的備份位於第一次全量備份的路徑下

4)  修改許可權

# chown -R mysql:mysql /usr/local/mysql/data

5)  啟動資料庫

# service mysqld start

6)  驗證資料

mysql> use test_db;

mysql> select * from test_tab;

+------+

| id   |

+------+

|    1 |

|    2 |

|    3 |

+------+

3 rows in set (0.00 sec)

最後需要注意一下,我們上面示例的三種備份方式,都只是恢復到了備份那個時間點,並沒有透過binlog 恢復到最近的位置。比如我們在昨晚 11 點做了全備或增量備份,早上 9 點時出了故障,我們透過以上方式也只能恢復到昨晚 11 點的備份時間。 11 -9 點這段時間的資料並不會得到恢復。

 

 

---- end ----


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

相關文章