Add --[no]drop-triggers to pt-online-schema-change.

This commit is contained in:
Daniel Nichter
2013-10-09 13:23:10 -07:00
parent 3c2376023d
commit d4995b565d
3 changed files with 107 additions and 7 deletions

View File

@@ -7845,6 +7845,10 @@ sub main {
$o->save_error($EVAL_ERROR); $o->save_error($EVAL_ERROR);
} }
if ( !$o->get('drop-triggers') ) {
$o->set('drop-old-table', 0);
}
if ( !$o->get('help') ) { if ( !$o->get('help') ) {
if ( @ARGV ) { if ( @ARGV ) {
$o->save_error('Specify only one DSN on the command line'); $o->save_error('Specify only one DSN on the command line');
@@ -8659,17 +8663,29 @@ sub main {
# Drop the triggers. We can save this cleanup task before # Drop the triggers. We can save this cleanup task before
# adding the triggers because if adding them fails, this will be # adding the triggers because if adding them fails, this will be
# called which will drop whichever triggers were created. # called which will drop whichever triggers were created.
my $drop_triggers = $o->get('drop-triggers');
push @cleanup_tasks, sub { push @cleanup_tasks, sub {
PTDEBUG && _d('Clean up triggers'); PTDEBUG && _d('Clean up triggers');
# --plugin hook # --plugin hook
if ( $plugin && $plugin->can('before_drop_triggers') ) { if ( $plugin && $plugin->can('before_drop_triggers') ) {
$plugin->before_drop_triggers( $plugin->before_drop_triggers(
oktorun => $oktorun, oktorun => $oktorun,
drop_triggers => $drop_triggers,
drop_trigger_sqls => \@drop_trigger_sqls, drop_trigger_sqls => \@drop_trigger_sqls,
); );
} }
if ( $oktorun ) { if ( !$oktorun ) {
print "Not dropping triggers because the tool was interrupted. "
. "To drop the triggers, execute:\n"
. join("\n", @drop_trigger_sqls) . "\n";
}
elsif ( !$drop_triggers ) {
print "Not dropping triggers because --no-drop-triggers was "
. "specified. To drop the triggers, execute:\n"
. join("\n", @drop_trigger_sqls) . "\n";
}
else {
drop_triggers( drop_triggers(
tbl => $orig_tbl, tbl => $orig_tbl,
Cxn => $cxn, Cxn => $cxn,
@@ -8680,11 +8696,6 @@ sub main {
stats => \%stats, stats => \%stats,
); );
} }
else {
print "Not dropping triggers because the tool was interrupted. "
. "To drop the triggers, execute:\n"
. join("\n", @drop_trigger_sqls) . "\n";
}
}; };
# --plugin hook # --plugin hook
@@ -9231,6 +9242,12 @@ sub main {
} }
} }
} }
elsif ( !$drop_triggers ) {
print "Not dropping old table because --no-drop-triggers was specified.\n";
}
else {
print "Not dropping old table because --no-drop-old-table was specified.\n";
}
# ######################################################################## # ########################################################################
# Done. # Done.
@@ -10943,6 +10960,13 @@ the tool leaves the original table in place.
If C<--no-swap-tables> is specified, then there is no old table to drop. If C<--no-swap-tables> is specified, then there is no old table to drop.
=item --[no]drop-triggers
default: yes
Drop triggers on the old table. C<--no-drop-triggers> forces
C<--no-drop-old-table>.
=item --dry-run =item --dry-run
Create and alter the new table, but do not create triggers, copy data, or Create and alter the new table, but do not create triggers, copy data, or

View File

@@ -576,7 +576,7 @@ SKIP: {
} }
# ############################################################################# # #############################################################################
# --alther-foreign-keys-method=none. This intentionally breaks fks because # --alter-foreign-keys-method=none. This intentionally breaks fks because
# they're not updated so they'll point to the old table that is dropped. # they're not updated so they'll point to the old table that is dropped.
# ############################################################################# # #############################################################################

View File

@@ -0,0 +1,76 @@
#!/usr/bin/env perl
BEGIN {
die "The PERCONA_TOOLKIT_BRANCH environment variable is not set.\n"
unless $ENV{PERCONA_TOOLKIT_BRANCH} && -d $ENV{PERCONA_TOOLKIT_BRANCH};
unshift @INC, "$ENV{PERCONA_TOOLKIT_BRANCH}/lib";
};
use strict;
use warnings FATAL => 'all';
use English qw(-no_match_vars);
use Test::More;
use PerconaTest;
use Sandbox;
require "$trunk/bin/pt-online-schema-change";
require VersionParser;
use Time::HiRes qw(sleep);
use Data::Dumper;
$Data::Dumper::Indent = 1;
$Data::Dumper::Sortkeys = 1;
$Data::Dumper::Quotekeys = 0;
my $dp = new DSNParser(opts=>$dsn_opts);
my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp);
my $dbh1 = $sb->get_dbh_for('master');
my $dbh2 = $sb->get_dbh_for('master');
if ( !$dbh1 || !$dbh2 ) {
plan skip_all => 'Cannot connect to sandbox master';
}
my $output;
my $master_dsn = $sb->dsn_for('master');
my $sample = "t/pt-online-schema-change/samples";
my $plugin = "$trunk/$sample/plugins";
my $exit;
my $rows;
# Loads pt_osc.t with cols id (pk), c (unique index),, d.
$sb->load_file('master', "$sample/basic_no_fks_innodb.sql");
# #############################################################################
# --no-swap-tables --no-drop-triggers
# #############################################################################
$output = output(
sub { pt_online_schema_change::main(
"$master_dsn,D=pt_osc,t=t",
'--alter', 'DROP COLUMN d',
qw(--execute --no-swap-tables --no-drop-new-table --no-drop-triggers))
},
stderr => 1,
);
my $triggers = $dbh1->selectall_arrayref("SHOW TRIGGERS FROM pt_osc");
is(
@$triggers,
3,
"no swap-tables, drop-triggers, drop-new-table: triggers"
) or diag(Dumper($triggers), $output);
my $tables = $dbh1->selectall_arrayref("SHOW TABLES FROM pt_osc");
is_deeply(
$tables,
[ ['_t_new'], ['t'] ],
"no swap-tables, drop-triggers, drop-new-table: tables"
) or diag(Dumper($tables), $output);
# #############################################################################
# Done.
# #############################################################################
$sb->wipe_clean($dbh1);
ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox");
done_testing;