在 select 查询为 运行 时重命名 table 和索引的策略
Strategies for renaming table and indices while select queries are running
我有一份工作将一个大文件复制到 table temp_a 并在列 j 上创建索引 idx_temp_a_j。现在,一旦作业完成复制所有数据,我必须将此 table 重命名为面向生产的 table prod_a 并且查询总是 运行ning 非常空闲时间更少。但是一旦我 运行 重命名查询,进入的查询和已经 运行ning 的查询就会备份产生高 API 错误率。我想知道我可以实施哪些可能的策略,以便 table 的重命名可以减少停机时间。
到目前为止,以下是我想出的策略:
首先,只需重命名 table 并允许备份查询。这种方法似乎不可靠,因为重命名 table 查询获取了独占锁并且所有其他查询都得到了备份,我得到了很高的 API 错误率。
其次,编写一个轮询函数,检查是否有任何查询 运行ning 现在如果没有则重命名 table 和索引。在这种方法中,轮询函数将定期检查以查看是否有任何查询 运行ning,任何查询都是 运行ning,然后等待,如果没有则 运行 更改 table询问。这种方法只会排队在 alter table 重命名查询在 table 上放置独占锁之后的查询。重命名完成后,将执行排队的查询。我仍然需要找到数据库 APIs 来帮助我编写这个函数。
还有哪些其他策略可以允许 "seamless" 重命名 table?我正在使用 postgres (PostgreSQL) 11.4,完成所有这些的工作在 Python.
重命名 table 时,您无法避免阻塞并发查询。
操作本身非常快,所以您遇到的任何延迟一定是因为 ALTER TABLE
本身被使用 table 的长 运行 事务阻塞了。 table 上的所有后续操作都必须在 ALTER TABLE
之后排队。
无痛重命名的解决方案是保持数据库事务非常短(这总是可取的,因为它也减少了死锁的危险)。
我有一份工作将一个大文件复制到 table temp_a 并在列 j 上创建索引 idx_temp_a_j。现在,一旦作业完成复制所有数据,我必须将此 table 重命名为面向生产的 table prod_a 并且查询总是 运行ning 非常空闲时间更少。但是一旦我 运行 重命名查询,进入的查询和已经 运行ning 的查询就会备份产生高 API 错误率。我想知道我可以实施哪些可能的策略,以便 table 的重命名可以减少停机时间。
到目前为止,以下是我想出的策略:
首先,只需重命名 table 并允许备份查询。这种方法似乎不可靠,因为重命名 table 查询获取了独占锁并且所有其他查询都得到了备份,我得到了很高的 API 错误率。
其次,编写一个轮询函数,检查是否有任何查询 运行ning 现在如果没有则重命名 table 和索引。在这种方法中,轮询函数将定期检查以查看是否有任何查询 运行ning,任何查询都是 运行ning,然后等待,如果没有则 运行 更改 table询问。这种方法只会排队在 alter table 重命名查询在 table 上放置独占锁之后的查询。重命名完成后,将执行排队的查询。我仍然需要找到数据库 APIs 来帮助我编写这个函数。
还有哪些其他策略可以允许 "seamless" 重命名 table?我正在使用 postgres (PostgreSQL) 11.4,完成所有这些的工作在 Python.
重命名 table 时,您无法避免阻塞并发查询。
操作本身非常快,所以您遇到的任何延迟一定是因为 ALTER TABLE
本身被使用 table 的长 运行 事务阻塞了。 table 上的所有后续操作都必须在 ALTER TABLE
之后排队。
无痛重命名的解决方案是保持数据库事务非常短(这总是可取的,因为它也减少了死锁的危险)。