diff --git a/bin/pt-archiver b/bin/pt-archiver index 81653b8d..8ad612a1 100755 --- a/bin/pt-archiver +++ b/bin/pt-archiver @@ -3955,24 +3955,8 @@ sub main { $dp->get_cxn_params($table), { AutoCommit => $ac }); PTDEBUG && _d('Inspecting table on', $dp->as_string($table)); - if ( $o->get('bulk-insert') ) { - local $@; - my $sql = "LOAD DATA LOCAL INFILE '/dev/null' INTO TABLE " - . "`test`.`pt_not_there`"; - eval { $dbh->do($sql); 1 } or do { - my $e = $@; - my $error_re = qr/\QDBD::mysql::db do failed: The used command is not allowed with this MySQL version [for Statement "LOAD DATA LOCAL INFILE/; - if ($e =~ $error_re) { - $dbh->disconnect(); - die("--bulk-insert cannot work as LOAD DATA LOCAL INFILE " - . "is disabled. See http://kb.percona.com/troubleshoot-load-data-infile" - ); - } - }; - } - - # Set options that can enable removing data on the master and archiving it - # on the slaves. + # Set options that can enable removing data on the master + # and archiving it on the slaves. if ( $table->{a} ) { $dbh->do("USE $table->{a}"); } diff --git a/bin/pt-upgrade b/bin/pt-upgrade index 5923ad6a..acaaabee 100755 --- a/bin/pt-upgrade +++ b/bin/pt-upgrade @@ -10371,32 +10371,6 @@ sub main { $host->{name} = $name || 'unknown host'; } - # ######################################################################## - # If we're comparing rows, check that LOAD DATA LOCAL INFILE works for, - # all hosts, or bail out early if it doesn't. - # ######################################################################## - my $compare = $o->get('compare'); - if ( $compare->{results} - && lc($o->get('compare-results-method')) eq 'rows' ) - { - foreach my $host ( @$hosts ) { - local $@; - my $sql = "LOAD DATA LOCAL INFILE '/dev/null' INTO TABLE " - . "`test`.`pt_not_there`"; - eval { $host->{dbh}->do($sql); 1 } or do { - my $e = $@; - my $error_re = qr/\QDBD::mysql::db do failed: The used command is not allowed with this MySQL version [for Statement "LOAD DATA LOCAL INFILE/; - if ($e =~ $error_re) { - $_->{dbh}->disconnect() for @$hosts; - die("Cannot compare rows as LOAD DATA LOCAL INFILE " - . "is disabled for $host->{name}. See " - . "http://kb.percona.com/troubleshoot-load-data-infile" - ); - } - }; - } - } - # ######################################################################## # Make some common modules. # ######################################################################## @@ -10430,6 +10404,7 @@ sub main { # ######################################################################## # Make compare modules in order. # ######################################################################## + my $compare = $o->get('compare'); my @compare_modules; if ( $compare->{results} ) { my $method = lc $o->get('compare-results-method'); diff --git a/lib/PerconaTest.pm b/lib/PerconaTest.pm index 8221de9b..45092376 100644 --- a/lib/PerconaTest.pm +++ b/lib/PerconaTest.pm @@ -68,6 +68,7 @@ our @EXPORT = qw( $trunk $dsn_opts $sandbox_version + $can_load_data ); our $trunk = $ENV{PERCONA_TOOLKIT_BRANCH}; @@ -78,6 +79,8 @@ eval { $sandbox_version = $v if $v; }; +our $can_load_data = can_load_data(); + our $dsn_opts = [ { key => 'A', @@ -777,17 +780,9 @@ sub tables_used { return [ sort keys %tables ]; } -sub load_data_is_disabled { - my ($dbh) = @_; - my $sql = "LOAD DATA LOCAL INFILE '/dev/null' INTO TABLE " - . "`t`.`pt_not_there`"; - local $@; - if (!eval { $dbh->do($sql); 1 } ) { - my $e = $@; - return 1 if $e =~ qr/\QDBD::mysql::db do failed: The used command is not allowed with this MySQL version [for Statement "LOAD DATA LOCAL INFILE/; - } - - return; +sub can_load_data { + my $output = `/tmp/12345/use -e "SELECT * FROM percona_test.load_data" 2>/dev/null`; + return ($output || '') =~ /42/; } 1; diff --git a/sandbox/test-env b/sandbox/test-env index cd1f94e5..cb022e09 100755 --- a/sandbox/test-env +++ b/sandbox/test-env @@ -234,6 +234,23 @@ set_mysql_version() { fi } +check_load_data() { + # LOAD DATA is disabled or broken on some boxes. PerconaTest exports + # $can_load_data which is true if percona_test.load_data has the 42 row, + # signaling that LOAD DATA LOCAL INFILE worked. + /tmp/12345/use -e "CREATE TABLE IF NOT EXISTS percona_test.load_data (i int)" + echo 42 > /tmp/load_data_test.$$ + /tmp/12345/use -e "LOAD DATA LOCAL INFILE '/tmp/load_data_test.$$' INTO TABLE percona_test.load_data" + sleep 0.1 + rm /tmp/load_data_test.$$ + /tmp/12345/use -e "SELECT * FROM percona_test.load_data" | grep 42 >/dev/null 2>&1 + if [ $? -eq 0 ]; then + echo "LOAD DATA LOCAL INFILE is enabled" + else + echo "LOAD DATA LOCAL INFILE is disabled" + fi +} + # ########################################################################### # Sanity check the cmd line options. # ########################################################################### @@ -290,6 +307,7 @@ case $opt in echo "OK" fi ../util/checksum-test-dataset + check_load_data ping=$(/tmp/12345/use -ss -e "SELECT MD5(RAND())") /tmp/12345/use -e "create table percona_test.sentinel(id int primary key, ping varchar(64) not null default '')" /tmp/12345/use -e "insert into percona_test.sentinel(id, ping) values(1, '$ping')"; diff --git a/t/pt-archiver/bulk_insert.t b/t/pt-archiver/bulk_insert.t index 3b7f1011..4727f7f7 100644 --- a/t/pt-archiver/bulk_insert.t +++ b/t/pt-archiver/bulk_insert.t @@ -22,12 +22,8 @@ my $dbh = $sb->get_dbh_for('master'); if ( !$dbh ) { plan skip_all => 'Cannot connect to sandbox master'; } -elsif ( PerconaTest::load_data_is_disabled($dbh) ) { - diag("LOAD DATA LOCAL INFILE is disabled, only going to test the error message"); - plan tests => 2; -} -else { - plan tests => 11; +elsif ( !$can_load_data ) { + plan skip_all => 'LOAD DATA LOCAL INFILE is disabled'; } my $output; @@ -35,11 +31,6 @@ my $rows; my $cnf = "/tmp/12345/my.sandbox.cnf"; my $cmd = "$trunk/bin/pt-archiver"; -if ( PerconaTest::load_data_is_disabled($dbh) ) { - test_disabled_load_data($dbh, $sb, 'master', $cnf); -} -else { - $sb->wipe_clean($dbh); $sb->create_dbs($dbh, ['test']); @@ -67,7 +58,6 @@ $output = `/tmp/12345/use -N -e "checksum table test.table_5_dest, test.table_5_ my ( $chks ) = $output =~ m/dest\s+(\d+)/; like($output, qr/copy\s+$chks/, 'copy checksum'); - # ############################################################################ # Issue 1260: mk-archiver --bulk-insert data loss # ############################################################################ @@ -93,48 +83,10 @@ is_deeply( "--bulk-insert archived 7 rows (issue 1260)" ); -# Test that the tool bails out early if LOAD DATA LOCAL INFILE is disabled -{ - if ( -d "/tmp/2900" ) { - diag(`$trunk/sandbox/stop-sandbox 2900 >/dev/null 2>&1`); - } - - local $ENV{LOCAL_INFILE} = 0; - diag(`$trunk/sandbox/start-sandbox master 2900 >/dev/null 2>&1`); - - my $master3_dbh = $sb->get_dbh_for('master3'); - - test_disabled_load_data($master3_dbh, $sb, 'master3', "/tmp/2900/my.sandbox.cnf"); - - diag(`$trunk/sandbox/stop-sandbox 2900 >/dev/null 2>&1`); - $master3_dbh->disconnect() if $master3_dbh; -} - -} - -sub test_disabled_load_data { - my ($dbh, $sb, $master, $cnf) = @_; - $sb->wipe_clean($dbh); - $sb->create_dbs($dbh, ['test']); - $sb->load_file($master, 't/pt-archiver/samples/table5.sql'); - $dbh->do('INSERT INTO `test`.`table_5_copy` SELECT * FROM `test`.`table_5`'); - - my ($output, undef) = full_output( - sub { pt_archiver::main(qw(--no-ascend --limit 50 --bulk-insert), - qw(--bulk-delete --where 1=1 --statistics), - '--source', "D=test,t=table_5,F=$cnf", - '--dest', "t=table_5_dest") }, - ); - - like($output, - qr!\Q--bulk-insert cannot work as LOAD DATA LOCAL INFILE is disabled. See http://kb.percona.com/troubleshoot-load-data-infile!, - "--bulk-insert throws an error if LOCAL INFILE is disabled" - ); -} - # ############################################################################# # Done. # ############################################################################# $sb->wipe_clean($dbh); ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox"); +done_testing; exit; diff --git a/t/pt-archiver/bulk_regular_insert.t b/t/pt-archiver/bulk_regular_insert.t index b8315e1e..13879833 100644 --- a/t/pt-archiver/bulk_regular_insert.t +++ b/t/pt-archiver/bulk_regular_insert.t @@ -22,11 +22,8 @@ my $dbh = $sb->get_dbh_for('master'); if ( !$dbh ) { plan skip_all => 'Cannot connect to sandbox master'; } -elsif ( PerconaTest::load_data_is_disabled($dbh) ) { - plan skip_all => 'Cannot use --bulk-insert with LOAD DATA LOCAL INFILE disabled'; -} -else { - plan tests => 5; +elsif ( !$can_load_data ) { + plan skip_all => 'LOAD DATA LOCAL INFILE is disabled'; } my $output; @@ -98,4 +95,5 @@ is_deeply( # ############################################################################# $sb->wipe_clean($dbh); ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox"); +done_testing; exit; diff --git a/t/pt-upgrade/basics.t b/t/pt-upgrade/basics.t index 702be9a4..0061521c 100644 --- a/t/pt-upgrade/basics.t +++ b/t/pt-upgrade/basics.t @@ -29,11 +29,6 @@ if ( !$dbh1 ) { elsif ( !$dbh2 ) { plan skip_all => 'Cannot connect to second sandbox master'; } -else { - plan tests => 13; -} - -my $load_data_is_disabled = PerconaTest::load_data_is_disabled($dbh1); my @host_args = ('h=127.1,P=12345', 'P=12348'); my @op_args = (qw(-u msandbox -p msandbox), @@ -67,7 +62,7 @@ ok( ); SKIP: { - skip "LOAD DATA LOCAL INFILE is disabled", 2 if $load_data_is_disabled; + skip "LOAD DATA LOCAL INFILE is disabled", 2 unless $can_load_data; ok( no_diff( @@ -114,7 +109,8 @@ $sb->wipe_clean($dbh2); # compare-results-method=rows # ############################################################################# SKIP: { - skip "LOAD DATA LOCAL INFILE is disabled", 4 if $load_data_is_disabled; + skip "LOAD DATA LOCAL INFILE is disabled", 4 unless $can_load_data; + $sb->load_file('master', "$sample/002/tables.sql"); $sb->load_file('master1', "$sample/002/tables.sql"); @@ -159,7 +155,6 @@ SKIP: { $sb->wipe_clean($dbh1); $sb->wipe_clean($dbh2); - } # ############################################################################# @@ -167,7 +162,7 @@ SKIP: { # precision (M) and scale (D) # ############################################################################# SKIP: { - skip "LOAD DATA LOCAL INFILE is disabled", 2 if $load_data_is_disabled; + skip "LOAD DATA LOCAL INFILE is disabled", 2 unless $can_load_data; $sb->load_file('master', "$sample/003/tables.sql"); $sb->load_file('master1', "$sample/003/tables.sql"); @@ -199,4 +194,5 @@ diag(`rm /tmp/left-outfile.txt /tmp/right-outfile.txt 2>/dev/null`); diag(`$trunk/sandbox/stop-sandbox 12348 >/dev/null`); $sb->wipe_clean($dbh1); ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox"); +done_testing; exit; diff --git a/t/pt-upgrade/warnings.t b/t/pt-upgrade/warnings.t index 01d086b8..d745a63e 100644 --- a/t/pt-upgrade/warnings.t +++ b/t/pt-upgrade/warnings.t @@ -15,6 +15,13 @@ use PerconaTest; use Sandbox; require "$trunk/bin/pt-upgrade"; +# This test calls pt-upgrade with --compare-results-method rows +# which use LOAD DATA LOCAL INFILE. If LOAD DATA is disabled, +# then this this test can't run. +if ( !$can_load_data ) { + plan skip_all => 'LOAD DATA LOCAL INFILE is disabled'; +} + # This runs immediately if the server is already running, else it starts it. diag(`$trunk/sandbox/start-sandbox master 12348 >/dev/null`); @@ -31,13 +38,6 @@ elsif ( !$dbh2 ) { diag(`$trunk/sandbox/stop-sandbox master 12348 >/dev/null`); plan skip_all => 'Cannot connect to second sandbox master'; } -elsif ( PerconaTest::load_data_is_disabled($dbh1) ) { - diag(`$trunk/sandbox/stop-sandbox master 12348 >/dev/null`); - plan skip_all => 'LOAD DATA LOCAL INFILE is disabled'; -} -else { - plan tests => 6; -} $sb->load_file('master', 't/pt-upgrade/samples/001/tables.sql'); $sb->load_file('master1', 't/pt-upgrade/samples/001/tables.sql'); @@ -102,4 +102,5 @@ ok( $sb->wipe_clean($dbh1); diag(`$trunk/sandbox/stop-sandbox master 12348 >/dev/null`); ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox"); +done_testing; exit;