4

我们的数据库一直设计得很糟糕(我们继承了它)。我已经将架构重新设计为可用和可维护的东西。相当多的表和列已被删除,许多列已被移动,并且大多数表和列已被重命名。某些数据类型也已更改。

我已经从我们的 web 应用程序中提取了所有查询,并且我们已经开始重写它们。我们认为,我们的 DBA 能够将旧数据迁移到新模式。为了确保我们需要通过将旧结果与新结果进行比较来测试每个查询。

我们如何测试这样的大规模迁移?我需要能够指定参数,并将旧表/列映射到新表/列。对于数百个查询,这是一项艰巨的任务。我可以自己写一些东西,但我已经对我的时间有很多要求,所以最好使用现有的工具。

谢谢!

4

3 回答 3

1

我不得不这样做......这很容易,因为我重写了整个应用程序;)

许多查询听起来像是选择、插入、更新等基本操作,并没有在函数中抽象出来——也许这有助于在适应之前清理混乱。

现在进行测试:

您需要一个测试脚本,它将 a) 运行所有查询 b) 存储所有选择的输出以进行比较

  1. 备份您的测试数据库@state 0,清除一般查询日志

  2. 使用所有的删除、选择和更新来玩转你的应用程序,

  3. 复制粘贴该日志,获取每个选择并在其前面加上“创建表 temptable_xyz”(或者当然选择到 temptable_xyz .. 取决于可用的语法)

  4. 在迁移脚本后在两个数据库上运行,test db @ state 0 和 test db @ state 0

  5. 比较

如果您可以确保使用了每个应用程序中的每个功能,则应该这样做。

GL - 没有什么比让现有的东西更好的了;)

于 2011-09-22T15:13:17.090 回答
0

有时简单的解决方案就可以完成这项工作。

如果只是选择,您可以将新旧查询放在文本文件中,使用脚本运行它们并比较输出。

cd newqueries
for queryfile in *; do
    psql -f $queryfile migrateddb > /tmp/newresult
    psql -f ../oldqueries/$queryfile olddb > /tmp/oldresult

    if ! diff /tmp/oldresult /tmp/newresult; then
        echo "Difference in $queryfile"
        exit 1
    fi
done

或者您可以编写基于单元测试的结果比较

于 2011-07-21T15:51:44.230 回答
0

这将是我的方法:

  1. 恢复一个有数据的测试数据库,运行所有已知的查询。
  2. 恢复另一个测试数据库,运行所有新查询。
  3. 创建一个连接每个数据库的表并比较结果的 sql 脚本。这可以通过 information_schema 或其他系统表完成(取决于供应商。)

    插入临时表 select (select count(1) from db1..name) , (select count(1) from db2..name) , (Select count(1) from db1.name t1 join db2.name t2 on t1. col1 = t2.col1 和 t1.colx = t2.colx) ,表名

然后,您可以运行在查询中具有表名的查询。它会给你从哪里看的起点。

于 2011-08-01T23:49:08.180 回答