一、數(shù)據(jù)庫備份的必要性
????????備份就是為了防止原數(shù)據(jù)丟失,保證數(shù)據(jù)的安全。當(dāng)數(shù)據(jù)庫因為某些原因造成部分或 者全部數(shù)據(jù)丟失后,備份文件可以幫我們找回丟失的數(shù)據(jù)。因此,數(shù)據(jù)備份是很重要 的工作。
常見數(shù)據(jù)庫備份的應(yīng)用場景如下:
數(shù)據(jù)丟失應(yīng)用場景:
- 人為操作失誤造成某些數(shù)據(jù)被誤操作
- 軟件 BUG 造成部分數(shù)據(jù)或全部數(shù)據(jù)丟失
- 硬件故障造成數(shù)據(jù)庫部分數(shù)據(jù)或全部數(shù)據(jù)丟失
- 安全漏洞被入侵數(shù)據(jù)惡意破壞
非數(shù)據(jù)丟失應(yīng)用場景:
- 特殊應(yīng)用場景下基于時間點的數(shù)據(jù)恢復(fù)
- 開發(fā)測試環(huán)境數(shù)據(jù)庫搭建
- 相同數(shù)據(jù)庫的新環(huán)境搭建
- 數(shù)據(jù)庫或者數(shù)據(jù)遷移
二、MySQL備份類型
根據(jù)備份的方法(是否需要數(shù)據(jù)庫離線)可以將備份分為:
- 熱備(Hot Backup)
- 冷備(Cold Backup)
- 溫備(Warm Backup)
熱備份可以在數(shù)據(jù)庫運行中直接備份,對正在運行的數(shù)據(jù)庫操作沒有任何的影響,數(shù)
據(jù)庫的讀寫操作可以正常執(zhí)行。這種方式在 MySQL 官方手冊中稱為 Online Backup
(在線備份)。
冷備份必須在數(shù)據(jù)庫停止的情況下進行備份,數(shù)據(jù)庫的讀寫操作不能執(zhí)行。這種備份
最為簡單,一般只需要復(fù)制相關(guān)的數(shù)據(jù)庫物理文件即可。這種方式在 MySQL 官方手
冊中稱為 Offline Backup(離線備份)。
溫備份同樣是在數(shù)據(jù)庫運行中進行的,但是會對當(dāng)前數(shù)據(jù)庫的操作有所影響,備份時
僅支持讀操作,不支持寫操作。
- 按照備份后文件的內(nèi)容,熱備份又可以分為:
- 邏輯備份
- 裸文件備份
????????在 MySQL 數(shù)據(jù)庫中,邏輯備份是指備份出的文件內(nèi)容是可讀的,一般是文本內(nèi)容。
內(nèi)容一般是由一條條 SQL 語句,或者是表內(nèi)實際數(shù)據(jù)組成。如 mysqldump 和
SELECT * INTO OUTFILE 的方法。這類方法的好處是可以觀察導(dǎo)出文件的內(nèi)容,一
般適用于數(shù)據(jù)庫的升級、遷移等工作。但其缺點是恢復(fù)的時間較長。
????????裸文件備份是指復(fù)制數(shù)據(jù)庫的物理文件,既可以在數(shù)據(jù)庫運行中進行復(fù)制(如
ibbackup、xtrabackup 這類工具),也可以在數(shù)據(jù)庫停止運行時直接復(fù)制數(shù)據(jù)文
件。這類備份的恢復(fù)時間往往比邏輯備份短很多。????????
????????對于跨平臺遷移,邏輯備份通常比裸文件備份更方便。這是因為邏輯備份將數(shù)據(jù)以可讀的格式進行備份,可以在不同操作系統(tǒng)和數(shù)據(jù)庫軟件之間進行轉(zhuǎn)換和導(dǎo)入。而裸文件備份只能在相同類型的操作系統(tǒng)和數(shù)據(jù)庫軟件上進行恢復(fù),如果需要跨平臺遷移,就需要先將數(shù)據(jù)進行轉(zhuǎn)換,才能進行導(dǎo)入。因此,在跨平臺遷移時,推薦使用邏輯備份。
- 按照備份數(shù)據(jù)庫的內(nèi)容來分,備份又可以分為:
- 完全備份
- 部分備份
完全備份是指對數(shù)據(jù)庫進行一個完整的備份,即備份整個數(shù)據(jù)庫,如果數(shù)據(jù)較多會占 用較大的時間和空間。 部分備份是指備份部分數(shù)據(jù)庫(例如,只備份一個表)
- 部分備份又分為:
- 增量備份
- 差異備份
????????增量備份需要使用專業(yè)的備份工具。也就是說每次備份只會備份自上次備份之后到這次備份的時間之內(nèi)產(chǎn)生的數(shù)據(jù)。 因此每次備份都比差異備份節(jié)約空間,但是恢復(fù)數(shù)據(jù)麻煩。
????????
????????差異備份指的是自上一次完全備份以來變化的數(shù)據(jù)。和增量備份相比,浪費空間,但 恢復(fù)數(shù)據(jù)比增量備份簡單。
????????
????????也就是說,增量備份是,只要數(shù)據(jù)與上次備份有修改或增加或刪除就備份,差異備份是上一次全備份到這次備份之間產(chǎn)生變化就備份
優(yōu)劣勢對比
MySQL 中進行不同方式的備份還要考慮存儲引擎是否支持,如 MyISAM 不支持熱 備,支持溫備和冷備。而 InnoDB 支持熱備、溫備和冷備。
一般情況下,我們需要備份的數(shù)據(jù)分為以下幾種:
- 表數(shù)據(jù)
- 二進制日志、InnoDB
- 事務(wù)日志
- 代碼(存儲過程、存儲函數(shù)、觸發(fā)器、事件調(diào)度器)
- 服務(wù)器配置文件
建議的恢復(fù)策略:
完全+增量+二進制日志
完全+差異+二進制日志
下面是幾種常用的備份工具:
- mysqldump:邏輯備份工具,適用于所有的存儲引擎,支持溫備、完全備份、部分備份、對于 InnoDB 存儲引擎支持熱備。
- cp、tar 等歸檔復(fù)制工具:物理備份工具,適用于所有的存儲引擎、冷備、完全備份、部分備份。
- lvm2 snapshot:借助文件系統(tǒng)管理工具進行備份。
- mysqlhotcopy:名不副實的一個工具,僅支持 MyISAM 存儲引擎。
- xtrabackup:一款由 percona 提供的非常強大的 InnoDB/XtraDB 熱備工具,支持完全備份、增量備份。
三、冷備份的備份及恢復(fù)
1、先看通用查詢?nèi)罩究词欠耖_啟
SHOW VARIABLES LIKE '%general%';
顯示OFF沒有開啟;
2、開啟通用查詢?nèi)罩?/p>
SET GLOBAL general_log=1;
3、mkdir /backup/ #創(chuàng)建備份目錄
4、#打包數(shù)據(jù)庫文件。/var/lib/mysql為數(shù)據(jù)庫文件存放目錄
tar -zcvf /backup/mysql_all$(date +%F-%m-%S).tar.zip *
?5、查看是否壓縮成功
?6、開啟mysql服務(wù),去刪掉指定的數(shù)據(jù)庫
查看數(shù)據(jù)庫;
刪除Class_Linux數(shù)據(jù)庫
?
?查看是否刪除成功
7、停掉mysql服務(wù),將之前打包的數(shù)據(jù)庫文件壓縮包解壓到/var/lib/mysql
?可以看到被刪除的數(shù)據(jù)庫恢復(fù)了
?8、開啟mysql服務(wù),查看Class_Linux數(shù)據(jù)庫是否恢復(fù)成功
?
恢復(fù)成功
四、Mysql命令行備份(熱備份的邏輯備份)
1、導(dǎo)出特定表的結(jié)構(gòu) mysqldump -uroot -p -B 數(shù)據(jù)庫名 --table 表名 > xxx.sql
mysqldump -uroot -p --databases Class_Linux > /backup/Class_Linux.sql
?2、查看導(dǎo)出的文件
?3、登錄mysql,刪除數(shù)據(jù)庫
查看數(shù)據(jù)庫
?刪除Class_Linux數(shù)據(jù)庫
?查看是否刪除成功;
?4、導(dǎo)入方法一:通過命令行恢復(fù),(登陸的時候進行導(dǎo)入)
mysql -uroot -p < /backup/Class_Linux.sql
?5、查看mysql,數(shù)據(jù)是否恢復(fù)成功
導(dǎo)入方法二:(?在mysql終端下執(zhí)行)
?在mysql終端下執(zhí)行:
source /backup/Class_Linux.sql
五、通過二進制日志恢復(fù)
① 先將Class_Linux庫進行邏輯備份?
mysqldump -uroot -pNebula@123 -B Class_Linux > /backup/Class_0417.sql
?② 查看原先的二進制日志
③ 使用reset master命令將二進制日志重置;
④ 查看二進制日志
?⑤ 切到Class_Linux庫,給students表進行表的增刪改查操作
?這里我們插入一條數(shù)據(jù):
? 這時候查看狀態(tài),發(fā)現(xiàn)Position變了,這時因為進行數(shù)據(jù)庫的修改,position的位置會改變
?在將剛剛插入的數(shù)據(jù)刪除:
⑥ 接下來通過二進制文件將數(shù)據(jù)恢復(fù);
?【mysql的二進制文件在/var/lib/mysql目錄下】
通過這個命令查看二進制日志詳情:
mysqlbinlog -v mysql-bin.000001
?在日志的最后可以看見我們剛剛的刪除操作:
?方法一:按時間恢復(fù)
【開始時間可以忽略,因為默認就是日志最開始的時間】
mysqlbinlog -v mysql-bin.000001 --start-datetime='2023-04-17 12:11:12' --stop-datetime='2023-04-17 12:12:41' |mysql -uroot -p
?再查看表發(fā)現(xiàn)數(shù)據(jù)恢復(fù)了;
方法二:按位置恢復(fù)
【開始位置可以忽略,因為默認就是日志最開始的位置】
#刪除剛剛恢復(fù)的數(shù)據(jù)
#再查看二進制日志
【注意】這個位置一定是刪除這個操作的BEGIN的下面那一行
mysqlbinlog -v mysql-bin.000001 --stop-position=1313 |mysql -uroot -p
?再查看表發(fā)現(xiàn)數(shù)據(jù)恢復(fù)了;
文章來源:http://www.zghlxwxcb.cn/news/detail-409881.html
?其實我們最開始插入數(shù)據(jù),刪除數(shù)據(jù)的時候該操作就已經(jīng)被記錄,第一次按時間恢復(fù)數(shù)據(jù)的操作就相當(dāng)于又插入了一條數(shù)據(jù),我們按位置恢復(fù)數(shù)據(jù)的時候先將剛剛恢復(fù)的數(shù)據(jù)刪除,這個操作也有記錄,所以二進制日志的內(nèi)容就是插入>刪除>按時間恢復(fù)時的插入>刪除,所以我們在按位置恢復(fù)的時候,可以只寫第一次刪除數(shù)據(jù)的位置。文章來源地址http://www.zghlxwxcb.cn/news/detail-409881.html
到了這里,關(guān)于【Linux】Mysql的數(shù)據(jù)庫備份及恢復(fù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!