mirror of
https://github.com/percona/percona-toolkit.git
synced 2025-09-19 18:34:59 +00:00
Working version with --preserve-triggers
This commit is contained in:
@@ -8030,6 +8030,7 @@ my $dont_interrupt_now = 0;
|
|||||||
my @drop_trigger_sqls;
|
my @drop_trigger_sqls;
|
||||||
my @triggers_not_dropped;
|
my @triggers_not_dropped;
|
||||||
my $pxc_version = '0';
|
my $pxc_version = '0';
|
||||||
|
my @orig_triggers = ('','','');
|
||||||
# Completely ignore these error codes.
|
# Completely ignore these error codes.
|
||||||
my %ignore_code = (
|
my %ignore_code = (
|
||||||
# Error: 1592 SQLSTATE: HY000 (ER_BINLOG_UNSAFE_STATEMENT)
|
# Error: 1592 SQLSTATE: HY000 (ER_BINLOG_UNSAFE_STATEMENT)
|
||||||
@@ -9546,6 +9547,16 @@ sub main {
|
|||||||
$plugin->before_swap_tables();
|
$plugin->before_swap_tables();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( $o->get('preserve-triggers') ) {
|
||||||
|
print "Adding original triggers to new table.\n";
|
||||||
|
|
||||||
|
foreach my $orig_trigger (@orig_triggers) {
|
||||||
|
PTDEBUG && _d($orig_trigger);
|
||||||
|
print $orig_trigger, "\n" if $o->get('print');
|
||||||
|
$cxn->dbh()->do($orig_trigger);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
my $old_tbl;
|
my $old_tbl;
|
||||||
if ( $o->get('swap-tables') ) {
|
if ( $o->get('swap-tables') ) {
|
||||||
|
|
||||||
@@ -10577,11 +10588,6 @@ sub create_triggers {
|
|||||||
my $orig_insert_trigger;
|
my $orig_insert_trigger;
|
||||||
my $orig_update_trigger;
|
my $orig_update_trigger;
|
||||||
|
|
||||||
my %orig_triggers = (
|
|
||||||
del => '',
|
|
||||||
ins => '',
|
|
||||||
upd => ''
|
|
||||||
);
|
|
||||||
|
|
||||||
if ( $o->get('preserve-triggers') ) {
|
if ( $o->get('preserve-triggers') ) {
|
||||||
$cxn->connect();
|
$cxn->connect();
|
||||||
@@ -10628,14 +10634,15 @@ sub create_triggers {
|
|||||||
. "UNLOCK TABLES;";
|
. "UNLOCK TABLES;";
|
||||||
}
|
}
|
||||||
|
|
||||||
$orig_triggers{del}
|
my $definer = $orig_delete_trigger->[2];
|
||||||
= "LOCK TABLES $orig_tbl->{name} WRITE;\n"
|
$definer =~ s/@/`@`/;
|
||||||
. "DROP TRIGGER IF EXISTS `${prefix}_del`;\n"
|
$definer = "`".$definer."`";
|
||||||
. "CREATE DEFINER=$orig_delete_trigger->[2] TRIGGER `$orig_delete_trigger->[0]`.`$orig_delete_trigger->[1]` "
|
|
||||||
. "AFTER DELETE ON $orig_tbl->{name}\n"
|
$orig_triggers[0]
|
||||||
|
= "CREATE DEFINER=$definer TRIGGER `$orig_delete_trigger->[0]`.`$orig_delete_trigger->[1]` "
|
||||||
|
. "AFTER DELETE ON $new_tbl->{name}\n"
|
||||||
. "FOR EACH ROW\n"
|
. "FOR EACH ROW\n"
|
||||||
. $orig_delete_trigger->[3] . ";\n"
|
. $orig_delete_trigger->[3] . ";\n";
|
||||||
. "UNLOCK TABLES;";
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$delete_trigger
|
$delete_trigger
|
||||||
@@ -10680,14 +10687,15 @@ sub create_triggers {
|
|||||||
. "UNLOCK TABLES;";
|
. "UNLOCK TABLES;";
|
||||||
}
|
}
|
||||||
|
|
||||||
$orig_triggers{del}
|
my $definer = $orig_insert_trigger->[2];
|
||||||
= "LOCK TABLES $orig_tbl->{name} WRITE;\n"
|
$definer =~ s/@/`@`/;
|
||||||
. "DROP TRIGGER IF EXISTS `${prefix}_del`;\n"
|
$definer = "`".$definer."`";
|
||||||
. "CREATE DEFINER=$orig_insert_trigger->[2] TRIGGER `$orig_insert_trigger->[0]`.`$orig_insert_trigger->[1]` "
|
|
||||||
. "AFTER DELETE ON $orig_tbl->{name}\n"
|
$orig_triggers[1]
|
||||||
|
= "CREATE DEFINER=$definer TRIGGER `$orig_insert_trigger->[0]`.`$orig_insert_trigger->[1]` "
|
||||||
|
. "AFTER INSERT ON $new_tbl->{name}\n"
|
||||||
. "FOR EACH ROW\n"
|
. "FOR EACH ROW\n"
|
||||||
. $orig_insert_trigger->[3] . ";\n"
|
. $orig_insert_trigger->[3] . ";\n";
|
||||||
. "UNLOCK TABLES;";
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$insert_trigger
|
$insert_trigger
|
||||||
@@ -10732,14 +10740,15 @@ sub create_triggers {
|
|||||||
. "UNLOCK TABLES;";
|
. "UNLOCK TABLES;";
|
||||||
}
|
}
|
||||||
|
|
||||||
$orig_triggers{del}
|
my $definer = $orig_update_trigger->[2];
|
||||||
= "LOCK TABLES $orig_tbl->{name} WRITE;\n"
|
$definer =~ s/@/`@`/;
|
||||||
. "DROP TRIGGER IF EXISTS `${prefix}_del`;\n"
|
$definer = "`".$definer."`";
|
||||||
. "CREATE DEFINER=$orig_update_trigger->[2] TRIGGER `$orig_update_trigger->[0]`.`$orig_update_trigger->[1]` "
|
|
||||||
. "AFTER DELETE ON $orig_tbl->{name}\n"
|
$orig_triggers[2]
|
||||||
|
= "CREATE DEFINER=$definer TRIGGER `$orig_update_trigger->[0]`.`$orig_update_trigger->[1]` "
|
||||||
|
. "AFTER UPDATE ON $new_tbl->{name}\n"
|
||||||
. "FOR EACH ROW\n"
|
. "FOR EACH ROW\n"
|
||||||
. $orig_update_trigger->[3] . ";\n"
|
. $orig_update_trigger->[3] . ";\n";
|
||||||
. "UNLOCK TABLES;";
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
@@ -10776,9 +10785,6 @@ sub create_triggers {
|
|||||||
# (or faked to be created) so if the 2nd trigger
|
# (or faked to be created) so if the 2nd trigger
|
||||||
# fails to create, we know to only drop the 1st.
|
# fails to create, we know to only drop the 1st.
|
||||||
push @trigger_names, "${prefix}_$name";
|
push @trigger_names, "${prefix}_$name";
|
||||||
if ( $o->get('preserve-triggers') ) {
|
|
||||||
push @drop_trigger_sqls, $orig_triggers{$name};
|
|
||||||
}
|
|
||||||
push @drop_trigger_sqls,
|
push @drop_trigger_sqls,
|
||||||
"DROP TRIGGER IF EXISTS "
|
"DROP TRIGGER IF EXISTS "
|
||||||
. $q->quote($orig_tbl->{db}, "${prefix}_$name") . ";";
|
. $q->quote($orig_tbl->{db}, "${prefix}_$name") . ";";
|
||||||
@@ -11806,7 +11812,8 @@ you notice queueing, it is best to decrease the chunk time.
|
|||||||
|
|
||||||
=item --preserve-triggers
|
=item --preserve-triggers
|
||||||
|
|
||||||
Preserves old triggers when specified.
|
Preserves old triggers when specified. This mode will briefly hold up to 3
|
||||||
|
locks when it rewrites original triggers to include the tool code.
|
||||||
|
|
||||||
=item --new-table-name
|
=item --new-table-name
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user