濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > MySQL 邏輯備份與恢復(fù)測(cè)試的相關(guān)總結(jié)

MySQL 邏輯備份與恢復(fù)測(cè)試的相關(guān)總結(jié)

熱門(mén)標(biāo)簽:400電話(huà)辦理服務(wù)價(jià)格最實(shí)惠 html地圖標(biāo)注并導(dǎo)航 大豐地圖標(biāo)注app 400電話(huà)變更申請(qǐng) 呂梁外呼系統(tǒng) 南太平洋地圖標(biāo)注 北京金倫外呼系統(tǒng) 武漢電銷(xiāo)機(jī)器人電話(huà) 催天下外呼系統(tǒng)

一、什么樣的備份是數(shù)據(jù)庫(kù)邏輯備份呢?

大家都知道,數(shù)據(jù)庫(kù)在返回?cái)?shù)據(jù)給我們使用的時(shí)候都是按照我們最初所設(shè)計(jì)期望的具有一定邏輯關(guān)聯(lián)格式的形式一條一條數(shù)據(jù)來(lái)展現(xiàn)的,具有一定的商業(yè)邏輯屬性,而在物理存儲(chǔ)的層面上數(shù)據(jù)庫(kù)軟件卻是按照數(shù)據(jù)庫(kù)軟件所設(shè)計(jì)的某種特定格式經(jīng)過(guò)一定的處理后存放。

數(shù)據(jù)庫(kù)邏輯備份就是備份軟件按照我們最初所設(shè)計(jì)的邏輯關(guān)系,以數(shù)據(jù)庫(kù)的邏輯結(jié)構(gòu)對(duì)象為單位,將數(shù)據(jù)庫(kù)中的數(shù)據(jù)按照預(yù)定義的邏輯關(guān)聯(lián)格式一條一條生成相關(guān)的文本文件,以達(dá)到備份的目的。

二、常用的邏輯備份

邏輯備份可以說(shuō)是最簡(jiǎn)單,也是目前中小型系統(tǒng)最常使用的備份方式。 在 MySQL 中我們常用的邏輯備份主要就是兩種,一種是將數(shù)據(jù)生成可以完全重現(xiàn)當(dāng)前數(shù)據(jù)庫(kù)中數(shù)據(jù)的 INSERT 語(yǔ)句,另外一種就是將數(shù)據(jù)通過(guò)邏輯備份軟件,將我們數(shù)據(jù)庫(kù)表數(shù)據(jù)以特定分隔符進(jìn)行分隔后記錄在文本文件中。

①生成 INSERT 語(yǔ)句備份

兩種邏輯備份各有優(yōu)劣,所針對(duì)的使用場(chǎng)景也會(huì)稍有差別,我們先來(lái)看一下生成 INSERT 語(yǔ)句的邏輯備份。

在 MySQL 數(shù)據(jù)庫(kù)中,我們一般都是通過(guò) MySQL 數(shù)據(jù)庫(kù)軟件自帶工具程序中的 mysqldump 來(lái)實(shí)現(xiàn)聲稱(chēng) INSERT 語(yǔ)句的邏輯備份文件。其使用方法基本如下:

Dumping definition and data mysql database or table
Usage: mysqldump [OPTIONS] database [tables]
OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR mysqldump [OPTIONS] --all-databases [OPTIONS]

由于 mysqldump 的使用方法比較簡(jiǎn)單,大部分需要的信息都可以通過(guò)運(yùn)行“mysqldump --help”而獲得。這里我只想結(jié)合 MySQL 數(shù)據(jù)庫(kù)的一些概念原理和大家探討一下當(dāng)我們使用 mysqldump 來(lái)做數(shù)據(jù)庫(kù)邏輯備份的時(shí)候有些什么技巧以及需要注意一些什么內(nèi)容。

我們都知道,對(duì)于大多數(shù)使用數(shù)據(jù)庫(kù)的軟件或者網(wǎng)站來(lái)說(shuō),都希望自己數(shù)據(jù)庫(kù)能夠提供盡可能高的可用性,而不是時(shí)不時(shí)的就需要停機(jī)停止提供服務(wù)。因?yàn)橐坏?shù)據(jù)庫(kù)無(wú)法提供服務(wù),系統(tǒng)就無(wú)法再通過(guò)存取數(shù)據(jù)來(lái)提供一些動(dòng)態(tài)功能。

所以對(duì)于大多數(shù)系統(tǒng)來(lái)說(shuō)如果要讓每次備份都停機(jī)來(lái)做可能都是不可接受的,可是 mysqldump 程序的實(shí)現(xiàn)原理是通過(guò)我們給的參數(shù)信息加上數(shù)據(jù)庫(kù)中的系統(tǒng)表信息來(lái)一個(gè)表一個(gè)表獲取數(shù)據(jù)然后生成 INSERT 語(yǔ)句再寫(xiě)入備份文件中的。這樣就出現(xiàn)了一個(gè)問(wèn)題,在系統(tǒng)正常運(yùn)行過(guò)程中,很可能會(huì)不斷有數(shù)據(jù)變更的請(qǐng)求正在執(zhí)行,這樣就可能造成在 mysqldump 備份出來(lái)的數(shù)據(jù)不一致。

也就是說(shuō)備份數(shù)據(jù)很可能不是同一個(gè)時(shí)間點(diǎn)的數(shù)據(jù),而且甚至可能都沒(méi)辦法滿(mǎn)足完整性約束。這樣的備份集對(duì)于有些系統(tǒng)來(lái)說(shuō)可能并沒(méi)有太大問(wèn)題,但是對(duì)于有些對(duì)數(shù)據(jù)的一致性和完整性要求比較嚴(yán)格系統(tǒng)來(lái)說(shuō)問(wèn)題就大了,就是一個(gè)完全無(wú)效的備份集。

對(duì)于如此場(chǎng)景,我們?cè)撊绾巫觯课覀冎?,想?shù)據(jù)庫(kù)中的數(shù)據(jù)一致,那么只有兩種情況下可以做到。

  • 第一、同一時(shí)刻取出所有數(shù)據(jù);
  • 第二、數(shù)據(jù)庫(kù)中的數(shù)據(jù)處于靜止?fàn)顟B(tài)。

對(duì)于第一種情況,大家肯定會(huì)想,這可能嗎?

不管如何,只要有兩個(gè)以上的表,就算我們?nèi)绾螌?xiě)程序,都不可能昨晚完全一致的取數(shù)時(shí)間點(diǎn)啊。是的,我們確實(shí)無(wú)法通過(guò)常規(guī)方法讓取數(shù)的時(shí)間點(diǎn)完全一致,但是大家不要忘記,在同一個(gè)事務(wù)中,數(shù)據(jù)庫(kù)是可以做到所讀取的數(shù)據(jù)是處于同一個(gè)時(shí)間點(diǎn)的。

所以,對(duì)于事務(wù)支持的存儲(chǔ)引擎,如 Innodb 或者 BDB 等 ,我們就可以通過(guò)控制將整個(gè)備份過(guò)程控制在同一個(gè)事務(wù)中,來(lái)達(dá)到備份數(shù)據(jù)的一致性和完整性,而且 mysqldump 程序也給我們提供了相關(guān)的參數(shù)選項(xiàng)來(lái)支持該功能,就是通過(guò)“--single-transaction”選項(xiàng),可以不影響數(shù)據(jù)庫(kù)的任何正常服務(wù)。

對(duì)于第二種情況我想大家首先想到的肯定是將需要備份的表鎖定,只允許讀取而不允許寫(xiě)入。

是的,我們確實(shí)只能這么做。我們只能通過(guò)一個(gè)折衷的處理方式,讓數(shù)據(jù)庫(kù)在備份過(guò)程中僅提供數(shù)據(jù)的查詢(xún)服務(wù),鎖定寫(xiě)入的服務(wù),來(lái)使數(shù)據(jù)暫時(shí)處于一個(gè)一致的不會(huì)被修改的狀態(tài),等 mysqldump 完成備份后再取消寫(xiě)入鎖定,重新開(kāi)始提供完整的服務(wù)。

mysqldump 程序自己也提供了相關(guān)選項(xiàng)如“--lock-tables”和“--lock-all-tables”,在執(zhí)行之前會(huì)鎖定表,執(zhí)行結(jié)束后自動(dòng)釋放鎖定。

這里有一點(diǎn)需要注意的就是,“--lock-tables”并不是一次性將需要 dump 的所有表鎖定,而是每次僅僅鎖定一個(gè)數(shù)據(jù)庫(kù)的表,如果你需要 dump 的表分別在多個(gè)不同的數(shù)據(jù)庫(kù)中,一定要使用“--lock-all-tables”才能確保數(shù)據(jù)的一致完整性。

當(dāng)通過(guò) mysqldump 生成 INSERT 語(yǔ)句的邏輯備份文件的時(shí)候,有一個(gè)非常有用的選項(xiàng)可以供我們使用,那就是“--master-data[=value]”。當(dāng)添加了“--master-data=1”的時(shí)候, mysqldump 會(huì)將當(dāng)前 MySQL 使用到 binlog 日志的名稱(chēng)和位置記錄到 dump 文件中,并且是被 以 CHANGE_MASTER 語(yǔ)句的形式記錄,如果僅僅只是使用“--master-data”或者“--master-data=2”,則 CHANGE_MASTER 語(yǔ)句會(huì)以注釋的形式存在。這個(gè)選項(xiàng)在實(shí)施 slave 的在線(xiàn)搭建的時(shí)候是非常有用的,即使不是進(jìn)行在線(xiàn)搭建 slave,也可以在某些情況下做恢復(fù)的過(guò)程中通過(guò)備份的 binlog 做進(jìn)一步恢復(fù)操作。

在某些場(chǎng)景下,我們可能只是為了將某些特殊的數(shù)據(jù)導(dǎo)出到其他數(shù)據(jù)庫(kù)中,而又不希望通過(guò)先建臨時(shí)表的方式來(lái)實(shí)現(xiàn),我們還可以在通過(guò) mysqldump 程序的“—where='where-condition'”來(lái)實(shí)現(xiàn),但只能在僅 dump 一個(gè)表的情況下使用。

其實(shí)除了以上一些使用訣竅之外,mysqldump 還提供了其他很多有用的選項(xiàng)供大家在不同的場(chǎng)景下只用,如通過(guò)“--no-data”僅僅 dump 數(shù)據(jù)庫(kù)結(jié)構(gòu)創(chuàng)建腳本,通過(guò)“--no-create-info”去掉 dump 文件中創(chuàng)建表結(jié)構(gòu)的命令等等,感興趣的讀者朋友可以詳細(xì)閱讀 mysqldump 程序的使用介紹再自行測(cè)試。

②生成特定格式的純文本備份數(shù)據(jù)文件備份

除了通過(guò)生成 INSERT 命令來(lái)做邏輯備份之外,我們還可以通過(guò)另外一種方式將數(shù)據(jù)庫(kù)中的數(shù)據(jù)以特定分隔字符將數(shù)據(jù)分隔記錄在文本文件中,以達(dá)到邏輯備份的效果。這樣的備份數(shù)據(jù)與 INSERT 命令文件相比,所需要使用的存儲(chǔ)空間更小,數(shù)據(jù)格式更加清晰明確,編輯方便。但是缺點(diǎn)是在同一個(gè)備份文件中不能存在多個(gè)表的備份數(shù)據(jù),沒(méi)有數(shù)據(jù)庫(kù)結(jié)構(gòu)的重建命令。對(duì)于備份集需要多個(gè)文件,對(duì)我們產(chǎn)生的影響無(wú)非就是文件多了維護(hù)和恢復(fù)成本增加,但這些基本上都可以通過(guò)編寫(xiě)一些簡(jiǎn)單的腳本來(lái)實(shí)現(xiàn)。

那我們一般可以使用什么方法來(lái)生成這樣的備份集文件呢,其實(shí) MySQL 也已經(jīng)給我們實(shí)現(xiàn)的相應(yīng)的功能。

在 MySQL 中一般都使用以下兩種方法來(lái)獲得可以自定義分隔符的純文本備份文件。

1.通過(guò)執(zhí)行 SELECT ... TO OUTFILE FROM ...命令來(lái)實(shí)現(xiàn)

在 MySQL 中提供了一種 SELECT 語(yǔ)法,專(zhuān)供用戶(hù)通過(guò) SQL 語(yǔ)句將某些特定數(shù)據(jù)以指定格式輸出到文本文件中,同時(shí)也提供了實(shí)用工具和相關(guān)的命令可以方便的將導(dǎo)出文件原樣再導(dǎo)入到數(shù)據(jù)庫(kù)中。這不正是我們做備份所需要的么?

該命令有幾個(gè)需要注意的參數(shù)如下:

  • 實(shí)現(xiàn)字符轉(zhuǎn)義功能的“FIELDS ESCAPED BY ['name']” 將 SQL 語(yǔ)句中需要轉(zhuǎn)義的字符進(jìn)行轉(zhuǎn)義;
  • 可以將字段的內(nèi)容“包裝”起來(lái)的“FIELDS [OPTIONALLY] ENCLOSED BY 'name'”,如果不使用“OPTIONALLY”則包括數(shù)字類(lèi)型的所有類(lèi)型數(shù)據(jù)都會(huì)被“包裝”,使 用“OPTIONALLY”之后,則數(shù)字類(lèi)型的數(shù)據(jù)不會(huì)被指定字符“包裝”。
  • 通過(guò)"FIELDS TERMINATED BY"可以設(shè)定每?jī)蓚€(gè)字段之間的分隔符;
  • 而通過(guò)“LINES TERMINATED BY”則會(huì)告訴 MySQL 輸出文件在每條記錄結(jié)束的時(shí)候需要添加什么字符。

如以下示例:

root@localhost : test 10:02:02> SELECT * INTO OUTFILE '/tmp/dump.text'
-> FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
-> LINES TERMINATED BY '\n'
-> FROM test_outfile limit 100;
Query OK, 100 rows affected (0.00 sec)
root@localhost : test 10:02:11> exit
Bye
root@sky:/tmp# cat dump.text
350021,21,"A","abcd"
350022,22,"B","abcd"
350023,23,"C","abcd"
350024,24,"D","abcd"
350025,25,"A","abcd"
... ...

2.通過(guò) mysqldump 導(dǎo)出

可能我們都知道 mysqldump 可以將數(shù)據(jù)庫(kù)中的數(shù)據(jù)以 INSERT 語(yǔ)句的形式生成相關(guān)備份文件,其實(shí)除了生成 INSERT 語(yǔ)句之外,mysqldump 還同樣能實(shí)現(xiàn)上面“SELECT ... TO OUTFILE FROM ...”所實(shí)現(xiàn)的功能,而且同時(shí)還會(huì)生成一個(gè)相關(guān)數(shù)據(jù)庫(kù)結(jié)構(gòu)對(duì)應(yīng)的創(chuàng)建腳本 。

如以下示例:

root@sky:~# ls -l /tmp/mysqldump
total 0
root@sky:~# mysqldump -uroot -T/tmp/mysqldump test test_outfile --fieldsenclosed-by=\" --fields-terminated-by=,
root@sky:~# ls -l /tmp/mysqldump
total 8
-rw-r--r-- 1 root root 1346 2021-4-20 22:18 test_outfile.sql
-rw-rw-rw- 1 mysql mysql 2521 2021-4-20 22:18 test_outfile.txt
root@sky:~# cat /tmp/mysqldump/test_outfile.txt
350021,21,"A","abcd"
350022,22,"B","abcd"
350023,23,"C","abcd"
350024,24,"D","abcd"
350025,25,"A","abcd"
... ...
root@sky:~# cat /tmp/mysqldump/test_outfile.sql
-- MySQL dump 10.11
--
-- Host: localhost Database: test
-- ------------------------------------------------------
-- Server version 5.0.51a-log
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `test_outfile`
--
DROP TABLE IF EXISTS `test_outfile`;
SET @saved_cs_client = @@character_set_client;
SET character_set_client = utf8;
CREATE TABLE `test_outfile` (
`id` int(11) NOT NULL default '0',
`t_id` int(11) default NULL,
`a` char(1) default NULL,
`mid` varchar(32) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
SET character_set_client = @saved_cs_client;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2021-4-20 14:18:23

這樣的輸出結(jié)構(gòu)對(duì)我們做為備份來(lái)使用是非常合適的,當(dāng)然如果一次有多個(gè)表需要被 dump,就會(huì)針對(duì)每個(gè)表都會(huì)生成兩個(gè)相對(duì)應(yīng)的文件。

三、邏輯備份恢復(fù)方法

僅僅有了備份還是不夠啊,我們得知道如何去使用這些備份,現(xiàn)在我們就看看上面所做的邏輯備份的恢復(fù)方法:

由于所有的備份數(shù)據(jù)都是以我們最初數(shù)據(jù)庫(kù)結(jié)構(gòu)的設(shè)計(jì)相關(guān)的形式所存儲(chǔ),所以邏輯備份的恢復(fù)也相對(duì)比較簡(jiǎn)單。當(dāng)然,針對(duì)兩種不同的邏輯備份形式,恢復(fù)方法也稍有區(qū)別。下面我們就分別針對(duì)這兩種邏輯備份文件的恢復(fù)方法做一個(gè)簡(jiǎn)單的介紹。

①I(mǎi)NSERT 語(yǔ)句文件的恢復(fù)

對(duì)于 INSERT 語(yǔ)句形式的備份文件的恢復(fù)是最簡(jiǎn)單的,我們僅僅只需要運(yùn)行該備份文件中的所有(或者部分)SQL 命令即可。首先,如果需要做完全恢復(fù),那么我們可以通過(guò)使用 “mysql backup.sql”直接調(diào)用備份文件執(zhí)行其中的所有命令,將數(shù)據(jù)完全恢復(fù)到備份時(shí)候的狀態(tài)。如果已經(jīng)使用 mysql 連接上了 MySQL,那么也可以通過(guò)在 mysql 中執(zhí)行“source/path/backup.sql”或者“\. /path/backup.sql”來(lái)進(jìn)行恢復(fù)。

②純數(shù)據(jù)文本備份的恢復(fù)

如果是上面第二中形式的邏輯備份,恢復(fù)起來(lái)會(huì)稍微麻煩一點(diǎn),需要一個(gè)表一個(gè)表通過(guò)相關(guān)命令來(lái)進(jìn)行恢復(fù),當(dāng)然如果通過(guò)腳本來(lái)實(shí)現(xiàn)自動(dòng)多表恢復(fù)也是比較方便的。恢復(fù)方法也有兩個(gè),一是通過(guò) MySQL 的“LOAD DATA INFILE”命令來(lái)實(shí)現(xiàn),另一種方法就是通過(guò) MySQL 提供的使用工具 mysqlimport 來(lái)進(jìn)行恢復(fù)。

邏輯備份能做什么?不能做什么?

在清楚了如何使用邏輯備份進(jìn)行相應(yīng)的恢復(fù)之后,我們需要知道我們可以利用這些邏輯備份做些什么。

  1. 通過(guò)邏輯備份,我們可以通過(guò)執(zhí)行相關(guān) SQL 或者命令將數(shù)據(jù)庫(kù)中的相關(guān)數(shù)據(jù)完全恢復(fù)到備份時(shí)候所處的狀態(tài),而不影響不相關(guān)的數(shù)據(jù);
  2. 通過(guò)全庫(kù)的邏輯備份,我們可以在新的 MySQL 環(huán)境下完全重建出一個(gè)于備份時(shí)候完全一樣的數(shù)據(jù)庫(kù),并且不受 MySQL 所處的平臺(tái)類(lèi)型限制;
  3. 通過(guò)特定條件的邏輯備份,我們可以將某些特定數(shù)據(jù)輕松遷移(或者同步)到其他的 MySQL 或者另外的數(shù)據(jù)庫(kù)環(huán)境;
  4. 通過(guò)邏輯備份,我們可以?xún)H僅恢復(fù)備份集中的部分?jǐn)?shù)據(jù)而不需要全部恢復(fù)。

在知道了邏輯備份能做什么之后,我們必須還要清楚他不能做什么,這樣我們自己才能清楚的知道這樣的一個(gè)備份能否滿(mǎn)足自己的預(yù)期,是否確實(shí)是自己想要的。

邏輯備份無(wú)法讓數(shù)據(jù)恢復(fù)到備份時(shí)刻以外的任何一個(gè)時(shí)刻;

四、邏輯備份恢復(fù)測(cè)試

有時(shí)聽(tīng)到某某的數(shù)據(jù)庫(kù)出現(xiàn)問(wèn)題,而當(dāng)其信心十足的準(zhǔn)備拿之前所做好的數(shù)據(jù)庫(kù)進(jìn)行恢復(fù)的時(shí)候才發(fā)現(xiàn)自己的備份集不可用,或者并不能達(dá)到自己做備份時(shí)候所預(yù)期的恢復(fù)效果。遇到這種情景的時(shí)候,恐怕每個(gè)人都會(huì)郁悶至極的。數(shù)據(jù)庫(kù)備份最重要最關(guān)鍵的一個(gè)用途就是當(dāng)我們的數(shù)據(jù)庫(kù)出現(xiàn)某些異常狀況,需要對(duì)數(shù)據(jù)進(jìn)行恢復(fù)的時(shí)候使用的。

作為一個(gè)維護(hù)人員,我們是絕對(duì)不應(yīng)該出現(xiàn)此類(lèi)低級(jí)錯(cuò)誤的。那我們到底該如何避免此類(lèi)問(wèn)題呢?

只有一個(gè)辦法,那就是周期性的進(jìn)行模擬恢復(fù)測(cè)試,校驗(yàn)我們的備份集是否真的有效,是否確實(shí)能夠按照我們的備份預(yù)期進(jìn)行相應(yīng)的恢復(fù)。

到這里可能有人會(huì)問(wèn),恢復(fù)測(cè)試又該如何做呢,我們總不能真的將線(xiàn)上環(huán)境的數(shù)據(jù)進(jìn)行恢復(fù)???

是的,線(xiàn)上環(huán)境的數(shù)據(jù)確實(shí)不能被恢復(fù),但是我們?yōu)槭裁床荒茉跍y(cè)試環(huán)境或者其他的地方做呢?

做恢復(fù)測(cè)試只是為了驗(yàn)證我們的備份是否有效,是否能達(dá)到我們的預(yù)期。

所以在做恢復(fù)測(cè)試之前我們一定要先清楚的知道我們所做的備份到底是為了應(yīng)用于什么樣的場(chǎng)景的。

就比如我們做了一個(gè)全庫(kù)的邏輯備份,目的可能是為了當(dāng)數(shù)據(jù)庫(kù)出現(xiàn)邏輯或者物理異常的時(shí)候能夠恢復(fù)整個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù)到備份時(shí)刻,那么我們惡的恢復(fù)測(cè)試就只需要將整個(gè)邏輯備份進(jìn)行全庫(kù)恢復(fù),看是否能夠成功的重建一個(gè)完整的數(shù)據(jù)庫(kù)。

至于恢復(fù)的數(shù)據(jù)是否和備份時(shí)刻一致,就只能依靠我們自己來(lái)人工判斷比較。

此外我們可能還希望當(dāng)某一個(gè)數(shù)據(jù)庫(kù)對(duì)象,比如某個(gè)表出現(xiàn)問(wèn)題之后能夠盡快的恢復(fù)該表數(shù)據(jù)到備份時(shí)刻。那么我們就可以針對(duì)單個(gè)指定表進(jìn)行抽樣恢復(fù)測(cè)試。

下面我們就假想數(shù)據(jù)庫(kù)主機(jī)崩潰,硬件損壞,造成數(shù)據(jù)庫(kù)數(shù)據(jù)全部丟失,來(lái)做一次全庫(kù)恢復(fù)的測(cè)試示例:

當(dāng)我們的數(shù)據(jù)庫(kù)出現(xiàn)硬件故障,數(shù)據(jù)全部丟失之后,我們必須盡快找到一臺(tái)新的主機(jī)以頂替損壞的主機(jī)來(lái)恢復(fù)相應(yīng)的服務(wù)。在恢復(fù)服務(wù)之前,我們首先需要重建損壞的數(shù)據(jù)庫(kù)。假設(shè)我們已經(jīng)拿到了一臺(tái)新的主機(jī),MySQL 軟件也已經(jīng)安裝就位,相關(guān)設(shè)置也都已經(jīng)調(diào)整好,就等著恢復(fù)數(shù)據(jù)庫(kù)了。

我們需要取回離崩潰時(shí)間最近的一次全庫(kù)邏輯備份文件,復(fù)制到準(zhǔn)備的新主機(jī)上,啟動(dòng)已經(jīng)安裝好的 MySQL。

由于我們有兩種邏輯備份格式,每種格式的恢復(fù)方法并不一樣,所以這里將對(duì)兩種格式的邏輯備份的恢復(fù)都進(jìn)行示例。

①如果是 INSERT 語(yǔ)句的邏輯備份

a、準(zhǔn)備好備份文件,copy 到某特定目錄,如“/tmp”下;

b、通過(guò)執(zhí)行如下命令執(zhí)行備份集中的相關(guān)命令:

mysql -uusername -p  backup.sql

或者先通過(guò) mysql 登錄到數(shù)據(jù)庫(kù)中,然后再執(zhí)行如下命令:

root@localhost : (none) 09:59:40> source /tmp/backup.sql

c、再到數(shù)據(jù)庫(kù)中檢查相應(yīng)的數(shù)據(jù)庫(kù)對(duì)象,看是否已經(jīng)齊全;

d、抽查幾個(gè)表中的數(shù)據(jù)進(jìn)行人工校驗(yàn),并通知開(kāi)啟應(yīng)用內(nèi)部測(cè)試校驗(yàn),當(dāng)所有校驗(yàn)都通過(guò)之后,即可對(duì)外提供服務(wù)了。

當(dāng)然上面所說(shuō)的步驟都是在默認(rèn)每一步都正常的前提下進(jìn)行的,如果發(fā)現(xiàn)某一步有問(wèn)題。假若在 b 步驟出現(xiàn)異常,無(wú)法繼續(xù)進(jìn)行下去,我們首先需要根據(jù)出現(xiàn)的錯(cuò)誤來(lái)排查是否是我們恢復(fù)命令有錯(cuò)?是否我們的環(huán)境有問(wèn)題等?等等。

如果我們確認(rèn)是備份文件的問(wèn)題,那么說(shuō)明我們的這個(gè)備份是無(wú)效的,說(shuō)明測(cè)試失敗了。如果我們恢復(fù)過(guò)程很正常,但是在校驗(yàn)的時(shí)候發(fā)現(xiàn)缺少數(shù)據(jù)庫(kù)對(duì)象,或者某些對(duì)象中的數(shù)據(jù)不正確,或者根本沒(méi)有數(shù)據(jù)。同樣說(shuō)明我們的備份級(jí)無(wú)法滿(mǎn)足預(yù)期,備份失敗。

當(dāng)然,如果我們是在實(shí)際工作的恢復(fù)過(guò)程中遇到類(lèi)似情況的時(shí)候,如果還有更早的備份集,我們必須退一步使用更早的備份集做相同的恢復(fù)操作。雖然更早的備份集中的數(shù)據(jù)可能會(huì)有些失真,但是至少可以部分恢復(fù),而不至于丟失所有數(shù)據(jù)。

②如果我們是備份的以特殊分隔符分隔的純數(shù)據(jù)文本文件

a、第一步和 INSERT 備份文件沒(méi)有區(qū)別,就是將最接近崩潰時(shí)刻的備份文件準(zhǔn)備好;

b、通過(guò)特定工具或者命令將數(shù)據(jù)導(dǎo)入如到數(shù)據(jù)庫(kù)中:

由于數(shù)據(jù)庫(kù)結(jié)構(gòu)創(chuàng)建腳本和純文本數(shù)據(jù)備份文件分開(kāi)存放,所以我們首先需要執(zhí)行數(shù)據(jù)庫(kù)結(jié)構(gòu)創(chuàng)建腳本,然后再導(dǎo)入數(shù)據(jù)。結(jié)構(gòu)創(chuàng)建腳本的方法和上面第一種備份的恢復(fù)測(cè)試中的 b 步驟完全一樣。

有了數(shù)據(jù)庫(kù)結(jié)構(gòu)之后,我們就可以導(dǎo)入備份數(shù)據(jù)了,如下:

mysqlimport --user=name --password=pwd test --fields-enclosed-by=\" --fields-terminated-by=, /tmp/test_outfile.txt

或者

LOAD DATA INFILE '/tmp/test_outfile.txt' INTO TABLE test_outfile FIELDS TERMINATED BY '"' ENCLOSED BY ',';

后面的步驟就和備份文件為 INSERT 語(yǔ)句備份的恢復(fù)完全一樣了,這里就不再累述。

以上就是MySQL 邏輯備份與恢復(fù)測(cè)試的相關(guān)總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于MySQL 邏輯備份與恢復(fù)測(cè)試的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • 詳解Mysql之mysqlbackup備份與恢復(fù)實(shí)踐
  • MySQL5.7 mysqldump備份與恢復(fù)的實(shí)現(xiàn)
  • 淺析MySQL 備份與恢復(fù)
  • 詳解mysql的備份與恢復(fù)
  • MySQL系列之十二 備份與恢復(fù)

標(biāo)簽:徐州 西寧 南充 無(wú)錫 龍巖 迪慶 自貢 麗水

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL 邏輯備份與恢復(fù)測(cè)試的相關(guān)總結(jié)》,本文關(guān)鍵詞  MySQL,邏輯,備份,與,恢復(fù),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MySQL 邏輯備份與恢復(fù)測(cè)試的相關(guān)總結(jié)》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于MySQL 邏輯備份與恢復(fù)測(cè)試的相關(guān)總結(jié)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    阳城县| 金湖县| 海城市| 吉安市| 平顺县| 大安市| 鹤壁市| 大港区| 凉城县| 洛浦县| 三亚市| 齐河县| 武邑县| 马尔康县| 无棣县| 漳州市| 田东县| 辽阳市| 沁阳市| 水富县| 宁晋县| 郑州市| 云霄县| 郁南县| 犍为县| 酉阳| 河北省| 景谷| 阳东县| 宽城| 元氏县| 尚义县| 且末县| 册亨县| 河南省| 东阳市| 安顺市| 天峨县| 桑日县| 健康| 翼城县|