🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
问题描述
数据库使用的是oracle,库之间有建立dblink。现在有一个数据库A里有800张表,表名全部列在一个excel里了,表名如ODS_A、ODS_B、ODS_C这样有很多。员工甲负责把A库里的这800张表的数据全部同步到数据库B里,我的工作是负责验证他是否把这800张表里的数据都完整且正确地同步到B了。请问是否有方法不使用其他软件/工具,只通过写sql来验证?有没有做过类似工作的朋友帮忙解答一下。我在上家公司遇到过类似的需求,不过不是我负责的。当时负责的同事好像是写java把对比结果生成了excel。但我不会java🥲
注:只需要验证一次就行,不用每天跑这个验证脚本。脚本不一定要写成存储过程,只要能达到目的,即使仅仅是一大段sql语句也可以。
解决方案
如下是上述问题的解决方案,仅供参考:
在Oracle数据库中,你可以通过编写SQL查询来对比两个数据库中表的数据差异。假设你已经通过DBLINK连接了数据库A和数据库B,以下是一个简单的方法来对比每张表的数据是否一致。
步骤 1: 创建比对结果表
首先,你可以在数据库中创建一个表来存储比对结果。
CREATE TABLE comparison_results (table_name VARCHAR2(100),row_count_diff NUMBER,diff_details VARCHAR2(4000)
);
步骤 2: 编写对比SQL
接下来,为了对比两个数据库中的表,你可以编写一个SQL脚本,通过循环所有表名来进行对比。
DECLAREv_table_name VARCHAR2(100);v_sql_count_diff VARCHAR2(2000);v_sql_data_diff VARCHAR2(4000);v_row_count_diff NUMBER;v_diff_details VARCHAR2(4000);
BEGINFOR r IN (SELECT table_name FROM your_table_list_excel) LOOPv_table_name := r.table_name;-- 计算行数差异EXECUTE IMMEDIATE 'SELECT (SELECT COUNT(1) FROM ' || v_table_name || '@DBLINK_A) - (SELECT COUNT(1) FROM ' || v_table_name || '@DBLINK_B) FROM dual'INTO v_row_count_diff;-- 如果行数不同,记录差异信息IF v_row_count_diff != 0 THENv_diff_details := 'Row count difference: ' || v_row_count_diff;INSERT INTO comparison_results (table_name, row_count_diff, diff_details)VALUES (v_table_name, v_row_count_diff, v_diff_details);ELSE-- 比较数据内容EXECUTE IMMEDIATE 'WITH a AS (SELECT * FROM ' || v_table_name || '@DBLINK_A), b AS (SELECT * FROM ' || v_table_name || '@DBLINK_B)SELECT COUNT(1) FROM (SELECT * FROM a MINUS SELECT * FROM b UNION ALL SELECT * FROM b MINUS SELECT * FROM a)'INTO v_row_count_diff;IF v_row_count_diff > 0 THENv_diff_details := 'Data difference found.';INSERT INTO comparison_results (table_name, row_count_diff, diff_details)VALUES (v_table_name, 0, v_diff_details);END IF;END IF;END LOOP;
END;
/
步骤 3: 查询比对结果
在执行完上述SQL脚本之后,你可以通过以下查询查看比对结果:
SELECT * FROM comparison_results;
说明
- DBLINK_A 和 DBLINK_B:假设你在A和B库之间分别建立了dblink,用于跨库访问。请用实际的dblink名称替换这些占位符。
- your_table_list_excel:这是一个临时表,存储了从Excel导入的800个表名。你需要先将表名导入到Oracle表中。
- 行数对比:首先对比两个库中表的行数是否一致。
- 数据对比:如果行数一致,则进一步对比数据内容。
MINUS
操作可以查找两个表中的数据差异。
附加说明
- 性能问题:在处理大量数据时,直接在数据库中进行数据对比可能会很耗时,尤其是对比大表。你可以考虑根据表的大小和数据量,分批次进行对比。
- 数据类型:对比表中所有数据时,需要确保数据类型完全一致,特别是在涉及日期、时间戳、BLOB等复杂数据类型时。
- 复杂性:如果数据表结构很复杂或者数据量巨大,建议将这些对比任务分割成小任务,逐个处理。
这种方法通过纯SQL实现了跨数据库的数据对比,可以满足一次性验证的需求。如果有进一步的优化需求,可以再进一步细化对比逻辑。
希望如上措施及解决方案能够帮到有需要的你。
PS:如若遇到采纳如下方案还是未解决的同学,希望不要抱怨&&急躁,毕竟影响因素众多,我写出来也是希望能够尽最大努力帮助到同类似问题的小伙伴,即把你未解决或者产生新Bug黏贴在评论区,我们大家一起来努力,一起帮你看看,可以不咯。
若有对当前Bug有与如下提供的方法不一致,有个不情之请,希望你能把你的新思路或新方法分享到评论区,一起学习,目的就是帮助更多所需要的同学,正所谓「赠人玫瑰,手留余香」。
☀️写在最后
如上问题有的来自我自身项目开发,有的收集网站,有的来自读者…如有侵权,立马删除。再者,针对此专栏中部分问题及其问题的解答思路或步骤等,存在少部分搜集于全网社区及人工智能问答等渠道,若最后实在是没能帮助到你,还望见谅!并非所有的解答都能解决每个人的问题,在此希望屏幕前的你能够给予宝贵的理解,而不是立刻指责或者抱怨!如果你有更优解,那建议你出教程写方案,一同学习!共同进步。
ok,以上就是我这期的Bug修复内容啦,如果还想查找更多解决方案,你可以看看我专门收集Bug及提供解决方案的专栏《CSDN问答解惑-专业版》,都是实战中碰到的Bug,希望对你有所帮助。到此,咱们下期拜拜。
码字不易,如果这篇文章对你有所帮助,帮忙给 bug菌 来个一键三连(关注、点赞、收藏) ,您的支持就是我坚持写作分享知识点传播技术的最大动力。
同时也推荐大家关注我的硬核公众号:「猿圈奇妙屋」 ;以第一手学习bug菌的首发干货,不仅能学习更多技术硬货,还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料,你想要的我都有!
📣关于我
我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿哇。