Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
922e7bad
Commit
922e7bad
authored
Aug 09, 2018
by
Vladislav Vaintroub
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
MDEV-16791 mariabackup : Support DDL commands during backup
parent
9a4998a3
Changes
26
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
26 changed files
with
1074 additions
and
80 deletions
+1074
-80
extra/mariabackup/backup_copy.cc
extra/mariabackup/backup_copy.cc
+30
-0
extra/mariabackup/backup_mysql.cc
extra/mariabackup/backup_mysql.cc
+6
-1
extra/mariabackup/datasink.c
extra/mariabackup/datasink.c
+3
-0
extra/mariabackup/fil_cur.cc
extra/mariabackup/fil_cur.cc
+29
-9
extra/mariabackup/fil_cur.h
extra/mariabackup/fil_cur.h
+3
-2
extra/mariabackup/xtrabackup.cc
extra/mariabackup/xtrabackup.cc
+512
-45
mysql-test/suite/mariabackup/create_during_backup.result
mysql-test/suite/mariabackup/create_during_backup.result
+10
-0
mysql-test/suite/mariabackup/create_during_backup.test
mysql-test/suite/mariabackup/create_during_backup.test
+26
-0
mysql-test/suite/mariabackup/create_with_data_directory_during_backup.result
...riabackup/create_with_data_directory_during_backup.result
+10
-0
mysql-test/suite/mariabackup/create_with_data_directory_during_backup.test
...mariabackup/create_with_data_directory_during_backup.test
+24
-0
mysql-test/suite/mariabackup/disabled.def
mysql-test/suite/mariabackup/disabled.def
+1
-1
mysql-test/suite/mariabackup/drop_table_during_backup.result
mysql-test/suite/mariabackup/drop_table_during_backup.result
+13
-0
mysql-test/suite/mariabackup/drop_table_during_backup.test
mysql-test/suite/mariabackup/drop_table_during_backup.test
+24
-0
mysql-test/suite/mariabackup/incremental_ddl_during_backup.result
...st/suite/mariabackup/incremental_ddl_during_backup.result
+22
-0
mysql-test/suite/mariabackup/incremental_ddl_during_backup.test
...test/suite/mariabackup/incremental_ddl_during_backup.test
+52
-0
mysql-test/suite/mariabackup/mlog_index_load.result
mysql-test/suite/mariabackup/mlog_index_load.result
+15
-0
mysql-test/suite/mariabackup/mlog_index_load.test
mysql-test/suite/mariabackup/mlog_index_load.test
+27
-0
mysql-test/suite/mariabackup/recreate_table_during_backup.result
...est/suite/mariabackup/recreate_table_during_backup.result
+23
-0
mysql-test/suite/mariabackup/recreate_table_during_backup.test
...-test/suite/mariabackup/recreate_table_during_backup.test
+37
-0
mysql-test/suite/mariabackup/rename_during_backup.result
mysql-test/suite/mariabackup/rename_during_backup.result
+53
-0
mysql-test/suite/mariabackup/rename_during_backup.test
mysql-test/suite/mariabackup/rename_during_backup.test
+86
-0
mysql-test/suite/mariabackup/rename_during_mdl_lock.result
mysql-test/suite/mariabackup/rename_during_mdl_lock.result
+9
-1
mysql-test/suite/mariabackup/rename_during_mdl_lock.test
mysql-test/suite/mariabackup/rename_during_mdl_lock.test
+14
-6
mysql-test/suite/mariabackup/suite.opt
mysql-test/suite/mariabackup/suite.opt
+1
-1
storage/innobase/include/log0recv.h
storage/innobase/include/log0recv.h
+16
-4
storage/innobase/log/log0recv.cc
storage/innobase/log/log0recv.cc
+28
-10
No files found.
extra/mariabackup/backup_copy.cc
View file @
922e7bad
...
...
@@ -1388,6 +1388,30 @@ backup_files(const char *from, bool prep_mode)
return
(
ret
);
}
void
backup_fix_ddl
(
void
);
#define LSN_PREFIX_IN_SHOW_STATUS "\nLog sequence number "
static
lsn_t
get_current_lsn
(
MYSQL
*
connection
)
{
MYSQL_RES
*
res
=
xb_mysql_query
(
connection
,
"SHOW ENGINE INNODB STATUS"
,
true
,
false
);
if
(
!
res
)
return
0
;
MYSQL_ROW
row
=
mysql_fetch_row
(
res
);
DBUG_ASSERT
(
row
);
if
(
row
)
{
const
char
*
p
=
strstr
(
row
[
2
],
LSN_PREFIX_IN_SHOW_STATUS
);
DBUG_ASSERT
(
p
);
if
(
p
)
{
p
+=
sizeof
(
LSN_PREFIX_IN_SHOW_STATUS
)
-
1
;
return
(
lsn_t
)
strtoll
(
p
,
NULL
,
10
);
}
}
mysql_free_result
(
res
);
return
0
;
}
lsn_t
server_lsn_after_lock
;
extern
void
backup_wait_for_lsn
(
lsn_t
lsn
);
/** Start --backup */
bool
backup_start
()
{
...
...
@@ -1407,6 +1431,7 @@ bool backup_start()
if
(
!
lock_tables
(
mysql_connection
))
{
return
(
false
);
}
server_lsn_after_lock
=
get_current_lsn
(
mysql_connection
);
}
if
(
!
backup_files
(
fil_path_to_mysql_datadir
,
false
))
{
...
...
@@ -1421,6 +1446,10 @@ bool backup_start()
rocksdb_create_checkpoint
();
}
msg_ts
(
"Waiting for log copy thread to read lsn %llu
\n
"
,
(
ulonglong
)
server_lsn_after_lock
);
backup_wait_for_lsn
(
server_lsn_after_lock
);
backup_fix_ddl
();
// There is no need to stop slave thread before coping non-Innodb data when
// --no-lock option is used because --no-lock option requires that no DDL or
// DML to non-transaction tables can occur.
...
...
@@ -2230,6 +2259,7 @@ static void rocksdb_lock_checkpoint()
msg_ts
(
"Could not obtain rocksdb checkpont lock
\n
"
);
exit
(
EXIT_FAILURE
);
}
mysql_free_result
(
res
);
}
static
void
rocksdb_unlock_checkpoint
()
...
...
extra/mariabackup/backup_mysql.cc
View file @
922e7bad
...
...
@@ -1794,7 +1794,12 @@ mdl_lock_table(ulint space_id)
std
::
ostringstream
lock_query
;
lock_query
<<
"SELECT 1 FROM "
<<
full_table_name
<<
" LIMIT 0"
;
msg_ts
(
"Locking MDL for %s
\n
"
,
full_table_name
.
c_str
());
xb_mysql_query
(
mdl_con
,
lock_query
.
str
().
c_str
(),
false
,
true
);
if
(
mysql_query
(
mdl_con
,
lock_query
.
str
().
c_str
()))
{
msg_ts
(
"Warning : locking MDL failed for space id %zu, name %s
\n
"
,
space_id
,
full_table_name
.
c_str
());
}
else
{
MYSQL_RES
*
r
=
mysql_store_result
(
mdl_con
);
mysql_free_result
(
r
);
}
}
pthread_mutex_unlock
(
&
mdl_lock_con_mutex
);
...
...
extra/mariabackup/datasink.c
View file @
922e7bad
...
...
@@ -108,6 +108,9 @@ Write to a datasink file.
int
ds_write
(
ds_file_t
*
file
,
const
void
*
buf
,
size_t
len
)
{
if
(
len
==
0
)
{
return
0
;
}
return
file
->
datasink
->
write
(
file
,
(
const
uchar
*
)
buf
,
len
);
}
...
...
extra/mariabackup/fil_cur.cc
View file @
922e7bad
...
...
@@ -131,14 +131,15 @@ Open a source file cursor and initialize the associated read filter.
be skipped and XB_FIL_CUR_ERROR on error. */
xb_fil_cur_result_t
xb_fil_cur_open
(
/*============*/
/*============*/
xb_fil_cur_t
*
cursor
,
/*!< out: source file cursor */
xb_read_filt_t
*
read_filter
,
/*!< in/out: the read filter */
fil_node_t
*
node
,
/*!< in: source tablespace node */
uint
thread_n
)
/*!< thread number for diagnostics */
uint
thread_n
,
/*!< thread number for diagnostics */
ulonglong
max_file_size
)
{
bool
success
;
int
err
;
/* Initialize these first so xb_fil_cur_close() handles them correctly
in case of error */
cursor
->
orig_buf
=
NULL
;
...
...
@@ -173,7 +174,7 @@ xb_fil_cur_open(
"tablespace %s
\n
"
,
thread_n
,
cursor
->
abs_path
);
return
(
XB_FIL_CUR_
ERROR
);
return
(
XB_FIL_CUR_
SKIP
);
}
mutex_enter
(
&
fil_system
->
mutex
);
...
...
@@ -194,14 +195,31 @@ xb_fil_cur_open(
cursor
->
node
=
node
;
cursor
->
file
=
node
->
handle
;
if
(
stat
(
cursor
->
abs_path
,
&
cursor
->
statinfo
))
{
msg
(
"[%02u] mariabackup: error: cannot stat %s
\n
"
,
#ifdef _WIN32
HANDLE
hDup
;
DuplicateHandle
(
GetCurrentProcess
(),
cursor
->
file
.
m_file
,
GetCurrentProcess
(),
&
hDup
,
0
,
FALSE
,
DUPLICATE_SAME_ACCESS
);
int
filenr
=
_open_osfhandle
((
intptr_t
)
hDup
,
0
);
if
(
filenr
<
0
)
{
err
=
EINVAL
;
}
else
{
err
=
_fstat64
(
filenr
,
&
cursor
->
statinfo
);
close
(
filenr
);
}
#else
err
=
fstat
(
cursor
->
file
.
m_file
,
&
cursor
->
statinfo
);
#endif
if
(
max_file_size
<
(
ulonglong
)
cursor
->
statinfo
.
st_size
)
{
cursor
->
statinfo
.
st_size
=
(
ulonglong
)
max_file_size
;
}
if
(
err
)
{
msg
(
"[%02u] mariabackup: error: cannot fstat %s
\n
"
,
thread_n
,
cursor
->
abs_path
);
xb_fil_cur_close
(
cursor
);
return
(
XB_FIL_CUR_
ERROR
);
return
(
XB_FIL_CUR_
SKIP
);
}
if
(
srv_file_flush_method
==
SRV_O_DIRECT
...
...
@@ -374,7 +392,9 @@ xb_fil_cur_close(
/*=============*/
xb_fil_cur_t
*
cursor
)
/*!< in/out: source file cursor */
{
cursor
->
read_filter
->
deinit
(
&
cursor
->
read_filter_ctxt
);
if
(
cursor
->
read_filter
)
{
cursor
->
read_filter
->
deinit
(
&
cursor
->
read_filter_ctxt
);
}
free
(
cursor
->
orig_buf
);
...
...
extra/mariabackup/fil_cur.h
View file @
922e7bad
...
...
@@ -57,7 +57,7 @@ struct xb_fil_cur_t {
ulint
space_size
;
/*!< space size in pages */
/** TODO: remove this default constructor */
xb_fil_cur_t
()
:
page_size
(
0
),
read_filter_ctxt
()
{}
xb_fil_cur_t
()
:
page_size
(
0
),
read_filter
(
0
),
read_filter
_ctxt
()
{}
/** @return whether this is not a file-per-table tablespace */
bool
is_system
()
const
...
...
@@ -86,7 +86,8 @@ xb_fil_cur_open(
xb_fil_cur_t
*
cursor
,
/*!< out: source file cursor */
xb_read_filt_t
*
read_filter
,
/*!< in/out: the read filter */
fil_node_t
*
node
,
/*!< in: source tablespace node */
uint
thread_n
);
/*!< thread number for diagnostics */
uint
thread_n
,
/*!< thread number for diagnostics */
ulonglong
max_file_size
=
ULLONG_MAX
);
/************************************************************************
Reads and verifies the next block of pages from the source
...
...
extra/mariabackup/xtrabackup.cc
View file @
922e7bad
This diff is collapsed.
Click to expand it.
mysql-test/suite/mariabackup/create_during_backup.result
0 → 100644
View file @
922e7bad
# xtrabackup backup
# xtrabackup prepare
# shutdown server
# remove datadir
# xtrabackup move back
# restart server
SELECT COUNT(*) from t1;
COUNT(*)
10000
DROP TABLE t1;
mysql-test/suite/mariabackup/create_during_backup.test
0 → 100644
View file @
922e7bad
--
source
include
/
have_debug
.
inc
let
$targetdir
=
$MYSQLTEST_VARDIR
/
tmp
/
backup
;
mkdir
$targetdir
;
# this will table and populate it, after backup has list of tables to be copied
--
let
after_load_tablespaces
=
CREATE
TABLE
test
.
t1
ENGINE
=
INNODB
SELECT
UUID
()
from
test
.
seq_1_to_10000
echo
# xtrabackup backup;
--
disable_result_log
exec
$XTRABACKUP
--
defaults
-
file
=
$MYSQLTEST_VARDIR
/
my
.
cnf
--
backup
--
target
-
dir
=
$targetdir
--
dbug
=+
d
,
mariabackup_events
;
--
enable_result_log
--
let
after_load_tables
=
echo
# xtrabackup prepare;
--
disable_result_log
exec
$XTRABACKUP
--
prepare
--
target
-
dir
=
$targetdir
;
--
source
include
/
restart_and_restore
.
inc
--
enable_result_log
# Check that new table is there after restore.
SELECT
COUNT
(
*
)
from
t1
;
DROP
TABLE
t1
;
rmdir
$targetdir
;
mysql-test/suite/mariabackup/create_with_data_directory_during_backup.result
0 → 100644
View file @
922e7bad
# xtrabackup backup
# xtrabackup prepare
DROP TABLE t;
# shutdown server
# remove datadir
# xtrabackup move back
# restart server
SELECT * FROM t;
i
DROP TABLE t;
mysql-test/suite/mariabackup/create_with_data_directory_during_backup.test
0 → 100644
View file @
922e7bad
--
source
include
/
have_debug
.
inc
let
$table_data_dir
=
$MYSQLTEST_VARDIR
/
tmp
/
ddir
;
let
$targetdir
=
$MYSQLTEST_VARDIR
/
tmp
/
backup
;
mkdir
$table_data_dir
;
--
replace_result
$table_data_dir
table_data_dir
--
let
after_load_tablespaces
=
CREATE
TABLE
test
.
t
(
i
int
)
ENGINE
=
INNODB
DATA
DIRECTORY
=
'$table_data_dir'
echo
# xtrabackup backup;
let
$targetdir
=
$MYSQLTEST_VARDIR
/
tmp
/
backup
;
--
disable_result_log
exec
$XTRABACKUP
--
defaults
-
file
=
$MYSQLTEST_VARDIR
/
my
.
cnf
--
backup
--
target
-
dir
=
$targetdir
--
dbug
=+
d
,
mariabackup_events
;
--
enable_result_log
--
source
include
/
shutdown_mysqld
.
inc
echo
# xtrabackup prepare;
--
disable_result_log
exec
$XTRABACKUP
--
prepare
--
target
-
dir
=
$targetdir
;
--
source
include
/
start_mysqld
.
inc
DROP
TABLE
t
;
rmdir
$table_data_dir
;
--
source
include
/
restart_and_restore
.
inc
--
enable_result_log
SELECT
*
FROM
t
;
DROP
TABLE
t
;
rmdir
$targetdir
;
rmdir
$table_data_dir
;
mysql-test/suite/mariabackup/disabled.def
View file @
922e7bad
unsupported_redo : MDEV-16791 allows optimized redo
\ No newline at end of file
mysql-test/suite/mariabackup/drop_table_during_backup.result
0 → 100644
View file @
922e7bad
CREATE TABLE t1 (i int) ENGINE=INNODB;
CREATE TABLE t2 (i int) ENGINE=INNODB;
CREATE TABLE t3 (i int) ENGINE=INNODB;
# xtrabackup prepare
# shutdown server
# remove datadir
# xtrabackup move back
# restart server
CREATE TABLE t1(i int);
DROP TABLE t1;
CREATE TABLE t2(i int);
DROP TABLE t2;
DROP TABLE t3;
mysql-test/suite/mariabackup/drop_table_during_backup.test
0 → 100644
View file @
922e7bad
--
source
include
/
have_debug
.
inc
let
$targetdir
=
$MYSQLTEST_VARDIR
/
tmp
/
backup
;
CREATE
TABLE
t1
(
i
int
)
ENGINE
=
INNODB
;
CREATE
TABLE
t2
(
i
int
)
ENGINE
=
INNODB
;
CREATE
TABLE
t3
(
i
int
)
ENGINE
=
INNODB
;
--
let
before_copy_test_t1
=
DROP
TABLE
test
.
t1
--
let
after_copy_test_t2
=
DROP
TABLE
test
.
t2
;
--
disable_result_log
exec
$XTRABACKUP
--
defaults
-
file
=
$MYSQLTEST_VARDIR
/
my
.
cnf
--
backup
--
target
-
dir
=
$targetdir
--
dbug
=+
d
,
mariabackup_events
;
--
enable_result_log
echo
# xtrabackup prepare;
--
disable_result_log
exec
$XTRABACKUP
--
prepare
--
target
-
dir
=
$targetdir
;
--
source
include
/
restart_and_restore
.
inc
--
enable_result_log
#check that the table t1 does not exist in backup
CREATE
TABLE
t1
(
i
int
);
DROP
TABLE
t1
;
CREATE
TABLE
t2
(
i
int
);
DROP
TABLE
t2
;
DROP
TABLE
t3
;
rmdir
$targetdir
;
mysql-test/suite/mariabackup/incremental_ddl_during_backup.result
0 → 100644
View file @
922e7bad
call mtr.add_suppression("InnoDB: New log files created");
CREATE TABLE t1(i INT PRIMARY KEY) ENGINE INNODB;
CREATE TABLE t2(i INT PRIMARY KEY) ENGINE INNODB;
CREATE TABLE t3(i INT) ENGINE INNODB;
# Create full backup , modify table, then create incremental/differential backup
INSERT into t1 values(1);
# Prepare full backup, apply incremental one
# Restore and check results
# shutdown server
# remove datadir
# xtrabackup move back
# restart server
CREATE TABLE t1(i int);
DROP TABLE t1;
SELECT * from t1_renamed;
i
1
DROP TABLE t1_renamed;
CREATE TABLE t2(i INT PRIMARY KEY) ENGINE INNODB;
DROP TABLE t2;
DROP TABLE t3;
DROP TABLE t4;
mysql-test/suite/mariabackup/incremental_ddl_during_backup.test
0 → 100644
View file @
922e7bad
--
source
include
/
have_debug
.
inc
call
mtr
.
add_suppression
(
"InnoDB: New log files created"
);
let
$basedir
=
$MYSQLTEST_VARDIR
/
tmp
/
backup
;
let
$incremental_dir
=
$MYSQLTEST_VARDIR
/
tmp
/
backup_inc1
;
CREATE
TABLE
t1
(
i
INT
PRIMARY
KEY
)
ENGINE
INNODB
;
CREATE
TABLE
t2
(
i
INT
PRIMARY
KEY
)
ENGINE
INNODB
;
CREATE
TABLE
t3
(
i
INT
)
ENGINE
INNODB
;
echo
# Create full backup , modify table, then create incremental/differential backup;
--
disable_result_log
exec
$XTRABACKUP
--
defaults
-
file
=
$MYSQLTEST_VARDIR
/
my
.
cnf
--
backup
--
target
-
dir
=
$basedir
;
--
enable_result_log
INSERT
into
t1
values
(
1
);
--
let
after_load_tablespaces
=
CREATE
TABLE
test
.
t4
ENGINE
=
INNODB
SELECT
UUID
()
from
test
.
seq_1_to_10000
--
let
after_copy_test_t1
=
RENAME
TABLE
test
.
t1
TO
test
.
t1_renamed
--
let
after_copy_test_t2
=
DROP
TABLE
test
.
t2
--
let
after_copy_test_t3
=
CREATE
INDEX
a_i
ON
test
.
t3
(
i
);
exec
$XTRABACKUP
--
defaults
-
file
=
$MYSQLTEST_VARDIR
/
my
.
cnf
--
backup
--
target
-
dir
=
$incremental_dir
--
incremental
-
basedir
=
$basedir
--
dbug
=+
d
,
mariabackup_events
;
--
let
after_load_tablespaces
=
--
disable_result_log
echo
# Prepare full backup, apply incremental one;
exec
$XTRABACKUP
--
apply
-
log
-
only
--
prepare
--
target
-
dir
=
$basedir
;
exec
$XTRABACKUP
--
prepare
--
target
-
dir
=
$basedir
--
incremental
-
dir
=
$incremental_dir
;
echo
# Restore and check results;
let
$targetdir
=
$basedir
;
--
source
include
/
restart_and_restore
.
inc
--
enable_result_log
# Test that t1 does not exist, but t1_renamed does
CREATE
TABLE
t1
(
i
int
);
DROP
TABLE
t1
;
SELECT
*
from
t1_renamed
;
DROP
TABLE
t1_renamed
;
# Test that t2 does not exist;
CREATE
TABLE
t2
(
i
INT
PRIMARY
KEY
)
ENGINE
INNODB
;
DROP
TABLE
t2
;
DROP
TABLE
t3
;
DROP
TABLE
t4
;
# Cleanup
rmdir
$basedir
;
rmdir
$incremental_dir
;
mysql-test/suite/mariabackup/mlog_index_load.result
0 → 100644
View file @
922e7bad
CREATE TABLE t1(i INT PRIMARY KEY auto_increment, a int) ENGINE INNODB;
INSERT INTO t1(a) SELECT * from seq_1_to_10000;
# xtrabackup backup
t1.frm
t1.ibd
t1.new
# xtrabackup prepare
# shutdown server
# remove datadir
# xtrabackup move back
# restart server
SELECT COUNT(*) from t1;
COUNT(*)
10000
DROP TABLE t1;
mysql-test/suite/mariabackup/mlog_index_load.test
0 → 100644
View file @
922e7bad
--
source
include
/
have_debug
.
inc
CREATE
TABLE
t1
(
i
INT
PRIMARY
KEY
auto_increment
,
a
int
)
ENGINE
INNODB
;
INSERT
INTO
t1
(
a
)
SELECT
*
from
seq_1_to_10000
;
let
$targetdir
=
$MYSQLTEST_VARDIR
/
tmp
/
backup
;
let
after_copy_test_t1
=
CREATE
INDEX
a_ind
ON
test
.
t1
(
a
)
ALGORITHM
=
INPLACE
;
echo
# xtrabackup backup;
--
disable_result_log
exec
$XTRABACKUP
--
defaults
-
file
=
$MYSQLTEST_VARDIR
/
my
.
cnf
--
backup
--
target
-
dir
=
$targetdir
--
dbug
=+
d
,
mariabackup_events
;
--
enable_result_log
--
list_files
$targetdir
/
test
t1
*
--
let
before_copy_test_t1
=
echo
# xtrabackup prepare;
--
disable_result_log
exec
$XTRABACKUP
--
prepare
--
target
-
dir
=
$targetdir
;
--
source
include
/
restart_and_restore
.
inc
--
enable_result_log
# Check that new table is there after restore.
SELECT
COUNT
(
*
)
from
t1
;
DROP
TABLE
t1
;
rmdir
$targetdir
;
mysql-test/suite/mariabackup/recreate_table_during_backup.result
0 → 100644
View file @
922e7bad
CREATE TABLE t1(i int) ENGINE=INNODB;
CREATE TABLE t2(i int) ENGINE=INNODB;
CREATE TABLE t3(a CHAR(36)) ENGINE INNODB;
INSERT INTO t3 SELECT UUID() FROM seq_1_to_1000;
# xtrabackup backup
# xtrabackup prepare
# shutdown server
# remove datadir
# xtrabackup move back
# restart server
SELECT COUNT(*) from t1;
COUNT(*)
100
SELECT COUNT(*) from t2;
COUNT(*)
1000
SELECT COUNT(*) from t3;
COUNT(*)
1000
DROP INDEX index_a ON t3;
DROP TABLE t1;
DROP TABLE t2;
DROP TABLE t3;
mysql-test/suite/mariabackup/recreate_table_during_backup.test
0 → 100644
View file @
922e7bad
--
source
include
/
have_debug
.
inc
let
$targetdir
=
$MYSQLTEST_VARDIR
/
tmp
/
backup
;
mkdir
$targetdir
;
CREATE
TABLE
t1
(
i
int
)
ENGINE
=
INNODB
;
CREATE
TABLE
t2
(
i
int
)
ENGINE
=
INNODB
;
CREATE
TABLE
t3
(
a
CHAR
(
36
))
ENGINE
INNODB
;
INSERT
INTO
t3
SELECT
UUID
()
FROM
seq_1_to_1000
;
# this will table and populate it, after backup has list of tables to be copied
--
let
before_copy_test_t1
=
BEGIN
NOT
ATOMIC
DROP
TABLE
test
.
t1
;
CREATE
TABLE
test
.
t1
ENGINE
=
INNODB
SELECT
UUID
()
from
test
.
seq_1_to_100
;
END
--
let
after_copy_test_t2
=
BEGIN
NOT
ATOMIC
DROP
TABLE
test
.
t2
;
CREATE
TABLE
test
.
t2
ENGINE
=
INNODB
SELECT
UUID
()
from
test
.
seq_1_to_1000
;
END
--
let
after_copy_test_t3
=
ALTER
TABLE
test
.
t3
ADD
INDEX
index_a
(
a
),
ALGORITHM
=
COPY
echo
# xtrabackup backup;
--
disable_result_log
exec
$XTRABACKUP
--
defaults
-
file
=
$MYSQLTEST_VARDIR
/
my
.
cnf
--
backup
--
target
-
dir
=
$targetdir
--
close
-
files
--
dbug
=+
d
,
mariabackup_events
;
--
enable_result_log
--
let
after_load_tables
=
echo
# xtrabackup prepare;
--
disable_result_log
exec
$XTRABACKUP
--
prepare
--
target
-
dir
=
$targetdir
;
--
source
include
/
restart_and_restore
.
inc
--
enable_result_log
# Check that new table is there after restore.
SELECT
COUNT
(
*
)
from
t1
;
SELECT
COUNT
(
*
)
from
t2
;
SELECT
COUNT
(
*
)
from
t3
;
DROP
INDEX
index_a
ON
t3
;
DROP
TABLE
t1
;
DROP
TABLE
t2
;
DROP
TABLE
t3
;
rmdir
$targetdir
;
mysql-test/suite/mariabackup/rename_during_backup.result
0 → 100644
View file @
922e7bad
CREATE TABLE t1(i int) ENGINE INNODB;
INSERT into t1 values(1);
CREATE TABLE t2(i int) ENGINE INNODB;
INSERT INTO t2 values(2);
CREATE TABLE t3(i int) ENGINE INNODB;
CREATE TABLE t4(i int) ENGINE INNODB;
CREATE TABLE a(a int) ENGINE INNODB;
INSERT INTO a values(1);
CREATE TABLE b(b CHAR(1)) ENGINE INNODB;
INSERT INTO b VALUES('b');
CREATE TABLE a1(a1 int) ENGINE INNODB;
INSERT INTO a1 VALUES(1);
CREATE TABLE b1(b1 CHAR(2)) ENGINE INNODB;
INSERT INTO b1 VALUES('b1');
# xtrabackup prepare
# shutdown server
# remove datadir
# xtrabackup move back
# restart server
CREATE TABLE t1(i int);
DROP TABLE t1;
SELECT * from t1_renamed;
i
1
DROP TABLE t1_renamed;
CREATE TABLE t2(i int);
DROP TABLE t2;
SELECT * from t2_renamed;
i
2
DROP TABLE t2_renamed;
SELECT * from t3;
i
3
DROP TABLE t3;
SELECT * from t4;
i
DROP TABLE t4;
CREATE TABLE tmp(i int);
DROP TABLE tmp;
SELECT * FROM a;
b
b
SELECT * FROM b;
a
1
SELECT * FROM a1;
b1
b1
SELECT * FROM b1;
a1
1
DROP TABLE a,b,a1,b1;
mysql-test/suite/mariabackup/rename_during_backup.test
0 → 100644
View file @
922e7bad
--
source
include
/
have_debug
.
inc
let
$targetdir
=
$MYSQLTEST_VARDIR
/
tmp
/
backup
;
mkdir
$targetdir
;
CREATE
TABLE
t1
(
i
int
)
ENGINE
INNODB
;
INSERT
into
t1
values
(
1
);
CREATE
TABLE
t2
(
i
int
)
ENGINE
INNODB
;
INSERT
INTO
t2
values
(
2
);
CREATE
TABLE
t3
(
i
int
)
ENGINE
INNODB
;
CREATE
TABLE
t4
(
i
int
)
ENGINE
INNODB
;
CREATE
TABLE
a
(
a
int
)
ENGINE
INNODB
;
INSERT
INTO
a
values
(
1
);
CREATE
TABLE
b
(
b
CHAR
(
1
))
ENGINE
INNODB
;
INSERT
INTO
b
VALUES
(
'b'
);
CREATE
TABLE
a1
(
a1
int
)
ENGINE
INNODB
;
INSERT
INTO
a1
VALUES
(
1
);
CREATE
TABLE
b1
(
b1
CHAR
(
2
))
ENGINE
INNODB
;
INSERT
INTO
b1
VALUES
(
'b1'
);
# Test renames before of after copying tablespaces
--
let
before_copy_test_t1
=
RENAME
TABLE
test
.
t1
TO
test
.
t1_renamed
--
let
after_copy_test_t2
=
RENAME
TABLE
test
.
t2
TO
test
.
t2_renamed
--
let
after_copy_test_t3
=
BEGIN
NOT
ATOMIC
RENAME
TABLE
test
.
t3
TO
test
.
t3_tmp
;
INSERT
INTO
test
.
t3_tmp
VALUES
(
3
);
RENAME
TABLE
test
.
t3_tmp
TO
test
.
t3
;
END
--
let
before_copy_test_t4
=
RENAME
TABLE
test
.
t4
TO
test
.
t4_tmp
--
let
after_copy_test_t4
=
RENAME
TABLE
test
.
t4_tmp
TO
test
.
t4
# Test circular renames
--
let
before_copy_test_b
=
RENAME
TABLE
test
.
a
to
test
.
tmp
,
test
.
b
to
test
.
a
,
test
.
tmp
to
test
.
b
--
let
after_copy_test_b1
=
RENAME
TABLE
test
.
a1
to
test
.
tmp
,
test
.
b1
to
test
.
a1
,
test
.
tmp
to
test
.
b1
--
disable_result_log
exec
$XTRABACKUP
--
defaults
-
file
=
$MYSQLTEST_VARDIR
/
my
.
cnf
--
backup
--
target
-
dir
=
$targetdir
--
dbug
=+
d
,
mariabackup_events
;
--
enable_result_log
--
let
before_copy_test_t1
=
''
--
let
after_copy_test_t2
=
''
--
let
before_copy_test_a
=
''
--
let
after_copy_test_a1
=
''
echo
# xtrabackup prepare;
--
disable_result_log
exec
$XTRABACKUP
--
prepare
--
target
-
dir
=
$targetdir
;
--
source
include
/
restart_and_restore
.
inc
--
enable_result_log
# the table was renamed from t1 to t1_renamed
# make sure t1 does not exist, and t1_renamed does.
CREATE
TABLE
t1
(
i
int
);
DROP
TABLE
t1
;
SELECT
*
from
t1_renamed
;
DROP
TABLE
t1_renamed
;
CREATE
TABLE
t2
(
i
int
);
DROP
TABLE
t2
;
SELECT
*
from
t2_renamed
;
DROP
TABLE
t2_renamed
;
#rename to itself
SELECT
*
from
t3
;
DROP
TABLE
t3
;
SELECT
*
from
t4
;
DROP
TABLE
t4
;
# For circular renames , make sure intermediate tables do not exist
CREATE
TABLE
tmp
(
i
int
);
DROP
TABLE
tmp
;
SELECT
*
FROM
a
;
SELECT
*
FROM
b
;
SELECT
*
FROM
a1
;
SELECT
*
FROM
b1
;
DROP
TABLE
a
,
b
,
a1
,
b1
;
rmdir
$targetdir
;
mysql-test/suite/mariabackup/rename_during_mdl_lock.result
View file @
922e7bad
CREATE TABLE t1(i int) ENGINE INNODB;
FOUND 1 /failed to execute query SELECT 1 FROM/ in backup.log
# xtrabackup prepare
# shutdown server
# remove datadir
# xtrabackup move back
# restart server
CREATE TABLE t1(i int);
DROP TABLE t1;
SELECT * from t2;
i
DROP TABLE t2;
mysql-test/suite/mariabackup/rename_during_mdl_lock.test
View file @
922e7bad
--
source
include
/
have_debug
.
inc
let
$targetdir
=
$MYSQLTEST_VARDIR
/
backup
;
let
$targetdir
=
$MYSQLTEST_VARDIR
/
tmp
/
backup
;
mkdir
$targetdir
;
CREATE
TABLE
t1
(
i
int
)
ENGINE
INNODB
;
--
error
1
exec
$XTRABACKUP
--
defaults
-
file
=
$MYSQLTEST_VARDIR
/
my
.
cnf
--
backup
--
target
-
dir
=
$targetdir
--
lock
-
ddl
-
per
-
table
--
dbug
=+
d
,
rename_during_mdl_lock_table
2
>
$targetdir
/
backup
.
log
;
exec
$XTRABACKUP
--
defaults
-
file
=
$MYSQLTEST_VARDIR
/
my
.
cnf
--
backup
--
target
-
dir
=
$targetdir
--
lock
-
ddl
-
per
-
table
--
dbug
=+
d
,
rename_during_mdl_lock_table
;
let
SEARCH_FILE
=
$targetdir
/
backup
.
log
;
let
SEARCH_PATTERN
=
failed
to
execute
query
SELECT
1
FROM
;
source
include
/
search_pattern_in_file
.
inc
;
echo
# xtrabackup prepare;
--
disable_result_log
exec
$XTRABACKUP
--
prepare
--
target
-
dir
=
$targetdir
;
--
source
include
/
restart_and_restore
.
inc
--
enable_result_log
# the table was renamed from t1 to t2
# make sure t1 does not exist, and t2 does
CREATE
TABLE
t1
(
i
int
);
DROP
TABLE
t1
;
SELECT
*
from
t2
;
DROP
TABLE
t2
;
rmdir
$targetdir
;
mysql-test/suite/mariabackup/suite.opt
View file @
922e7bad
--innodb --loose-changed_page_bitmaps --innodb-sys-tables --innodb-flush-log-at-trx-commit=2
--innodb --loose-changed_page_bitmaps --innodb-sys-tables --innodb-flush-log-at-trx-commit=2
--sequence
storage/innobase/include/log0recv.h
View file @
922e7bad
/*****************************************************************************
Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, MariaDB Corporation.
Copyright (c) 2017,
2018,
MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
...
...
@@ -153,9 +153,21 @@ bool recv_parse_log_recs(lsn_t checkpoint_lsn, store_t store, bool apply);
/** Moves the parsing buffer data left to the buffer start. */
void
recv_sys_justify_left_parsing_buf
();
/** Backup function checks whether the space id belongs to
the skip table list given in the mariabackup option. */
extern
bool
(
*
check_if_backup_includes
)(
ulint
space_id
);
/** Report optimized DDL operation (without redo log), corresponding to MLOG_INDEX_LOAD.
@param[in] space_id tablespace identifier
*/
extern
void
(
*
log_optimized_ddl_op
)(
ulint
space_id
);
/** Report an operation to create, delete, or rename a file during backup.
@param[in] space_id tablespace identifier
@param[in] flags tablespace flags (NULL if not create)
@param[in] name file name (not NUL-terminated)
@param[in] len length of name, in bytes
@param[in] new_name new file name (NULL if not rename)
@param[in] new_len length of new_name, in bytes (0 if NULL) */
extern
void
(
*
log_file_op
)(
ulint
space_id
,
const
byte
*
flags
,
const
byte
*
name
,
ulint
len
,
const
byte
*
new_name
,
ulint
new_len
);
/** Block of log record data */
struct
recv_data_t
{
...
...
storage/innobase/log/log0recv.cc
View file @
922e7bad
...
...
@@ -169,9 +169,21 @@ typedef std::map<
static
recv_spaces_t
recv_spaces
;
/** Backup function checks whether the space id belongs to
the skip table list given in the mariabackup option. */
bool
(
*
check_if_backup_includes
)(
ulint
space_id
);
/** Report optimized DDL operation (without redo log), corresponding to MLOG_INDEX_LOAD.
@param[in] space_id tablespace identifier
*/
void
(
*
log_optimized_ddl_op
)(
ulint
space_id
);
/** Report an operation to create, delete, or rename a file during backup.
@param[in] space_id tablespace identifier
@param[in] flags tablespace flags (NULL if not create)
@param[in] name file name (not NUL-terminated)
@param[in] len length of name, in bytes
@param[in] new_name new file name (NULL if not rename)
@param[in] new_len length of new_name, in bytes (0 if NULL) */
void
(
*
log_file_op
)(
ulint
space_id
,
const
byte
*
flags
,
const
byte
*
name
,
ulint
len
,
const
byte
*
new_name
,
ulint
new_len
);
/** Process a file name from a MLOG_FILE_* record.
@param[in,out] name file name
...
...
@@ -381,9 +393,13 @@ fil_name_parse(
fil_name_process
(
reinterpret_cast
<
char
*>
(
ptr
),
len
,
space_id
,
true
);
break
;
/* fall through */
case
MLOG_FILE_CREATE2
:
if
(
log_file_op
)
{
log_file_op
(
space_id
,
type
==
MLOG_FILE_CREATE2
?
ptr
-
4
:
NULL
,
ptr
,
len
,
NULL
,
0
);
}
break
;
case
MLOG_FILE_RENAME2
:
if
(
corrupt
)
{
...
...
@@ -424,6 +440,11 @@ fil_name_parse(
reinterpret_cast
<
char
*>
(
new_name
),
new_len
,
space_id
,
false
);
if
(
log_file_op
)
{
log_file_op
(
space_id
,
NULL
,
ptr
,
len
,
new_name
,
new_len
);
}
if
(
!
apply
)
{
break
;
}
...
...
@@ -2503,11 +2524,8 @@ bool recv_parse_log_recs(lsn_t checkpoint_lsn, store_t store, bool apply)
/* fall through */
case
MLOG_INDEX_LOAD
:
if
(
type
==
MLOG_INDEX_LOAD
)
{
if
(
check_if_backup_includes
&&
!
check_if_backup_includes
(
space
))
{
ut_ad
(
srv_operation
==
SRV_OPERATION_BACKUP
);
return
true
;
if
(
log_optimized_ddl_op
)
{
log_optimized_ddl_op
(
space
);
}
}
/* fall through */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment