1. 程式人生 > >Percona XtraBackup的部分備份與恢復/單庫備份/單表備份/指定庫備份/指定表備份

Percona XtraBackup的部分備份與恢復/單庫備份/單表備份/指定庫備份/指定表備份

原官方文件沒有如何恢復的方法,恢復部分是我自己加的。

-----------------------------------------------------------這是一條分割線-----------------------------------------------------------

Percona XtraBackup的功能之一“部分備份(partial backups)”,即讓使用者可以備份指定的表或資料庫。要注意的是:你希望備份的表必須是在獨立的表空間中,即該表在建立以前,你的MySQL開啟了innodb_file_per_table設定。

還一點要注意的是:不要將prepared backup備份的東西拷貝回去。部分備份使用的是匯入表(importing the tables),而不是全庫備份的--copy-back引數。儘管有時簡單的拷貝備份檔案可以成功,但是這種方法很容易導致資料庫的不一致,因此不推薦大家這麼做。

建立部分備份(Creating Partial Backups)

部分備份共有三種方式,分別是:1. 用正則表示式表示要備份的庫名及表名(引數為--include);2. 將要備份的表名或庫名都寫在一個文字檔案中(引數為--tables-file)以及 3. 將要備份表名或庫名完整的寫在命令列中(引數為:--databases)。(譯者注:不管你備份哪個庫或是哪張表,強烈推薦把mysql庫也一起備份,恢復的時候要用。)

方式一:使用--include引數

這種方式通過正則表示式來匹配資料庫名和表名,你需要寫完整的資料庫名及表名,如果資料庫有使用者名稱密碼請使用--user和--password指定相關資訊。,格式如下:databasename.tablename。下面是一個例子:

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

上面的方式會和其他使用innobackupex命令的備份方式一樣,建立一個時間戳命名的資料夾,不同的是,最終只包括那些正則表示式匹配的表。

要注意的是,這個命令最後會傳給xtrabackup --tables命令執行,並且會為每個資料庫(包括不需要備份的資料庫)建立一個對應的資料夾。

方式二:使用--tables-file引數

這種方式是將所有要備份的完整表名都寫在一個文字檔案中,每行一個完整表名,然後程式讀取這個文字檔案進行備份。完整表名即:databasename.tablename。如果資料庫有使用者名稱密碼請使用--user和--password指定相關資訊。下面是一個例子:

$ echo "mydatabase.mytable" > /tmp/tables.txt
$ innobackupex --tables-file=/tmp/tables.txt /path/to/backup --user=backup --password=backup

上面的方式會和其他使用innobackupex命令的備份方式一樣,建立一個時間戳命名的資料夾,不同的是,最終只包括那些檔案中指定的表名。

這個命令最後會傳給xtrabackup --tables-file命令執行,而不是--tables,因此這個命令只會建立那些需要備份的資料庫資料夾。

方式三:使用--databases引數

使用這種方式,使用者既可以將所有要備份的資料庫名和完整表名都寫在一起,以空格分隔,也可以將資料庫名、完整表名寫在一個檔案中,每行一個,如果資料庫有使用者名稱密碼請使用--user和--password指定相關資訊。下面是一個例子。

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

上面的方式會和其他使用innobackupex命令的備份方式一樣,建立一個時間戳命名的資料夾,最終結果將包括mydatabase資料庫中的mytable表,以及整個完整的mysql資料庫。

準備部分備份(Preparing Partial Backups)

執行preparing partial backups,與恢復獨立的表(Restoring Individual Tables)很類似:使用--apply-log和--export引數,幷包含上一步生成的時間戳資料夾,如下:

$ innobackupex --apply-log --export /path/to/backup/2015-11-09_16-33-58

執行命令的時候,對於那些不需要備份的表,會出現表不存在的提示。不用擔心,這是正常現象。下面是可能出現的錯誤提示:
111225  0:54:06  InnoDB: Error: table 'mydatabase/mytablenotincludedinpartialb'
InnoDB: in InnoDB data dictionary has tablespace id 6,
InnoDB: but tablespace with that id or name does not exist. It will be removed from data dictionary.

同時,你還會看到系統生成對要備份的表建立匯出檔案的提示,資訊如下:
xtrabackup: export option is specified.
xtrabackup: export metadata of table 'employees/departments' to file `.//departments.exp` (2 indexes)
xtrabackup:     name=PRIMARY, id.low=80, page=3
xtrabackup:     name=dept_name, id.low=81, page=4

注意,你能夠對已經執行過準備備份(already-prepared backup)的檔案執行帶有--export和--apply-log引數的命令,來生成.exp檔案。

最終,記得觀察下面的輸出,已確定準備備份工作結束。

111225 00:54:18  innobackupex: completed OK!

恢復部分被備份(Restoring Partial Backups)

方法二:

1. 停止MySQL:service mysql stop

2. 將/var/lib/mysql下面的所有檔案全部刪除:rm /var/lib/mysql/* -rf(如果前面沒有備份mysql資料庫, 那麼在刪除資料檔案後要重建mysql系統表,重建命令是sudo mysql_install_db --user=mysql,但重建會導致原有使用者資訊全部丟失)

3. 將第二步準備過的檔案拷貝到/var/lib/mysql下:cp /usr/local/backup/2015-11-09_16-33-58/* /var/lib/mysql -rf

4. 給檔案賦權:chown -R mysql:mysql /var/lib/mysql/

5. 啟動MySQL:service mysql start