package GenTest::Reporter::inter_backup; require Exporter; @ISA = qw(GenTest::Reporter); use strict; use GenTest; use GenTest::Reporter; use GenTest::Constants; my $count = 0; my $file = '/tmp/inter.bak'; sub monitor { my $reporter = shift; my $dsn = $reporter->dsn(); # Execute BACKUP periodically my $dsn = $reporter->dsn(); my $dbh = DBI->connect($dsn); unlink('/tmp/inter.bak'); say("Executing BACKUP DATABASE."); $dbh->do("BACKUP DATABASE db2 TO '/tmp/inter.bak'"); $count++; if (defined $dbh->err()) { return STATUS_DATABASE_CORRUPTION; } else { return STATUS_OK; } } my $tables; sub report { my $reporter = shift; my $dsn = $reporter->dsn(); my $dbh = DBI->connect($dsn); # Check the number of tables in db before performing restore # Note that it is not possible to check the contents of tables because # there will be concurrent queries against this database $dbh = DBI->connect($dsn) if not defined $dbh; $tables = $dbh->selectcol_arrayref("SHOW TABLES") if not defined $tables; my $results; my $query="SELECT COUNT(table_name) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='db2'"; # Execute query my ($count_before) = $dbh->selectrow_array($query); ################################################################# # Dump the database db2 that is being backed up by using # mysqldump program ################################################################# our $database = 'db2'; my $file_bak = '/tmp/db2_dump.bak'; my $file_res= '/tmp/db2_dump_res.bak'; my $mysqldump_result = system("mysqldump --compact --order-by-primary --skip-triggers --skip-extended-insert --no-create-info --host=127.0.0.1 --port=19306 --user=root $database | sort > $file_bak"); return STATUS_UNKNOWN_ERROR if $mysqldump_result > 0; # PERFORM RESTORE say("Executing RESTORE FROM."); $dbh->do("RESTORE FROM '/tmp/inter.bak' OVERWRITE"); if (defined $dbh->err()) { return STATUS_DATABASE_CORRUPTION; } else { return STATUS_OK; } # Verify the number of tables after restore # Execute the same query that we executed before restore my ($count_after) = $dbh->selectrow_array($query); my $mysqldump_result = system("mysqldump --compact --order-by-primary --skip-triggers --skip-extended-insert --no-create-info --host=127.0.0.1 --port=19306 --user=root $database | sort > $file_res"); return STATUS_UNKNOWN_ERROR if $mysqldump_result > 0; my $diff_result = system("diff --unified $file_bak $file_res"); $diff_result = $diff_result >> 8; return STATUS_UNKNOWN_ERROR if $diff_result > 1; if ($diff_result == 1) { say("Differences between the files were found after query ".$results->[0]->query()); return STATUS_UNKNOWN_ERROR; } else { return STATUS_OK; } } sub type { return REPORTER_TYPE_PERIODIC | REPORTER_TYPE_SUCCESS; } 1;