diff --git a/Changelog b/Changelog index 300c88d3..7c3e20fc 100644 --- a/Changelog +++ b/Changelog @@ -1,5 +1,8 @@ Changelog for Percona Toolkit +v3.0.4 + * Fixed bug PT-142 : pt-online-schema-change find_child_tables slow + v3.0.3 * Fixed bug PT-133 : Sandbox won't start correctly if autocommit=0 in my.cnf diff --git a/bin/pt-online-schema-change b/bin/pt-online-schema-change index 95d5cc38..37919975 100755 --- a/bin/pt-online-schema-change +++ b/bin/pt-online-schema-change @@ -8770,6 +8770,7 @@ sub main { tbl => $orig_tbl, Cxn => $cxn, Quoter => $q, + only_same_schema_fks => $o->get('only-same-schema-fks'), ); if ( !$child_tables ) { if ( $alter_fk_method ) { @@ -10448,6 +10449,11 @@ sub find_child_tables { . "FROM information_schema.key_column_usage " . "WHERE referenced_table_schema='$tbl->{db}' " . "AND referenced_table_name='$tbl->{tbl}'"; + + if ($args{only_same_schema_fks}) { + $sql .= " AND table_schema='$tbl->{db}'"; + } + PTDEBUG && _d($sql); my $rows = $cxn->dbh()->selectall_arrayref($sql); if ( !$rows || !@$rows ) { @@ -11869,6 +11875,13 @@ them. The rows which contain NULL values will be converted to the defined default value. If no explicit DEFAULT value is given MySQL will assign a default value based on datatype, e.g. 0 for number datatypes, '' for string datatypes. +=item --only-same-schema-fks + +Check foreigns keys only on tables on the same schema than the original table. +This option is dangerous since if you have FKs refenrencing tables in other +schemas, they won't be detected. + + =item --password short form: -p; type: string diff --git a/t/pt-online-schema-change/bugs.t b/t/pt-online-schema-change/bugs.t index 61025eaa..5580ebc4 100644 --- a/t/pt-online-schema-change/bugs.t +++ b/t/pt-online-schema-change/bugs.t @@ -445,6 +445,31 @@ $output = output( # clear databases with their foreign keys $sb->load_file('master', "$sample/bug-1315130_cleanup.sql"); +# ############################################################################# +# Issue 1315130 +# Failed to detect child tables in other schema, and falsely identified +# child tables in own schema +# ############################################################################# + +$sb->load_file('master', "$sample/bug-1315130_cleanup.sql"); +$sb->load_file('master', "$sample/bug-1315130.sql"); + +$output = output( + sub { pt_online_schema_change::main(@args, "$master_dsn,D=bug_1315130_a,t=parent_table", + '--dry-run', + '--alter', "add column c varchar(16)", + '--alter-foreign-keys-method', 'auto', '--only-same-schema-fks'), + }, +); + +like( + $output, + qr/Child tables:\s*`bug_1315130_a`\.`child_table_in_same_schema` \(approx\. 1 rows\)[^`]*?Will/s, + "Ignore child tables in other schemas.", +); +# clear databases with their foreign keys +$sb->load_file('master', "$sample/bug-1315130_cleanup.sql"); + # ############################################################################# # Issue 1340728