來自 RDS 實例的混合 InnoDB 和 MyISAM 表的一致 mysqldump
我在專用伺服器上有 MySQL 數據庫。我希望它成為 RDS 實例的外部主機。我想備份RDS。(目前我們混合使用了 InnoDB 和 MyISAM,但我們正在慢慢過渡到完整的 InnoDB)。
我
flush tables with read lock
在我們的主人(在專用伺服器上)做了一個轉儲。在 RDS 實例上恢復了該轉儲並配置了外部主伺服器。RDS 複製趕上了。我正在嘗試從我們與 master 保持同步的第一個 slave 在 RDS 中創建第二個 slave。這就是我遇到麻煩的地方。我無法獲得一致的副本來執行複制。我嘗試從恢復的快照進行快照並建構複製 - 但複製會收到有關重複的整體和外部約束的錯誤。如果我跳過一些錯誤 - 複製會執行幾分鐘並再次出錯。錯誤中的表不是 MyISAM。我試著做轉儲。嘗試鎖定表。沖洗表。
因為你不能
flush tables with read lock
在 RDS 上做 - 我試著做這篇 AWS 文章中所說的:(http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Overview.BackingUpAndRestoringAmazonRDSInstances.html)。因為錯誤沒有連接到 MyISAM 表我雖然這不是問題,但仍然嘗試:
use my_db; flush tables [list of MyISAM tables]; lock each MyISAM table for read: `lock table <MyISAM table> read`
但問題還是一樣。
數據庫大約 100G,所以我用 shell 一個襯裡逐個表地轉儲它。
有什麼想法我在哪裡做錯了嗎?
上個月,我回答了這個問題:將一個 RDS 實例與另一個 RDS 實例同步
通過研究和回答該文章,我最近了解到您可以在 MySQL RDS 從站上設置 read_only 關閉。這對你意味著什麼?一個非常獨特的機會。什麼機會?
將你所有的 MyISAM 表轉換為 InnoDB !!!
通過將 read_only 設置為 0 使 RDS Slave 可寫後,您可以將 RDS Slave 中所有表的儲存引擎更改為 InnoDB。不用擔心,Master 可以擁有 MyISAM 表,而 Slave 可以擁有 InnoDB。我之前曾建議 Master 和 Slave 使用不同的儲存引擎(我可以有一個 InnoDB master 和 MyISAM slaves with Full-Text 進行搜尋嗎?)
一旦您將 RDS 從屬中的所有表轉換為 InnoDB,您就可以製作該新從屬的只讀副本,而無需擔心備份數據的 MyISAM。
注意:這是一個將所有 MyISAM 表轉換為 InnoDB 的範例腳本
MYSQL_USER=root MYSQL_PASS=rootpassword MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}" CONVERT_SCRIPT=/tmp/ConvertMyISAMToInnoDB.sql echo "SET SQL_LOG_BIN = 0;" > ${CONVERT_SCRIPT} SQL="SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;')" SQL="${SQL} FROM information_schema.tables WHERE engine='MyISAM' AND" SQL="${SQL} table_schema NOT IN ('information_schema','mysql','performance_schema')" mysql ${MYSQL_CONN} -ANe"${SQL}" > ${CONVERT_SCRIPT} less ${CONVERT_SCRIPT}
試一試 !!!
不確定您是否只想創建一個遠離您點擊的只讀副本?
如果沒有,那麼我想您需要從 dbsnapshot 恢復。
你可以:
- 停止奴隸。
- 注意顯示從屬狀態。
- 創建數據庫快照。
- 在第一個奴隸上啟動奴隸。
- 使用 dbsnapshot 創建新的 rds 實例。
- 使用座標從外部主機複製。
另外,如果沒有,並且您正在尋找創建 RDS 從屬的從屬,那麼有一個舊的更新部落格說它是可能的。
希望這可以幫助。