MySQL 備份精編版

一、備份概述

為何要備份

  • 由于機(jī)器故障導(dǎo)致數(shù)據(jù)丟失

    • 主從復(fù)制

    • 集群

    • 把原始數(shù)據(jù)備份到異地(其他機(jī)房或者其他城市)

  • 由于人為的誤操作導(dǎo)致的數(shù)據(jù)丟失

    • 把原始數(shù)據(jù)備份到其他媒介上,脫離當(dāng)前的系統(tǒng),避免人為的誤操作

備份的目的

  • 保持?jǐn)?shù)據(jù)一致性

  • 保障數(shù)據(jù)可用性

備份的種類

  • 物理備份 由目錄的原始副本和存儲數(shù)據(jù)庫內(nèi)容的文件組成。此類備份適用于需要在出現(xiàn)問題時快速恢復(fù)的大型重要數(shù)據(jù)庫。

    • 除數(shù)據(jù)庫外,備份還可以包括任何相關(guān)文件,如日志或配置文件。

    • 備份僅可移植到具有相同或類似硬件特征的其他計算機(jī)。

    • 可以在MySQL服務(wù)器未運(yùn)行時執(zhí)行備份。如果服務(wù)器正在運(yùn)行,則必須執(zhí)行適當(dāng)?shù)逆i定,以便服務(wù)器在備份期間不會更改數(shù)據(jù)庫內(nèi)容。

    • 物理備份工具包括用于的MySQL Enterprise Backup 的 mysqlbackupInnoDB或任何其他表,或文件系統(tǒng)級命令(如cpscp,tar, rsync

    • MySQL Enterprise Backup還原InnoDB 以及它備份的其他表。

    • 可以使用文件系統(tǒng)命令將在文件系統(tǒng)級別復(fù)制的文件復(fù)制回其原始位置。

      • MySQL Enterprise Backup還原InnoDB 以及它備份的其他表。

      • ndb_restore恢復(fù) NDB表。

      • 可以使用文件系統(tǒng)命令將在文件系統(tǒng)級別復(fù)制的文件復(fù)制回其原始位置。

      • MySQL Enterprise Backup還原InnoDB 以及它備份的其他表。

      • ndb_restore恢復(fù) NDB表。

      • 可以使用文件系統(tǒng)命令將在文件系統(tǒng)級別復(fù)制的文件復(fù)制回其原始位置。

      • MySQL Enterprise Backup還原InnoDB 以及它備份的其他表。

      • ndb_restore恢復(fù) NDB表。

      • 可以使用文件系統(tǒng)命令將在文件系統(tǒng)級別復(fù)制的文件復(fù)制回其原始位置。

      • MySQL Enterprise Backup還原InnoDB 以及它備份的其他表。

      • ndb_restore恢復(fù) NDB表。

      • 可以使用文件系統(tǒng)命令將在文件系統(tǒng)級別復(fù)制的文件復(fù)制回其原始位置。

  • 邏輯備份 保存表示為邏輯數(shù)據(jù)庫結(jié)構(gòu)(CREATE DATABASE, CREATE TABLE語句)和內(nèi)容(INSERT語句或分隔文本文件)的信息。此類備份適用于較少量的數(shù)據(jù),您可以在其中編輯數(shù)據(jù)值或表結(jié)構(gòu),或在不同的計算機(jī)體系結(jié)構(gòu)上重新創(chuàng)建數(shù)據(jù)。

邏輯備份方法具有以下特征:

  • 通過查詢MySQL服務(wù)器來獲取數(shù)據(jù)庫結(jié)構(gòu)和內(nèi)容信息來完成備份。

  • 備份比物理方法慢,因?yàn)榉?wù)器必須訪問數(shù)據(jù)庫信息并將其轉(zhuǎn)換為邏輯格式。如果輸出寫在客戶端,則服務(wù)器還必須將其發(fā)送到備份程序。

  • 輸出大于物理備份,特別是以文本格式保存時。

  • 備份和還原粒度可在服務(wù)器級別(所有數(shù)據(jù)庫),數(shù)據(jù)庫級別(特定數(shù)據(jù)庫中的所有表)或表級別中使用。無論存儲引擎如何,都是如此。

  • 備份不包括日志或配置文件,或其他不屬于數(shù)據(jù)庫的數(shù)據(jù)庫相關(guān)文件。

  • 以邏輯格式存儲的備份與機(jī)器無關(guān)且具有高度可移植性。

  • 在運(yùn)行MySQL服務(wù)器的情況下執(zhí)行邏輯備份。服務(wù)器未脫機(jī)。

  • 邏輯備份工具包括mysqldump 程序和SELECT ... INTO OUTFILE語句。這些適用于任何存儲引擎,甚至MEMORY。

  • 要恢復(fù)邏輯備份,可以使用mysql客戶端處理SQL格式轉(zhuǎn)儲文件。要加載分隔文本文件,請使用 LOAD DATA INFILE語句或 mysqlimport客戶端

在線與離線備份

在MySQL服務(wù)器運(yùn)行時進(jìn)行聯(lián)機(jī)備份,以便可以從服務(wù)器獲取數(shù)據(jù)庫信息。服務(wù)器停止時會發(fā)生脫機(jī)備份。這種區(qū)別也可以描述為“ 熱 ”與 “ 冷 ”備份; 一個“ 溫暖 ”的備份是一個在服務(wù)器保持運(yùn)行,但鎖定,以防止當(dāng)你從外部訪問數(shù)據(jù)庫文件修改數(shù)據(jù)。

二、MySQL 邏輯備份 mysqldump

邏輯備份特點(diǎn)
  • 備份的是建表、建庫、插入等操作所執(zhí)行SQL語句(DDL DML DCL),適用于中小型數(shù)據(jù)庫。
  • 效率相對較低

在日常工作中,我們會使用 mysqldump 命令創(chuàng)建SQL格式的轉(zhuǎn)儲文件來備份數(shù)據(jù)庫?;蛘呶覀儼褦?shù)據(jù)導(dǎo)出后做數(shù)據(jù)遷移,主從復(fù)制等操作。mysqldump是一個邏輯備份工具,復(fù)制原始的數(shù)據(jù)庫對象定義和表數(shù)據(jù)產(chǎn)生一組可執(zhí)行的SQL語句。 默認(rèn)情況下,生成insert語句,也能生成其它分隔符的輸出或XML格式的文件。

特點(diǎn)
  1. 自動記錄position位置。
show master  status\G;
  1. 可用性,一致性

鎖表機(jī)制

用法
mysqldump  -h 服務(wù)器  -u用戶名  -p密碼   數(shù)據(jù)庫名  > 備份文件.sql

/*查看幫助*/
mysqldump --help

日常用法

備份所有庫

// 先配置用戶名和密碼
shell> vi ~/.mysql_user
[mysqldump]
user=root
password=123

shell> mysqldump --defaults-file=~/.mysql_user -h172.16.153.10 --all-databases > `date +%FT%H_%M_%S`dump_all.sql
# 不包含 INFORMATION_SCHEMA,performance_schema,sys


備份指定的多個庫

// 為了考慮篇幅,請自行添加指定用戶名密碼參數(shù)和指定服務(wù)器的參數(shù)
// --defaults-file=~/.mysql_user -hip
shell> mysqldump --databases db1 db2 db3 > `date +%FT%H_%M_%S`dump_all.sql


備份指定庫的指定幾個表

shell> mysqldump db1 t1 t3 t7 > dump.sql

備份時不鎖表

備份時希望轉(zhuǎn)儲和刷新日志到恰好在同一時刻發(fā)生,適用于 InnoDB 引擎

shell> mysqldump  --all-databases --single-transaction --flush-logs > `date +%FT%H_%M_%S`dump_all.sql


--flush-logs 在開始備份數(shù)據(jù)之前刷新MySQL服務(wù)器日志文件。
此選項(xiàng)需要 RELOAD權(quán)限。如果將此選項(xiàng)與選項(xiàng)結(jié)合使用 --all-databases,則會為每個轉(zhuǎn)儲的數(shù)據(jù)庫刷新日志。會鎖表。

--single-transaction 是針對 InnoDB 引擎的表,不鎖表,也稱熱備。

其他參數(shù)

  • --master-data=0|1|2

    服務(wù)器的二進(jìn)制日志必須打開

    0 不記錄二進(jìn)制日志文件及位置:

    1 以CHANGE MASTER TO 的方式記錄位置,可用于恢復(fù)后直接啟動從服務(wù)器:

    2 以CHANGE MASTER TO 的方式記錄位置,但默認(rèn)被注釋:

  • --dump-slave 用于在slave上dump數(shù)據(jù),建立新的slave。因?yàn)槲覀冊谑褂胢ysqldump時會鎖表,所以大多數(shù)情況下,我們的導(dǎo)出操作一般會在只讀備庫上做,為了獲取主庫的Relay_Master_Log_File(二進(jìn)制日志)和Exec_Master_Log_Pos(主服務(wù)器二進(jìn)制日志中數(shù)據(jù)所處的位置),需要用到這個參數(shù),不過這個參數(shù)只有在5.7以后的才會有

  • --no-data, -d 不導(dǎo)出任何數(shù)據(jù),只導(dǎo)出數(shù)據(jù)庫表結(jié)構(gòu)

  • --lock-all-tables:鎖定所有表 對MyISAM引擎的表開始備份前,先鎖定所有表。

優(yōu)勢

mysqldump的優(yōu)勢:

  1. 可以查看或者編輯十分方便,它也可以靈活性的恢復(fù)之前的數(shù)據(jù)。
  2. 不關(guān)心底層的存儲引擎,既適用于支持事務(wù)的,也適用于不支持事務(wù)的表。
  3. 不過它不能作為一個快速備份大量的數(shù)據(jù)或可伸縮的解決方案。如果數(shù)據(jù)庫過大,即使備份步驟需要的時間不算太久,但有可能恢復(fù)數(shù)據(jù)的速度也會非常慢,因?yàn)樗婕暗腟QL語句插入磁盤I/O,創(chuàng)建索引等等。 對于大規(guī)模的備份和恢復(fù),更合適的做法是物理備份,復(fù)制其原始格式的數(shù)據(jù)文件,可以快速恢復(fù)。
恢復(fù)
shell> mysql < dump.sql

或者,在mysql中,使用 source命令:

mysql> source dump.sql

如果文件是不包含CREATE DATABASEUSE語句的單數(shù)據(jù)庫轉(zhuǎn)儲 ,請首先創(chuàng)建數(shù)據(jù)庫(如有必要):

shell> mysqladmin create db1

然后在加載轉(zhuǎn)儲文件時指定數(shù)據(jù)庫名稱:

shell> mysql db1 < dump.sql

或者,在mysql中創(chuàng)建數(shù)據(jù)庫,將其選為默認(rèn)數(shù)據(jù)庫,然后加載轉(zhuǎn)儲文件:

mysql> CREATE DATABASE IF NOT EXISTS db1;
mysql> USE db1;
mysql>source dump.sql

Example

shell> mysql --defaults-file=~/.mysql_user < /backup/2016-12-08-04-mysql-all.sql


三、MySQL 物理備份: Innobackupex 和 xtrabackup(熱備)

Percona XtraBackup是一款基于MySQL的熱備份的開源實(shí)用程序,它可以備份5.1到5.7版本上InnoDB,XtraDB,MyISAM存儲引擎的表, Xtrabackup有兩個主要的工具:xtrabackup、innobackupex 。

原來的版本

(1)xtrabackup 只能備份InnoDB和XtraDB兩種數(shù)據(jù)引擎的數(shù)據(jù)表,而不能備份MyISAM數(shù)據(jù)表

(2)innobackupex 則封裝了 xtrabackup,是一個腳本封裝,所以能同時備份處理innodb和myisam,但在處理myisam時需要加一個讀鎖。

新版本的變化

如果你安裝了2.3之前版本的xtrabackup,那么在備份的過程中,你可能會用到兩個常用的備份工具。

安裝2.3版本之前的XtraBackup后,我們會得到兩個主要的備份工具:

  • xtrabackup
  • innobackupex

xtrabackup是一個C程序。

innobackupex是一個perl腳本,它對xtrabackup這個C程序進(jìn)行了封裝,在備份innodb表時,此腳本會調(diào)用xtrabackup這個C程序。

如果使用xtrabackup這個C程序進(jìn)行備份,則只能備份innodb和xtradb的表,不能備份myisam表。

如果使用innobackupex進(jìn)行備份,則可以備份innodb或xtradb的表,同時也能夠備份myisam表。

所以,一般在使用XtraBackup備份工具進(jìn)行數(shù)據(jù)備份時,通常會選擇使用innobackupex命令進(jìn)行備份。

那么問題來了。

xtrabackup是一個C程序,innobackupex是一個perl腳本,當(dāng)它們作為兩個進(jìn)程運(yùn)行時,總是沒有特別完美的方式讓它們進(jìn)行通訊,當(dāng)它們作為一個整體進(jìn)行工作時就不太盡如人意,如此情況,就導(dǎo)致了一些bug的出現(xiàn),于是,官方?jīng)Q定使用C重寫innobackupex,將它與xtrabackup這個C程序完美的整合在一起。這個想法在2.3版本的XtraBackup中實(shí)現(xiàn)。

官方手冊解釋

xtrabackup
一個已編譯的C二進(jìn)制文件,它提供了使用MyISAM,InnoDB和XtraDB表備份整個MySQL數(shù)據(jù)庫實(shí)例的功能

而我們安裝的就是2.4版本,此時,innobackupex的功能已經(jīng)完全整合到了xtrabackup中,innobackupex不再是perl腳本了,但是,為了兼容之前用戶的使用習(xí)慣,官方保留了innobackupex,它作為一個軟連接,指向了xtrabackup,也就是說,在2.4版本中,不管我們使用innobackupex命令,還是xtrabackup命令,其實(shí)使用的都是這個xtrabackupC程序。雖然在實(shí)現(xiàn)上有所不同,但是在工作原理上,與之前的版本并沒有什么不同。

下面我們用新的命令xtrabachup使用。

首先我們先來簡單的了解一下xtrabackup 是怎么工作的。xtrabackup 基于innodb的crash-recovery(實(shí)例恢復(fù))功能,先copy innodb的物理文件(這個時候數(shù)據(jù)的一致性是無法滿足的),然后進(jìn)行基于redo log進(jìn)行恢復(fù),達(dá)到數(shù)據(jù)的一致性。

第一個安裝方式: 使用 YUM 方式安裝

地址
https://www.percona.com/downloads/XtraBackup/LATEST/

  1. 確保安裝 EPEL 源
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

  1. 安裝 libev
    為了成功安裝Percona XtraBackup libev包需要先安裝。
yum  install -y libev
  1. 安裝Percona存儲庫
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

  1. 測試存儲庫的可用性
shell> yum list | grep percona

應(yīng)該輸出如下信息

...
percona-xtrabackup-20.x86_64               2.0.8-587.rhel5             percona-release-x86_64
percona-xtrabackup-20-debuginfo.x86_64     2.0.8-587.rhel5             percona-release-x86_64
percona-xtrabackup-20-test.x86_64          2.0.8-587.rhel5             percona-release-x86_64
percona-xtrabackup-21.x86_64               2.1.9-746.rhel5             percona-release-x86_64
percona-xtrabackup-21-debuginfo.x86_64     2.1.9-746.rhel5             percona-release-x86_64
percona-xtrabackup-22.x86_64               2.2.13-1.el5                percona-release-x86_64
percona-xtrabackup-22-debuginfo.x86_64     2.2.13-1.el5                percona-release-x86_64
percona-xtrabackup-debuginfo.x86_64        2.3.5-1.el5                 percona-release-x86_64
percona-xtrabackup-test.x86_64             2.3.5-1.el5                 percona-release-x86_64
percona-xtrabackup-test-21.x86_64          2.1.9-746.rhel5             percona-release-x86_64
percona-xtrabackup-test-22.x86_64          2.2.13-1.el5                percona-release-x86_64
...
  1. 安裝軟件
shell> yum install percona-xtrabackup-24
  1. 驗(yàn)證安裝


    image.png

第一種安裝方式:下載對應(yīng)版本的軟件包,在本地安裝

點(diǎn)擊 下載頁面,選擇對應(yīng)版本后進(jìn)行下載

image.png

示例:

下載 2.4.4版本

wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm


安裝

yum localinstall percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm

注意:像這樣手動安裝軟件包時,您需要確保解決所有依賴項(xiàng)并自行安裝缺少的軟件包。

卸載
yum remove percona-xtrabackup

80 版本安裝方法

注意:
這個版本只支持 MySQL8.0的數(shù)據(jù)進(jìn)行備份,不支持 MySQL8.0版本之前的數(shù)據(jù)進(jìn)行備份。

# 安裝倉庫文件
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

# 啟用倉庫
percona-release enable-only tools release

#安裝軟件
yum install percona-xtrabackup-80

報錯解決

來自 file:///etc/pki/rpm-gpg/RPM-GPG-KEY-percona 的無效 GPG 密鑰:No key found in given key data

或者

源 "CentOS 7 - Percona" 的 GPG 密鑰已安裝,但是不適用于此軟件包。請檢查
源的公鑰 URL 是否配置正確。


 失敗的軟件包是:Percona-Server-shared-56-5.6.43-rel84.3.el7.x86_64
 GPG  密鑰配置為:file:///etc/pki/rpm-gpg/RPM-GPG-KEY-percona

修改倉庫文件 percona-release.repo 不使用密鑰認(rèn)證

image.png

再次安裝會看到如下報錯信息


Transaction check error:
  file /etc/my.cnf from install of Percona-Server-shared-56-5.6.43-rel84.3.el7.x86_64 conflicts with file from package mysql-community-server-5.7.25-1.el7.x86_64

錯誤概要
-------------

需要安裝如下軟件

yum install -y   mysql-community-libs-compat

注意:
這個軟件的源是 mysql57-community

[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql 文件內(nèi)容如下:

點(diǎn)我傳送門

  1. 再執(zhí)行安裝命令
yum install percona-xtrabackup-24
日常操作

條件:

  1. 在 MySQL 服務(wù)器本地安裝 Xtrbackup 并執(zhí)行相關(guān)操作。
  2. 給執(zhí)行備份到用戶進(jìn)行相應(yīng)的授權(quán)。

配置選項(xiàng)

配置選項(xiàng)可以在sh命令行中直接使用,也可以在 my.cnf 文件中配置

# my.cnf 文件的配置
[xtrabackup]
target_dir = /data/backups/mysql/   # 備份數(shù)據(jù)放置的位置

假如是編譯安裝的 mysql ,需要在配置文件my.cnf 中指定 socket 文件的路徑。

[xtrabackup]
socket = /tmp/mysql.sock

1. 全備

下面的命令均假設(shè)沒有在 my.cnf 中配置任何關(guān)于 xtrabackup 的選項(xiàng)

要執(zhí)行備份需要指定 備份數(shù)據(jù)放置的位置,就是目錄,假如目錄不存在,則會自動創(chuàng)建;==注意這個目錄不會被遞歸創(chuàng)建,僅僅會創(chuàng)建最后一級目錄;==假如存在,就會直接開始備份,并且不會覆蓋原來的數(shù)據(jù)。

  1. 開始備份
shell> xtrabackup --backup --user=root --password='123'  --target-dir=/backups/full

# 備份完成后,可以看到備份時的LSN號,當(dāng)下次進(jìn)行增量備份時,xtrabackup就只備份大于此號的page即可。
  1. 查看備份文件
[root@mysql-master ~]# ls -lh /backups/full
總用量 13M
-rw-r----- 1 root root  487 8月  18 09:44 backup-my.cnf
-rw-r----- 1 root root  293 8月  18 09:44 ib_buffer_pool
-rw-r----- 1 root root  12M 8月  18 09:44 ibdata1
drwxr-x--- 2 root root 4.0K 8月  18 09:44 mysql
drwxr-x--- 2 root root   88 8月  18 09:44 one_db
drwxr-x--- 2 root root 8.0K 8月  18 09:44 performance_schema
drwxr-x--- 2 root root   58 8月  18 09:44 shark_db
drwxr-x--- 2 root root 8.0K 8月  18 09:44 sys
-rw-r----- 1 root root  115 8月  18 09:44 xtrabackup_checkpoints
-rw-r----- 1 root root  446 8月  18 09:44 xtrabackup_info
-rw-r----- 1 root root 2.5K 8月  18 09:44 xtrabackup_logfile

進(jìn)入目錄后,可以看到一些目錄,這些目錄與我們數(shù)據(jù)庫的名稱相同,沒錯,這些就是各個數(shù)據(jù)庫的數(shù)據(jù)文件備份目錄。

還有一個innodb的共享表空間文件,ibdata1,注意,如果想要使用xtrabackup備份眾多數(shù)據(jù)庫中的某一個,那么必須保證在創(chuàng)建這個數(shù)據(jù)庫時,已經(jīng)開啟了innodb_file_per_table 參數(shù),否則將無法單獨(dú)備份數(shù)據(jù)庫服務(wù)器中的某一個數(shù)據(jù)庫。

除了剛才描述的這些數(shù)據(jù)文件,xtrabackup還為我們生成了一些文件,我們來看看這些文件都有什么用(不同版本的xtrabackup生成的文件可能不同)。

  1. backup-my.cnf
    此文件中包含了my.cnf中的一些設(shè)置信息,但是,并不是my.cnf中的所有信息都會包含在此文件中,此文件中只包含了備份時需要的信息。

  2. xtrabackup_binlog_info
    需要開啟二進(jìn)制日志
    此文件中記錄了備份開始時二進(jìn)制日志文件的"位置(position)"

  3. xtrabackup_checkpoints
    此文件中記錄此次備份屬于那種類型的備份,是全量還是增量,備份時起始的LSN號碼,結(jié)束的LSN號碼等信息。

  4. xtrabackup_info
    本次備份的概要信息,此文件中的信息還是比較全面的。

  5. xtrabackup_logfile
    記錄了備份過程中的日志,在對數(shù)據(jù)進(jìn)行prepare時需要通過日志將數(shù)據(jù)還原成一致的可用的數(shù)據(jù)。

  1. 準(zhǔn)備恢復(fù)的數(shù)據(jù)

使用 xtrabackup --backup 選項(xiàng)進(jìn)行備份后,并不能直接使用,首先需要準(zhǔn)備它以便還原它。

如果您嘗試使用這些數(shù)據(jù)文件啟動 InnoDB,它將檢測損壞并自行崩潰,以防止您在損壞的數(shù)據(jù)上運(yùn)行。

因?yàn)閭浞莩龅臄?shù)據(jù)是不一致的,我們需要將同時備份出的事務(wù)日志應(yīng)用到備份中,才能得到一份完整、一致、可用的數(shù)據(jù),xtrabackup稱這一步操作為prepare,直譯過來就是"準(zhǔn)備"。

xtrabackup --prepare 步驟使文件在同一時刻內(nèi)的數(shù)據(jù)完全一致

shell> xtrabackup --prepare --target-dir=/backups/full

如果你要備份的數(shù)據(jù)量巨大,那么備份時長會變長,期間備份的事務(wù)日志容量有可能會很大。那么,我們可以使用--use-memory選項(xiàng),加速準(zhǔn)備工作的完成,在不指定內(nèi)存大小的情況下,準(zhǔn)備工作默認(rèn)會占用100MB的內(nèi)存,如果服務(wù)器有一定的空閑內(nèi)存,那么我們可以讓xtrabackup使用指定大小的內(nèi)存完成準(zhǔn)備工作,以提升準(zhǔn)備工作完成的速度,示例語句如下。

shell> xtrabackup --prepare --use-memory=512M --target-dir=/backups/full

==準(zhǔn)備備份時不建議中斷xtrabackup進(jìn)程,因?yàn)檫@可能會導(dǎo)致數(shù)據(jù)文件損壞,備份將無法使用。如果準(zhǔn)備過程中斷,則無法保證備份有效性。==

準(zhǔn)備備份數(shù)據(jù)完成后,應(yīng)該會看到如下信息。

InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 13596200
180818 10:09:19 completed OK!

恢復(fù)

xtrabackup 在執(zhí)行copyback時會讀取數(shù)據(jù)庫的my.cnf中的配置,但是如果my.cnf中沒有配置datadir,那么--datadir選項(xiàng)必須存在,而且,datadir目錄必須為空目錄,其中不能存在數(shù)據(jù),否則在執(zhí)行上述命令時會報錯,--copy-back選項(xiàng)對應(yīng)的目錄就是我們準(zhǔn)備好的可用數(shù)據(jù)的目錄。

為了能夠正常的恢復(fù)數(shù)據(jù),我們先確定數(shù)據(jù)庫服務(wù)已經(jīng)停止了,而且對應(yīng)的數(shù)據(jù)目錄中不存在數(shù)據(jù),然后進(jìn)行數(shù)據(jù)還原工作,刪除數(shù)據(jù)目錄中的文件與日志。

  1. 停止數(shù)據(jù)庫的服務(wù)
  2. 清理環(huán)境
  3. 修改權(quán)限
  4. 啟動數(shù)據(jù)庫
shell> systemctl stop mysqld.service

shell> rm -rf /var/lib/mysql/*

shell> xtrabackup --copy-back --datadir=/var/lib/mysql --target-dir=/backups/full

# 下面為完成后的輸出結(jié)果
180818 10:59:25 [01]        ...done
180818 10:59:25 completed OK!
shell> chown  mysql.mysql -R /var/lib/mysql


或者使用 rsync 命令

shell> rsync -avrP /data/backup/ /var/lib/mysql/
shell> chown  mysql.mysql -R /var/lib/mysql

啟動數(shù)據(jù)庫

shell> systemctl start mysqld.service

innobackuper 命令實(shí)現(xiàn)

shell> innobackupex --defaults-file=/etc/my.cnf --host=192.168.1.146 --user=root --password=123 /backups/full

shell> nnobackupex --apply-log --use-memory=4G /backup/full/2018-08-17_15-53-11

shell> systemctl stop mysqld.service

shell> rm -rf /var/lib/mysql/*

shell> innobackupex --datadir=/var/lib/mysql --copy-back 2018-08-17_15-53-11

shell> chown  mysql.mysql -R /var/lib/mysql

shell> systemctl start mysqld.service


全量備份思路總結(jié)

  1. 執(zhí)行備份命令
    • 指定 數(shù)據(jù)庫的用戶名和密碼
    • 指定 備份目錄,注意只可以自動創(chuàng)建最后一級的目錄
  2. 準(zhǔn)備備份的數(shù)據(jù)
    • 就是指: --prepare 參數(shù), 保證數(shù)據(jù)的統(tǒng)一且完整性
  3. 停服務(wù),并且把 mysql 的數(shù)據(jù)目錄下的所有文件和文件夾清除。
    • /var/lib/mysql/ 此目錄必須是空的
  4. 恢復(fù)數(shù)據(jù)
    • 本質(zhì)上就是拷貝備份的文件到指定的 mysql 數(shù)據(jù)目錄下
  5. 修改 mysql 數(shù)據(jù)目錄的屬主和屬組為 MySQL 服務(wù)器進(jìn)程啟動的用戶,默認(rèn)是 mysql
  6. 啟動服務(wù)


2. 增量備份

image.png

特點(diǎn):每次備份,都對自上一次備份(注意是上一次,不是第一次)到此時備份之間有變化的文件,進(jìn)行備份。所 以備份體積小,備份速度快,但是恢復(fù)的時候,需要按備份時間順序,逐個備份版本進(jìn)行恢復(fù),恢復(fù)時持續(xù)的時間長。

無論xtrabackupinnobackupex工具支持增量備份,這意味著它們可以只復(fù)制自上次備份以來發(fā)生變化的數(shù)據(jù)。

您可以在每個完整備份之間執(zhí)行許多增量備份,因此您可以設(shè)置備份過程,例如每周一次完整備份和每天增量備份,或每天完整備份和每小時增量備份。

增量備份有效,因?yàn)槊總€InnoDB頁面都包含一個日志序列號或LSN。該LSN是整個數(shù)據(jù)庫系統(tǒng)的版本號。每個頁面的LSN顯示它最近的更改。

當(dāng)我們做過全量備份以后會在目錄下產(chǎn)生xtrabackup_checkpoints的文件 這里面記錄了lsn和備份方式,我們可以基于這次的全量做增量的備份。

shell> cat /data/backups/xtrabackup_checkpoints
backup_type = full-prepared
from_lsn = 0
to_lsn = 13593159
last_lsn = 13593168
compact = 0
recover_binlog_info = 0

增量備份實(shí)際上并不將數(shù)據(jù)文件與先前備份的數(shù)據(jù)文件進(jìn)行比較。事實(shí)上,如果你知道它的LSN,你可以使用 xtrabackup --incremental-lsn來執(zhí)行增量備份,而不需要先前的備份。增量備份只是讀取頁面并將其LSN與最后一個備份的LSN進(jìn)行比較。但是,您仍需要完整備份來恢復(fù)增量更改;如果沒有完整備份作為基礎(chǔ),增量備份將毫無用處。

創(chuàng)建增量備份

要進(jìn)行增量備份,請像往常一樣以完整備份開始, 使用下面的命令創(chuàng)建基礎(chǔ)的全量備份。

shell> xtrabackup --backup --user=root --password=123 --target-dir=/backups/base

現(xiàn)在您已擁有完整備份,以后可以根據(jù)它進(jìn)行增量備份。

向數(shù)據(jù)庫中添加數(shù)據(jù),以便于測試

mysql> select count(id) from shark_db.student;
+-----------+
| count(id) |
+-----------+
|     99213 |
+-----------+
1 row in set (0.04 sec)

mysql> insert into shark_db.student (name,age,phone) values('xiguatian',20,13149876789);
Query OK, 1 row affected (0.00 sec)

mysql> select count(id) from shark_db.student;
+-----------+
| count(id) |
+-----------+
|     99214 |
+-----------+
1 row in set (0.03 sec)

使用以下命令進(jìn)行增量備份:

shell> xtrabackup --backup --user=root --password=123 --target-dir=/data/backups/inc1 --incremental-basedir=/backups/base

/data/backups/inc1/目錄現(xiàn)在應(yīng)包含增量文件

ls -lh /data/backups/inc1/
總用量 116K
-rw-r----- 1 root root  487 8月  18 11:40 backup-my.cnf
-rw-r----- 1 root root  293 8月  18 11:40 ib_buffer_pool
-rw-r----- 1 root root  64K 8月  18 11:40 ibdata1.delta
-rw-r----- 1 root root   44 8月  18 11:40 ibdata1.meta
drwxr-x--- 2 root root 4.0K 8月  18 11:40 mysql
drwxr-x--- 2 root root  144 8月  18 11:40 one_db
drwxr-x--- 2 root root 8.0K 8月  18 11:40 performance_schema
drwxr-x--- 2 root root   88 8月  18 11:40 shark_db
drwxr-x--- 2 root root 8.0K 8月  18 11:40 sys
-rw-r----- 1 root root  120 8月  18 11:40 xtrabackup_checkpoints
-rw-r----- 1 root root  498 8月  18 11:40 xtrabackup_info
-rw-r----- 1 root root 2.5K 8月  18 11:40 xtrabackup_logfile

這個時候去查看增量備份的xtrabackup_checkpoints,會發(fā)現(xiàn)同樣也記錄了LSN 等信息

shell> cat /backups/inc1/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 13596423
to_lsn = 13596628
last_lsn = 13596637
compact = 0
recover_binlog_info = 0
// 這也意味著你可以在增量的備份上繼續(xù)增量的備份。

from_lsn是備份的起始LSN,對于增量,它必須與前一個/基本備份的to_lsn(如果它是最后一個檢查點(diǎn))相同。

上面的情況是,to_lsn (上一個檢查點(diǎn)LSN)和last_lsn(上次復(fù)制的LSN)之間存在差異,這意味著在備份過程中服務(wù)器上存在一些流量

模擬增加數(shù)據(jù)

mysql> insert into shark_db.student (name,age,phone) values('xiguatian3',21,13149876789);
Query OK, 1 row affected (0.01 sec)

mysql> select count(id) from shark_db.student;                                     +-----------+
| count(id) |
+-----------+
|     99215 |
+-----------+
1 row in set (0.03 sec)

現(xiàn)在可以使用此目錄作為另一個增量備份的基礎(chǔ):

shell> xtrabackup --backup --user=root --password=123 --target-dir=/backups/inc2 --incremental-basedir=/backups/inc1


準(zhǔn)備增量備份的數(shù)據(jù)

增量備份的步驟與完全備份的步驟不同。在完全備份中,執(zhí)行兩種類型的操作以使數(shù)據(jù)庫保持一致:從日志文件中針對數(shù)據(jù)文件重播已提交的事務(wù),并回滾未提交的事務(wù)。在準(zhǔn)備增量備份時,必須跳過未提交事務(wù)的回滾,因?yàn)閭浞輹r未提交的事務(wù)可能正在進(jìn)行中,并且很可能它們將在下一次增量備份中提交。您應(yīng)該使用該 選項(xiàng)來阻止回滾階段.

xtrabackup --apply-log-only
警告

如果不使用該 選項(xiàng)來阻止回滾階段,那么增量備份將毫無用處?;貪L事務(wù)后,無法應(yīng)用進(jìn)一步的增量備份。

要準(zhǔn)備數(shù)據(jù),需要從一開始就準(zhǔn)備,現(xiàn)在回想一下我們都有那些備份

/backups/base
/backups/inc1
/backups/inc2
image.png
  1. 準(zhǔn)備基礎(chǔ)備份的數(shù)據(jù)

    shell> xtrabackup --prepare --apply-log-only \
    --target-dir=/backups/base
    ...省略...
    xtrabackup: starting shutdown with innodb_fast_shutdown = 1
    InnoDB: Starting shutdown...
    InnoDB: Shutdown completed; log sequence number 13596441
    InnoDB: Number of pools: 1
    180818 11:56:55 completed OK!
    

注意:
即使已跳過回滾階段,此備份實(shí)際上也可以按原樣恢復(fù)。如果你恢復(fù)它并啟動MySQL,InnoDB將檢測到?jīng)]有執(zhí)行回滾階段,它將在后臺執(zhí)行,因?yàn)樗ǔS糜趩訒r的崩潰恢復(fù)。它會通知您數(shù)據(jù)庫未正常關(guān)閉。

  1. 把第一次增量備份的數(shù)據(jù)合并到基礎(chǔ)備份的數(shù)據(jù)中
shell> xtrabackup  --prepare  --apply-log-only  --user=root --password=123  --target-dir=/backups/base  --incremental-dir=/backups/inc1


  1. 再把第二次增量備份的數(shù)據(jù)也合并到基礎(chǔ)備份的數(shù)據(jù)中
shell> xtrabackup --prepare --user=root --password=123  --target-dir=/backups/base  --incremental-dir=/backups/inc2


==注意: 最后一次操作不需要加 --apply-log-only 參數(shù)==

  1. 停止 MySQL 服務(wù),并刪除數(shù)據(jù)目錄和日志
shell> systemctl stop mysqld
shell> rm -rf /var/lib/mysql/*
  1. 開始恢復(fù)合并后的全部數(shù)據(jù)的數(shù)據(jù)庫
shell> xtrabackup --copy-back  --datadir=/var/lib/mysql  --target-dir=/backups/base/


  1. 更改數(shù)據(jù)庫目錄的權(quán)限并啟動數(shù)據(jù)庫
shell> chown mysql.mysql -R /var/lib/mysql
shell> systemctl start mysqld
啟用壓縮備份
  1. 壓縮備份使用 --compress
// 壓縮備份
shell> xtrabackup --backup --compress  --target-dir=/backups/compressed 

// 可以同時啟用 4 個線程進(jìn)行壓縮
shell> xtrabackup --backup --compress  --compress-threads=4    --target-dir=/backups/compressed/


  1. 準(zhǔn)備恢復(fù)數(shù)據(jù)

    首先要解壓備份文件

安裝依賴的軟件

shell>  wget -d --user-agent="Mozilla/5.0 (Windows NT x.y; rv:10.0) Gecko/20100101 Firefox/10.0"http://www.quicklz.com/qpress-11-linux-x64.tar
shell> tar xvf qpress-11-linux-x64.tar
shell> cp qpress /usr/bin


解壓縮

shell> xtrabackup  --decompress   --target-dir=/backups/compressed/

// --parallel 參數(shù)可以和 --decompress 參數(shù)一起使用,可以實(shí)現(xiàn)同時解壓多個文件

解壓后就可以進(jìn)行準(zhǔn)備恢復(fù)的數(shù)據(jù)操作了

shell> xtrabackup  --prepare --target-dir=/backups/compressed/
  1. 恢復(fù)數(shù)據(jù)并更改文件權(quán)限
shell> xtrabackup --copy-back --target-dir=/backups/full
shell> chown -R mysql:mysql /var/lib/mysql
創(chuàng)建加密備份

要創(chuàng)建加密的備份需要指定至少兩個選項(xiàng):

  • --encrypt=ALGORITHM 目前支持的算法是: AES128,AES192AES256
  • --encrypt-key=ENCRYPTION_KEY 使用適當(dāng)長度的加密密鑰。如果命令行無法控制訪問機(jī)器,則不建議使用此選項(xiàng),因此可以將密鑰視為流程信息的一部分。
  • --encrypt-key-file=KEYFILE 可以從中讀取適當(dāng)長度的原始密鑰的文件的名稱。該文件必須是一個簡單的二進(jìn)制(或文本)文件,其中包含要使用的密鑰。
  1. 產(chǎn)生一個加密密鑰
[root@mysql-master /]# openssl rand -base64 24
2t3RHNrCZfBNuzdqxCTaI80PS6kkPNVP

// 或者創(chuàng)建一個密鑰文件
shell> echo -n "2t3RHNrCZfBNuzdqxCTaI80PS6kkPNVP" > 
 /data/backups/keyfile


在某些情況下,文本文件可能包含CRLF,這將導(dǎo)致密鑰大小增大,從而使其無效。建議的方法是使用以下命令創(chuàng)建文件:

echo -n  "GCHFLrDFVx6UAsRb88uLVbAVWbK+Yzfs" > /backups/keyfile
  1. 創(chuàng)建加密的數(shù)據(jù)備份
xtrabackup --backup \
--target-dir=/backups \
--encrypt = AES256 \
--encrypt-key="2t3RHNrCZfBNuzdqxCTaI80PS6kkPNVP"
或者
--encrypt-key-file=/data/backups/keyfile
  1. 解密加密的備份數(shù)據(jù)
xtrabackup --decrypt=AES256 \
--encrypt-key="2t3RHNrCZfBNuzdqxCTaI80PS6kkPNVP" \ 
--target-dir=/backups/
或者
--encrypt-key-file=/backups/keyfile

剩余的操作和之前的恢復(fù)數(shù)據(jù)的操作一樣

echo -n "GCHFLrDFVx6UAsRb88uLVbAVWbK+Yzfs" > /backups/keyfile
部分備份

xtrabackup支持在啟用innodb_file_per_table選項(xiàng)時進(jìn)行部分備份。創(chuàng)建部分備份有三種方法:

  • 將表的名稱與正則表達(dá)式匹配

  • 在文件中提供它們的列表

  • 提供數(shù)據(jù)庫列表。

使用--tables 選項(xiàng)

  1. 創(chuàng)建部分備份

第一種方法是--tables選項(xiàng)。選項(xiàng)的值是一個正則表達(dá)式,它與表單中的完全限定的表名(包括數(shù)據(jù)庫名稱)相匹配.

比如,僅備份數(shù)據(jù)庫 shark_db中的所有表

shell> xtrabackup --backup \
--user=root \
--password=123 \
--datadir=/var/lib/mysql \
--target-dir=/backups/shark_db_all \
--tables="^shark_db[.].* | ^mysql[.].*|^sys[.].*|^per.*|information_schema[.].*"


僅備份 shark_db.student

shell> xtrabackup --backup \
--user=root \
--password=123 \
--datadir=/var/lib/mysql \
--target-dir=/backups/shark_db.student \
--tables="^shark_db[.]student|^mysql[.].*|sys[.].*|^per.*|informatio_schema[.].*"
// 參考默認(rèn)表名
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+-----

使用 --tables-file 選項(xiàng)

--tables-file選項(xiàng)指定一個文件,該文件可以包含多個表名,文件中每行一個表名。僅備份文件中指定的表。名稱完全匹配,區(qū)分大小寫,沒有模式或正則表達(dá)式匹配。表格名稱必須是databasename.tablename格式完全限定的。

shell> echo  "mydatabase.mytable" > /tmp/tables.txt
shell> xtrabackup --backup --tables-file=/tmp/tables.txt

使用--databases--databases-file選項(xiàng)

--databases選項(xiàng)接受以空格分隔的要備份的數(shù)據(jù)庫和表的列表.

--databases-file選項(xiàng)指定一個文件,該文件可以包含databasename[.tablename]表單中的多個數(shù)據(jù)庫和表,文件中每行一個元素名稱。僅備份命名的數(shù)據(jù)庫和表。名稱完全匹配,區(qū)分大小寫,沒有模式或正則表達(dá)式匹配。

這兩個選項(xiàng)和之前提到的--tables 和 --tables-file 選項(xiàng)是否方式幾乎一致。
所不同的是:
talbes 僅可以指定具體的表。
databases 即可以指定數(shù)據(jù)庫名,也可以指定某個數(shù)據(jù)庫中的表。

2.恢復(fù)部分備份

在部分備份上使用--prepare選項(xiàng)時,您將看到有關(guān)不存在的表的警告。這是因?yàn)檫@些表存在于InnoDB內(nèi)的數(shù)據(jù)字典中,但相應(yīng)的.ibd文件不存在。它們未被復(fù)制到備份目錄中。

==這些表將從數(shù)據(jù)字典中刪除,當(dāng)您還原備份并啟動InnoDB時,它們將不再存在,==并且不會導(dǎo)致任何錯誤或警告打印到日志文件中。

因?yàn)槟阒爸粋浞萘瞬糠謧浞莸臄?shù)據(jù)而已,自然恢復(fù)的時候不能恢復(fù)沒有備份的數(shù)據(jù)。

shell> xtrabackup --prepare   --target-dir=/backups/shark_db_all


  1. 恢復(fù)備份文件

方法一:

shell> xtrabackup --copy-back \
--datadir=/var/lib/mysql \
--target-dir=/backups/shark_db_all

// 更改權(quán)限
shell> chown mysql.mysql /var/lib/mysql -R

方法二:

適用于沒有對 mysql 服務(wù)器默認(rèn)的數(shù)據(jù)庫(msql/sys/performance_schema)備份的情況

a. 初始化數(shù)據(jù)庫
shell> mysqld --initialize --user=mysql

b. 復(fù)制文件準(zhǔn)備好的備份文件到 mysql 的數(shù)據(jù)庫目錄
shell> rsync -avrP /backups/shark_db_all/ /var/lib/mysql/

c. 修改相關(guān)文件權(quán)限
shell> chown mysql.mysql /var/lib/mysql -R

d. 啟動數(shù)據(jù)庫
shell> systemctl start mysqld

e. 找到數(shù)據(jù)庫密碼,并登錄數(shù)據(jù)庫
shell> grep password /var/log/mysqld.log
shell> mysql -uroot -p   # 回車之后,輸入在上一步找到的密碼

f. 修改數(shù)據(jù)庫密碼
mysql> alter user 'root'@'localhost' identified by '123';

在本地執(zhí)行備份,并且備份到遠(yuǎn)程服務(wù)器

假如目前 MySQL 服務(wù)器是 DB1
遠(yuǎn)程用于備份到服務(wù)器是 BK1

操作步驟

1. 建立DB1BK1 的信任關(guān)系

shell> ssh-copy-id  user@DK1

2. 在 DB1 中安裝支持多線程壓縮和壓縮算法的軟件

shell> yum install pigz   # 支持多線程壓縮
shell>  wget -d --user-agent="Mozilla/5.0 (Windows NT x.y; rv:10.0) Gecko/20100101 Firefox/10.0"http://www.quicklz.com/qpress-11-linux-x64.tar
shell> tar xvf qpress-11-linux-x64.tar
shell> cp qpress /usr/bin


3. 在 DB1 中執(zhí)行備份命令

xtrabackup  --backup --user=mysqluser --password=password --stream=xbstream | ssh user@BK1 "cat - > /mysql_backup.tar.gz"


上面命令的意思是,把備份壓縮后的文件以數(shù)據(jù)流的格式傳輸給 ssh ,并通過 ssh 傳輸給遠(yuǎn)程服務(wù)器 BK1, 備份后的文件名為 mysql_backup.tar.gz

--user--password 指定的是在 MySQL 服務(wù)上經(jīng)過授權(quán)的用戶和密碼
--stream 指定的是采用流格式進(jìn)行同步壓縮

恢復(fù)數(shù)據(jù)

  1. 先解壓
    壓縮的時候是使用下xb 格式的數(shù)據(jù)流壓縮的,所以解壓的時候,也需要使用 xb 工具解壓文件到本地硬盤。
mkdir   -p   /data/xb
xbstream    -x    <    mysql_backup.tar.gz   -C    /data/xb
  1. 之后再安裝之前的步驟恢復(fù)數(shù)據(jù)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容