Mysql

RDS 上的 MySQL,將數據從一個實例傳輸到另一個實例作為生產作業

  • July 21, 2020

我有一個 MySQL RDS 實例(“生產”),我需要從中將增量數據複製到另一個 MySQL RDS 實例(“報告”)。“增量數據”是某些表中的新行。目前,我通過一個 PHP 腳本完成此操作,該腳本根據上次更新時間從“生產”查詢並將 CSV 文件寫入磁碟,然後使用 mysqlimport.exe 將文件導入“報告”。

我目前的方法大約需要 80 秒。這是最強大和最有效的方法嗎?我找到了其他用於“一次性”傳輸的工具,但沒有找到“企業增量數據庫複製”工具。

由於報告端的批處理操作,我們目前的流程不是“連續”複製。不過這可能是可以商量的。放寬這種限制會打開使這變得容易的工具嗎?

相關相關文章/問題:亞馬遜關於導入數據的文章似乎主要處理批處理(初始載入)的情況。 http://aws.amazon.com/articles/2933

這可以在同一個實例上從一個數據庫移動到另一個數據庫時使用儲存過程來完成(我的問題是它們是不同的實例)。請參閱:保持 MySQL 暫存數據庫在同一台伺服器上從生產更新

我不能將兩個數據庫放在同一個實例上,因為我們的實例處於相當多的負載之下。

MySQL RDS 允許您執行兩個選項

選項1

您設置了一個讀取從站。然後,從中執行報告。RDS CLI 中有一個工具用於從正在rds-create-db-instance-read-replica執行的 RDS 實例創建讀取從站。以下是在引擎蓋下完成的:

  • 快照製作
  • 快照提出
  • CHANGE MASTER TO 使用正確的二進制日誌和位置執行

選項 #2

拍攝生產的實時快照。然後,使用該快照打開一個新實例。

用於此的工具是

  • rds-create-db-snapshot
  • rds-restore-db-instance-from-db-snapshot

結論

這些選項之間的唯一區別

  • 讀從機是連續的
  • 快照作為時間點實例啟動

在這兩種情況下,一旦您完成,只需自行決定刪除新實例(省錢)。

如果您結合這兩個想法,您可以將 PHP 腳本的輸出載入到點時間實例中。可以從 Read Slave 讀取從生產中檢索所需的任何數據,以防止生產中出現進一步的負載問題。

警告

啟動實例可能很耗時。因此,計劃儘早啟動實例,以便報告和導入時間。

這比具體的答案更具咆哮和頭腦風暴。

編寫自己的 bash 腳本並安排增量載入作業以同步 Prod 和報告伺服器/DWH DB,

第 1 步:在 Prod(無鎖)上執行 mysqldump 以從表中獲取記錄(在 Previous_Day_Start 和 Previous_Day_End 之間的 updated_at 位置)

步驟 2:將備份的 SQL 文件恢復到報告/dwh 實例中,(Delta DB - 在此處創建您的暫存數據庫)

第 3 步:SP 呼叫是否將報告/dwh 增量數據庫中的記錄同步到實際報告/dwh 數據庫(兩個數據庫在同一實例中)

SP Logic:首先通過匹配主鍵進行更新,然後插入新記錄。

腳本命令:#(1)做mysql數據庫備份(dump) mysqldump -h $ vHost1 -u $ 虛擬使用者 -p $ vPass1 –skip-comments –quick –extended-insert –set-gtid-purged=OFF –skip-triggers –skip-add-locks $ vDb1 $ vTable –where=“updated_at between ’ $ vStartDate’ 和 ’ $ vEndDate’” > $ 虛擬文件

#(2) 執行 mysql 恢復 mysql -h $ vHost2 -u $ 虛擬使用者 -p $ vPass2 –comments –database= $ vDb2 < $vFile

#(3) SP呼叫mysql -h $ vHost2 -u $ 虛擬使用者 -p $ vPass2 –skip-column-names –database= $ vDb2 –execute=“CALL your_sp();” >> " $ vDailyIncrementalLoad/ $ 文件名"

警告: mysqldump 操作成本高,因此請在非營業時間每晚執行該作業,謝謝

引用自:https://dba.stackexchange.com/questions/30176