簡體   English   中英

如果同步到 Redshift/BigQuery,來自 MySQL 數據庫的 bin 日志復制是否會保持唯一約束?

[英]Will bin log replication from a MySQL database maintain unique constraints if synched to Redshift/BigQuery?

我們希望將數據倉庫從 MySQL 數據庫遷移到 Redshift 或 BigQuery。

雖然針對 OLAP 操作進行了優化,但這些基於列的數據庫的缺點之一是它們不強制執行唯一約束。

因此,您的表格中存在重復的訂單/產品並非不可能。 我們工作的行業是零售業,我們使用標准的 Kimball 事實和維度(星型模式)數據庫設計。

提出的一種潛在解決方案是在 MySQL 中構建數據庫,並使用第三方復制工具將數據同步到 Redshift/BigQuery。 這樣,我們將在原始 MySQL 數據庫中強制執行鍵約束,並且我們將僅將 Redshift/BigQuery 用於讀取查詢。

但是,在 MySQL 中強制執行約束並設置到 Redshift/BigQuery 的 bin 日志復制將使數據與 MySQL 中的數據相同,從而強制執行唯一約束?

首先,您不能從 MySQL 復制到 RedShift/BigQuery。

請理解 BigQuery 是一個分析型數據庫。

建議您從雲 SQL 中的 MySQL 設置復制。 然后在 BigQuery 中,您現在可以運行 EXTERNAL_QUERY,這意味着您可以使用 Cloud SQL MySQL 數據庫查詢/加入您的 BQ 數據庫。

  1. 將當前實例的副本設置為 Cloud SQL 實例,請遵循本指南
  2. 了解Cloud SQL 聯合查詢如何讓您從 BigQuery Cloud SQL 實例進行查詢。

您可以通過這種方式實時訪問您的關系數據庫:

您在 BigQuery 上運行的示例查詢:

SELECT * EXTERNAL_QUERY(
'connection_id',
'''SELECT * FROM mysqltable AS c ORDER BY c.customer_id'');

您甚至可以將 Bigquery 表與 SQL 表連接起來:

例子:

SELECT c.customer_id, c.name, SUM(t.amount) AS total_revenue,
rq.first_order_date
FROM customers AS c
INNER JOIN transaction_fact AS t ON c.customer_id = t.customer_id
LEFT OUTER JOIN EXTERNAL_QUERY(
  'connection_id',
  '''SELECT customer_id, MIN(order_date) AS first_order_date
  FROM orders
  GROUP BY customer_id''') AS rq ON rq.customer_id = c.customer_id
GROUP BY c.customer_id, c.name, rq.first_order_date;

您提出的解決方案將允許:

  • 對源 MySQL 數據庫強制執行唯一鍵約束
  • 將該數據庫發生的所有更改復制/捕獲到您的數據倉庫

話雖如此,您最終在數據倉庫中獲得的是所有已更改 MySQL 數據庫的事件(插入、更新、(刪除:並非所有 SaaS 產品支持...))的視圖。 因此,您的倉庫中的“原始”表將具有每個 MySQL 的唯一鍵的多個事件,然后您需要重新處理這些事件以最終得到與 MySQL 中相同的表。

為了進一步說明這一點:就像您的 MySQL 表在每個時間點都是快照或凍結的圖片/狀態,而您從二進制日志復制中獲得的是數據庫所有連續 state 更改的“電影”。 如果您想在倉庫中創建快照,則需要“重播”所有更改,直到您想要快照的位置。

這非常強大,因為您永遠不會丟失數據庫上發生的任何更改,並且總能找回它。 但它確實需要額外的工作來使您的數據倉庫表與輸入數據庫的“快照”形狀相同。

這通常可以通過 CTE 在您的倉庫上完成,該 CTE 添加row_number() over (partition by id order by updated_at desc) as rn ,然后where rn = 1 and deleted_at is null的位置過濾該 CTE(其中id是您的列唯一約束,如果您的唯一約束是復合的(在多個鍵上),您可以列出多個,並且updated_at是每個更改數據捕獲事件的時間戳,而deleted_at是刪除事件的時間戳(或者 null 如果給定鍵沒有發生刪除事件))。

對於開源和自托管變更數據捕獲,您還可以查看在 Kafka Connect(或 AWS Kinesis 或其他...)上運行的 Debezium 之類的東西,如果這是您的客戶願意投資的基礎設施...或者只是在您選擇的數據庫引擎/lib 中查看您首選數據庫的邏輯復制連接(例如,我在 Python 上為 PostgreSQL 使用psycopg2 (帶有extras )...)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM