AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 3289
Accepted
Tony
Tony
Asked: 2011-06-14 07:02:11 +0800 CST2011-06-14 07:02:11 +0800 CST 2011-06-14 07:02:11 +0800 CST

是否有工具可以在两个不同的模式之间进行数据比较?

  • 772

我们正在将数据库迁移到新模式,但想要验证数据是否已正确移动。

如果模式相同,传统的数据比较工具可以比较两个数据库的差异。在我们的例子中,表设计发生了变化,但旧模式中的所有数据都在新模式中,只是稍微移动了一下,我需要确保它是正确的。我们有数千万行,因此人工检查不是一种选择。

是否有任何工具可以帮助进行此类比较?

如果没有,是否有任何库/框架可以帮助启动自定义解决方案的开发?

如有必要,我很乐意使用特定于数据库的解决方案,在这种情况下用于 SQL Server 2008。

我的解决方案:我通过VIEW在旧数据库上创建一个与新数据库表具有相同字段的每个表来比较两个数据集。

然后,我使用此处描述的技术比较数据:在 SQL Server 中比较两个表的最短、最快和最简单的方法:UNION !

我在这次迁移中很幸运,因为整个表结构类似于旧数据库,字段从一个表移动到另一个表,删除或添加。在删除和添加的情况下,没有什么可比较的,对于已移动或聚合的字段,我在视图中进行计算以提供正确的比较信息。

比较UNION只显示有差异的行,所以只要数据正确,我就会得到一个空的结果集。

sql-server sql-server-2008
  • 4 4 个回答
  • 8767 Views

4 个回答

  • Voted
  1. Best Answer
    Andrew Bickerton
    2011-06-16T00:13:50+08:002011-06-16T00:13:50+08:00

    比较两种不同的模式并非不可能,这是计算您对结果的信心程度。我基本上是从银行对账技术中借来的

    重要提示:这种协调不是要确保目标与数据上下文中的源完全匹配(这是您迁移到新系统的原因),但您确实需要解释任何差异!

    基础:

    1. 确定您将用来衡量的指标(即:用户总数、他们所有年龄的总和、用户 ID 列表及其邮政编码......)我尝试使用以下几个指标:总计、平均值和样本/详细记录
    2. 将此数据转储到一个公共位置(通过视图/报告/任何合理的)
    3. 比较您的数据并确保可以解释任何差异

    我通常将比较分为几种方法(特别是对于详细指标):

    • 按表:通常以源表为定义,在目标数据库上创建一组视图,尝试重现源表数据
    • 按对象:根据数据库和您存储的内容,跨多个表创建对象(即:用户)的整体视图可能更有意义,类似于上面创建一组视图以将该对象作为结果集
    • 按报告:如果源数据库有一套很好的综合管理报告,另一种技术是用完全相同的格式复制这些报告

    技巧:

    无论我使用什么方法来生成要比较的内容,我最终都会得到一组包含可协调源和目标数据的文件/视图/数据库,然后根据媒介,我可以使用常用工具之一比较它们。我自己的偏好是:

    1. 文件比较
      为 SourceDB 和 DestinationDB 创建两个不同的文件夹(标记时间/版本,以便我知道我何时进行了对账)并将我的指标输出转储为相关命名的文件,然后使用比较工具(例如CSDiff)来识别差异

    2. Excel 比较
      特别是在处理管理报告时,我将创建一组 Excel 工作簿来比较报告(本质上是利用 VLookups 和比较总数)

    3. 数据比较
      不是将调节数据输出到文件或报告中,而是将它们输出到单独的数据库,然后使用Redgate SQL 数据比较之类的东西来比较数据库

    其他工具:

    没有尝试过任何这些,但在“数据协调工具”上的快速谷歌搜索给出:

    • n-Tierfs 数据核对软件
    • 测试性能数据核对

    还有其他的,但那些看起来很合理

    • 7
  2. gbn
    2011-06-14T07:38:13+08:002011-06-14T07:38:13+08:00

    如果要比较两种不同数据库设计中的数据,则必须编写手工编码的 SQL 来比较数据。

    • 如果表已被拆分或合并等怎么办?
    • 如果你有 datetime,现在你有 smalldatetime = 数据会不同
    • ...

    没有用于检查两个不同数据库中的数据是否相同的框架库。

    只有你知道你改变或修改了什么

    • 6
  3. SqlSandwiches
    2011-06-15T13:40:35+08:002011-06-15T13:40:35+08:00

    您将不可能比较不同的模式。为了解决您的问题,我会弄清楚您需要比较哪些数据。然后,我将在每台服务器上创建一个视图,该视图将拉回我想要比较的数据(考虑数据类型等)。

    一旦两个视图相同,我就会使用Red Gate Data Compare 之类的第三方工具来查看哪些行不同。

    听起来很痛苦。祝你好运!

    • 5
  4. Dariusz Dziewialtowski-Gintowt
    2011-06-14T17:09:13+08:002011-06-14T17:09:13+08:00

    几年前,我写了一个工具来做这件事——两个数据库之间的数据比较。从那时起,我将其转换为商业软件并发布在

    www.sql-server-tool.com

    • 单个许可证的费用为 99 美元,但您可以免费试用 30 天。

    该程序 - 名为 SCT 的“SQL Server 比较工具”(我从来不擅长命名事物:) - 有很多微调选项,例如:忽略选定的列或指定比较方法(逐个记录或主键/指数比较)。比较“会话”可以保存并在以后重新播放,而无需重新输入参数。命令行参数可用于完全自动化比较。

    对于数千万行,它可能有点慢 - 在这种情况下,我建议从较小的数据子集开始 - 假设只比较前 1,000 行 - 看看是否需要对过程进行任何微调。

    Dariusz Dziewialtowski-Gintowt

    • 2

相关问题

  • 死锁的主要原因是什么,可以预防吗?

  • 我在索引上放了多少“填充”?

  • 是否有开发人员遵循数据库更改的“最佳实践”类型流程?

  • 如何确定是否需要或需要索引

  • 从 SQL Server 2008 降级到 2005

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve