randomx Asked: 2011-02-26 13:15:46 +0800 CST2011-02-26 13:15:46 +0800 CST 2011-02-26 13:15:46 +0800 CST 您规划数据迁移的工作流程是什么? 772 很多次我在软件开发工作结束时被带进来,并被告知类似“好的,我们已经有了所有这些新代码,它需要更改表和迁移数据”。 似乎每次都是一次性的、草率的、最好的猜测场景。我觉得这是我作为 DBA 最薄弱的技能。 我想了解一些处理、管理和测试数据迁移的模式。 请告诉我一些最佳实践和/或我可以在哪里获得学习材料来帮助我在这方面做得更好。 migration testing 4 个回答 Voted Best Answer Joe 2011-02-26T14:51:35+08:002011-02-26T14:51:35+08:00 每次我完成它,我们都会进行两次传球...... 拍摄快照,并在不同的服务器上工作,使用它来确定迁移必须完成的操作,并编写脚本。 一旦他们掌握了脚本,就会在测试系统上恢复 snapshop,并定时查看它是否会在要求的时间内运行,或者对其进行调整和修改直到可以。 让利益相关者签字确认测试系统上的数据看起来没有问题。 然后,在一个周末,你有一个预定的停机: 星期五晚上,关闭使用数据库的系统,进行完整的冷备份,然后运行脚本以迁移/修改/对数据进行任何操作 系统在某个私人地址下备份或以某种方式设置,因此除了利益相关者进行验收测试外,它不对任何人开放 如果利益相关者批准,系统就会上线并公开;如果没有,数据库将从周五晚上制作的备份中恢复,然后您重新开始该过程。 根据我们的时间表,数据库人员通常从周五下午 6 点到周六上午 10 点运行备份和迁移脚本,因此我们的目标是他们在 8 小时内运行(其中约 6 小时用于备份),所以我们'在它发布给利益相关者之前,我们有一些时间进行测试和更正。 利益相关者提前获得了他们的时间窗口,因此他们知道在窗口开始时让他们的周末开放进行测试。他们还会被告知他们的窗口结束,通常是星期天下午,如果每个人都没有签字,我们将不得不开始回滚。 哦,当然......如果有人在任何一个验收测试期间进行了更改,而我们进行了更改,这意味着所有利益相关者的签字都将作废,他们必须重新测试......所以我们会尝试给他们所有时间来查找问题并批量运行任何更正,而不是一次应用它们。 幸运的是,我唯一遇到过这样的情况之一,我们不会有明显的停机时间,我正在迁移的系统是从脚本中获取的,而不是用户输入的,所以我可以让两个并行系统运行,然后将它们换掉当事情得到签署时。(只有一次有问题,当我的老板坚持要我们进行完整备份时,不明白整个事情仍然会在不同的 IP 上在线......所以应该是在一个 5 分钟的中断糟糕的一天变成了 5 小时的中断。) ik_zelf 2011-02-26T13:46:09+08:002011-02-26T13:46:09+08:00 这完全取决于与支持数据库的硬件能力相比的数据量以及关于系统可用性的协议。你碰巧有一些停机时间还是应该全部在线完成?开始清理数据,尽可能多地清除过时的行。这本身就是一个项目。如果数据干净且有价值,让用户决定停机时间。如果停机时间是可用的,它是相当简单的,如果它们是一个已知的转换,应该应用于现有数据以形成更新的集合。如果没有 - 或很少 - 允许的停机时间,挑战就开始了。Oracle 通过几种方式支持这一点,例如联机表重新定义和 - 11g 中的新功能 - 基于版本的重新定义。通过在线表格重新定义,您可以准备表格以采用新形式。这可以在应用程序在表的旧形式上运行时完成。如果它们都准备好了,您可以切换到新表格 [s]。这也将是引入新应用程序代码的时刻,同时标志着将新应用程序部署到位所需的停机时间的开始。较旧的历史数据可以在实时数据迁移之前准备好,并使用 Oracle Golden Gate 等工具保持同步。在这种情况下,您可以有效地构建一个接管旧数据库角色的新数据库。如果不需要更改表,则基于版本的重新定义更适合。有很多选择要考虑,我认为很难给出一个总是有效的好规则。这也将是引入新应用程序代码的时刻,同时标志着将新应用程序部署到位所需的停机时间的开始。较旧的历史数据可以在实时数据迁移之前准备好,并使用 Oracle Golden Gate 等工具保持同步。在这种情况下,您可以有效地构建一个接管旧数据库角色的新数据库。如果不需要更改表,则基于版本的重新定义更适合。有很多选择要考虑,我认为很难给出一个总是有效的好规则。这也将是引入新应用程序代码的时刻,同时标志着将新应用程序部署到位所需的停机时间的开始。较旧的历史数据可以在实时数据迁移之前准备好,并使用 Oracle Golden Gate 等工具保持同步。在这种情况下,您可以有效地构建一个接管旧数据库角色的新数据库。如果不需要更改表,则基于版本的重新定义更适合。有很多选择要考虑,我认为很难给出一个总是有效的好规则。较旧的历史数据可以在实时数据迁移之前准备好,并使用 Oracle Golden Gate 等工具保持同步。在这种情况下,您可以有效地构建一个接管旧数据库角色的新数据库。如果不需要更改表,则基于版本的重新定义更适合。有很多选择要考虑,我认为很难给出一个总是有效的好规则。较旧的历史数据可以在实时数据迁移之前准备好,并使用 Oracle Golden Gate 等工具保持同步。在这种情况下,您可以有效地构建一个接管旧数据库角色的新数据库。如果不需要更改表,则基于版本的重新定义更适合。有很多选择要考虑,我认为很难给出一个总是有效的好规则。 这是一个有趣的话题,罗纳德。 D. Lambert 2011-03-01T08:26:38+08:002011-03-01T08:26:38+08:00 到目前为止很好的答案。我会再补充几点以供考虑。 首先,当您可以使用简单的 SQL DML 进行迁移时,您可以在很大程度上依赖 SQL 引擎来确保成功处理所有行。不过,我参与过迁移,其中一些迁移稍微复杂一些——当数据被移动到一个新结构中时,会发生实际的数据转换。在这些情况下,重要的是您有一个可以处理以下项目的流程: 计数记录与处理的记录。 在转换过程中检测错误并以允许转换继续的方式处理它们,并允许在您确定修复后重新处理“坏”记录。 记录计数应包括“坏”记录——即,记录输入=记录输出好+坏记录 如果您的转换更改了记录数(例如,一个输入记录变成了多个输出记录),则有一种方法可以预测您最终将得到的输出记录数,然后根据该计数测试您的结果。 我要补充的另一点是,如果/当事情没有按计划进行时,制定一个你将要做什么的计划很重要。这实际上是整个部署的一个功能,但它似乎经常被掩盖,我认为值得一提。 gbn 2011-02-27T03:08:11+08:002011-02-27T03:08:11+08:00 如何做的概述 首先 您在测试/UAT/任何“工作数据库”中都有“之后”数据库 您在生产中拥有“之前”的数据库。因此,使用它在某处创建生产副本=“参考数据库”。另一个作为“脚本测试数据库” 我也希望你有一堆开发脚本和你的 ALTERs 等。如果是这样,另一个应用了你的开发脚本的生产副本,干净且有序是有用的=“更改数据库” 接下来,下载Red Gate Compare 工具或类似 Embarcadero SQL Change manager的东西。没有它,您将无法轻松迁移。与节省的时间相比,成本微不足道。最重要的是,生成的脚本在单个事务中进行更改,这意味着干净的部署 现在, 使用比较“参考”和“更改”的工具生成更改和回滚脚本 将更改脚本应用于“脚本测试”并与“工作数据库”进行比较 将回滚脚本应用于“脚本测试”并比较回“并比较回”工作数据库“ 现在,您拥有安全且经过测试的更改和回滚脚本,可以随时应用。 当然,你在任何更改之前备份数据库,因为统计上的狗屎最终总会发生。 Red Gate 工具还可以与受源代码控制的文件夹进行比较。然后,我们将源代码控制中的 ALTER 等分别捕获到实际的更改脚本中。
每次我完成它,我们都会进行两次传球......
然后,在一个周末,你有一个预定的停机:
根据我们的时间表,数据库人员通常从周五下午 6 点到周六上午 10 点运行备份和迁移脚本,因此我们的目标是他们在 8 小时内运行(其中约 6 小时用于备份),所以我们'在它发布给利益相关者之前,我们有一些时间进行测试和更正。
利益相关者提前获得了他们的时间窗口,因此他们知道在窗口开始时让他们的周末开放进行测试。他们还会被告知他们的窗口结束,通常是星期天下午,如果每个人都没有签字,我们将不得不开始回滚。
哦,当然......如果有人在任何一个验收测试期间进行了更改,而我们进行了更改,这意味着所有利益相关者的签字都将作废,他们必须重新测试......所以我们会尝试给他们所有时间来查找问题并批量运行任何更正,而不是一次应用它们。
幸运的是,我唯一遇到过这样的情况之一,我们不会有明显的停机时间,我正在迁移的系统是从脚本中获取的,而不是用户输入的,所以我可以让两个并行系统运行,然后将它们换掉当事情得到签署时。(只有一次有问题,当我的老板坚持要我们进行完整备份时,不明白整个事情仍然会在不同的 IP 上在线......所以应该是在一个 5 分钟的中断糟糕的一天变成了 5 小时的中断。)
这完全取决于与支持数据库的硬件能力相比的数据量以及关于系统可用性的协议。你碰巧有一些停机时间还是应该全部在线完成?开始清理数据,尽可能多地清除过时的行。这本身就是一个项目。如果数据干净且有价值,让用户决定停机时间。如果停机时间是可用的,它是相当简单的,如果它们是一个已知的转换,应该应用于现有数据以形成更新的集合。如果没有 - 或很少 - 允许的停机时间,挑战就开始了。Oracle 通过几种方式支持这一点,例如联机表重新定义和 - 11g 中的新功能 - 基于版本的重新定义。通过在线表格重新定义,您可以准备表格以采用新形式。这可以在应用程序在表的旧形式上运行时完成。如果它们都准备好了,您可以切换到新表格 [s]。这也将是引入新应用程序代码的时刻,同时标志着将新应用程序部署到位所需的停机时间的开始。较旧的历史数据可以在实时数据迁移之前准备好,并使用 Oracle Golden Gate 等工具保持同步。在这种情况下,您可以有效地构建一个接管旧数据库角色的新数据库。如果不需要更改表,则基于版本的重新定义更适合。有很多选择要考虑,我认为很难给出一个总是有效的好规则。这也将是引入新应用程序代码的时刻,同时标志着将新应用程序部署到位所需的停机时间的开始。较旧的历史数据可以在实时数据迁移之前准备好,并使用 Oracle Golden Gate 等工具保持同步。在这种情况下,您可以有效地构建一个接管旧数据库角色的新数据库。如果不需要更改表,则基于版本的重新定义更适合。有很多选择要考虑,我认为很难给出一个总是有效的好规则。这也将是引入新应用程序代码的时刻,同时标志着将新应用程序部署到位所需的停机时间的开始。较旧的历史数据可以在实时数据迁移之前准备好,并使用 Oracle Golden Gate 等工具保持同步。在这种情况下,您可以有效地构建一个接管旧数据库角色的新数据库。如果不需要更改表,则基于版本的重新定义更适合。有很多选择要考虑,我认为很难给出一个总是有效的好规则。较旧的历史数据可以在实时数据迁移之前准备好,并使用 Oracle Golden Gate 等工具保持同步。在这种情况下,您可以有效地构建一个接管旧数据库角色的新数据库。如果不需要更改表,则基于版本的重新定义更适合。有很多选择要考虑,我认为很难给出一个总是有效的好规则。较旧的历史数据可以在实时数据迁移之前准备好,并使用 Oracle Golden Gate 等工具保持同步。在这种情况下,您可以有效地构建一个接管旧数据库角色的新数据库。如果不需要更改表,则基于版本的重新定义更适合。有很多选择要考虑,我认为很难给出一个总是有效的好规则。
这是一个有趣的话题,罗纳德。
到目前为止很好的答案。我会再补充几点以供考虑。
首先,当您可以使用简单的 SQL DML 进行迁移时,您可以在很大程度上依赖 SQL 引擎来确保成功处理所有行。不过,我参与过迁移,其中一些迁移稍微复杂一些——当数据被移动到一个新结构中时,会发生实际的数据转换。在这些情况下,重要的是您有一个可以处理以下项目的流程:
我要补充的另一点是,如果/当事情没有按计划进行时,制定一个你将要做什么的计划很重要。这实际上是整个部署的一个功能,但它似乎经常被掩盖,我认为值得一提。
如何做的概述
首先
接下来,下载Red Gate Compare 工具或类似 Embarcadero SQL Change manager的东西。没有它,您将无法轻松迁移。与节省的时间相比,成本微不足道。最重要的是,生成的脚本在单个事务中进行更改,这意味着干净的部署
现在,
现在,您拥有安全且经过测试的更改和回滚脚本,可以随时应用。
当然,你在任何更改之前备份数据库,因为统计上的狗屎最终总会发生。
Red Gate 工具还可以与受源代码控制的文件夹进行比较。然后,我们将源代码控制中的 ALTER 等分别捕获到实际的更改脚本中。