2011-04-26 96 views
2

假設我已經有一個已啓動並正在運行的主數據庫服務器和一個從屬數據庫服務器。使用從設備轉儲(InnoDB和MyISAM)的MySQL增量備份

我想介紹增量備份/時間點恢復到混合中。由於我已經有了用於複製的二進制日誌,它應該像進行完整備份和存儲日誌位置一樣簡單。

但是,我在我的服務器上同時安裝了MyISAM和InnoDB表,並且在每種情況下如何進行完整備份似乎存在衝突的建議。如果它是嚴格的InnoDB,我可以用--single-transaction做mysqldump,但是這個選項警告我MyISAM可能仍然會改變。

我的問題如下:

(1)它是一個有效的關注,MySQL手冊建議的備份:

的mysqldump --single事務--flush-日誌--master -data = 2 --all-databases> whatever.sql

...將不適合,因爲MyISAM表可能會更改(表未使用--single-transaction鎖定),因此新的日誌文件已啓動,但它會啓動可能包含MyISAM表的查詢,這些表在實際上已經在服務器上運行之前已經在這些表中創建他轉儲(並且增量恢復會在不需要時嘗試重新執行這些查詢)? (2)是否只有通過MyISAM和InnoDB表才能獲得「正確」完整備份才能使用--lock-all表的唯一方法是? (或在那一刻關閉服務器/複製文件,因爲無論如何一切都鎖定了)

我假設這些問題的答案是肯定的,但請糾正我,如果我錯了,因爲我已經基於它的下一個想法。

我想保持中斷在主服務器上最小的,所以我正在考慮做完全轉儲關閉基於此方向的奴隸:

http://dev.mysql.com/doc/refman/5.0/en/mysqldump.html#option_mysqldump_master-data

這些方向實際上是爲奴隸建立一個奴隸,但我想知道,下面是否合理?

每天一次:

  1. 停止從
  2. 顯示從站狀態並獲得主日誌文件和位置
  3. 執行從完全轉儲雖然沒有變化正在向它提出的(的MyISAM或InnoDB的)
  4. 啓動從機再一次
  5. 將我完全轉儲到主服務器在某些備份目錄

在恢復的情況下:

  1. 使用從這裏http://dev.mysql.com/doc/refman/5.0/en/point-in-time-recovery-positions.html位置從上述(2)到任何位置的位置去還原從(5)上述
  2. 運行點完全轉儲及時恢復我想恢復到

這是合法嗎?我不明白爲什麼從奴隸的全部轉儲與主人的轉儲有什麼不同,所以看起來好像沒問題。

感謝您的幫助!

回答

0

你一天一次的計劃是非常合理的,原因很簡單:你首先停止了奴隸。沒有新的交易會進入。我想提出一些額外的建議。

在從屬服務器,請在設置的/etc/my.cnf

[mysqld] 
innodb_max_dirty_pages_pct=0 

這是爲什麼如下:

雖然從正在處理的mysqldump,如果任何表必須在註冊髒頁innodb緩衝池,頁面必須刷新到磁盤。我注意到你的mysqldump已經發布了這個選項。默認情況下,innodb_max_dirty_pages_pct是90.無論存在什麼髒頁面,都必須寫入磁盤。如果innodb_max_dirty_pages_pct始終爲零,則刷新innodb緩衝池更快。

您可以在不重新啓動mysql的情況下動態設置它。剛剛運行這個:

SET GLOBAL innodb_max_dirty_pages_pct = 0; 

這將保持innodb緩衝池精益和平均。

我還看到--master-data = 2在你的mysqldump命令中。這隻有在從機上啓用二進制日誌時纔有效。否則,您需要從主服務器檢索主日誌和位置,因爲mysqldump不能這樣做。這裏是你如何可以從得到主人的日誌文件和位置:

步驟1)運行「SHOW SLAVE STATUS \ G」和rediredct到ShowSlaveStatus.txt

步驟2)獲取從ShowSlaveStatus以下信息.TXT
Relay_Master_Log_File
Exec_Master_Log_Pos

步驟3)在轉儲文件的背面寫上這兩個值。

一件事:

請加--routines --triggers到mysqldump命令。你永遠不知道什麼時候你可能決定編寫存儲過程和觸發器。另外,不需要-lock-tables就會停止從站。