良好的数据库维护不仅包括执行标准添加、更新和删除记录,等等,但定期编辑表模式。操作,比如添加、编辑和删除表列也是今天的生命周期的一部分现实不断添加新功能。

安静,少要求,可以侥幸通过执行影响最小的模式更新操作在低负荷时间。然而,正如所有的数据库系统已经变得更加关键业务的底线,维护窗口,不得已,更小更合理的时间安排。

这个问题是问:一个人怎么能更新一个tb表接近零停机时间?

寻找深入Postgres的组合,我们不是看,而是最近的和先进的功能,我们利用一个非常古老的功能的Postgres的一部分,因为当它第一次被作为一个发布开源项目,即其对象关系能力的实现继承

用例

在进入解决方案的细节让我们定义正是我们正在努力解决的。

严格地说;有两种用例使用继承时想到的' ETL数据迁移机制:

  • 删除表oid,例如当搬到Postgres 12和更大的版本。
  • 执行DML / DDL操作包括:
    • 更新数据
    • 添加或删除表列

生活开始变得复杂处理等问题时更新数据类型。但我们会谈论这个的博客。

关于继承

与面向对象编程语言,孩子从父母继承属性,在Postgres的父母从孩子有能力继承(如果这是真的在现实生活中;-))。因此从一个孩子一个表列有潜力成为可用的父母关系。

考虑下面的代码片段:两个父母和三个孩子创建和填充记录:

列中声明的父母必须因此存在于孩子,即它们合并。但要注意那些列的孩子不一定是传播到父母:











发展ETL /迁移模型

在生产条件下进行数据迁移应该考虑这些四(4)不同的查询操作:

  • 选择目标和源表在同一时间。
  • 更新和/或删除记录的目标和源表。
  • 将新记录插入到目标表。
  • 将数据从源移动到目标表。

为了讨论我们将演示使用目标从一个表分别继承:

查询目标和源表

继承使SELECT查询一个简单的操作。这个查询检查所有表的查询记录(s):

更新和/或删除记录

类似于SELECT查询,不需要担心编辑现有应用程序的DML操作(s)在执行更新和删除。再次注意到源和目标表查询以及家长:

将新记录插入到目标表

关于插入的事情要记住的是没有重定向机制所有记录被插入到父母。

因为所有人都已经知道触发器,我认为会很有趣使用重写规则:

这是我们的验证;注意插入重定向目标:

源表和目标表之间移动记录

是时候介绍最后一个需要执行实际的数据迁移机制。从本质上讲,数据批量移动,否则,如果你买得起的停机时间记录在一个非常大的交易,这盛大表演有点多余。

在现实世界中我们需要预见到多个进程同时试图独占锁。如果一个或多个记录被另一个操作下面的示例演示了如何可以简单地跳过在他们:

把它放在一起

是时候来演示使用pgbench概念验证。

设置

初始化数据库db02:

创建表孩子

请注意:为了证明数据迁移从弃用表,表中pgbench_accounts通过添加oid是改变。

测试

这个查询的方法是解决方案的核心。任何完全锁定的记录,它试图移动自动跳过和新的尝试可以下次调用这个脚本。

验证

迁移脚本

查询已纳入这个脚本移动1000条记录每5秒。

基准测试

所有的活跃pgbench上述脚本运行时的水准。

警告

这是一个简单而强大的方法,但有局限性:而常见的表之间的列必须是相同的数据类型

例如,如果列c1表中的数据类型int你想迁移数据到表中目标用相同的列c1但数据类型长整型数字然后这个方法行不通。然而另一种解决方案可以利用可更新视图,您可以阅读更多关于在这里和使用适当的触发器和重写规则。

雷竞技下载官网Percona分布PostgreSQL提供最好的和最重要的开源社区的企业组件,在一个单一的分布,设计和测试一起工作。

raybet52

订阅
通知的
客人”年代rc=