DBIx-Replicate
view release on metacpan or search on metacpan
bin/dbix_replicate view on Meta::CPAN
#! /usr/bin/perl
use strict;
use warnings;
use DBI;
use DBIx::Replicate qw/dbix_replicate/;
use Getopt::Long;
sub usage {
print << "EOT";
$0 options
Options:
--src=path source table
--dest=path destination table
--copy-by=cols copy by block of rows with same values in ``colums''
--primary-key=cols primary key columns
--columns=cols list of column names (required if using --primary-key)
--block=num_rows number of rows to be copied at once (same as above)
--extra-cond=expr SQL expression for filtering rows to be copied
Examples:
# copy using DBIx::Replicate::Strategy::CopyBy
$0 \
--src='dbi:mysql:test;table=t;host=db1;user=root;mysql_enable_utf8=1' \
--dest='dbi:mysql:test;table=t;host=db2;user=root;mysql_enable_utf8=1' \
--copy-by='id,subid'
# copy using DBIx::Replicate::Strategy::PK
$0 \
--src='dbi:mysql:test;table=t;host=db1;user=root;mysql_enable_utf8=1' \
--dest='dbi:mysql:test;table=t;host=db2;user=root;mysql_enable_utf8=1' \
--primary-key='id' \
--columns='subid,name,flags'
EOT
;
exit 0;
}
sub connect_to_db {
my $addr = shift;
$addr =~ s/;table=([^;]+)//
or die "table name missing in operand: $addr\n";
my $table = $1;
my $dbh = DBI->connect($addr)
or die "failed to connect to database: $addr\n";
($dbh, $table);
}
my ($src, $dest, $copy_by, $primary_key, $columns, $block, $extra_cond, $load,
$help);
GetOptions(
'src:s' => \$src,
'dest:s' => \$dest,
'copy-by:s' => \$copy_by,
'primary-key:s' => \$primary_key,
'columns:s' => \$columns,
'block:i' => \$block,
'extra_cond:s' => \$extra_cond,
'load:f' => \$load,
help => \$help,
) or exit 1;
usage() if $help;
die "mandatory arguments --src and --dest are missing.\n"
unless $src && $dest;
if ($copy_by) {
die "following arguments cannot be used together with --copy-by: --primary-key, --columns, --block\n"
if $primary_key || $columns || $block;
} elsif ($primary_key) {
} else {
die "either --copy-by or --primary-key should be set.\n";
}
my ($src_conn, $src_table) = connect_to_db($src);
my ($dest_conn, $dest_table) = connect_to_db($dest);
dbix_replicate({
src_conn => $src_conn,
src_table => $src_table,
dest_conn => $dest_conn,
dest_table => $dest_table,
copy_by => $copy_by,
primary_key => $primary_key && [ split /\s*,\s*/, $primary_key ],
columns => $columns && [ split /\s*,\s*/, $columns ],
block => $block,
extra_cond => $extra_cond,
load => $load,
});
( run in 1.116 second using v1.01-cache-2.11-cpan-39bf76dae61 )