mysql - 如果同步到 Redshift/BigQuery,来自 MySQL 数据库的 bin 日志复制是否会保持唯一约束?

标签 mysql google-bigquery amazon-redshift replication mysqlbinlog

我们希望将数据仓库从 MySQL 数据库迁移到 Redshift 或 BigQuery。

虽然针对 OLAP 操作进行了优化,但这些基于列的数据库的缺点之一是它们不强制执行唯一约束。

因此,表中存在重复的订单/产品并非不可能。我们工作的行业是零售业,我们使用标准 Kimball 事实和维度(星型模式)数据库设计。

提出的一个潜在解决方案是在 MySQL 中构建数据库,并使用第三方复制工具将数据同步到 Redshift/BigQuery。这样,我们将在原始 MySQL 数据库中强制执行关键约束,并且仅将 Redshift/BigQuery 用于读取查询。

但是,在 MySQL 中强制执行约束并设置到 Redshift/BigQuery 的 bin 日志复制将使数据与 MySQL 中的数据保持一致,从而强制执行唯一约束?

最佳答案

首先,您无法从 MySQL 复制到 RedShift/BigQuery。

请理解 BigQuery 是一个分析数据库。

建议您在 Cloud SQL 中设置从 MySQL 的复制。 然后在 BigQuery 中,您现在可以运行 EXTERNAL_QUERY,这意味着您可以使用 Cloud SQL MySQL 数据库查询/加入 BQ 数据库。

  1. 设置从当前实例到 Cloud SQL 实例的副本,请按照此操作 guide
  2. 了解如何 Cloud SQL federated queries让您从 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 - 如果同步到 Redshift/BigQuery,来自 MySQL 数据库的 bin 日志复制是否会保持唯一约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58181686/

相关文章:

mysql - 如何在 Laravel 中循环并输出嵌套数组

javascript - 使用 JavaScript BigQuery UDF 解密/解码 AES256

sql - _TABLE_SUFFIX 丢失?

csv - BigQuery 加载较大的 CSV 文件失败

java - Gradle SLF4J Redshift JDBC 冲突

php - 在 mySql 中获取最大值的时间

c++ - 我的 C++ 程序会从世界各地的计算机(在我的 LAN 之外)连接到本地 MySQL 数据库吗?

php - Laravel 中的计数函数机制

java - 如何在 BigQuery 中创建非分区表。并为 BigQuery 中的表导出表 SQL?

sql - 没有 "WITH NO SCHEMA BINDING"的 View 返回关系 "does not exist"错误