在 Redshift 中为 tables 执行热插拔时避免 table 锁的最佳实践
Best practice to avoid table locks when performing hot swaps for tables in Redshift
我是 运行 一个周期性的 ETL 过程,用于将 table 从 MySQL 同步到 Redshift。这涉及 table 交换 - 对于每个 MySQL table 我在 Redshift 中创建一个名为 \<table>_tmp
的暂存 table,将数据加载到其中,准备好后我重命名生产 table 到 \<table>_old
并将 \<table>_tmp
重命名为 \<table>
.
我的 BI 平台基于此 Redshift 实例,这意味着上述情况发生时可能会查询 tables(有时通过多个查询)。
在 Redshift 中重命名 table 需要一个 AccessExclusiveLock
,在查询 table 时无法获得它(即当有活动的 AccessShareLock
锁时).
我担心的是我的 table 重命名会失败、超时或永远挂起,以防新查询继续访问原始 table - 这意味着我的 table-交换逻辑不成立。
Redshift 是否有任何锁定队列可以保证在新查询继续锁定 table 之前发生我的姓名更改?
否则 - 是否有任何其他最佳实践来管理 table 与 Redshift 的交换?
这是任何数据库的常见问题。重命名 tables 会在查询进行时导致问题,并且可能会导致实体化视图出现问题。
另一种方法是定义一个视图,它只是从table(例如SELECT * FROM table1
)查询。
然后,不要重命名 table,只需重新定义视图(例如 SELECT * from table2
)。
因此,将其更多地视为 blue/green 交换 而不是促进 table 从暂存到生产。
我是 运行 一个周期性的 ETL 过程,用于将 table 从 MySQL 同步到 Redshift。这涉及 table 交换 - 对于每个 MySQL table 我在 Redshift 中创建一个名为 \<table>_tmp
的暂存 table,将数据加载到其中,准备好后我重命名生产 table 到 \<table>_old
并将 \<table>_tmp
重命名为 \<table>
.
我的 BI 平台基于此 Redshift 实例,这意味着上述情况发生时可能会查询 tables(有时通过多个查询)。
在 Redshift 中重命名 table 需要一个 AccessExclusiveLock
,在查询 table 时无法获得它(即当有活动的 AccessShareLock
锁时).
我担心的是我的 table 重命名会失败、超时或永远挂起,以防新查询继续访问原始 table - 这意味着我的 table-交换逻辑不成立。
Redshift 是否有任何锁定队列可以保证在新查询继续锁定 table 之前发生我的姓名更改?
否则 - 是否有任何其他最佳实践来管理 table 与 Redshift 的交换?
这是任何数据库的常见问题。重命名 tables 会在查询进行时导致问题,并且可能会导致实体化视图出现问题。
另一种方法是定义一个视图,它只是从table(例如SELECT * FROM table1
)查询。
然后,不要重命名 table,只需重新定义视图(例如 SELECT * from table2
)。
因此,将其更多地视为 blue/green 交换 而不是促进 table 从暂存到生产。