MySQL 邏輯備份 mysqldump

1 特點(diǎn)
自動(dòng)記錄position位置。

show master  status\G;

2 可用性,一致性
鎖表機(jī)制

用法

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

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

日常用法
備份所有庫(kù)

// 先配置用戶名和密碼
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

備份指定的多個(gè)庫(kù)

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

備份指定庫(kù)的指定幾個(gè)表

shell> mysqldump db1 t1 t3 t7 > dump.sql

備份時(shí)不鎖表

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

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

--flush-logs 在開(kāi)始備份數(shù)據(jù)之前刷新MySQL服務(wù)器日志文件。
此選項(xiàng)需要 RELOAD權(quán)限。如果將此選項(xiàng)與選項(xiàng)結(jié)合使用 --all-databases,則會(huì)為每個(gè)轉(zhuǎn)儲(chǔ)的數(shù)據(jù)庫(kù)刷新日志。會(huì)鎖表。
--single-transaction 是針對(duì) InnoDB 引擎的表,不鎖表,也稱熱備。

恢復(fù)

shell> mysql < dump.sql

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

mysql> source dump.sql

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

shell> mysqladmin create db1

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

shell> mysql db1 < dump.sq1

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

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的熱備份的開(kāi)源實(shí)用程序,它可以備份5.1到5.7版本上InnoDB,XtraDB,MyISAM存儲(chǔ)引擎的表, Xtrabackup有兩個(gè)主要的工具:xtrabackup、innobackupex 。

原來(lái)的版本

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

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

新版本的變化

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

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

  • xtrabackup
  • innobackupex

xtrabackup是一個(gè)C程序。

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

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

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

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

那么問(wèn)題來(lái)了。

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

官方手冊(cè)解釋

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

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

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

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

全備

下面的命令均假設(shè)沒(méi)有在 my.cnf 中配置任何關(guān)于 xtrabackup 的選項(xiàng)
要執(zhí)行備份需要指定 備份數(shù)據(jù)放置的位置,就是目錄,假如目錄不存在,則會(huì)自動(dòng)創(chuàng)建;==注意這個(gè)目錄不會(huì)被遞歸創(chuàng)建,僅僅會(huì)創(chuàng)建最后一級(jí)目錄;==假如存在,就會(huì)直接開(kāi)始備份,并且不會(huì)覆蓋原來(lái)的數(shù)據(jù)。

1 開(kāi)始備份

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

# 備份完成后,可以看到備份時(shí)的LSN號(hào),當(dāng)下次進(jìn)行增量備份時(shí),xtrabackup就只備份大于此號(hào)的page即可。

查看備份文件

[root@mysql-master ~]# ls -lh /data/backups/
總用量 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ù)庫(kù)的名稱相同,沒(méi)錯(cuò),這些就是各個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù)文件備份目錄。
還有一個(gè)innodb的共享表空間文件,ibdata1,注意,如果想要使用xtrabackup備份眾多數(shù)據(jù)庫(kù)中的某一個(gè),那么必須保證在創(chuàng)建這個(gè)數(shù)據(jù)庫(kù)時(shí),已經(jīng)開(kāi)啟了innodb_file_per_table參數(shù),否則將無(wú)法單獨(dú)備份數(shù)據(jù)庫(kù)服務(wù)器中的某一個(gè)數(shù)據(jù)庫(kù)。
除了剛才描述的這些數(shù)據(jù)文件,xtrabackup還為我們生成了一些文件,我們來(lái)看看這些文件都有什么用(不同版本的xtrabackup生成的文件可能不同)。

backup-my.cnf
此文件中包含了my.cnf中的一些設(shè)置信息,但是,并不是my.cnf中的所有信息都會(huì)包含在此文件中,此文件中只包含了備份時(shí)需要的信息。
xtrabackup_binlog_info
需要開(kāi)啟二進(jìn)制日志
此文件中記錄了備份開(kāi)始時(shí)二進(jìn)制日志文件的"位置(position)"
xtrabackup_checkpoints
此文件中記錄此次備份屬于那種類(lèi)型的備份,是全量還是增量,備份時(shí)起始的LSN號(hào)碼,結(jié)束的LSN號(hào)碼等信息。
xtrabackup_info
本次備份的概要信息,此文件中的信息還是比較全面的。
xtrabackup_logfile
記錄了備份過(guò)程中的日志,在對(duì)數(shù)據(jù)進(jìn)行prepare時(shí)需要通過(guò)日志將數(shù)據(jù)還原成一致的可用的數(shù)據(jù)。

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

使用 xtrabackup --backup 選項(xiàng)進(jìn)行備份后,并不能直接使用,首先需要準(zhǔn)備它以便還原它。
如果您嘗試使用這些數(shù)據(jù)文件啟動(dòng)InnoDB,它將檢測(cè)損壞并自行崩潰,以防止您在損壞的數(shù)據(jù)上運(yùn)行。
因?yàn)閭浞莩龅臄?shù)據(jù)是不一致的,我們需要將同時(shí)備份出的事務(wù)日志應(yīng)用到備份中,才能得到一份完整、一致、可用的數(shù)據(jù),xtrabackup稱這一步操作為prepare,直譯過(guò)來(lái)就是"準(zhǔn)備"。
xtrabackup --prepare 步驟使文件在一個(gè)時(shí)刻完全一致

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

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

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

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

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

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

恢復(fù)

xtrabackup 在執(zhí)行copyback時(shí)會(huì)讀取數(shù)據(jù)庫(kù)的my.cnf中的配置,但是如果my.cnf中沒(méi)有配置datadir,那么--datadir選項(xiàng)必須存在,而且,datadir目錄必須為空目錄,其中不能存在數(shù)據(jù),否則在執(zhí)行上述命令時(shí)會(huì)報(bào)錯(cuò),--copy-back選項(xiàng)對(duì)應(yīng)的目錄就是我們準(zhǔn)備好的可用數(shù)據(jù)的目錄。
為了能夠正常的恢復(fù)數(shù)據(jù),我們先確定數(shù)據(jù)庫(kù)服務(wù)已經(jīng)停止了,而且對(duì)應(yīng)的數(shù)據(jù)目錄中不存在數(shù)據(jù),然后進(jìn)行數(shù)據(jù)還原工作,刪除數(shù)據(jù)目錄中的文件與日志。

停止數(shù)據(jù)庫(kù)的服務(wù)
清理環(huán)境
修改權(quán)限
啟動(dòng)數(shù)據(jù)庫(kù)

shell> systemctl stop mysqld.service

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

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

# 下面為完成后的輸出結(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

啟動(dòng)數(shù)據(jù)庫(kù)

shell> systemctl start mysqld.service

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

shell> innobackupex --defaults-file=/etc/my.cnf --host=192.168.1.146 --user=root --password=123123 /backup

shell> nnobackupex --apply-log --use-memory=4G /backup/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é)

執(zhí)行備份命令

指定 數(shù)據(jù)庫(kù)的用戶名和密碼
指定 備份目錄,注意只可以自動(dòng)創(chuàng)建最后一級(jí)的目錄

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

就是指: --prepare 參數(shù), 保證數(shù)據(jù)的統(tǒng)一且完整性

停服務(wù),并且把 mysql 的數(shù)據(jù)目錄下的所有文件和文件夾清除。

/var/lib/mysql/ 此目錄必須是空的

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

本質(zhì)上就是拷貝備份的文件到指定的 mysql 數(shù)據(jù)目錄下

修改 mysql 數(shù)據(jù)目錄的屬主和屬組為 MySQL 服務(wù)器進(jìn)程啟動(dòng)的用戶,默認(rèn)是 mysql
啟動(dòng)服務(wù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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