Commit eda46086 authored by Vlad Lesin's avatar Vlad Lesin

MDEV-29050 mariabackup issues error messages during InnoDB tablespaces export...

MDEV-29050 mariabackup issues error messages during InnoDB tablespaces export on partial backup preparing

The solution is to suppress error messages for missing tablespaces if
mariabackup is launched with "--prepare --export" options.

"mariabackup --prepare --export" invokes itself with --mysqld parameter.
If the parameter is set, then it starts server to feed "FLUSH TABLES ...
FOR EXPORT;" queries for exported tablespaces. This is "normal" server
start, that's why new srv_operation value is introduced.

Reviewed by Marko Makela.
parent e06c6046
......@@ -6760,6 +6760,7 @@ int main(int argc, char **argv)
*/
if (strcmp(argv[1], "--mysqld") == 0)
{
srv_operation= SRV_OPERATION_EXPORT_RESTORED;
extern int mysqld_main(int argc, char **argv);
argc--;
argv++;
......
......@@ -8,8 +8,15 @@ CREATE DATABASE db2;
USE db2;
CREATE TABLE t1(i INT) ENGINE INNODB;
USE test;
BEGIN;
INSERT INTO db2.t1 VALUES(20);
INSERT INTO test.t1 VALUES(20);
INSERT INTO test.t2 VALUES(20);
# xtrabackup backup
COMMIT;
t1.new
DROP TABLE t1;
DROP TABLE t2;
DROP DATABASE db2;
NOT FOUND /Operating system error number/ in backup.log
NOT FOUND /Could not find a valid tablespace file for/ in backup.log
......@@ -19,6 +19,11 @@ CREATE TABLE t1(i INT) ENGINE INNODB;
USE test;
BEGIN;
INSERT INTO db2.t1 VALUES(20);
INSERT INTO test.t1 VALUES(20);
INSERT INTO test.t2 VALUES(20);
echo # xtrabackup backup;
let $targetdir=$MYSQLTEST_VARDIR/tmp/backup;
......@@ -26,6 +31,8 @@ let $targetdir=$MYSQLTEST_VARDIR/tmp/backup;
exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup "--tables-exclude=test.*2" "--databases-exclude=db2" --target-dir=$targetdir;
--enable_result_log
COMMIT;
# check that only t1 table is in backup (t2 is excluded)
list_files $targetdir/test *.new;
list_files $targetdir/test *.ibd;
......@@ -47,4 +54,17 @@ DROP DATABASE db2;
rmdir $MYSQLD_DATADIR/db3;
rmdir $MYSQLD_DATADIR/db4;
rmdir $MYSQLD_DATADIR/db5;
--let $backup_log=$MYSQLTEST_VARDIR/tmp/backup.log
--disable_result_log
exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --export --prepare --target-dir="$targetdir" > $backup_log;
--enable_result_log
--let SEARCH_FILE=$backup_log
--let SEARCH_PATTERN=Operating system error number
--source include/search_pattern_in_file.inc
--let SEARCH_PATTERN=Could not find a valid tablespace file for
--source include/search_pattern_in_file.inc
--remove_file $backup_log
rmdir $targetdir;
......@@ -2267,7 +2267,7 @@ static void buf_flush_page_cleaner()
if (!recv_recovery_is_on() &&
!srv_startup_is_before_trx_rollback_phase &&
srv_operation == SRV_OPERATION_NORMAL)
srv_operation <= SRV_OPERATION_EXPORT_RESTORED)
log_checkpoint();
}
while (false);
......@@ -2439,7 +2439,7 @@ static void buf_flush_page_cleaner()
ATTRIBUTE_COLD void buf_flush_page_cleaner_init()
{
ut_ad(!buf_page_cleaner_is_active);
ut_ad(srv_operation == SRV_OPERATION_NORMAL ||
ut_ad(srv_operation <= SRV_OPERATION_EXPORT_RESTORED ||
srv_operation == SRV_OPERATION_RESTORE ||
srv_operation == SRV_OPERATION_RESTORE_EXPORT);
buf_flush_async_lsn= 0;
......
......@@ -953,7 +953,7 @@ void dict_check_tablespaces_and_store_max_id()
space_id, dict_tf_to_fsp_flags(flags),
name, filepath)) {
} else if (!not_dropped) {
} else if (srv_operation == SRV_OPERATION_NORMAL
} else if (srv_operation <= SRV_OPERATION_EXPORT_RESTORED
&& srv_start_after_restore
&& srv_force_recovery < SRV_FORCE_NO_BACKGROUND
&& dict_table_t::is_temporary_name(filepath)) {
......
......@@ -2115,7 +2115,9 @@ fil_ibd_open(
the first server startup. The tables ought to be dropped by
drop_garbage_tables_after_restore() a little later. */
const bool strict = validate && !tablespaces_found
const bool strict = srv_operation != SRV_OPERATION_EXPORT_RESTORED
&& srv_operation != SRV_OPERATION_RESTORE_EXPORT
&& validate && !tablespaces_found
&& !(srv_operation == SRV_OPERATION_NORMAL
&& srv_start_after_restore
&& srv_force_recovery < SRV_FORCE_NO_BACKGROUND
......@@ -2331,6 +2333,7 @@ fil_ibd_discover(
case SRV_OPERATION_RESTORE:
break;
case SRV_OPERATION_NORMAL:
case SRV_OPERATION_EXPORT_RESTORED:
size_t len= strlen(db);
if (len <= 4 || strcmp(db + len - 4, dot_ext[IBD])) {
break;
......
......@@ -766,7 +766,7 @@ the double write buffer.
bool
Datafile::restore_from_doublewrite()
{
if (srv_operation != SRV_OPERATION_NORMAL) {
if (srv_operation > SRV_OPERATION_EXPORT_RESTORED) {
return true;
}
......
......@@ -581,7 +581,7 @@ SysTablespace::read_lsn_and_check_flags(lsn_t* flushed_lsn)
ut_a(it->order() == 0);
if (srv_operation == SRV_OPERATION_NORMAL) {
if (srv_operation <= SRV_OPERATION_EXPORT_RESTORED) {
buf_dblwr.init_or_load_pages(it->handle(), it->filepath());
}
......
......@@ -2146,7 +2146,7 @@ static void innodb_ddl_recovery_done(handlerton*)
{
ut_ad(!ddl_recovery_done);
ut_d(ddl_recovery_done= true);
if (!srv_read_only_mode && srv_operation == SRV_OPERATION_NORMAL &&
if (!srv_read_only_mode && srv_operation <= SRV_OPERATION_EXPORT_RESTORED &&
srv_force_recovery < SRV_FORCE_NO_BACKGROUND)
{
if (srv_start_after_restore && !high_level_read_only)
......
......@@ -944,12 +944,13 @@ os_file_flush_func(
The number should be retrieved before any other OS calls (because they may
overwrite the error number). If the number is not known to this program,
the OS error number + 100 is returned.
@param[in] report true if we want an error message printed
for all errors
@param[in] report_all_errors true if we want an error message
printed of all errors
@param[in] on_error_silent true then don't print any diagnostic
to the log
@return error number, or OS error number + 100 */
ulint
os_file_get_last_error(
bool report);
ulint os_file_get_last_error(bool report_all_errors,
bool on_error_silent= false);
/** NOTE! Use the corresponding macro os_file_read(), not directly this
function!
......
......@@ -389,6 +389,9 @@ extern my_bool srv_immediate_scrub_data_uncompressed;
enum srv_operation_mode {
/** Normal mode (MariaDB Server) */
SRV_OPERATION_NORMAL,
/** Mariabackup is executing server to export already restored
tablespaces */
SRV_OPERATION_EXPORT_RESTORED,
/** Mariabackup taking a backup */
SRV_OPERATION_BACKUP,
/** Mariabackup restoring a backup for subsequent --copy-back */
......
......@@ -1241,7 +1241,7 @@ static void fil_name_process(const char *name, ulint len, uint32_t space_id,
return;
}
ut_ad(srv_operation == SRV_OPERATION_NORMAL
ut_ad(srv_operation <= SRV_OPERATION_EXPORT_RESTORED
|| srv_operation == SRV_OPERATION_RESTORE
|| srv_operation == SRV_OPERATION_RESTORE_EXPORT);
......@@ -3223,7 +3223,7 @@ static void log_sort_flush_list()
@param last_batch whether it is possible to write more redo log */
void recv_sys_t::apply(bool last_batch)
{
ut_ad(srv_operation == SRV_OPERATION_NORMAL ||
ut_ad(srv_operation <= SRV_OPERATION_EXPORT_RESTORED ||
srv_operation == SRV_OPERATION_RESTORE ||
srv_operation == SRV_OPERATION_RESTORE_EXPORT);
......@@ -4104,7 +4104,7 @@ recv_recovery_from_checkpoint_start(lsn_t flush_lsn)
byte* buf;
dberr_t err = DB_SUCCESS;
ut_ad(srv_operation == SRV_OPERATION_NORMAL
ut_ad(srv_operation <= SRV_OPERATION_EXPORT_RESTORED
|| srv_operation == SRV_OPERATION_RESTORE
|| srv_operation == SRV_OPERATION_RESTORE_EXPORT);
ut_d(mysql_mutex_lock(&buf_pool.flush_list_mutex));
......@@ -4315,7 +4315,7 @@ recv_recovery_from_checkpoint_start(lsn_t flush_lsn)
recv_sys.parse_start_lsn = checkpoint_lsn;
if (srv_operation == SRV_OPERATION_NORMAL) {
if (srv_operation <= SRV_OPERATION_EXPORT_RESTORED) {
deferred_spaces.deferred_dblwr();
buf_dblwr.recover();
}
......@@ -4380,7 +4380,8 @@ recv_recovery_from_checkpoint_start(lsn_t flush_lsn)
log_sys.last_checkpoint_lsn = checkpoint_lsn;
if (!srv_read_only_mode && srv_operation == SRV_OPERATION_NORMAL
if (!srv_read_only_mode
&& srv_operation <= SRV_OPERATION_EXPORT_RESTORED
&& (~log_t::FORMAT_ENCRYPTED & log_sys.log.format)
== log_t::FORMAT_10_5) {
/* Write a FILE_CHECKPOINT marker as the first thing,
......@@ -4397,7 +4398,7 @@ recv_recovery_from_checkpoint_start(lsn_t flush_lsn)
recv_no_ibuf_operations = false;
ut_d(recv_no_log_write = srv_operation == SRV_OPERATION_RESTORE
|| srv_operation == SRV_OPERATION_RESTORE_EXPORT);
if (srv_operation == SRV_OPERATION_NORMAL) {
if (srv_operation <= SRV_OPERATION_EXPORT_RESTORED) {
err = recv_rename_files();
}
mysql_mutex_unlock(&recv_sys.mutex);
......
......@@ -735,22 +735,16 @@ os_file_punch_hole_posix(
return(DB_IO_NO_PUNCH_HOLE);
}
/** Retrieves the last error number if an error occurs in a file io function.
The number should be retrieved before any other OS calls (because they may
overwrite the error number). If the number is not known to this program,
the OS error number + 100 is returned.
@param[in] report_all_errors true if we want an error message
printed of all errors
printed of all errors
@param[in] on_error_silent true then don't print any diagnostic
to the log
to the log
@return error number, or OS error number + 100 */
static
ulint
os_file_get_last_error_low(
bool report_all_errors,
bool on_error_silent)
ulint os_file_get_last_error(bool report_all_errors, bool on_error_silent)
{
int err = errno;
......@@ -1740,16 +1734,13 @@ bool os_file_flush_func(os_file_t file)
The number should be retrieved before any other OS calls (because they may
overwrite the error number). If the number is not known to this program,
then OS error number + OS_FILE_ERROR_MAX is returned.
@param[in] report_all_errors true if we want an error message printed
of all errors
@param[in] report_all_errors true if we want an error message
printed of all errors
@param[in] on_error_silent true then don't print any diagnostic
to the log
to the log
@return error number, or OS error number + OS_FILE_ERROR_MAX */
static
ulint
os_file_get_last_error_low(
bool report_all_errors,
bool on_error_silent)
ulint os_file_get_last_error(bool report_all_errors, bool on_error_silent)
{
ulint err = (ulint) GetLastError();
......@@ -2952,20 +2943,6 @@ os_file_read_func(
return err ? err : DB_IO_ERROR;
}
/** Retrieves the last error number if an error occurs in a file io function.
The number should be retrieved before any other OS calls (because they may
overwrite the error number). If the number is not known to this program,
the OS error number + 100 is returned.
@param[in] report_all_errors true if we want an error printed
for all errors
@return error number, or OS error number + 100 */
ulint
os_file_get_last_error(
bool report_all_errors)
{
return(os_file_get_last_error_low(report_all_errors, false));
}
/** Handle errors for file operations.
@param[in] name name of a file or NULL
@param[in] operation operation
......@@ -2982,7 +2959,7 @@ os_file_handle_error_cond_exit(
{
ulint err;
err = os_file_get_last_error_low(false, on_error_silent);
err = os_file_get_last_error(false, on_error_silent);
switch (err) {
case OS_FILE_DISK_FULL:
......
......@@ -702,7 +702,7 @@ srv_undo_tablespaces_init(bool create_new_db)
srv_undo_tablespaces_open= 0;
ut_a(srv_undo_tablespaces <= TRX_SYS_N_RSEGS);
ut_a(!create_new_db || srv_operation == SRV_OPERATION_NORMAL);
ut_a(!create_new_db || srv_operation <= SRV_OPERATION_EXPORT_RESTORED);
if (srv_undo_tablespaces == 1)
srv_undo_tablespaces= 0;
......@@ -1056,7 +1056,7 @@ dberr_t srv_start(bool create_new_db)
bool srv_log_file_found = true;
mtr_t mtr;
ut_ad(srv_operation == SRV_OPERATION_NORMAL
ut_ad(srv_operation <= SRV_OPERATION_RESTORE_EXPORT
|| srv_operation == SRV_OPERATION_RESTORE
|| srv_operation == SRV_OPERATION_RESTORE_EXPORT);
......@@ -1454,6 +1454,7 @@ dberr_t srv_start(bool create_new_db)
switch (srv_operation) {
case SRV_OPERATION_NORMAL:
case SRV_OPERATION_EXPORT_RESTORED:
case SRV_OPERATION_RESTORE_EXPORT:
/* Initialize the change buffer. */
err = dict_boot();
......@@ -1849,7 +1850,8 @@ dberr_t srv_start(bool create_new_db)
return(srv_init_abort(err));
}
if (!srv_read_only_mode && srv_operation == SRV_OPERATION_NORMAL) {
if (!srv_read_only_mode
&& srv_operation <= SRV_OPERATION_EXPORT_RESTORED) {
/* Initialize the innodb_temporary tablespace and keep
it open until shutdown. */
err = srv_open_tmp_tablespace(create_new_db);
......@@ -1931,7 +1933,7 @@ void innodb_preshutdown()
if (srv_read_only_mode)
return;
if (!srv_fast_shutdown && srv_operation == SRV_OPERATION_NORMAL)
if (!srv_fast_shutdown && srv_operation <= SRV_OPERATION_EXPORT_RESTORED)
{
/* Because a slow shutdown must empty the change buffer, we had
better prevent any further changes from being buffered. */
......@@ -1971,6 +1973,7 @@ void innodb_shutdown()
mysql_mutex_unlock(&buf_pool.flush_list_mutex);
break;
case SRV_OPERATION_NORMAL:
case SRV_OPERATION_EXPORT_RESTORED:
/* Shut down the persistent files. */
logs_empty_and_mark_files_at_shutdown();
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment