0

我想使用 Perl比较驻留在两个不同服务器上的两个不同TERADATA数据库的数据结构/数据类型/长度

是否有可能做到这一点?

添加了详细信息 我正在尝试比较这两个数据库(一个 PROD)和(一个 DEV)环境数据库并将 PROD 与 DEV 进行比较并记录差异,我无法导出到平面文件,然后导入到另一个地方,因为大小被复制的数据超过 500GB。

我首先尝试将 PROD 与 DEV 服务器数据库进行比较,然后根据模式/数据类型/长度的差异,从 PROD 导入 DEV。

4

3 回答 3

2

根据您的问题,在纯 Perl 中执行此操作可能很困难,但可以使用DBI. 假设 MySQLDB.YOURDOMAIN.COMDB2.YOUROTHERDOMAIN.COM

my $db1 = DBI->connect(
     'DBI:mysql:database=DATABASE1;host=DB.YOURDOMAIN.COM;port=3306',
     'username', 'password',
     );
my $db2 = DBI->connect(
     'DBI:mysql:database=DATABASE1;host=DB2.YOUROTHERDOMAIN.COM;port=3306',
     'username', 'password',
     );

这将为您提供两个连接。从那里,您只需执行查询即可完成工作:

my $sth = $dbh->prepare("show tables");
while (my $row = $sth->fetchrow_hashref) {
   my $table_name = $row->{'Tables_in_DATABASE1'};
   ## Process this particular table.
}

对于您使用的各个表describe

my $sth = $dbh->prepare("DESCRIBE table1");
while (my $row = $sth->fetchrow_hashref) {
    my $type = $row->{'Type'}; ## 'int(12)' for example.
    ## Process from there.
}
于 2011-07-27T18:33:12.017 回答
1

想到了几种不同的方法。如果两个数据库都可以从一台机器访问,那么您可以将数据构建到 Perl 数据结构中,然后使用 Test::More::is_deeply() 来检查差异。

如果两个数据库都不能访问,那么像上面那样在 Perl 中构建数据,然后使用 Data::Dumper 将结构打印到文件中。确保使用 Sortkeys 选项,以及使用相同的 Indent/Purity/etc。两次运行的选项。最后,将两个输出文件复制到同一个地方并在它们上运行“diff”。

于 2011-07-27T18:25:11.250 回答
0

您是否尝试过查询模式、表和列上的元数据(并将每个都放入相关的数据结构中)——例如:

{
   schema1=>
       [{table11=>[[column111,datatype111],[column112,datatype112],...],
        table12=>[[column121,datatype121],...
       ]
    ,schema2=>[{table21=>[[column211,datatype211],[column212,datatype212,...],
        etc...]
}

然后遍历每一个数据结构,比较每一个schema、table、column?除非您向我们提供更多细节,否则我认为您不会得到更多有用的答案。

于 2011-07-27T18:23:22.887 回答