mirror of
https://github.com/percona/percona-toolkit.git
synced 2025-09-10 13:11:32 +00:00
Remove LOAD DATA check from pt-archiver and pt-upgrade. Make test-env check if LOAD DATA works and PerconaTest export . Rewrite how pt-archiver/t/bulk_insert.t conditionalizes on LOAD DATA working.
This commit is contained in:
@@ -3955,24 +3955,8 @@ sub main {
|
|||||||
$dp->get_cxn_params($table), { AutoCommit => $ac });
|
$dp->get_cxn_params($table), { AutoCommit => $ac });
|
||||||
PTDEBUG && _d('Inspecting table on', $dp->as_string($table));
|
PTDEBUG && _d('Inspecting table on', $dp->as_string($table));
|
||||||
|
|
||||||
if ( $o->get('bulk-insert') ) {
|
# Set options that can enable removing data on the master
|
||||||
local $@;
|
# and archiving it on the slaves.
|
||||||
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.
|
|
||||||
if ( $table->{a} ) {
|
if ( $table->{a} ) {
|
||||||
$dbh->do("USE $table->{a}");
|
$dbh->do("USE $table->{a}");
|
||||||
}
|
}
|
||||||
|
@@ -10371,32 +10371,6 @@ sub main {
|
|||||||
$host->{name} = $name || 'unknown host';
|
$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.
|
# Make some common modules.
|
||||||
# ########################################################################
|
# ########################################################################
|
||||||
@@ -10430,6 +10404,7 @@ sub main {
|
|||||||
# ########################################################################
|
# ########################################################################
|
||||||
# Make compare modules in order.
|
# Make compare modules in order.
|
||||||
# ########################################################################
|
# ########################################################################
|
||||||
|
my $compare = $o->get('compare');
|
||||||
my @compare_modules;
|
my @compare_modules;
|
||||||
if ( $compare->{results} ) {
|
if ( $compare->{results} ) {
|
||||||
my $method = lc $o->get('compare-results-method');
|
my $method = lc $o->get('compare-results-method');
|
||||||
|
@@ -68,6 +68,7 @@ our @EXPORT = qw(
|
|||||||
$trunk
|
$trunk
|
||||||
$dsn_opts
|
$dsn_opts
|
||||||
$sandbox_version
|
$sandbox_version
|
||||||
|
$can_load_data
|
||||||
);
|
);
|
||||||
|
|
||||||
our $trunk = $ENV{PERCONA_TOOLKIT_BRANCH};
|
our $trunk = $ENV{PERCONA_TOOLKIT_BRANCH};
|
||||||
@@ -78,6 +79,8 @@ eval {
|
|||||||
$sandbox_version = $v if $v;
|
$sandbox_version = $v if $v;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
our $can_load_data = can_load_data();
|
||||||
|
|
||||||
our $dsn_opts = [
|
our $dsn_opts = [
|
||||||
{
|
{
|
||||||
key => 'A',
|
key => 'A',
|
||||||
@@ -777,17 +780,9 @@ sub tables_used {
|
|||||||
return [ sort keys %tables ];
|
return [ sort keys %tables ];
|
||||||
}
|
}
|
||||||
|
|
||||||
sub load_data_is_disabled {
|
sub can_load_data {
|
||||||
my ($dbh) = @_;
|
my $output = `/tmp/12345/use -e "SELECT * FROM percona_test.load_data" 2>/dev/null`;
|
||||||
my $sql = "LOAD DATA LOCAL INFILE '/dev/null' INTO TABLE "
|
return ($output || '') =~ /42/;
|
||||||
. "`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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
@@ -234,6 +234,23 @@ set_mysql_version() {
|
|||||||
fi
|
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.
|
# Sanity check the cmd line options.
|
||||||
# ###########################################################################
|
# ###########################################################################
|
||||||
@@ -290,6 +307,7 @@ case $opt in
|
|||||||
echo "OK"
|
echo "OK"
|
||||||
fi
|
fi
|
||||||
../util/checksum-test-dataset
|
../util/checksum-test-dataset
|
||||||
|
check_load_data
|
||||||
ping=$(/tmp/12345/use -ss -e "SELECT MD5(RAND())")
|
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 "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')";
|
/tmp/12345/use -e "insert into percona_test.sentinel(id, ping) values(1, '$ping')";
|
||||||
|
@@ -22,12 +22,8 @@ my $dbh = $sb->get_dbh_for('master');
|
|||||||
if ( !$dbh ) {
|
if ( !$dbh ) {
|
||||||
plan skip_all => 'Cannot connect to sandbox master';
|
plan skip_all => 'Cannot connect to sandbox master';
|
||||||
}
|
}
|
||||||
elsif ( PerconaTest::load_data_is_disabled($dbh) ) {
|
elsif ( !$can_load_data ) {
|
||||||
diag("LOAD DATA LOCAL INFILE is disabled, only going to test the error message");
|
plan skip_all => 'LOAD DATA LOCAL INFILE is disabled';
|
||||||
plan tests => 2;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
plan tests => 11;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
my $output;
|
my $output;
|
||||||
@@ -35,11 +31,6 @@ my $rows;
|
|||||||
my $cnf = "/tmp/12345/my.sandbox.cnf";
|
my $cnf = "/tmp/12345/my.sandbox.cnf";
|
||||||
my $cmd = "$trunk/bin/pt-archiver";
|
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->wipe_clean($dbh);
|
||||||
$sb->create_dbs($dbh, ['test']);
|
$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+)/;
|
my ( $chks ) = $output =~ m/dest\s+(\d+)/;
|
||||||
like($output, qr/copy\s+$chks/, 'copy checksum');
|
like($output, qr/copy\s+$chks/, 'copy checksum');
|
||||||
|
|
||||||
|
|
||||||
# ############################################################################
|
# ############################################################################
|
||||||
# Issue 1260: mk-archiver --bulk-insert data loss
|
# Issue 1260: mk-archiver --bulk-insert data loss
|
||||||
# ############################################################################
|
# ############################################################################
|
||||||
@@ -93,48 +83,10 @@ is_deeply(
|
|||||||
"--bulk-insert archived 7 rows (issue 1260)"
|
"--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.
|
# Done.
|
||||||
# #############################################################################
|
# #############################################################################
|
||||||
$sb->wipe_clean($dbh);
|
$sb->wipe_clean($dbh);
|
||||||
ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox");
|
ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox");
|
||||||
|
done_testing;
|
||||||
exit;
|
exit;
|
||||||
|
@@ -22,11 +22,8 @@ my $dbh = $sb->get_dbh_for('master');
|
|||||||
if ( !$dbh ) {
|
if ( !$dbh ) {
|
||||||
plan skip_all => 'Cannot connect to sandbox master';
|
plan skip_all => 'Cannot connect to sandbox master';
|
||||||
}
|
}
|
||||||
elsif ( PerconaTest::load_data_is_disabled($dbh) ) {
|
elsif ( !$can_load_data ) {
|
||||||
plan skip_all => 'Cannot use --bulk-insert with LOAD DATA LOCAL INFILE disabled';
|
plan skip_all => 'LOAD DATA LOCAL INFILE is disabled';
|
||||||
}
|
|
||||||
else {
|
|
||||||
plan tests => 5;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
my $output;
|
my $output;
|
||||||
@@ -98,4 +95,5 @@ is_deeply(
|
|||||||
# #############################################################################
|
# #############################################################################
|
||||||
$sb->wipe_clean($dbh);
|
$sb->wipe_clean($dbh);
|
||||||
ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox");
|
ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox");
|
||||||
|
done_testing;
|
||||||
exit;
|
exit;
|
||||||
|
@@ -29,11 +29,6 @@ if ( !$dbh1 ) {
|
|||||||
elsif ( !$dbh2 ) {
|
elsif ( !$dbh2 ) {
|
||||||
plan skip_all => 'Cannot connect to second sandbox master';
|
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 @host_args = ('h=127.1,P=12345', 'P=12348');
|
||||||
my @op_args = (qw(-u msandbox -p msandbox),
|
my @op_args = (qw(-u msandbox -p msandbox),
|
||||||
@@ -67,7 +62,7 @@ ok(
|
|||||||
);
|
);
|
||||||
|
|
||||||
SKIP: {
|
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(
|
ok(
|
||||||
no_diff(
|
no_diff(
|
||||||
@@ -114,7 +109,8 @@ $sb->wipe_clean($dbh2);
|
|||||||
# compare-results-method=rows
|
# compare-results-method=rows
|
||||||
# #############################################################################
|
# #############################################################################
|
||||||
SKIP: {
|
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('master', "$sample/002/tables.sql");
|
||||||
$sb->load_file('master1', "$sample/002/tables.sql");
|
$sb->load_file('master1', "$sample/002/tables.sql");
|
||||||
|
|
||||||
@@ -159,7 +155,6 @@ SKIP: {
|
|||||||
|
|
||||||
$sb->wipe_clean($dbh1);
|
$sb->wipe_clean($dbh1);
|
||||||
$sb->wipe_clean($dbh2);
|
$sb->wipe_clean($dbh2);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# #############################################################################
|
# #############################################################################
|
||||||
@@ -167,7 +162,7 @@ SKIP: {
|
|||||||
# precision (M) and scale (D)
|
# precision (M) and scale (D)
|
||||||
# #############################################################################
|
# #############################################################################
|
||||||
SKIP: {
|
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('master', "$sample/003/tables.sql");
|
||||||
$sb->load_file('master1', "$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`);
|
diag(`$trunk/sandbox/stop-sandbox 12348 >/dev/null`);
|
||||||
$sb->wipe_clean($dbh1);
|
$sb->wipe_clean($dbh1);
|
||||||
ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox");
|
ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox");
|
||||||
|
done_testing;
|
||||||
exit;
|
exit;
|
||||||
|
@@ -15,6 +15,13 @@ use PerconaTest;
|
|||||||
use Sandbox;
|
use Sandbox;
|
||||||
require "$trunk/bin/pt-upgrade";
|
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.
|
# This runs immediately if the server is already running, else it starts it.
|
||||||
diag(`$trunk/sandbox/start-sandbox master 12348 >/dev/null`);
|
diag(`$trunk/sandbox/start-sandbox master 12348 >/dev/null`);
|
||||||
|
|
||||||
@@ -31,13 +38,6 @@ elsif ( !$dbh2 ) {
|
|||||||
diag(`$trunk/sandbox/stop-sandbox master 12348 >/dev/null`);
|
diag(`$trunk/sandbox/stop-sandbox master 12348 >/dev/null`);
|
||||||
plan skip_all => 'Cannot connect to second sandbox master';
|
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('master', 't/pt-upgrade/samples/001/tables.sql');
|
||||||
$sb->load_file('master1', '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);
|
$sb->wipe_clean($dbh1);
|
||||||
diag(`$trunk/sandbox/stop-sandbox master 12348 >/dev/null`);
|
diag(`$trunk/sandbox/stop-sandbox master 12348 >/dev/null`);
|
||||||
ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox");
|
ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox");
|
||||||
|
done_testing;
|
||||||
exit;
|
exit;
|
||||||
|
Reference in New Issue
Block a user