我们的数据库设计很差(我们继承了它)。我已经将模式重新设计为可用且可维护的东西。删除了相当多的表和列,许多列已移动,大多数表和列已重命名。某些数据类型也已更改。
我已经从我们的webapps中提取了所有查询,并且我们已经开始重写它们。我们认为,我们的DBA能够将旧数据迁移到新模式。为了确保我们需要通过将旧结果与新结果进行比较来测试每个查询。
我们如何测试这样的批量迁移?我需要能够指定参数,并将旧表/列映射到新表/列。有数百个查询,这是一项艰巨的任务。我自己可以写点东西,但我已经对我的时间有很多要求,所以最好使用现有的工具。
谢谢!
答案 0 :(得分:1)
我必须这样做......而且这很简单,因为我重写了整个应用程序;)
许多查询听起来像基本操作,例如选择,插入,更新都没有在函数中抽象出来 - 也许这有助于在调整之前清理混乱。
现在进行测试:
你需要一个测试脚本 a)运行所有查询 b)存储所有选择的输出以进行比较
备份您的测试db @ state 0,清除常规查询日志
使用所有删除,选择和更新
复制粘贴该日志,取每一个选择并在其前面加上“Create table temptable_xyz”(当然还有SELECT到temptable_xyz ..取决于可用的语法)
在两个数据库上运行,测试db @ state 0并在迁移脚本后测试db @ state 0
比较
如果你能确保使用每个应用程序中的每个功能,就应该这样做。
GL - 没有什么能比现有的东西更好;)
答案 1 :(得分:0)
有时简单的解决方案可以胜任。
如果它只是SELECT,您可以将新旧查询放在文本文件中,使用脚本运行它们并对输出进行差异化。
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
或者您可以编写基于单元测试的结果比较
答案 2 :(得分:0)
这将是我的方法:
创建一个连接每个数据库表的sql脚本并比较结果。这可以在information_schema或其他系统表(取决于供应商)之外完成。
插入临时表 select(从db1..name中选择count(1)) ,(从db2..name中选择count(1)) ,(从t1.col1 = t2.col1和t1.colx = t2.colx中的db1.name t1 join db2.name t2中选择count(1)) ,tablename
然后,您可以运行查询中包含表名的查询。它会给你从哪里开始看。