比较来自两个数据库的数据百分比或整个数据集的最佳方法是什么?



场景:

我有两个远程数据库(源和目标),我希望它们相似。我想验证这是真的或找出目标数据库中缺少的内容 - 不一定关心相反的情况。

我正在使用Java 1.8和OJDBC6驱动程序连接到两个使用Oracle 11g的数据库。有人告诉我,在Oracle 11g db上使用带有Java的ResultSet rs.next()是昂贵的,我不确定是否有更好的方法来比较数据库 - 如果存在,我愿意使用工具或某种平面文件方法。

数据:

有 300 多个表具有不同的列数;有些表具有主键,有些表没有。

我相信弄清楚哪些表有主键,哪些没有是我在SQL中执行的第一步:

---TABLES WITH PRIMARY KEY
SELECT TABLE_NAME
FROM ALL_CONSTRAINTS
WHERE OWNER = 'PLTTUX_ADMIN'
AND (CONSTRAINT_TYPE = 'P')
ORDER BY TABLE_NAME;

.

---TABLES WITHOUT PRIMARY KEY
SELECT TABLE_NAME
FROM ALL_TABLES
WHERE OWNER = 'PLTTUX_ADMIN'
MINUS
SELECT TABLE_NAME
FROM ALL_CONSTRAINTS
WHERE OWNER = 'PLTTUX_ADMIN'
AND (CONSTRAINT_TYPE = 'P')
ORDER BY TABLE_NAME;

我相信在比较之前,首先对这些表进行正确排序是正确的方法。对于具有主键的表,我可以简单地按主键排序,但对于其他没有主键的表,我需要所有列的列表。我发现这很有帮助:

SELECT listagg(COLUMN_NAME,', ') WITHIN GROUP(ORDER BY COLUMN_NAME) 
CSV
FROM ALL_TAB_COLUMNS
WHERE TABLE_NAME = 'NAME_OF_TABLE';

然后我可以使用逗号分隔的列表:

SELECT *
FROM NAME_OF_TABLE
ORDER BY
(SELECT listagg(COLUMN_NAME,', ') WITHIN GROUP(ORDER BY COLUMN_NAME) 
CSV
FROM ALL_TAB_COLUMNS
WHERE TABLE_NAME = 'NAME_OF_TABLE');

我的比较:

通常,我会使用相同的SQL命令获取两个数据库并为每个数据库获取一个ResultSet,并继续执行一个while循环,其中rs1.next()和rs2.next()为真。

我可以通过添加"WHERE ROWNUM <= number_of_rows_returned"来编写代码将我的 SQL 限制为一定数量的行以进行百分比比较

这就是我不太简短的问题的根源所在:我是否以明显的次优方式完成所有这些工作?有没有更好的方法?有没有我应该听说过的工具?请帮帮我解决:)我希望我已经分享了足够多的东西来获得一些想法......

按照以下步骤操作,

1.) 在源数据库中创建一个数据库链接,以连接到目标数据库。

2.) 使用 MINUS 集运算符比较两个表的数据。下面的查询示例,

SELECT *
FROM table1
MINUS
SELECT *
FROM table1@dblink;
SELECT *
FROM table1@dblink
MINUS
SELECT *
FROM table1;

如果返回了一些行,则存在差异。

最新更新