0

Perl を使用して、2 つの異なるサーバーに存在する 2つの異なるTERADATAデータベースのデータ構造/データ型/長さを比較したい

これを行うことは可能ですか?

詳細を追加しまし た。これら 2 つのデータベース (1 つの PROD) と (1 つの DEV) 環境データベースを比較し、PROD を DEV と比較して違いを記録しようとしています。フラット ファイルにエクスポートしてから別の場所にインポートすることはできません。コピーされるデータは 500 GB 以上です。

最初に PROD を DEV サーバー データベースと比較してから、スキーマ/データ型/長さの違いを考慮して、PROD から DEV にインポートします。

4

3 に答える 3

2

あなたの質問によれば、純粋なPerlでこれを行うのは難しいかもしれませんが、を使用して行うことができますDBI。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',
     );

これにより、2つの接続が得られます。そこから、クエリを実行してジョブを実行します。

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 を使用してください。両方の実行のオプション。最後に、2 つの出力ファイルを同じ場所にコピーし、それらに対して 'diff' を実行します。

于 2011-07-27T18:25:11.250 に答える
0

スキーマ、テーブル、および列のメタデータをクエリしてみましたか (そして、それぞれを関連するデータ構造に入れましたか)--たとえば:

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

次に、各データ構造をトラバースし、各スキーマ、テーブル、および列を比較しますか? もう少し具体的に教えていただけない限り、これ以上有益な答えは得られないと思います。

于 2011-07-27T18:23:22.887 に答える