Effective MySQL之備份與恢復

2021-06-18 16:54:42 字數 4449 閱讀 8225

五分鐘成為一名dba

如果我們已經有了乙個mysql生產級系統,而該產品卻沒有mysql備份策略,那麼我們至少應該做些什麼呢?在採取任何備份策略之前,有許多有關資料庫大小和儲存策略引擎的用法的預備知識需要了解,在執行任何備份方案期間,上述二者對於系統的可用性都會產生直接影響。

本章將討論在確定乙個最小功能性備份時所需的方法,包括:

●      確定資料庫的大小

●      確定儲存策略引擎的使用

●      鎖和宕機帶來的影響

1.1 my sql備份

備份mysql環境的策略不止一種,它們都取決於mysql拓撲中伺服器的數量。有大量的開源或商業工具軟體可用於執行備份。第2章中將對這些策略進行詳細討論。

現在我們要討論的情形是:環境中只有一台伺服器,且需要建立乙個一致的備份策略。我們有兩個適用於所有mysql環境的選擇方案。第乙個就是把mysql例項停下來,然後對整個檔案系統進行冷備份。這樣做會導致系統在一段不確定的時間內不可用,還要保證對所有正確的資訊都進行了拷貝,這些正確的資訊包括:mysql資料、可用的事務和二進位制日誌資料,以及當前的mysql配置。

第二個選擇方案是利用標準mysql安裝中所包含的乙個客戶端工具。使用mysqldump命令可不停止mysql例項就能夠產生乙個一致的備份。但在使用mysqldump命令時,需要做出幾個重要的決定,以便選定最佳方案。這些決定包括:

●      需要備份的資料庫有多大?

●      要生成乙個一致性備份,什麼鎖策略是必需的?

●      備份需要占用多長時間?

執行一次mysql備份時,需要考慮乙個重要問題,那就是將mysql備份到本地磁碟上時,這個備份有多大。需要確保有足夠的磁碟空間來儲存備份檔案。

通過下面的sql語句,可以得到當前的資料和索引的總大小(以mb為單位):

mysql>select round(sum(data_length+index_length)/1024/1024)

->          as total_mb,

->          round(sum(data_length)/1024/1024)asdata_mb,

->          round(sum(index_length)/1024/1024)asindex_mb

->from    information_schema.tables;

| total_mb | data_mb | index_mb |

|      927 |      847 |       80 |

執行mysqldump所得的備份的大小大致與資料的大小相同,但為了安全起見,有10%到15%的冗餘。這種計算是不精確的,然而,這一備份會產生乙個資料的基於文字的輸出。例如,乙個在資料庫中4位元組的整數,在mysqldump備份檔案中就可能長達10字元位元組。在執行備份的同時將備份壓縮或傳輸到另乙個不同的網路裝置上是可能的,在第2章和第8章中將對它們及相關的限制進行討論。

執行上述sql語句得到的資料庫中的資料的大小是847mb,後面我們會看到,用通常的預設選項執行mysqldump所得的備份檔案的大小是818mb。第8章中的示例資料庫的大小是4.5gb,而所產生的備份檔案的大小卻只有2.9gb。

所選擇的鎖策略將決定在執行備份期間,應用程式是否可以對資料庫執行寫操作。預設情況下,mysqldump利用lock tables命令進行表級加鎖,以便確保所有資料有乙個一致的版本。這取決於--lock tables命令列選項,而這一選項在預設狀態下是disabled的,它是--opt選項的一部分,而--opt選項在預設狀態下是enabled的。我們可以不鎖表,但這樣一來,就不能保證備份的一致性了。當使用myisam儲存引擎時,--lock-tables對於確保備份的一致性而言是非常必要的。

反過來,

mysqldump提供了--single-transaction選項,它可以為乙個單獨的事務中所有的表建立乙個版本一致的快照。這一選項只有在使用某種支援多版本的儲存引擎時才可用。innodb是mysql預設安裝時唯一包含的儲存引擎。使用這一選項時,它自動關閉--lock-tables。

下面的sql語句將確認當前mysql例項所使用的儲存引擎:

mysql> select table_schema, engine, count(*) as tables

->from    information_schema.tables

-> where   table_schema not in

->          ('information_schema','performance_schema')

->group by table_schema, engine

->order by 3 desc;

|table_schema       |engine | tables |

|shopping_cart      |myisam |    109 |

|cust_db            |innodb |     48 |

|mysql              |myisam |     21 |

|analytics          |innodb |     20 |

|phpmyadmin         |myisam |      8 |

|newsletter         |myisam |      8 |

|cust_db            |myisam |      3 |

|mysql              |csv    |      2 |

在本例中,此mysql例項包含數個不同的支援不同功能的模式(schedule),包括乙個購物車、時事新聞和管理工具。乙個完整的innodb應用具有如下形式:

| table_schema       |  engine     |      tables |

| prod_db            |  innodb     |         122 |

| mysql              |  myisam     |          21 |

| mysql              |  csv        |           2 |

如本例所示,mysql元模式使用myisam,這是無法改變的。如果資料庫使用了完整的innodb,則將會有兩種處理myisam的mysql表的選擇,本章後續部分將對此進行討論。

確定備份需要消耗多長時間是最重要的需求。沒有什麼計算方法可以給出精確答案。資料庫的大小、系統的ram的容量、所使用的儲存引擎、mysql的配置、硬碟的速度以及當前的工作負載等都會影響到計算結果。在執行備份時收集這種型別資訊的重要意義在於將來要用得到它們。執行時間是重要的,這是因為它是維護資料庫的有效視窗。在資料庫備份期間,可能會存在應用程式的功能限制、效能開銷等,而且備份還可能限制了其他操作,如批處理或軟體維護等。

$cat  storage_engines.sql

select table_schema, engine,

round(sum(data_length+index_length)/1024/1024) astotal_mb,

round(sum(data_length)/1024/1024) as data_mb,

round(sum(index_length)/1024/1024) as index_mb,

count(*)  as tables

from  information_schema.tables

group by  table_schema,  engine

order by  3  desc;

mysql> source  storage_engines.sql

| table_schema |engine | total_mb | data_mb | index_mb | tables |

| analytics          | innodb | 10930 | 10525 | 378 |  20 |

| cust_db            | innodb |  1155 |   962 | 194 |  48 |

| newsletter         | innodb |   514 |   278 | 237 |   7 |

| shopping_cart      | myisam |    27 |    19 |   8 | 109 |

| cust_db            | myisam |     9 |     3 |   7 |   3 |

| mysql              | myisam |     1 |     0 |   0 |  21 |

| information_schema | myisam |     0 |     0 |   0 |   8 |

| information_schema | memory |     0 |     0 |   0 |  20 |

| mysql              | csv    |     0 |     0 |   0 |   2 |

博學之,審問之,慎思之,明辨之,篤行之

禮記 中庸 十九章有云 博學之,審問之,慎思之,明辨之,篤行之。這說的是為學的幾個層次,或者說是幾個遞進的階段。博學之 意謂為學首先要廣泛的獵取,培養充沛而旺盛的好奇心。好奇心喪失了,為學的慾望隨之而消亡,博學遂為不可能之事。博 還意味著博大和寬容。惟有博大和寬容,才能相容幷包,使為學具有世界眼光和...

接觸之,熟悉之,打破之

接觸之,熟悉之,打破之 拿破崙小時候就是孩子王,不管同夥伴們玩什麼遊戲,它總是贏家。同時,它更善於改變遊戲規則,以便能夠發揮他自己的優勢。如果能夠成為遊戲規則的左右者,那麼,在當今商戰中必定是最大的贏家。我們處在乙個有著各種各樣遊戲規則的大環境中,每時每刻都要面對不同的遊戲規則,轉換不同的角色,讓自...

手之舞之,足之蹈之

我知道,你認為我在講述天方夜譚。沒有哪個程式設計師可以這樣奢侈,可以這樣幸運。不錯,這確乎是我的幻想。不可求,不可遇。然而,書卻可以擁有這樣的魔力,可以讓這樣的幻想得到實現。感謝richard monson haefel薈萃了這樣乙個團隊,並將他們帶到每乙個讀者身邊,那就是這本薄薄的小書 軟體架構師...