比较两个Perl数据库
我想使用Perl比较驻留在两台不同服务器上的两个不同的TERADATA数据库的数据结构/数据类型/长度 有可能这样做吗 添加了详细信息 我试图比较这两个数据库(一个PROD)和(一个DEV)环境数据库,比较PROD和DEV并记录差异,我无法导出到平面文件,然后导入到另一个位置,因为要复制的数据的大小超过500gb比较两个Perl数据库,perl,comparison,compare,teradata,Perl,Comparison,Compare,Teradata,我想使用Perl比较驻留在两台不同服务器上的两个不同的TERADATA数据库的数据结构/数据类型/长度 有可能这样做吗 添加了详细信息 我试图比较这两个数据库(一个PROD)和(一个DEV)环境数据库,比较PROD和DEV并记录差异,我无法导出到平面文件,然后导入到另一个位置,因为要复制的数据的大小超过500gb 我首先尝试比较PROD和DEV服务器数据库,然后根据模式/数据类型/长度的差异,从PROD导入到DEV中。您是否尝试过查询模式、表和列上的元数据(并将它们放入相关的数据结构中)——例如
我首先尝试比较PROD和DEV服务器数据库,然后根据模式/数据类型/长度的差异,从PROD导入到DEV中。您是否尝试过查询模式、表和列上的元数据(并将它们放入相关的数据结构中)——例如:
{
schema1=>
[{table11=>[[column111,datatype111],[column112,datatype112],...],
table12=>[[column121,datatype121],...
]
,schema2=>[{table21=>[[column211,datatype211],[column212,datatype212,...],
etc...]
}
然后遍历每个数据结构,比较每个模式、表和列?除非您提供更多的细节,否则我认为您不会得到更多有用的答案。您是否尝试过查询模式、表和列上的元数据(并将它们放入相关的数据结构中)——例如:
{
schema1=>
[{table11=>[[column111,datatype111],[column112,datatype112],...],
table12=>[[column121,datatype121],...
]
,schema2=>[{table21=>[[column211,datatype211],[column212,datatype212,...],
etc...]
}
然后遍历每个数据结构,比较每个模式、表和列?除非你给我们提供更多的细节,否则我认为你不会得到更多有用的答案。我想到了几种不同的方法。如果两个数据库都可以从一台机器访问,那么可以将数据构建到Perl数据结构中,然后使用Test::More::is_deeph()检查差异
如果两个数据库都不可访问,则如上所述在Perl中构建数据,然后使用data::Dumper将结构打印到文件中。确保使用Sortkeys选项,以及在两次运行中使用相同的缩进/纯度等选项。最后,将两个输出文件复制到同一个位置,并在其上运行“diff”。想到了几种不同的方法。如果两个数据库都可以从一台机器访问,那么可以将数据构建到Perl数据结构中,然后使用Test::More::is_deeph()检查差异
如果两个数据库都不可访问,则如上所述在Perl中构建数据,然后使用data::Dumper将结构打印到文件中。确保使用Sortkeys选项,以及在两次运行中使用相同的缩进/纯度等选项。最后,将两个输出文件复制到同一位置,并在其上运行“diff”。根据您的问题,用纯Perl执行此操作可能很困难,但可以使用。假设MySQL位于
DB.YOURDOMAIN.COM
和DB2.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.
}
对于您使用的各个表说明:
my $sth = $dbh->prepare("DESCRIBE table1");
while (my $row = $sth->fetchrow_hashref) {
my $type = $row->{'Type'}; ## 'int(12)' for example.
## Process from there.
}
根据您的问题,在纯Perl中执行此操作可能很困难,但可以使用。假设MySQL位于DB.YOURDOMAIN.COM
和DB2.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.
}
对于您使用的各个表说明:
my $sth = $dbh->prepare("DESCRIBE table1");
while (my $row = $sth->fetchrow_hashref) {
my $type = $row->{'Type'}; ## 'int(12)' for example.
## Process from there.
}
从一个数据库导出数据库,然后在另一个数据库上导入(以不同的名称)。然后您可以编写php来比较您使用的是哪个数据库?您可能必须找到DBMS提供的用于比较的任何内置方式,以及在perl脚本中实现该内置机制的任何内置方式。然后您可以编写php来比较您使用的是哪个数据库?您可能必须找到DBMS提供的任何内置方式来进行比较,并在perl脚本中实现该内置机制。请参阅上面添加的信息并提供示例脚本(如果可能)。非常感谢。请参阅上面添加的信息并提供示例脚本(如果可能)。非常感谢。在这种情况下,是的,您需要查询元数据。具体操作方式取决于您的RDBMS。上面添加了TERADATA。在这种情况下,您需要查找如何在TERADATA数据库中查询元数据。在这种情况下,您需要查询元数据。具体如何做取决于您的RDBMS。上面添加了TERADATA。在这种情况下,您需要查找如何在TERADATA数据库中查询元数据。好的。。。我不熟悉Teradata,但是根据这个()您可能有一些等效的命令。还有DBI的Teradata驱动程序:好的。。。我不熟悉Teradata,但是根据这个()您可能有一些等效的命令。然后是DBI的Teradata驱动程序: