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);
}
if ( !$o->get('drop-triggers') ) {
$o->set('drop-old-table', 0);
}
if ( !$o->get('help') ) {
if ( @ARGV ) {
$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
# adding the triggers because if adding them fails, this will be
# called which will drop whichever triggers were created.
my $drop_triggers = $o->get('drop-triggers');
push @cleanup_tasks, sub {
PTDEBUG && _d('Clean up triggers');
# --plugin hook
if ( $plugin && $plugin->can('before_drop_triggers') ) {
$plugin->before_drop_triggers(
oktorun => $oktorun,
drop_triggers => $drop_triggers,
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(
tbl => $orig_tbl,
Cxn => $cxn,
@@ -8680,11 +8696,6 @@ sub main {
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
@@ -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.
@@ -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.
=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
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.
# #############################################################################

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;