mirror of
https://github.com/percona/percona-toolkit.git
synced 2025-09-10 13:11:32 +00:00
Compare commits
5 Commits
developmen
...
PT-1828-mi
Author | SHA1 | Date | |
---|---|---|---|
![]() |
3fb8002d94 | ||
![]() |
7d6ae54279 | ||
![]() |
8990a967c5 | ||
![]() |
4c5447bf42 | ||
![]() |
4fda9caaf8 |
13
Changelog
13
Changelog
@@ -1,18 +1,7 @@
|
||||
Changelog for Percona Toolkit
|
||||
|
||||
* Fixed bug PT-1824: Name of a constraint can exceed 64 chars
|
||||
* Fixed bug PT-1793: Protocol parser cannot handle year 2020 (Thanks Kei Tsuchiya)
|
||||
* Fixed bug PT-1782: pt-online-schema-change: FK keys warning, but there are no foreign keys
|
||||
* Fixed bug PT-1773: pt-online-schema-change: Restrict the FK check if needed
|
||||
* Fixed bug PT-1766: pt-table-checksum: DIFF_ROWS is not computed correctly
|
||||
* Improvement PT-1765: Documentation for pt-table-checksum's DIFF_ROWS
|
||||
* Fixed bug PT-1760: pt-online-schema-change: regression on slave with replication channels
|
||||
* Fixed bug PT-1759: pt-stalk not collecting processlist and variables
|
||||
* Improvement PT-1757: pt-table-checksum: Improvement on handling Small Tables
|
||||
* Improvement PT-1707: IPv6 support
|
||||
* Fixed bug PT-1576: pt-stalk mysql-only not working as expected
|
||||
* Fixed bug PT-1502: pt-online-schema-change not working with multi-source replication
|
||||
* Fixed bug PT-297 : pt-online-schema-change can break replication
|
||||
* Fixed bug PT-1793: Protocol parser cannot handle year 2020 (Thanks Kei Tsuchiya)
|
||||
|
||||
v3.1.0 release 2019-09-12
|
||||
|
||||
|
@@ -45,7 +45,7 @@ BEGIN {
|
||||
{
|
||||
package Percona::Toolkit;
|
||||
|
||||
our $VERSION = '3.2.0';
|
||||
our $VERSION = '3.0.14-dev';
|
||||
|
||||
use strict;
|
||||
use warnings FATAL => 'all';
|
||||
|
@@ -43,7 +43,7 @@ BEGIN {
|
||||
{
|
||||
package Percona::Toolkit;
|
||||
|
||||
our $VERSION = '3.2.0';
|
||||
our $VERSION = '3.0.14-dev';
|
||||
|
||||
use strict;
|
||||
use warnings FATAL => 'all';
|
||||
|
@@ -42,7 +42,7 @@ BEGIN {
|
||||
{
|
||||
package Percona::Toolkit;
|
||||
|
||||
our $VERSION = '3.2.0';
|
||||
our $VERSION = '3.0.14-dev';
|
||||
|
||||
use strict;
|
||||
use warnings FATAL => 'all';
|
||||
|
@@ -38,7 +38,7 @@ BEGIN {
|
||||
{
|
||||
package Percona::Toolkit;
|
||||
|
||||
our $VERSION = '3.2.0';
|
||||
our $VERSION = '3.0.14-dev';
|
||||
|
||||
use strict;
|
||||
use warnings FATAL => 'all';
|
||||
|
@@ -39,7 +39,7 @@ BEGIN {
|
||||
{
|
||||
package Percona::Toolkit;
|
||||
|
||||
our $VERSION = '3.2.0';
|
||||
our $VERSION = '3.0.14-dev';
|
||||
|
||||
use strict;
|
||||
use warnings FATAL => 'all';
|
||||
|
@@ -35,7 +35,7 @@ BEGIN {
|
||||
{
|
||||
package Percona::Toolkit;
|
||||
|
||||
our $VERSION = '3.2.0';
|
||||
our $VERSION = '3.0.14-dev';
|
||||
|
||||
use strict;
|
||||
use warnings FATAL => 'all';
|
||||
|
@@ -37,7 +37,7 @@ BEGIN {
|
||||
{
|
||||
package Percona::Toolkit;
|
||||
|
||||
our $VERSION = '3.2.0';
|
||||
our $VERSION = '3.0.14-dev';
|
||||
|
||||
use strict;
|
||||
use warnings FATAL => 'all';
|
||||
|
@@ -44,7 +44,7 @@ BEGIN {
|
||||
{
|
||||
package Percona::Toolkit;
|
||||
|
||||
our $VERSION = '3.2.0';
|
||||
our $VERSION = '3.0.14-dev';
|
||||
|
||||
use strict;
|
||||
use warnings FATAL => 'all';
|
||||
|
@@ -45,7 +45,7 @@ BEGIN {
|
||||
{
|
||||
package Percona::Toolkit;
|
||||
|
||||
our $VERSION = '3.2.0';
|
||||
our $VERSION = '3.0.14-dev';
|
||||
|
||||
use strict;
|
||||
use warnings FATAL => 'all';
|
||||
|
@@ -47,7 +47,7 @@ BEGIN {
|
||||
{
|
||||
package Percona::Toolkit;
|
||||
|
||||
our $VERSION = '3.2.0';
|
||||
our $VERSION = '3.0.14-dev';
|
||||
|
||||
use strict;
|
||||
use warnings FATAL => 'all';
|
||||
|
@@ -56,7 +56,7 @@ BEGIN {
|
||||
{
|
||||
package Percona::Toolkit;
|
||||
|
||||
our $VERSION = '3.2.0';
|
||||
our $VERSION = '3.0.14-dev';
|
||||
|
||||
use strict;
|
||||
use warnings FATAL => 'all';
|
||||
@@ -8376,6 +8376,7 @@ my $dont_interrupt_now = 0;
|
||||
my @drop_trigger_sqls;
|
||||
my @triggers_not_dropped;
|
||||
my $pxc_version = '0';
|
||||
my $can_drop_triggers = 1;
|
||||
|
||||
my $triggers_info = [];
|
||||
|
||||
@@ -9550,6 +9551,7 @@ sub main {
|
||||
# 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') ) {
|
||||
@@ -9560,12 +9562,12 @@ sub main {
|
||||
);
|
||||
}
|
||||
|
||||
if ( !$oktorun ) {
|
||||
if ( !$oktorun || !_can_drop_triggers()) {
|
||||
print "Not dropping triggers because the tool was interrupted. "
|
||||
. "To drop the triggers, execute:\n"
|
||||
. join("\n", @drop_trigger_sqls) . "\n";
|
||||
}
|
||||
elsif ( !$drop_triggers ) {
|
||||
elsif ( !$drop_triggers || !_can_drop_triggers()) {
|
||||
print "Not dropping triggers because --no-drop-triggers was "
|
||||
. "specified. To drop the triggers, execute:\n"
|
||||
. join("\n", @drop_trigger_sqls) . "\n";
|
||||
@@ -9998,6 +10000,76 @@ sub main {
|
||||
$plugin->after_copy_rows();
|
||||
}
|
||||
|
||||
# #####################################################################
|
||||
# Step 5a: Update foreign key constraints if there are child tables.
|
||||
# #####################################################################
|
||||
if ( $child_tables ) {
|
||||
# --plugin hook
|
||||
if ( $plugin && $plugin->can('before_update_foreign_keys') ) {
|
||||
$plugin->before_update_foreign_keys();
|
||||
}
|
||||
|
||||
eval {
|
||||
if ( $alter_fk_method eq 'none' ) {
|
||||
# This shouldn't happen, but in case it does we should know.
|
||||
warn "The tool detected child tables but "
|
||||
. "--alter-foreign-keys-method=none";
|
||||
}
|
||||
elsif ( $alter_fk_method eq 'rebuild_constraints' ) {
|
||||
rebuild_constraints(
|
||||
orig_tbl => $new_tbl,
|
||||
old_tbl => $orig_tbl,
|
||||
# orig_tbl => $orig_tbl,
|
||||
# old_tbl => $old_tbl,
|
||||
child_tables => $child_tables,
|
||||
OptionParser => $o,
|
||||
Quoter => $q,
|
||||
Cxn => $cxn,
|
||||
TableParser => $tp,
|
||||
stats => \%stats,
|
||||
Retry => $retry,
|
||||
tries => $tries,
|
||||
);
|
||||
}
|
||||
elsif ( $alter_fk_method eq 'drop_swap' ) {
|
||||
drop_swap(
|
||||
orig_tbl => $new_tbl,
|
||||
new_tbl => $orig_tbl,
|
||||
# orig_tbl => $orig_tbl,
|
||||
# new_tbl => $new_tbl,
|
||||
Cxn => $cxn,
|
||||
OptionParser => $o,
|
||||
stats => \%stats,
|
||||
Retry => $retry,
|
||||
tries => $tries,
|
||||
analyze_table => $analyze_table,
|
||||
);
|
||||
}
|
||||
elsif ( !$alter_fk_method
|
||||
&& $o->has('alter-foreign-keys-method')
|
||||
&& ($o->get('alter-foreign-keys-method') || '') eq 'auto' ) {
|
||||
# If --alter-foreign-keys-method is 'auto' and we are on a dry run,
|
||||
# $alter_fk_method is left as an empty string.
|
||||
print "Not updating foreign key constraints because this is a dry run.\n";
|
||||
}
|
||||
else {
|
||||
# This should "never" happen because we check this var earlier.
|
||||
_die("Invalid --alter-foreign-keys-method: $alter_fk_method", INVALID_ALTER_FK_METHOD);
|
||||
}
|
||||
};
|
||||
if ( $EVAL_ERROR ) {
|
||||
# TODO: improve error message and handling.
|
||||
$can_drop_triggers=undef;
|
||||
$oktorun=undef;
|
||||
_die("Error updating foreign key constraints: $EVAL_ERROR", ERROR_UPDATING_FKS);
|
||||
}
|
||||
|
||||
# --plugin hook
|
||||
if ( $plugin && $plugin->can('after_update_foreign_keys') ) {
|
||||
$plugin->after_update_foreign_keys();
|
||||
}
|
||||
}
|
||||
|
||||
# #####################################################################
|
||||
# XXX
|
||||
# Step 5: Rename tables: orig -> old, new -> orig
|
||||
@@ -10092,66 +10164,66 @@ sub main {
|
||||
# #####################################################################
|
||||
# Step 6: Update foreign key constraints if there are child tables.
|
||||
# #####################################################################
|
||||
if ( $child_tables ) {
|
||||
# --plugin hook
|
||||
if ( $plugin && $plugin->can('before_update_foreign_keys') ) {
|
||||
$plugin->before_update_foreign_keys();
|
||||
}
|
||||
|
||||
eval {
|
||||
if ( $alter_fk_method eq 'none' ) {
|
||||
# This shouldn't happen, but in case it does we should know.
|
||||
warn "The tool detected child tables but "
|
||||
. "--alter-foreign-keys-method=none";
|
||||
}
|
||||
elsif ( $alter_fk_method eq 'rebuild_constraints' ) {
|
||||
rebuild_constraints(
|
||||
orig_tbl => $orig_tbl,
|
||||
old_tbl => $old_tbl,
|
||||
child_tables => $child_tables,
|
||||
OptionParser => $o,
|
||||
Quoter => $q,
|
||||
Cxn => $cxn,
|
||||
TableParser => $tp,
|
||||
stats => \%stats,
|
||||
Retry => $retry,
|
||||
tries => $tries,
|
||||
);
|
||||
}
|
||||
elsif ( $alter_fk_method eq 'drop_swap' ) {
|
||||
drop_swap(
|
||||
orig_tbl => $orig_tbl,
|
||||
new_tbl => $new_tbl,
|
||||
Cxn => $cxn,
|
||||
OptionParser => $o,
|
||||
stats => \%stats,
|
||||
Retry => $retry,
|
||||
tries => $tries,
|
||||
analyze_table => $analyze_table,
|
||||
);
|
||||
}
|
||||
elsif ( !$alter_fk_method
|
||||
&& $o->has('alter-foreign-keys-method')
|
||||
&& ($o->get('alter-foreign-keys-method') || '') eq 'auto' ) {
|
||||
# If --alter-foreign-keys-method is 'auto' and we are on a dry run,
|
||||
# $alter_fk_method is left as an empty string.
|
||||
print "Not updating foreign key constraints because this is a dry run.\n";
|
||||
}
|
||||
else {
|
||||
# This should "never" happen because we check this var earlier.
|
||||
_die("Invalid --alter-foreign-keys-method: $alter_fk_method", INVALID_ALTER_FK_METHOD);
|
||||
}
|
||||
};
|
||||
if ( $EVAL_ERROR ) {
|
||||
# TODO: improve error message and handling.
|
||||
_die("Error updating foreign key constraints: $EVAL_ERROR", ERROR_UPDATING_FKS);
|
||||
}
|
||||
|
||||
# --plugin hook
|
||||
if ( $plugin && $plugin->can('after_update_foreign_keys') ) {
|
||||
$plugin->after_update_foreign_keys();
|
||||
}
|
||||
}
|
||||
# if ( $child_tables ) {
|
||||
# # --plugin hook
|
||||
# if ( $plugin && $plugin->can('before_update_foreign_keys') ) {
|
||||
# $plugin->before_update_foreign_keys();
|
||||
# }
|
||||
#
|
||||
# eval {
|
||||
# if ( $alter_fk_method eq 'none' ) {
|
||||
# # This shouldn't happen, but in case it does we should know.
|
||||
# warn "The tool detected child tables but "
|
||||
# . "--alter-foreign-keys-method=none";
|
||||
# }
|
||||
# elsif ( $alter_fk_method eq 'rebuild_constraints' ) {
|
||||
# rebuild_constraints(
|
||||
# orig_tbl => $orig_tbl,
|
||||
# old_tbl => $old_tbl,
|
||||
# child_tables => $child_tables,
|
||||
# OptionParser => $o,
|
||||
# Quoter => $q,
|
||||
# Cxn => $cxn,
|
||||
# TableParser => $tp,
|
||||
# stats => \%stats,
|
||||
# Retry => $retry,
|
||||
# tries => $tries,
|
||||
# );
|
||||
# }
|
||||
# elsif ( $alter_fk_method eq 'drop_swap' ) {
|
||||
# drop_swap(
|
||||
# orig_tbl => $orig_tbl,
|
||||
# new_tbl => $new_tbl,
|
||||
# Cxn => $cxn,
|
||||
# OptionParser => $o,
|
||||
# stats => \%stats,
|
||||
# Retry => $retry,
|
||||
# tries => $tries,
|
||||
# analyze_table => $analyze_table,
|
||||
# );
|
||||
# }
|
||||
# elsif ( !$alter_fk_method
|
||||
# && $o->has('alter-foreign-keys-method')
|
||||
# && ($o->get('alter-foreign-keys-method') || '') eq 'auto' ) {
|
||||
# # If --alter-foreign-keys-method is 'auto' and we are on a dry run,
|
||||
# # $alter_fk_method is left as an empty string.
|
||||
# print "Not updating foreign key constraints because this is a dry run.\n";
|
||||
# }
|
||||
# else {
|
||||
# # This should "never" happen because we check this var earlier.
|
||||
# _die("Invalid --alter-foreign-keys-method: $alter_fk_method", INVALID_ALTER_FK_METHOD);
|
||||
# }
|
||||
# };
|
||||
# if ( $EVAL_ERROR ) {
|
||||
# # TODO: improve error message and handling.
|
||||
# _die("Error updating foreign key constraints: $EVAL_ERROR", ERROR_UPDATING_FKS);
|
||||
# }
|
||||
#
|
||||
# # --plugin hook
|
||||
# if ( $plugin && $plugin->can('after_update_foreign_keys') ) {
|
||||
# $plugin->after_update_foreign_keys();
|
||||
# }
|
||||
# }
|
||||
|
||||
# ########################################################################
|
||||
# Step 7: Drop the old table.
|
||||
@@ -10225,6 +10297,10 @@ sub main {
|
||||
# Subroutines.
|
||||
# ############################################################################
|
||||
|
||||
sub _can_drop_triggers {
|
||||
return $can_drop_triggers;
|
||||
}
|
||||
|
||||
sub validate_tries {
|
||||
my ($o) = @_;
|
||||
my @ops = qw(
|
||||
@@ -11006,6 +11082,8 @@ sub rebuild_constraints {
|
||||
print ts("Rebuilding foreign key constraints...\n");
|
||||
}
|
||||
|
||||
my $foreign_key_checks;
|
||||
|
||||
CHILD_TABLE:
|
||||
foreach my $child_tbl ( @$child_tables ) {
|
||||
my $table_def = $tp->get_create_table(
|
||||
@@ -11066,26 +11144,47 @@ sub rebuild_constraints {
|
||||
|
||||
$constraint =~ s/CONSTRAINT `$fk`/CONSTRAINT `$new_fk`/;
|
||||
|
||||
my $sql = "DROP FOREIGN KEY `$fk`, "
|
||||
. "ADD $constraint";
|
||||
my $sql = "DROP FOREIGN KEY `$fk`, ADD $constraint";
|
||||
push @rebuilt_constraints, $sql;
|
||||
}
|
||||
|
||||
my $server_version = VersionParser->new($cxn->dbh());
|
||||
if ($server_version >= '5.6' && $o->get('disable-fk-checks')) {
|
||||
my $row = $cxn->dbh()->selectrow_arrayref('SELECT @@foreign_key_checks');
|
||||
$foreign_key_checks = @$row[0];
|
||||
ts("Disabling FK checks");
|
||||
$cxn->dbh()->do("SET FOREIGN_KEY_CHECKS=0");
|
||||
}
|
||||
my $sql = "ALTER TABLE $child_tbl->{name} "
|
||||
. join(', ', @rebuilt_constraints);
|
||||
print $sql, "\n" if $o->get('print');
|
||||
if ( $o->get('execute') ) {
|
||||
osc_retry(
|
||||
Cxn => $cxn,
|
||||
Retry => $retry,
|
||||
tries => $tries->{update_foreign_keys},
|
||||
stats => $stats,
|
||||
code => sub {
|
||||
PTDEBUG && _d($sql);
|
||||
$cxn->dbh()->do($sql);
|
||||
$stats->{rebuilt_constraint}++;
|
||||
},
|
||||
);
|
||||
if ($o->get('execute')) {
|
||||
eval {
|
||||
osc_retry(
|
||||
Cxn => $cxn,
|
||||
Retry => $retry,
|
||||
tries => $tries->{update_foreign_keys},
|
||||
stats => $stats,
|
||||
code => sub {
|
||||
PTDEBUG && _d($sql);
|
||||
$cxn->dbh()->do($sql);
|
||||
$stats->{rebuilt_constraint}++;
|
||||
},
|
||||
);
|
||||
};
|
||||
if ($foreign_key_checks) {
|
||||
ts("Re-enabling FK checks");
|
||||
$cxn->dbh()->do("SET FOREIGN_KEY_CHECKS=$foreign_key_checks");
|
||||
}
|
||||
if ($EVAL_ERROR) {
|
||||
$can_drop_triggers=undef;
|
||||
$oktorun=undef;
|
||||
_d("Foreing keys rebuild failed. To rebuild constraints please manually run:");
|
||||
foreach my $cmd (@rebuilt_constraints) {
|
||||
print "$cmd\n";
|
||||
}
|
||||
_die("Foreing keys were not rebuilt");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11212,10 +11311,11 @@ sub create_triggers {
|
||||
"$new_tbl->{name}.$new_qcol <=> OLD.$old_qcol"
|
||||
} @{$tbl_struct->{keys}->{$del_index}->{cols}} );
|
||||
|
||||
my $ignore_clause = $o->get("delete-ignore") ? "IGNORE" : "";
|
||||
my $delete_trigger
|
||||
= "CREATE TRIGGER `${prefix}_del` AFTER DELETE ON $orig_tbl->{name} "
|
||||
. "FOR EACH ROW "
|
||||
. "DELETE IGNORE FROM $new_tbl->{name} "
|
||||
. "DELETE $ignore_clause FROM $new_tbl->{name} "
|
||||
. "WHERE $del_index_cols";
|
||||
|
||||
# ---------------------------------------------------------------------------------------
|
||||
@@ -11241,7 +11341,7 @@ sub create_triggers {
|
||||
= "CREATE TRIGGER `${prefix}_upd` AFTER UPDATE ON $orig_tbl->{name} "
|
||||
. "FOR EACH ROW "
|
||||
. "BEGIN "
|
||||
. "DELETE IGNORE FROM $new_tbl->{name} WHERE !($upd_index_cols) AND $del_index_cols;"
|
||||
. "DELETE $ignore_clause FROM $new_tbl->{name} WHERE !($upd_index_cols) AND $del_index_cols;"
|
||||
. "REPLACE INTO $new_tbl->{name} ($qcols) VALUES ($new_vals);"
|
||||
. "END ";
|
||||
|
||||
@@ -11540,6 +11640,11 @@ sub osc_retry {
|
||||
) {
|
||||
# These errors/warnings can be retried, so don't print
|
||||
# a warning yet; do that in final_fail.
|
||||
# If we found a lock wait timeout and $tries == 0, we are in the rebuilt_constraints part
|
||||
# so we should keep retrying
|
||||
if ($error =~ m/Lock wait timeout exceeded/ && !$tries->{tries}) {
|
||||
return 1;
|
||||
}
|
||||
$stats->{ error_event($error) }++;
|
||||
return 1; # try again
|
||||
}
|
||||
@@ -11862,6 +11967,10 @@ foreign keys and indexes as the original table (unless you specify differently
|
||||
in your ALTER statement), but the names of the objects may be changed slightly
|
||||
to avoid object name collisions in MySQL and InnoDB.
|
||||
|
||||
You should take into consideration that data consistency is not maintained by
|
||||
default if you have FKs, and you must pass this additional new argument to
|
||||
avoid data loss. Please read L<"--delete-ignore">
|
||||
|
||||
For safety, the tool does not modify the table unless you specify the
|
||||
L<"--execute"> option, which is not enabled by default. The tool supports a
|
||||
variety of other measures to prevent unwanted load or other problems, including
|
||||
@@ -12379,6 +12488,21 @@ short form: -F; type: string
|
||||
Only read mysql options from the given file. You must give an absolute
|
||||
pathname.
|
||||
|
||||
=item --[no]delete-ignore
|
||||
|
||||
default: yes
|
||||
|
||||
Do not use C<IGNORE> on C<DELETE> triggers.
|
||||
This is an special case that affects forign keys handling. Since C<DELETE> only return errors when
|
||||
there is a problem deleting rows affected by foreign keys, it might be cases when we want to
|
||||
receive such errors during the program execution to ensure FKs handling is correct.
|
||||
|
||||
=item --disable-fk-checks
|
||||
|
||||
Disable foreign keys check during rebuild constraints. This option improves the process speed
|
||||
but it is risky since FKs checks will be disabled for a short period of time, allowing invalid
|
||||
values in tables. Please use it carefully.
|
||||
|
||||
=item --[no]drop-new-table
|
||||
|
||||
default: yes
|
||||
|
@@ -64,7 +64,7 @@ BEGIN {
|
||||
{
|
||||
package Percona::Toolkit;
|
||||
|
||||
our $VERSION = '3.2.0';
|
||||
our $VERSION = '3.0.14-dev';
|
||||
|
||||
use strict;
|
||||
use warnings FATAL => 'all';
|
||||
|
@@ -40,7 +40,7 @@ BEGIN {
|
||||
{
|
||||
package Percona::Toolkit;
|
||||
|
||||
our $VERSION = '3.2.0';
|
||||
our $VERSION = '3.0.14-dev';
|
||||
|
||||
use strict;
|
||||
use warnings FATAL => 'all';
|
||||
|
@@ -41,7 +41,7 @@ BEGIN {
|
||||
{
|
||||
package Percona::Toolkit;
|
||||
|
||||
our $VERSION = '3.2.0';
|
||||
our $VERSION = '3.0.14-dev';
|
||||
|
||||
use strict;
|
||||
use warnings FATAL => 'all';
|
||||
|
@@ -58,7 +58,7 @@ BEGIN {
|
||||
{
|
||||
package Percona::Toolkit;
|
||||
|
||||
our $VERSION = '3.2.0';
|
||||
our $VERSION = '3.0.14-dev';
|
||||
|
||||
use strict;
|
||||
use warnings FATAL => 'all';
|
||||
|
@@ -55,7 +55,7 @@ BEGIN {
|
||||
{
|
||||
package Percona::Toolkit;
|
||||
|
||||
our $VERSION = '3.2.0';
|
||||
our $VERSION = '3.0.14-dev';
|
||||
|
||||
use strict;
|
||||
use warnings FATAL => 'all';
|
||||
|
@@ -61,7 +61,7 @@ BEGIN {
|
||||
{
|
||||
package Percona::Toolkit;
|
||||
|
||||
our $VERSION = '3.2.0';
|
||||
our $VERSION = '3.0.14-dev';
|
||||
|
||||
use strict;
|
||||
use warnings FATAL => 'all';
|
||||
|
@@ -44,7 +44,7 @@ BEGIN {
|
||||
{
|
||||
package Percona::Toolkit;
|
||||
|
||||
our $VERSION = '3.2.0';
|
||||
our $VERSION = '3.0.14-dev';
|
||||
|
||||
use strict;
|
||||
use warnings FATAL => 'all';
|
||||
|
@@ -18,7 +18,7 @@
|
||||
# ###########################################################################
|
||||
package Percona::Toolkit;
|
||||
|
||||
our $VERSION = '3.2.0';
|
||||
our $VERSION = '3.0.14-dev';
|
||||
|
||||
use strict;
|
||||
use warnings FATAL => 'all';
|
||||
|
473
src/go/pt-pg-summary/README.rst
Normal file
473
src/go/pt-pg-summary/README.rst
Normal file
@@ -0,0 +1,473 @@
|
||||
pt-pg-summary
|
||||
=============
|
||||
**pt-pg-summary** collects information about a PostgreSQL cluster.
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
``pt-pg-summary [options] [host:[port]]``
|
||||
|
||||
Binaries
|
||||
--------
|
||||
Please check the `releases <https://github.com/percona/toolkit-go/releases>`_ tab to download the binaries.
|
||||
|
||||
Parameters
|
||||
^^^^^^^^^^
|
||||
|
||||
+--------+---------------------------------+---------+----------------------------------------------------------------------------+
|
||||
| Short | Long | Default | Description |
|
||||
+========+=================================+=========+============================================================================+
|
||||
| | ``--help`` | | Show context-sensitive help (also try ``--help-long`` and ``--help-man``). |
|
||||
+--------+---------------------------------+---------+----------------------------------------------------------------------------+
|
||||
| | ``--version`` | | Show application version. |
|
||||
+--------+---------------------------------+---------+----------------------------------------------------------------------------+
|
||||
| | ``--databases=DATABASES`` | | Summarize this comma-separated list of databases. All if not specified. |
|
||||
+--------+---------------------------------+---------+----------------------------------------------------------------------------+
|
||||
| ``-h`` | ``--host=HOST`` | | Host to connect to. |
|
||||
+--------+---------------------------------+---------+----------------------------------------------------------------------------+
|
||||
| ``-W`` | ``--password=PASSWORD`` | | Password to use when connecting. |
|
||||
+--------+---------------------------------+---------+----------------------------------------------------------------------------+
|
||||
| ``-p`` | ``--port=PORT`` | | Port number to use for connection. |
|
||||
+--------+---------------------------------+---------+----------------------------------------------------------------------------+
|
||||
| | ``--sleep=SLEEP`` | 10 | Seconds to sleep when gathering status counters. |
|
||||
+--------+---------------------------------+---------+----------------------------------------------------------------------------+
|
||||
| ``-U`` | ``--username=USERNAME`` | | User for login if not current user. |
|
||||
+--------+---------------------------------+---------+----------------------------------------------------------------------------+
|
||||
| | ``--disable-ssl`` | true | Disable SSL for the connection. |
|
||||
+--------+---------------------------------+---------+----------------------------------------------------------------------------+
|
||||
| | ``--verbose`` | false | Show verbose log. |
|
||||
+--------+---------------------------------+---------+----------------------------------------------------------------------------+
|
||||
| | ``--debug`` | false | Show debug information in the logs. |
|
||||
+--------+---------------------------------+---------+----------------------------------------------------------------------------+
|
||||
|
||||
|
||||
.. Currently hidden
|
||||
.. --list-encrypted-tables Include a list of the encrypted tables in all databases
|
||||
.. --ask-pass Prompt for a password when connecting to PostgreSQL
|
||||
.. --config Config file
|
||||
.. --defaults-file Only read PostgreSQL options from the given file
|
||||
.. --read-samples Create a report from the files found in this directory
|
||||
.. --save-samples Save the data files used to generate the summary in this directory
|
||||
|
||||
|
||||
Output
|
||||
^^^^^^
|
||||
|
||||
The output is grouped into these categories:
|
||||
|
||||
AllDatabases
|
||||
Selects ``datname`` from ``pg_database`` where ``datistemplate`` is false.
|
||||
|
||||
ClusterInfo
|
||||
Selects cluster information from ``pg_stat_activity``.
|
||||
|
||||
ConnectedClients
|
||||
Counts the connected clients by selecting from ``pg_stat_activity``.
|
||||
|
||||
Connections
|
||||
Selects ``state`` from ``pg_stat_activity`` and counts them.
|
||||
|
||||
Counters
|
||||
Selects various counter values from ``pg_stat_database``.
|
||||
|
||||
DatabaseWaitEvents
|
||||
Shows database wait events from ``pg_locks``, ``pg_stat_database``, ``pg_class``, and ``pg_stat_activity``.
|
||||
|
||||
Databases
|
||||
Shows the name and size of databases from ``pg_stat_database``.
|
||||
|
||||
GlobalWaitEvents
|
||||
Shows global wait evens from ``pg_stat_activity``.
|
||||
|
||||
IndexCacheHitRatio
|
||||
Shows index hit ratios from ``pg_statio_user_indexes``.
|
||||
|
||||
PortAndDatadir
|
||||
Shows port and data directory name from ``pg_settings``.
|
||||
|
||||
ServerVersion
|
||||
Shows the value of ``server_version_num``.
|
||||
|
||||
Setting
|
||||
Selects ``name`` and ``setting`` from ``pg_settings``.
|
||||
|
||||
SlaveHosts10
|
||||
Selects information for PostgreSQL version 10.
|
||||
|
||||
SlaveHosts96
|
||||
Selects information for PostgreSQL version 9.6.
|
||||
|
||||
TableAccess
|
||||
Shows table access information by selecting from ``pg_locks``, ``pg_stat_database`` and ``pg_class``.
|
||||
|
||||
TableCacheHitRatio
|
||||
Shows table cache hit ratio information from ``pg_statio_user_tables``.
|
||||
|
||||
Tablespaces
|
||||
Show owner and location from ``pg_catalog.pg_tablespace``.
|
||||
|
||||
|
||||
Output example
|
||||
""""""""""""""
|
||||
|
||||
.. code-block:: html
|
||||
|
||||
##### --- Database Port and Data_Directory --- ####
|
||||
+----------------------+----------------------------------------------------+
|
||||
| Name | Setting |
|
||||
+----------------------+----------------------------------------------------+
|
||||
| data_directory | /var/lib/postgresql/data |
|
||||
+----------------------+----------------------------------------------------+
|
||||
|
||||
##### --- List of Tablespaces ---- ######
|
||||
+----------------------+----------------------+----------------------------------------------------+
|
||||
| Name | Owner | Location |
|
||||
+----------------------+----------------------+----------------------------------------------------+
|
||||
| pg_default | postgres | |
|
||||
| pg_global | postgres | |
|
||||
+----------------------+----------------------+----------------------------------------------------+
|
||||
|
||||
|
||||
##### --- Cluster Information --- ####
|
||||
+------------------------------------------------------------------------------------------------------+
|
||||
Usename : postgres
|
||||
Time : 2020-04-21 13:38:22.770077 +0000 UTC
|
||||
Client Address : 172.19.0.1
|
||||
Client Hostname:
|
||||
Version : PostgreSQL 9.6.17 on x86_64-pc-linux-gnu (Debian 9.6.17-2.pgdg90+1), compiled by
|
||||
Started : 2020-04-21 13:36:59.909175 +0000 UTC
|
||||
Is Slave : false
|
||||
+------------------------------------------------------------------------------------------------------+
|
||||
|
||||
##### --- Databases --- ####
|
||||
+----------------------+------------+
|
||||
| Dat Name | Size |
|
||||
+----------------------+------------+
|
||||
| postgres | 7071 kB |
|
||||
| template1 | 6961 kB |
|
||||
| template0 | 6961 kB |
|
||||
+----------------------+------------+
|
||||
|
||||
##### --- Index Cache Hit Ratios --- ####
|
||||
|
||||
Database: postgres
|
||||
+----------------------+------------+
|
||||
| Index Name | Ratio |
|
||||
+----------------------+------------+
|
||||
| index hit rate | 0.00 |
|
||||
+----------------------+------------+
|
||||
|
||||
##### --- Table Cache Hit Ratios --- ####
|
||||
Database: postgres
|
||||
+----------------------+------------+
|
||||
| Index Name | Ratio |
|
||||
+----------------------+------------+
|
||||
| cache hit rate | 0.00 |
|
||||
+----------------------+------------+
|
||||
|
||||
##### --- List of Wait_events for the entire Cluster - all-databases --- ####
|
||||
No stats available
|
||||
|
||||
##### --- List of users and client_addr or client_hostname connected to --all-databases --- ####
|
||||
+----------------------+------------+---------+----------------------+---------+
|
||||
| Wait Event Type | Client | State | Count |
|
||||
+----------------------+------------+---------+----------------------+---------+
|
||||
| postgres | 172.19.0.1/32 | active | 1 |
|
||||
+----------------------+------------+---------+----------------------+---------+
|
||||
|
||||
##### --- Counters diff after 10 seconds --- ####
|
||||
|
||||
+----------------------+-------------+------------+--------------+-------------+------------+-------------+------------+-------------+------------+------------+-----------+-----------+-----------+------------+
|
||||
| Database | Numbackends | XactCommit | XactRollback | BlksRead | BlksHit | TupReturned | TupFetched | TupInserted | TupUpdated | TupDeleted | Conflicts | TempFiles | TempBytes | Deadlocks |
|
||||
+----------------------+-------------+------------+--------------+-------------+------------+-------------+------------+-------------+------------+------------+-----------+-----------+-----------+------------+
|
||||
| postgres | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
|
||||
| template0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
|
||||
| template1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
|
||||
+----------------------+-------------+------------+--------------+-------------+------------+-------------+------------+-------------+------------+------------+-----------+-----------+-----------+------------+
|
||||
|
||||
##### --- Table access per database --- ####
|
||||
Database: postgres
|
||||
+----------------------------------------------------+------+--------------------------------+---------+
|
||||
| Relname | Kind | Datname | Count |
|
||||
+----------------------------------------------------+------+--------------------------------+---------+
|
||||
| pg_class | r | postgres | 1 |
|
||||
| pg_stat_database | v | postgres | 1 |
|
||||
| pg_locks | v | postgres | 1 |
|
||||
| pg_class_tblspc_relfilenode_index | i | postgres | 1 |
|
||||
| pg_class_relname_nsp_index | i | postgres | 1 |
|
||||
| pg_class_oid_index | i | postgres | 1 |
|
||||
+----------------------------------------------------+------+--------------------------------+---------+
|
||||
|
||||
##### --- Instance settings --- ####
|
||||
Setting Value
|
||||
allow_system_table_mods : off
|
||||
application_name :
|
||||
archive_command : (disabled)
|
||||
archive_mode : off
|
||||
archive_timeout : 0
|
||||
array_nulls : on
|
||||
authentication_timeout : 60
|
||||
autovacuum : on
|
||||
autovacuum_analyze_scale_factor : 0.1
|
||||
autovacuum_analyze_threshold : 50
|
||||
autovacuum_freeze_max_age : 200000000
|
||||
autovacuum_max_workers : 3
|
||||
autovacuum_multixact_freeze_max_age : 400000000
|
||||
autovacuum_naptime : 60
|
||||
autovacuum_vacuum_cost_delay : 20
|
||||
autovacuum_vacuum_cost_limit : -1
|
||||
autovacuum_vacuum_scale_factor : 0.2
|
||||
autovacuum_vacuum_threshold : 50
|
||||
autovacuum_work_mem : -1
|
||||
backend_flush_after : 0
|
||||
backslash_quote : safe_encoding
|
||||
bgwriter_delay : 200
|
||||
bgwriter_flush_after : 64
|
||||
bgwriter_lru_maxpages : 100
|
||||
bgwriter_lru_multiplier : 2
|
||||
block_size : 8192
|
||||
bonjour : off
|
||||
bonjour_name :
|
||||
bytea_output : hex
|
||||
check_function_bodies : on
|
||||
checkpoint_completion_target : 0.5
|
||||
checkpoint_flush_after : 32
|
||||
checkpoint_timeout : 300
|
||||
checkpoint_warning : 30
|
||||
client_encoding : UTF8
|
||||
client_min_messages : notice
|
||||
cluster_name :
|
||||
commit_delay : 0
|
||||
commit_siblings : 5
|
||||
config_file : /var/lib/postgresql/data/postgresql.conf
|
||||
constraint_exclusion : partition
|
||||
cpu_index_tuple_cost : 0.005
|
||||
cpu_operator_cost : 0.0025
|
||||
cpu_tuple_cost : 0.01
|
||||
cursor_tuple_fraction : 0.1
|
||||
data_checksums : off
|
||||
data_directory : /var/lib/postgresql/data
|
||||
data_sync_retry : off
|
||||
DateStyle : ISO, MDY
|
||||
db_user_namespace : off
|
||||
deadlock_timeout : 1000
|
||||
debug_assertions : off
|
||||
debug_pretty_print : on
|
||||
debug_print_parse : off
|
||||
debug_print_plan : off
|
||||
debug_print_rewritten : off
|
||||
default_statistics_target : 100
|
||||
default_tablespace :
|
||||
default_text_search_config : pg_catalog.english
|
||||
default_transaction_deferrable : off
|
||||
default_transaction_isolation : read committed
|
||||
default_transaction_read_only : off
|
||||
default_with_oids : off
|
||||
dynamic_library_path : $libdir
|
||||
dynamic_shared_memory_type : posix
|
||||
effective_cache_size : 524288
|
||||
effective_io_concurrency : 1
|
||||
enable_bitmapscan : on
|
||||
enable_hashagg : on
|
||||
enable_hashjoin : on
|
||||
enable_indexonlyscan : on
|
||||
enable_indexscan : on
|
||||
enable_material : on
|
||||
enable_mergejoin : on
|
||||
enable_nestloop : on
|
||||
enable_seqscan : on
|
||||
enable_sort : on
|
||||
enable_tidscan : on
|
||||
escape_string_warning : on
|
||||
event_source : PostgreSQL
|
||||
exit_on_error : off
|
||||
external_pid_file :
|
||||
extra_float_digits : 2
|
||||
force_parallel_mode : off
|
||||
from_collapse_limit : 8
|
||||
fsync : on
|
||||
full_page_writes : on
|
||||
geqo : on
|
||||
geqo_effort : 5
|
||||
geqo_generations : 0
|
||||
geqo_pool_size : 0
|
||||
geqo_seed : 0
|
||||
geqo_selection_bias : 2
|
||||
geqo_threshold : 12
|
||||
gin_fuzzy_search_limit : 0
|
||||
gin_pending_list_limit : 4096
|
||||
hba_file : /var/lib/postgresql/data/pg_hba.conf
|
||||
hot_standby : off
|
||||
hot_standby_feedback : off
|
||||
huge_pages : try
|
||||
ident_file : /var/lib/postgresql/data/pg_ident.conf
|
||||
idle_in_transaction_session_timeout : 0
|
||||
ignore_checksum_failure : off
|
||||
ignore_system_indexes : off
|
||||
integer_datetimes : on
|
||||
IntervalStyle : postgres
|
||||
join_collapse_limit : 8
|
||||
krb_caseins_users : off
|
||||
krb_server_keyfile : FILE:/etc/postgresql-common/krb5.keytab
|
||||
lc_collate : en_US.utf8
|
||||
lc_ctype : en_US.utf8
|
||||
lc_messages : en_US.utf8
|
||||
lc_monetary : en_US.utf8
|
||||
lc_numeric : en_US.utf8
|
||||
lc_time : en_US.utf8
|
||||
listen_addresses : *
|
||||
lo_compat_privileges : off
|
||||
local_preload_libraries :
|
||||
lock_timeout : 0
|
||||
log_autovacuum_min_duration : -1
|
||||
log_checkpoints : off
|
||||
log_connections : off
|
||||
log_destination : stderr
|
||||
log_directory : pg_log
|
||||
log_disconnections : off
|
||||
log_duration : off
|
||||
log_error_verbosity : default
|
||||
log_executor_stats : off
|
||||
log_file_mode : 0600
|
||||
log_filename : postgresql-%Y-%m-%d_%H%M%S.log
|
||||
log_hostname : off
|
||||
log_line_prefix :
|
||||
log_lock_waits : off
|
||||
log_min_duration_statement : -1
|
||||
log_min_error_statement : error
|
||||
log_min_messages : warning
|
||||
log_parser_stats : off
|
||||
log_planner_stats : off
|
||||
log_replication_commands : off
|
||||
log_rotation_age : 1440
|
||||
log_rotation_size : 10240
|
||||
log_statement : none
|
||||
log_statement_stats : off
|
||||
log_temp_files : -1
|
||||
log_timezone : Etc/UTC
|
||||
log_truncate_on_rotation : off
|
||||
logging_collector : off
|
||||
maintenance_work_mem : 65536
|
||||
max_connections : 100
|
||||
max_files_per_process : 1000
|
||||
max_function_args : 100
|
||||
max_identifier_length : 63
|
||||
max_index_keys : 32
|
||||
max_locks_per_transaction : 64
|
||||
max_parallel_workers_per_gather : 0
|
||||
max_pred_locks_per_transaction : 64
|
||||
max_prepared_transactions : 0
|
||||
max_replication_slots : 0
|
||||
max_stack_depth : 2048
|
||||
max_standby_archive_delay : 30000
|
||||
max_standby_streaming_delay : 30000
|
||||
max_wal_senders : 0
|
||||
max_wal_size : 64
|
||||
max_worker_processes : 8
|
||||
min_parallel_relation_size : 1024
|
||||
min_wal_size : 5
|
||||
old_snapshot_threshold : -1
|
||||
operator_precedence_warning : off
|
||||
parallel_setup_cost : 1000
|
||||
parallel_tuple_cost : 0.1
|
||||
password_encryption : on
|
||||
port : 5432
|
||||
post_auth_delay : 0
|
||||
pre_auth_delay : 0
|
||||
quote_all_identifiers : off
|
||||
random_page_cost : 4
|
||||
replacement_sort_tuples : 150000
|
||||
restart_after_crash : on
|
||||
row_security : on
|
||||
search_path : "$user", public
|
||||
segment_size : 131072
|
||||
seq_page_cost : 1
|
||||
server_encoding : UTF8
|
||||
server_version : 9.6.17
|
||||
server_version_num : 90617
|
||||
session_preload_libraries :
|
||||
session_replication_role : origin
|
||||
shared_buffers : 16384
|
||||
shared_preload_libraries :
|
||||
sql_inheritance : on
|
||||
ssl : off
|
||||
ssl_ca_file :
|
||||
ssl_cert_file : server.crt
|
||||
ssl_ciphers : HIGH:MEDIUM:+3DES:!aNULL
|
||||
ssl_crl_file :
|
||||
ssl_ecdh_curve : prime256v1
|
||||
ssl_key_file : server.key
|
||||
ssl_prefer_server_ciphers : on
|
||||
standard_conforming_strings : on
|
||||
statement_timeout : 0
|
||||
stats_temp_directory : pg_stat_tmp
|
||||
superuser_reserved_connections : 3
|
||||
synchronize_seqscans : on
|
||||
synchronous_commit : on
|
||||
synchronous_standby_names :
|
||||
syslog_facility : local0
|
||||
syslog_ident : postgres
|
||||
syslog_sequence_numbers : on
|
||||
syslog_split_messages : on
|
||||
tcp_keepalives_count : 9
|
||||
tcp_keepalives_idle : 7200
|
||||
tcp_keepalives_interval : 75
|
||||
temp_buffers : 1024
|
||||
temp_file_limit : -1
|
||||
temp_tablespaces :
|
||||
TimeZone : Etc/UTC
|
||||
timezone_abbreviations : Default
|
||||
trace_notify : off
|
||||
trace_recovery_messages : log
|
||||
trace_sort : off
|
||||
track_activities : on
|
||||
track_activity_query_size : 1024
|
||||
track_commit_timestamp : off
|
||||
track_counts : on
|
||||
track_functions : none
|
||||
track_io_timing : off
|
||||
transaction_deferrable : off
|
||||
transaction_isolation : read committed
|
||||
transaction_read_only : off
|
||||
transform_null_equals : off
|
||||
unix_socket_directories : /var/run/postgresql
|
||||
unix_socket_group :
|
||||
unix_socket_permissions : 0777
|
||||
update_process_title : on
|
||||
vacuum_cost_delay : 0
|
||||
vacuum_cost_limit : 200
|
||||
vacuum_cost_page_dirty : 20
|
||||
vacuum_cost_page_hit : 1
|
||||
vacuum_cost_page_miss : 10
|
||||
vacuum_defer_cleanup_age : 0
|
||||
vacuum_freeze_min_age : 50000000
|
||||
vacuum_freeze_table_age : 150000000
|
||||
vacuum_multixact_freeze_min_age : 5000000
|
||||
vacuum_multixact_freeze_table_age : 150000000
|
||||
wal_block_size : 8192
|
||||
wal_buffers : 512
|
||||
wal_compression : off
|
||||
wal_keep_segments : 0
|
||||
wal_level : minimal
|
||||
wal_log_hints : off
|
||||
wal_receiver_status_interval : 10
|
||||
wal_receiver_timeout : 60000
|
||||
wal_retrieve_retry_interval : 5000
|
||||
wal_segment_size : 2048
|
||||
wal_sender_timeout : 60000
|
||||
wal_sync_method : fdatasync
|
||||
wal_writer_delay : 200
|
||||
wal_writer_flush_after : 128
|
||||
work_mem : 4096
|
||||
xmlbinary : base64
|
||||
xmloption : content
|
||||
zero_damaged_pages : off
|
||||
|
||||
##### --- Processes start up command --- ####
|
||||
No postgres process found
|
||||
|
||||
Minimum auth role
|
||||
^^^^^^^^^^^^^^^^^
|
||||
|
||||
This program needs to run some commands like ``getShardMap`` and to be able to run those commands
|
||||
it needs to run under a user with the ``clusterAdmin`` or ``root`` built-in roles.
|
@@ -51,7 +51,6 @@ ok(
|
||||
);
|
||||
|
||||
SKIP: {
|
||||
skip "Skipping in MySQL 8.0.4-rc since there is an error in the server itself. See https://bugs.mysql.com/bug.php?id=89441", 9 if ($sandbox_version ge '8.0');
|
||||
($output, $exit_status) = full_output(
|
||||
sub { pt_online_schema_change::main(@args,
|
||||
"$master_dsn,D=issue26211,t=process_model_inst",
|
||||
|
@@ -23,10 +23,6 @@ my $master_dbh = $sb->get_dbh_for('master');
|
||||
|
||||
my $vp = VersionParser->new($master_dbh);
|
||||
|
||||
if ($vp->cmp('8.0.14') > -1 && $vp->flavor() !~ m/maria/i) {
|
||||
plan skip_all => 'Cannot run this test under the current MySQL version';
|
||||
}
|
||||
|
||||
if ( !$master_dbh ) {
|
||||
plan skip_all => 'Cannot connect to sandbox master';
|
||||
}
|
||||
|
@@ -32,6 +32,7 @@ my $master_dsn = 'h=127.1,P=12345,u=msandbox,p=msandbox';
|
||||
my @args = (qw(--set-vars innodb_lock_wait_timeout=3 --alter-foreign-keys-method rebuild_constraints));
|
||||
my $output;
|
||||
my $exit_status;
|
||||
my $sample = "t/pt-online-schema-change/samples/";
|
||||
|
||||
# ############################################################################
|
||||
# https://bugs.launchpad.net/percona-toolkit/+bug/1632522
|
||||
@@ -39,7 +40,7 @@ my $exit_status;
|
||||
# ############################################################################
|
||||
|
||||
diag("Before loading sql");
|
||||
$sb->load_file('master', "t/pt-online-schema-change/samples/bug-1632522.sql");
|
||||
$sb->load_file('master', "$sample/bug-1632522.sql");
|
||||
diag("after loading sql");
|
||||
|
||||
# run once: we expect the constraint name to be appended with one underscore
|
||||
@@ -51,22 +52,14 @@ diag("after loading sql");
|
||||
qw(--execute)) },
|
||||
);
|
||||
|
||||
my $query = <<"END";
|
||||
SELECT TABLE_NAME, CONSTRAINT_NAME
|
||||
FROM information_schema.KEY_COLUMN_USAGE
|
||||
WHERE table_schema='bug1632522'
|
||||
AND (TABLE_NAME='test_table' OR TABLE_NAME='person')
|
||||
AND CONSTRAINT_NAME LIKE '%fk_%'
|
||||
ORDER BY TABLE_NAME, CONSTRAINT_NAME
|
||||
END
|
||||
my $constraints = $master_dbh->selectall_arrayref($query);
|
||||
my $constraints = $master_dbh->selectall_arrayref("SELECT TABLE_NAME, CONSTRAINT_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE table_schema='bug1632522' and (TABLE_NAME='test_table' OR TABLE_NAME='person') and CONSTRAINT_NAME LIKE '%fk_%' ORDER BY TABLE_NAME, CONSTRAINT_NAME");
|
||||
|
||||
is_deeply(
|
||||
$constraints,
|
||||
[
|
||||
['person', '_fk_testId'],
|
||||
['test_table', '_fk_person'],
|
||||
['test_table', '__fk_refId'],
|
||||
['test_table', 'fk_person'],
|
||||
['test_table', 'fk_refId'],
|
||||
],
|
||||
"First run adds or removes underscore from constraint names, accordingly"
|
||||
);
|
||||
@@ -80,23 +73,15 @@ is_deeply(
|
||||
qw(--execute)) },
|
||||
);
|
||||
|
||||
$query = <<"END";
|
||||
SELECT TABLE_NAME, CONSTRAINT_NAME
|
||||
FROM information_schema.KEY_COLUMN_USAGE
|
||||
WHERE table_schema='bug1632522'
|
||||
AND (TABLE_NAME='test_table' OR TABLE_NAME='person')
|
||||
AND CONSTRAINT_NAME LIKE '%fk_%'
|
||||
ORDER BY TABLE_NAME, CONSTRAINT_NAME
|
||||
END
|
||||
$constraints = $master_dbh->selectall_arrayref($query);
|
||||
$constraints = $master_dbh->selectall_arrayref("SELECT TABLE_NAME, CONSTRAINT_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE table_schema='bug1632522' and (TABLE_NAME='test_table' OR TABLE_NAME='person') and CONSTRAINT_NAME LIKE '%fk_%' ORDER BY TABLE_NAME, CONSTRAINT_NAME");
|
||||
|
||||
|
||||
is_deeply(
|
||||
$constraints,
|
||||
[
|
||||
['person', '__fk_testId'],
|
||||
['test_table', '_fk_refId'],
|
||||
['test_table', '__fk_person'],
|
||||
['person', '_fk_testId'],
|
||||
['test_table', 'fk_person'],
|
||||
['test_table', 'fk_refId'],
|
||||
],
|
||||
"Second run self-referencing will be one due to rebuild_constraints"
|
||||
);
|
||||
@@ -109,21 +94,13 @@ is_deeply(
|
||||
qw(--execute)) },
|
||||
);
|
||||
|
||||
$query = <<"END";
|
||||
SELECT TABLE_NAME, CONSTRAINT_NAME
|
||||
FROM information_schema.KEY_COLUMN_USAGE
|
||||
WHERE table_schema='bug1632522'
|
||||
and (TABLE_NAME='test_table' OR TABLE_NAME='person')
|
||||
and CONSTRAINT_NAME LIKE '%fk_%'
|
||||
ORDER BY TABLE_NAME, CONSTRAINT_NAME
|
||||
END
|
||||
$constraints = $master_dbh->selectall_arrayref($query);
|
||||
$constraints = $master_dbh->selectall_arrayref("SELECT TABLE_NAME, CONSTRAINT_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE table_schema='bug1632522' and (TABLE_NAME='test_table' OR TABLE_NAME='person') and CONSTRAINT_NAME LIKE '%fk_%' ORDER BY TABLE_NAME, CONSTRAINT_NAME");
|
||||
|
||||
|
||||
is_deeply(
|
||||
$constraints,
|
||||
[
|
||||
['person', 'fk_testId'],
|
||||
['person', '_fk_testId'],
|
||||
['test_table', 'fk_person'],
|
||||
['test_table', 'fk_refId'],
|
||||
],
|
||||
|
@@ -1,138 +0,0 @@
|
||||
#!/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 Data::Dumper;
|
||||
use PerconaTest;
|
||||
use Sandbox;
|
||||
|
||||
require "$trunk/bin/pt-online-schema-change";
|
||||
|
||||
my $dp = new DSNParser(opts=>$dsn_opts);
|
||||
my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp);
|
||||
my $master_dbh = $sb->get_dbh_for('master');
|
||||
|
||||
if ( !$master_dbh ) {
|
||||
plan skip_all => 'Cannot connect to sandbox master';
|
||||
}
|
||||
|
||||
# The sandbox servers run with lock_wait_timeout=3 and it's not dynamic
|
||||
# so we need to specify --set-vars innodb_lock_wait_timeout-3 else the
|
||||
# tool will die.
|
||||
my $master_dsn = 'h=127.1,P=12345,u=msandbox,p=msandbox';
|
||||
my @args = (qw(--set-vars innodb_lock_wait_timeout=3 --alter-foreign-keys-method rebuild_constraints));
|
||||
my $output;
|
||||
my $exit_status;
|
||||
|
||||
# ############################################################################
|
||||
# https://bugs.launchpad.net/percona-toolkit/+bug/1632522
|
||||
# pt-online-schema-change fails with duplicate key in table for self-referencing FK
|
||||
# ############################################################################
|
||||
|
||||
diag("Before loading sql");
|
||||
$sb->load_file('master', "t/pt-online-schema-change/samples/bug-1632522.sql");
|
||||
diag("after loading sql");
|
||||
|
||||
# run once: we expect the constraint name to be appended with one underscore
|
||||
# but the self-referencing constraint will have 2 underscore
|
||||
($output, $exit_status) = full_output(
|
||||
sub { pt_online_schema_change::main(@args,
|
||||
"$master_dsn,D=bug1632522,t=test_table",
|
||||
"--alter", "ENGINE=InnoDB",
|
||||
qw(--execute)) },
|
||||
);
|
||||
|
||||
my $query = <<"END";
|
||||
SELECT TABLE_NAME, CONSTRAINT_NAME
|
||||
FROM information_schema.KEY_COLUMN_USAGE
|
||||
WHERE table_schema='bug1632522'
|
||||
AND (TABLE_NAME='test_table' OR TABLE_NAME='person')
|
||||
AND CONSTRAINT_NAME LIKE '%fk_%'
|
||||
ORDER BY TABLE_NAME, CONSTRAINT_NAME
|
||||
END
|
||||
my $constraints = $master_dbh->selectall_arrayref($query);
|
||||
|
||||
is_deeply(
|
||||
$constraints,
|
||||
[
|
||||
['person', '_fk_testId'],
|
||||
['test_table', '_fk_person'],
|
||||
['test_table', '__fk_refId'],
|
||||
],
|
||||
"First run adds or removes underscore from constraint names, accordingly"
|
||||
);
|
||||
|
||||
# run second time: we expect constraint names to be prefixed with one underscore
|
||||
# if they havre't one, and to remove 2 if they have 2
|
||||
($output, $exit_status) = full_output(
|
||||
sub { pt_online_schema_change::main(@args,
|
||||
"$master_dsn,D=bug1632522,t=test_table",
|
||||
"--alter", "ENGINE=InnoDB",
|
||||
qw(--execute)) },
|
||||
);
|
||||
|
||||
$query = <<"END";
|
||||
SELECT TABLE_NAME, CONSTRAINT_NAME
|
||||
FROM information_schema.KEY_COLUMN_USAGE
|
||||
WHERE table_schema='bug1632522'
|
||||
AND (TABLE_NAME='test_table' OR TABLE_NAME='person')
|
||||
AND CONSTRAINT_NAME LIKE '%fk_%'
|
||||
ORDER BY TABLE_NAME, CONSTRAINT_NAME
|
||||
END
|
||||
$constraints = $master_dbh->selectall_arrayref($query);
|
||||
|
||||
|
||||
is_deeply(
|
||||
$constraints,
|
||||
[
|
||||
['person', '__fk_testId'],
|
||||
['test_table', '_fk_refId'],
|
||||
['test_table', '__fk_person'],
|
||||
],
|
||||
"Second run self-referencing will be one due to rebuild_constraints"
|
||||
);
|
||||
|
||||
# run third time: we expect constraints to be the same as we started (toggled back)
|
||||
($output, $exit_status) = full_output(
|
||||
sub { pt_online_schema_change::main(@args,
|
||||
"$master_dsn,D=bug1632522,t=test_table",
|
||||
"--alter", "ENGINE=InnoDB",
|
||||
qw(--execute)) },
|
||||
);
|
||||
|
||||
$query = <<"END";
|
||||
SELECT TABLE_NAME, CONSTRAINT_NAME
|
||||
FROM information_schema.KEY_COLUMN_USAGE
|
||||
WHERE table_schema='bug1632522'
|
||||
and (TABLE_NAME='test_table' OR TABLE_NAME='person')
|
||||
and CONSTRAINT_NAME LIKE '%fk_%'
|
||||
ORDER BY TABLE_NAME, CONSTRAINT_NAME
|
||||
END
|
||||
$constraints = $master_dbh->selectall_arrayref($query);
|
||||
|
||||
|
||||
is_deeply(
|
||||
$constraints,
|
||||
[
|
||||
['person', 'fk_testId'],
|
||||
['test_table', 'fk_person'],
|
||||
['test_table', 'fk_refId'],
|
||||
],
|
||||
"Third run toggles constraint names back to how they were"
|
||||
);
|
||||
|
||||
# #############################################################################
|
||||
# Done.
|
||||
# #############################################################################
|
||||
$sb->wipe_clean($master_dbh);
|
||||
ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox");
|
||||
done_testing;
|
@@ -1,9 +0,0 @@
|
||||
CREATE TABLE `joinit` (
|
||||
`i` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`s` varchar(64) DEFAULT NULL,
|
||||
`t` time NOT NULL,
|
||||
`g` int(11) NOT NULL,
|
||||
`j` int(11) NOT NULL DEFAULT 1,
|
||||
PRIMARY KEY (`i`))
|
||||
ENGINE=InnoDB;
|
||||
ALTER TABLE joinit ADD FOREIGN KEY i_fk (j) REFERENCES joinit (i) ON UPDATE cascade ON DELETE restrict;
|
Reference in New Issue
Block a user