比较两个数据库Perl

时间:2011-07-27 18:14:31

标签: perl comparison compare teradata

我想使用Perl

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

是否可以这样做?

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

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

3 个答案:

答案 0 :(得分:2)

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

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.
}

答案 1 :(得分:1)

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

如果数据库不是可访问的,则如上所述在Perl中构建数据,然后使用Data :: Dumper将结构打印到文件中。确保使用Sortkeys选项,以及使用相同的缩进/纯度/等。两次运行的选项。最后,将两个输出文件复制到同一个地方并在它们上运行'diff'。

答案 2 :(得分:0)

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

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

然后遍历每个数据结构,比较每个模式,表和列?除非你给我们一些更具体的细节,否则我认为你不会得到更多有用的答案。