mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
MDEV-14425 deprecate and ignore innodb_log_files_in_group
Now there can be only one log file instead of several which logically work as a single file. Possible names of redo log files: ib_logfile0, ib_logfile101 (for just created one) innodb_log_fiels_in_group: value of this variable is not used by InnoDB. Possible values are still 1..100, to not break upgrade LOG_FILE_NAME: add constant of value "ib_logfile0" LOG_FILE_NAME_PREFIX: add constant of value "ib_logfile" get_log_file_path(): convenience function that returns full path of a redo log file SRV_N_LOG_FILES_MAX: removed srv_n_log_files: we can't remove this for compatibility reasons, but now server doesn't use this variable log_sys_t::file::fd: now just one, not std::vector log_sys_t::log_capacity: removed word 'group' find_and_check_log_file(): part of logic from huge srv_start() moved here recv_sys_t::files: file descriptors of redo log files. There can be several of those in case we're upgrading from older MariaDB version. recv_sys_t::remove_extra_log_files: whether to remove ib_logfile{1,2,3...} after successfull upgrade. recv_sys_t::read(): open if needed and read from one of several log files recv_sys_t::files_size(): open if needed and return files count redo_file_sizes_are_correct(): check that redo log files sizes are equal. Just to log an error for a user. Corresponding check was moved from srv0start.cc namespace deprecated: put all deprecated variables here to prevent usage of it by us, developers
This commit is contained in:
@ -1863,24 +1863,25 @@ copy_back()
|
|||||||
dst_dir = (srv_log_group_home_dir && *srv_log_group_home_dir)
|
dst_dir = (srv_log_group_home_dir && *srv_log_group_home_dir)
|
||||||
? srv_log_group_home_dir : mysql_data_home;
|
? srv_log_group_home_dir : mysql_data_home;
|
||||||
|
|
||||||
/* --backup generates a single ib_logfile0, which we must copy
|
/* --backup generates a single LOG_FILE_NAME, which we must copy
|
||||||
if it exists. */
|
if it exists. */
|
||||||
|
|
||||||
ds_data = ds_create(dst_dir, DS_TYPE_LOCAL);
|
ds_data = ds_create(dst_dir, DS_TYPE_LOCAL);
|
||||||
MY_STAT stat_arg;
|
MY_STAT stat_arg;
|
||||||
if (!my_stat("ib_logfile0", &stat_arg, MYF(0)) || !stat_arg.st_size) {
|
if (!my_stat(LOG_FILE_NAME, &stat_arg, MYF(0)) || !stat_arg.st_size) {
|
||||||
/* After completed --prepare, redo log files are redundant.
|
/* After completed --prepare, redo log files are redundant.
|
||||||
We must delete any redo logs at the destination, so that
|
We must delete any redo logs at the destination, so that
|
||||||
the database will not jump to a different log sequence number
|
the database will not jump to a different log sequence number
|
||||||
(LSN). */
|
(LSN). */
|
||||||
|
|
||||||
for (uint i = 0; i <= SRV_N_LOG_FILES_MAX + 1; i++) {
|
char filename[FN_REFLEN];
|
||||||
char filename[FN_REFLEN];
|
snprintf(filename, sizeof filename, "%s/%s0", dst_dir,
|
||||||
snprintf(filename, sizeof filename, "%s/ib_logfile%u",
|
LOG_FILE_NAME_PREFIX);
|
||||||
dst_dir, i);
|
unlink(filename);
|
||||||
unlink(filename);
|
snprintf(filename, sizeof filename, "%s/%s101", dst_dir,
|
||||||
}
|
LOG_FILE_NAME_PREFIX);
|
||||||
} else if (!(ret = copy_or_move_file("ib_logfile0", "ib_logfile0",
|
unlink(filename);
|
||||||
|
} else if (!(ret = copy_or_move_file(LOG_FILE_NAME, LOG_FILE_NAME,
|
||||||
dst_dir, 1))) {
|
dst_dir, 1))) {
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
@ -1972,7 +1973,7 @@ copy_back()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* skip the redo log (it was already copied) */
|
/* skip the redo log (it was already copied) */
|
||||||
if (!strcmp(filename, "ib_logfile0")) {
|
if (!strcmp(filename, LOG_FILE_NAME)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -483,9 +483,7 @@ get_mysql_vars(MYSQL *connection)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (innodb_log_files_in_group_var) {
|
if (innodb_log_files_in_group_var) {
|
||||||
srv_n_log_files = strtol(
|
// deprecated
|
||||||
innodb_log_files_in_group_var, &endptr, 10);
|
|
||||||
ut_ad(*endptr == 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (innodb_log_file_size_var) {
|
if (innodb_log_file_size_var) {
|
||||||
@ -1573,7 +1571,6 @@ bool write_backup_config_file()
|
|||||||
"[mysqld]\n"
|
"[mysqld]\n"
|
||||||
"innodb_checksum_algorithm=%s\n"
|
"innodb_checksum_algorithm=%s\n"
|
||||||
"innodb_data_file_path=%s\n"
|
"innodb_data_file_path=%s\n"
|
||||||
"innodb_log_files_in_group=%lu\n"
|
|
||||||
"innodb_log_file_size=%llu\n"
|
"innodb_log_file_size=%llu\n"
|
||||||
"innodb_page_size=%lu\n"
|
"innodb_page_size=%lu\n"
|
||||||
"innodb_undo_directory=%s\n"
|
"innodb_undo_directory=%s\n"
|
||||||
@ -1583,7 +1580,6 @@ bool write_backup_config_file()
|
|||||||
"%s\n",
|
"%s\n",
|
||||||
innodb_checksum_algorithm_names[srv_checksum_algorithm],
|
innodb_checksum_algorithm_names[srv_checksum_algorithm],
|
||||||
make_local_paths(innobase_data_file_path).c_str(),
|
make_local_paths(innobase_data_file_path).c_str(),
|
||||||
srv_n_log_files,
|
|
||||||
srv_log_file_size,
|
srv_log_file_size,
|
||||||
srv_page_size,
|
srv_page_size,
|
||||||
srv_undo_dir,
|
srv_undo_dir,
|
||||||
|
@ -1166,6 +1166,10 @@ uint xb_client_options_count = array_elements(xb_client_options);
|
|||||||
static const char *dbug_option;
|
static const char *dbug_option;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
namespace deprecated {
|
||||||
|
extern ulong srv_n_log_files;
|
||||||
|
}
|
||||||
|
|
||||||
struct my_option xb_server_options[] =
|
struct my_option xb_server_options[] =
|
||||||
{
|
{
|
||||||
{"datadir", 'h', "Path to the database root.", (G_PTR*) &mysql_data_home,
|
{"datadir", 'h', "Path to the database root.", (G_PTR*) &mysql_data_home,
|
||||||
@ -1274,7 +1278,7 @@ struct my_option xb_server_options[] =
|
|||||||
UNIV_PAGE_SIZE_MAX, 0},
|
UNIV_PAGE_SIZE_MAX, 0},
|
||||||
{"innodb_log_files_in_group", OPT_INNODB_LOG_FILES_IN_GROUP,
|
{"innodb_log_files_in_group", OPT_INNODB_LOG_FILES_IN_GROUP,
|
||||||
"Ignored for mysqld option compatibility",
|
"Ignored for mysqld option compatibility",
|
||||||
&srv_n_log_files, &srv_n_log_files,
|
&deprecated::srv_n_log_files, &deprecated::srv_n_log_files,
|
||||||
0, GET_LONG, REQUIRED_ARG, 1, 1, 100, 0, 1, 0},
|
0, GET_LONG, REQUIRED_ARG, 1, 1, 100, 0, 1, 0},
|
||||||
{"innodb_log_group_home_dir", OPT_INNODB_LOG_GROUP_HOME_DIR,
|
{"innodb_log_group_home_dir", OPT_INNODB_LOG_GROUP_HOME_DIR,
|
||||||
"Path to InnoDB log files.", &srv_log_group_home_dir,
|
"Path to InnoDB log files.", &srv_log_group_home_dir,
|
||||||
@ -2894,7 +2898,7 @@ Initialize the appropriate datasink(s). Both local backups and streaming in the
|
|||||||
|
|
||||||
Otherwise (i.e. when streaming in the 'tar' format) we need 2 separate datasinks
|
Otherwise (i.e. when streaming in the 'tar' format) we need 2 separate datasinks
|
||||||
for the data stream (and don't allow parallel data copying) and for metainfo
|
for the data stream (and don't allow parallel data copying) and for metainfo
|
||||||
files (including ib_logfile0). The second datasink writes to temporary
|
files (including LOG_FILE_NAME). The second datasink writes to temporary
|
||||||
files first, and then streams them in a serialized way when closed. */
|
files first, and then streams them in a serialized way when closed. */
|
||||||
static void
|
static void
|
||||||
xtrabackup_init_datasinks(void)
|
xtrabackup_init_datasinks(void)
|
||||||
@ -3760,36 +3764,6 @@ xb_filters_free()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**Create log file metadata.
|
|
||||||
@param[in] i log file number in group
|
|
||||||
@param[in,out] file_names redo log file names */
|
|
||||||
static
|
|
||||||
void
|
|
||||||
open_or_create_log_file(
|
|
||||||
ulint i,
|
|
||||||
std::vector<std::string> &file_names)
|
|
||||||
{
|
|
||||||
char name[FN_REFLEN];
|
|
||||||
ulint dirnamelen;
|
|
||||||
|
|
||||||
os_normalize_path(srv_log_group_home_dir);
|
|
||||||
|
|
||||||
dirnamelen = strlen(srv_log_group_home_dir);
|
|
||||||
ut_a(dirnamelen < (sizeof name) - 10 - sizeof "ib_logfile");
|
|
||||||
memcpy(name, srv_log_group_home_dir, dirnamelen);
|
|
||||||
|
|
||||||
/* Add a path separator if needed. */
|
|
||||||
if (dirnamelen && name[dirnamelen - 1] != OS_PATH_SEPARATOR) {
|
|
||||||
name[dirnamelen++] = OS_PATH_SEPARATOR;
|
|
||||||
}
|
|
||||||
|
|
||||||
sprintf(name + dirnamelen, "%s%zu", "ib_logfile", i);
|
|
||||||
|
|
||||||
ut_a(fil_validate());
|
|
||||||
|
|
||||||
file_names.emplace_back(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
Set the open files limit. Based on set_max_open_files().
|
Set the open files limit. Based on set_max_open_files().
|
||||||
|
|
||||||
@ -4046,15 +4020,8 @@ fail:
|
|||||||
SRV_MAX_N_PENDING_SYNC_IOS);
|
SRV_MAX_N_PENDING_SYNC_IOS);
|
||||||
|
|
||||||
log_sys.create();
|
log_sys.create();
|
||||||
log_sys.log.create(srv_n_log_files);
|
log_sys.log.create();
|
||||||
|
log_sys.log.open_file(get_log_file_path());
|
||||||
std::vector<std::string> file_names;
|
|
||||||
|
|
||||||
for (ulint i = 0; i < srv_n_log_files; i++) {
|
|
||||||
open_or_create_log_file(i, file_names);
|
|
||||||
}
|
|
||||||
|
|
||||||
log_sys.log.open_files(std::move(file_names));
|
|
||||||
|
|
||||||
/* create extra LSN dir if it does not exist. */
|
/* create extra LSN dir if it does not exist. */
|
||||||
if (xtrabackup_extra_lsndir
|
if (xtrabackup_extra_lsndir
|
||||||
@ -4123,10 +4090,10 @@ reread_log_header:
|
|||||||
|
|
||||||
/* open the log file */
|
/* open the log file */
|
||||||
memset(&stat_info, 0, sizeof(MY_STAT));
|
memset(&stat_info, 0, sizeof(MY_STAT));
|
||||||
dst_log_file = ds_open(ds_redo, "ib_logfile0", &stat_info);
|
dst_log_file = ds_open(ds_redo, LOG_FILE_NAME, &stat_info);
|
||||||
if (dst_log_file == NULL) {
|
if (dst_log_file == NULL) {
|
||||||
msg("Error: failed to open the target stream for "
|
msg("Error: failed to open the target stream for '%s'.",
|
||||||
"'ib_logfile0'.");
|
LOG_FILE_NAME);
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4147,7 +4114,7 @@ reread_log_header:
|
|||||||
log_hdr_field +=
|
log_hdr_field +=
|
||||||
(log_sys.next_checkpoint_no & 1) ? LOG_CHECKPOINT_2 : LOG_CHECKPOINT_1;
|
(log_sys.next_checkpoint_no & 1) ? LOG_CHECKPOINT_2 : LOG_CHECKPOINT_1;
|
||||||
/* The least significant bits of LOG_CHECKPOINT_OFFSET must be
|
/* The least significant bits of LOG_CHECKPOINT_OFFSET must be
|
||||||
stored correctly in the copy of the ib_logfile. The most significant
|
stored correctly in the copy of the LOG_FILE_NAME. The most significant
|
||||||
bits, which identify the start offset of the log block in the file,
|
bits, which identify the start offset of the log block in the file,
|
||||||
we did choose freely, as LOG_FILE_HDR_SIZE. */
|
we did choose freely, as LOG_FILE_HDR_SIZE. */
|
||||||
ut_ad(!((log_sys.log.get_lsn() ^ checkpoint_lsn_start)
|
ut_ad(!((log_sys.log.get_lsn() ^ checkpoint_lsn_start)
|
||||||
|
@ -54,7 +54,6 @@ loose-innodb_write_io_threads= 2
|
|||||||
loose-innodb_read_io_threads= 2
|
loose-innodb_read_io_threads= 2
|
||||||
loose-innodb_log_buffer_size= 1M
|
loose-innodb_log_buffer_size= 1M
|
||||||
loose-innodb_log_file_size= 10M
|
loose-innodb_log_file_size= 10M
|
||||||
loose-innodb_log_files_in_group= 1
|
|
||||||
loose-innodb-stats-persistent= OFF
|
loose-innodb-stats-persistent= OFF
|
||||||
|
|
||||||
slave-net-timeout=120
|
slave-net-timeout=120
|
||||||
|
@ -40,7 +40,7 @@ NOT FOUND /private|secret|sacr(ed|ament)|success|story|secur(e|ity)/ in t0.ibd
|
|||||||
# ib_logfile0 expecting NOT FOUND
|
# ib_logfile0 expecting NOT FOUND
|
||||||
NOT FOUND /private|secret|sacr(ed|ament)|success|story|secur(e|ity)/ in ib_logfile0
|
NOT FOUND /private|secret|sacr(ed|ament)|success|story|secur(e|ity)/ in ib_logfile0
|
||||||
# Restart without redo log encryption
|
# Restart without redo log encryption
|
||||||
# restart: --skip-innodb-encrypt-log --innodb-log-files-in-group=1
|
# restart: --skip-innodb-encrypt-log
|
||||||
SELECT COUNT(*) FROM t0;
|
SELECT COUNT(*) FROM t0;
|
||||||
COUNT(*)
|
COUNT(*)
|
||||||
1024
|
1024
|
||||||
|
@ -53,13 +53,14 @@ AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
|||||||
COUNT(*)
|
COUNT(*)
|
||||||
0
|
0
|
||||||
FOUND 1 /InnoDB: Log file .*ib_logfile1 is of different size 1048576 bytes than other log files 2097152 bytes!/ in mysqld.1.err
|
FOUND 1 /InnoDB: Log file .*ib_logfile1 is of different size 1048576 bytes than other log files 2097152 bytes!/ in mysqld.1.err
|
||||||
|
FOUND 1 /InnoDB: Upgrade after a crash is not supported\. The redo log was created with BogoDB 1\.2\.3\.4, and it appears corrupted\./ in mysqld.1.err
|
||||||
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=2m
|
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=2m
|
||||||
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
|
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
|
||||||
WHERE engine = 'innodb'
|
WHERE engine = 'innodb'
|
||||||
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
||||||
COUNT(*)
|
COUNT(*)
|
||||||
0
|
0
|
||||||
FOUND 1 /InnoDB: Upgrade after a crash is not supported\. The redo log was created with BogoDB 1\.2\.3\.4, and it appears corrupted\./ in mysqld.1.err
|
FOUND 2 /InnoDB: Upgrade after a crash is not supported\. The redo log was created with BogoDB 1\.2\.3\.4, and it appears corrupted\./ in mysqld.1.err
|
||||||
# Empty multi-file redo log from after MariaDB 10.2.2
|
# Empty multi-file redo log from after MariaDB 10.2.2
|
||||||
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=2m
|
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=2m
|
||||||
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
|
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
|
||||||
|
@ -3,5 +3,4 @@
|
|||||||
--plugin-load-add=$FILE_KEY_MANAGEMENT_SO
|
--plugin-load-add=$FILE_KEY_MANAGEMENT_SO
|
||||||
--loose-file-key-management
|
--loose-file-key-management
|
||||||
--loose-file-key-management-filename=$MYSQL_TEST_DIR/std_data/logkey.txt
|
--loose-file-key-management-filename=$MYSQL_TEST_DIR/std_data/logkey.txt
|
||||||
--innodb-log-files-in-group=1
|
|
||||||
--file-key-management-encryption-algorithm=aes_cbc
|
--file-key-management-encryption-algorithm=aes_cbc
|
||||||
|
@ -59,7 +59,7 @@ INSERT INTO t0
|
|||||||
-- source include/search_pattern_in_file.inc
|
-- source include/search_pattern_in_file.inc
|
||||||
|
|
||||||
--echo # Restart without redo log encryption
|
--echo # Restart without redo log encryption
|
||||||
-- let $restart_parameters=--skip-innodb-encrypt-log --innodb-log-files-in-group=1
|
-- let $restart_parameters=--skip-innodb-encrypt-log
|
||||||
-- source include/start_mysqld.inc
|
-- source include/start_mysqld.inc
|
||||||
|
|
||||||
SELECT COUNT(*) FROM t0;
|
SELECT COUNT(*) FROM t0;
|
||||||
|
@ -9,8 +9,6 @@
|
|||||||
--copy_file $bugdir/bak_ibdata1 $bugdir/ibdata1
|
--copy_file $bugdir/bak_ibdata1 $bugdir/ibdata1
|
||||||
--copy_file $bugdir/bak_ibdata2 $bugdir/ibdata2
|
--copy_file $bugdir/bak_ibdata2 $bugdir/ibdata2
|
||||||
--copy_file $bugdir/bak_ib_logfile0 $bugdir/ib_logfile0
|
--copy_file $bugdir/bak_ib_logfile0 $bugdir/ib_logfile0
|
||||||
--copy_file $bugdir/bak_ib_logfile1 $bugdir/ib_logfile1
|
|
||||||
--copy_file $bugdir/bak_ib_logfile2 $bugdir/ib_logfile2
|
|
||||||
--copy_file $bugdir/bak_undo001 $bugdir/undo001
|
--copy_file $bugdir/bak_undo001 $bugdir/undo001
|
||||||
--copy_file $bugdir/bak_undo002 $bugdir/undo002
|
--copy_file $bugdir/bak_undo002 $bugdir/undo002
|
||||||
--copy_file $bugdir/bak_undo003 $bugdir/undo003
|
--copy_file $bugdir/bak_undo003 $bugdir/undo003
|
||||||
|
@ -53,13 +53,14 @@ AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
|||||||
COUNT(*)
|
COUNT(*)
|
||||||
0
|
0
|
||||||
FOUND 1 /InnoDB: Log file .*ib_logfile1 is of different size 1048576 bytes than other log files 2097152 bytes!/ in mysqld.1.err
|
FOUND 1 /InnoDB: Log file .*ib_logfile1 is of different size 1048576 bytes than other log files 2097152 bytes!/ in mysqld.1.err
|
||||||
|
FOUND 1 /InnoDB: Upgrade after a crash is not supported\. The redo log was created with BogoDB 1\.2\.3\.4, and it appears corrupted\./ in mysqld.1.err
|
||||||
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=2m
|
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=2m
|
||||||
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
|
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
|
||||||
WHERE engine = 'innodb'
|
WHERE engine = 'innodb'
|
||||||
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
||||||
COUNT(*)
|
COUNT(*)
|
||||||
0
|
0
|
||||||
FOUND 1 /InnoDB: Upgrade after a crash is not supported\. The redo log was created with BogoDB 1\.2\.3\.4, and it appears corrupted\./ in mysqld.1.err
|
FOUND 2 /InnoDB: Upgrade after a crash is not supported\. The redo log was created with BogoDB 1\.2\.3\.4, and it appears corrupted\./ in mysqld.1.err
|
||||||
# Empty multi-file redo log from after MariaDB 10.2.2
|
# Empty multi-file redo log from after MariaDB 10.2.2
|
||||||
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=2m
|
# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_corruption --innodb-force-recovery=5 --innodb-log-file-size=2m
|
||||||
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
|
SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES
|
||||||
|
@ -2,15 +2,15 @@
|
|||||||
# Bug#16691130 - ASSERT WHEN INNODB_LOG_GROUP_HOME_DIR DOES NOT EXIST
|
# Bug#16691130 - ASSERT WHEN INNODB_LOG_GROUP_HOME_DIR DOES NOT EXIST
|
||||||
# Bug#16418661 - CHANGING NAME IN FOR INNODB_DATA_FILE_PATH SHOULD NOT SUCCEED WITH LOG FILES
|
# Bug#16418661 - CHANGING NAME IN FOR INNODB_DATA_FILE_PATH SHOULD NOT SUCCEED WITH LOG FILES
|
||||||
# Start mysqld without the possibility to create innodb_undo_tablespaces
|
# Start mysqld without the possibility to create innodb_undo_tablespaces
|
||||||
# restart: --innodb-log-files-in-group=3 --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-directory=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-logs=20 --innodb-undo-tablespaces=3 --innodb-data-file-path=ibdata1:16M;ibdata2:10M:autoextend
|
# restart: --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-directory=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-logs=20 --innodb-undo-tablespaces=3 --innodb-data-file-path=ibdata1:16M;ibdata2:10M:autoextend
|
||||||
SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
||||||
WHERE engine = 'innodb'
|
WHERE engine = 'innodb'
|
||||||
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
||||||
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
|
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
|
||||||
FOUND 1 /\[ERROR\] InnoDB: Could not create undo tablespace '.*undo002'/ in mysqld.1.err
|
FOUND 1 /\[ERROR\] InnoDB: Could not create undo tablespace '.*undo002'/ in mysqld.1.err
|
||||||
# Remove undo001,undo002,ibdata1,ibdata2,ib_logfile1,ib_logfile2,ib_logfile101
|
# Remove undo001,undo002,ibdata1,ibdata2,ib_logfile101
|
||||||
# Start mysqld with non existent innodb_log_group_home_dir
|
# Start mysqld with non existent innodb_log_group_home_dir
|
||||||
# restart: --innodb-log-files-in-group=3 --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-directory=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-logs=20 --innodb-undo-tablespaces=3 --innodb-data-file-path=ibdata1:16M;ibdata2:10M:autoextend --innodb_log_group_home_dir=/path/to/non-existent/
|
# restart: --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-directory=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-logs=20 --innodb-undo-tablespaces=3 --innodb-data-file-path=ibdata1:16M;ibdata2:10M:autoextend --innodb_log_group_home_dir=/path/to/non-existent/
|
||||||
SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
||||||
WHERE engine = 'innodb'
|
WHERE engine = 'innodb'
|
||||||
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
||||||
@ -18,7 +18,7 @@ ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
|
|||||||
FOUND 1 /File .path.to.non-existent.*ib_logfile101: 'create' returned OS error \d+/ in mysqld.1.err
|
FOUND 1 /File .path.to.non-existent.*ib_logfile101: 'create' returned OS error \d+/ in mysqld.1.err
|
||||||
# Remove ibdata1 & ibdata2
|
# Remove ibdata1 & ibdata2
|
||||||
# Successfully let InnoDB create tablespaces
|
# Successfully let InnoDB create tablespaces
|
||||||
# restart: --innodb-log-files-in-group=3 --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-directory=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-logs=20 --innodb-undo-tablespaces=3 --innodb-data-file-path=ibdata1:16M;ibdata2:10M:autoextend
|
# restart: --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-directory=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-logs=20 --innodb-undo-tablespaces=3 --innodb-data-file-path=ibdata1:16M;ibdata2:10M:autoextend
|
||||||
SELECT COUNT(*) `1` FROM INFORMATION_SCHEMA.ENGINES
|
SELECT COUNT(*) `1` FROM INFORMATION_SCHEMA.ENGINES
|
||||||
WHERE engine='innodb'
|
WHERE engine='innodb'
|
||||||
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
||||||
@ -26,15 +26,13 @@ AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
|||||||
1
|
1
|
||||||
# Backup tmp/logfile/*
|
# Backup tmp/logfile/*
|
||||||
# 1. With ibdata2, Without ibdata1
|
# 1. With ibdata2, Without ibdata1
|
||||||
# restart: --innodb-log-files-in-group=3 --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-directory=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-logs=20 --innodb-undo-tablespaces=3 --innodb-data-file-path=ibdata1:16M;ibdata2:10M:autoextend
|
# restart: --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-directory=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-logs=20 --innodb-undo-tablespaces=3 --innodb-data-file-path=ibdata1:16M;ibdata2:10M:autoextend
|
||||||
SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
||||||
WHERE engine = 'innodb'
|
WHERE engine = 'innodb'
|
||||||
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
||||||
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
|
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
|
||||||
FOUND 1 /The innodb_system data file 'ibdata1' was not found but one of the other data files 'ibdata2' exists/ in mysqld.1.err
|
FOUND 1 /The innodb_system data file 'ibdata1' was not found but one of the other data files 'ibdata2' exists/ in mysqld.1.err
|
||||||
bak_ib_logfile0
|
bak_ib_logfile0
|
||||||
bak_ib_logfile1
|
|
||||||
bak_ib_logfile2
|
|
||||||
bak_ibdata1
|
bak_ibdata1
|
||||||
bak_ibdata2
|
bak_ibdata2
|
||||||
bak_undo001
|
bak_undo001
|
||||||
@ -42,14 +40,12 @@ bak_undo002
|
|||||||
bak_undo003
|
bak_undo003
|
||||||
ib_buffer_pool
|
ib_buffer_pool
|
||||||
ib_logfile0
|
ib_logfile0
|
||||||
ib_logfile1
|
|
||||||
ib_logfile2
|
|
||||||
ibdata2
|
ibdata2
|
||||||
undo001
|
undo001
|
||||||
undo002
|
undo002
|
||||||
undo003
|
undo003
|
||||||
# 2. With ibdata1, without ibdata2
|
# 2. With ibdata1, without ibdata2
|
||||||
# restart: --innodb-log-files-in-group=3 --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-directory=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-logs=20 --innodb-undo-tablespaces=3 --innodb-data-file-path=ibdata1:16M;ibdata2:10M:autoextend
|
# restart: --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-directory=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-logs=20 --innodb-undo-tablespaces=3 --innodb-data-file-path=ibdata1:16M;ibdata2:10M:autoextend
|
||||||
SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
||||||
WHERE engine = 'innodb'
|
WHERE engine = 'innodb'
|
||||||
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
||||||
@ -57,8 +53,6 @@ ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
|
|||||||
FOUND 1 /InnoDB: Tablespace size stored in header is \d+ pages, but the sum of data file sizes is \d+ pages/ in mysqld.1.err
|
FOUND 1 /InnoDB: Tablespace size stored in header is \d+ pages, but the sum of data file sizes is \d+ pages/ in mysqld.1.err
|
||||||
FOUND 1 /InnoDB: Cannot start InnoDB. The tail of the system tablespace is missing/ in mysqld.1.err
|
FOUND 1 /InnoDB: Cannot start InnoDB. The tail of the system tablespace is missing/ in mysqld.1.err
|
||||||
bak_ib_logfile0
|
bak_ib_logfile0
|
||||||
bak_ib_logfile1
|
|
||||||
bak_ib_logfile2
|
|
||||||
bak_ibdata1
|
bak_ibdata1
|
||||||
bak_ibdata2
|
bak_ibdata2
|
||||||
bak_undo001
|
bak_undo001
|
||||||
@ -66,8 +60,6 @@ bak_undo002
|
|||||||
bak_undo003
|
bak_undo003
|
||||||
ib_buffer_pool
|
ib_buffer_pool
|
||||||
ib_logfile0
|
ib_logfile0
|
||||||
ib_logfile1
|
|
||||||
ib_logfile2
|
|
||||||
ibdata1
|
ibdata1
|
||||||
ibdata2
|
ibdata2
|
||||||
undo001
|
undo001
|
||||||
@ -75,8 +67,6 @@ undo002
|
|||||||
undo003
|
undo003
|
||||||
# 3. Without ibdata1 & ibdata2
|
# 3. Without ibdata1 & ibdata2
|
||||||
bak_ib_logfile0
|
bak_ib_logfile0
|
||||||
bak_ib_logfile1
|
|
||||||
bak_ib_logfile2
|
|
||||||
bak_ibdata1
|
bak_ibdata1
|
||||||
bak_ibdata2
|
bak_ibdata2
|
||||||
bak_undo001
|
bak_undo001
|
||||||
@ -84,20 +74,16 @@ bak_undo002
|
|||||||
bak_undo003
|
bak_undo003
|
||||||
ib_buffer_pool
|
ib_buffer_pool
|
||||||
ib_logfile0
|
ib_logfile0
|
||||||
ib_logfile1
|
|
||||||
ib_logfile2
|
|
||||||
undo001
|
undo001
|
||||||
undo002
|
undo002
|
||||||
undo003
|
undo003
|
||||||
# restart: --innodb-log-files-in-group=3 --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-directory=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-logs=20 --innodb-undo-tablespaces=3 --innodb-data-file-path=ibdata1:16M;ibdata2:10M:autoextend
|
# restart: --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-directory=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-logs=20 --innodb-undo-tablespaces=3 --innodb-data-file-path=ibdata1:16M;ibdata2:10M:autoextend
|
||||||
SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
||||||
WHERE engine = 'innodb'
|
WHERE engine = 'innodb'
|
||||||
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
||||||
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
|
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
|
||||||
FOUND 1 /InnoDB: undo tablespace .*undo001.* exists\. Creating system tablespace with existing undo tablespaces is not supported\. Please delete all undo tablespaces before creating new system tablespace\./ in mysqld.1.err
|
FOUND 1 /InnoDB: undo tablespace .*undo001.* exists\. Creating system tablespace with existing undo tablespaces is not supported\. Please delete all undo tablespaces before creating new system tablespace\./ in mysqld.1.err
|
||||||
bak_ib_logfile0
|
bak_ib_logfile0
|
||||||
bak_ib_logfile1
|
|
||||||
bak_ib_logfile2
|
|
||||||
bak_ibdata1
|
bak_ibdata1
|
||||||
bak_ibdata2
|
bak_ibdata2
|
||||||
bak_undo001
|
bak_undo001
|
||||||
@ -105,15 +91,11 @@ bak_undo002
|
|||||||
bak_undo003
|
bak_undo003
|
||||||
ib_buffer_pool
|
ib_buffer_pool
|
||||||
ib_logfile0
|
ib_logfile0
|
||||||
ib_logfile1
|
|
||||||
ib_logfile2
|
|
||||||
undo001
|
undo001
|
||||||
undo002
|
undo002
|
||||||
undo003
|
undo003
|
||||||
# 4. Without ibdata*, ib_logfile* and with undo00*
|
# 4. Without ibdata*, ib_logfile* and with undo00*
|
||||||
bak_ib_logfile0
|
bak_ib_logfile0
|
||||||
bak_ib_logfile1
|
|
||||||
bak_ib_logfile2
|
|
||||||
bak_ibdata1
|
bak_ibdata1
|
||||||
bak_ibdata2
|
bak_ibdata2
|
||||||
bak_undo001
|
bak_undo001
|
||||||
@ -123,14 +105,12 @@ ib_buffer_pool
|
|||||||
undo001
|
undo001
|
||||||
undo002
|
undo002
|
||||||
undo003
|
undo003
|
||||||
# restart: --innodb-log-files-in-group=3 --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-directory=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-logs=20 --innodb-undo-tablespaces=3 --innodb-data-file-path=ibdata1:16M;ibdata2:10M:autoextend
|
# restart: --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-directory=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-logs=20 --innodb-undo-tablespaces=3 --innodb-data-file-path=ibdata1:16M;ibdata2:10M:autoextend
|
||||||
SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
||||||
WHERE engine = 'innodb'
|
WHERE engine = 'innodb'
|
||||||
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
||||||
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
|
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
|
||||||
bak_ib_logfile0
|
bak_ib_logfile0
|
||||||
bak_ib_logfile1
|
|
||||||
bak_ib_logfile2
|
|
||||||
bak_ibdata1
|
bak_ibdata1
|
||||||
bak_ibdata2
|
bak_ibdata2
|
||||||
bak_undo001
|
bak_undo001
|
||||||
@ -142,8 +122,6 @@ undo002
|
|||||||
undo003
|
undo003
|
||||||
# 5. Without ibdata*,ib_logfile* files & Without undo002
|
# 5. Without ibdata*,ib_logfile* files & Without undo002
|
||||||
bak_ib_logfile0
|
bak_ib_logfile0
|
||||||
bak_ib_logfile1
|
|
||||||
bak_ib_logfile2
|
|
||||||
bak_ibdata1
|
bak_ibdata1
|
||||||
bak_ibdata2
|
bak_ibdata2
|
||||||
bak_undo001
|
bak_undo001
|
||||||
@ -152,14 +130,12 @@ bak_undo003
|
|||||||
ib_buffer_pool
|
ib_buffer_pool
|
||||||
undo001
|
undo001
|
||||||
undo003
|
undo003
|
||||||
# restart: --innodb-log-files-in-group=3 --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-directory=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-logs=20 --innodb-undo-tablespaces=3 --innodb-data-file-path=ibdata1:16M;ibdata2:10M:autoextend
|
# restart: --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-directory=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-logs=20 --innodb-undo-tablespaces=3 --innodb-data-file-path=ibdata1:16M;ibdata2:10M:autoextend
|
||||||
SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
||||||
WHERE engine = 'innodb'
|
WHERE engine = 'innodb'
|
||||||
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
||||||
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
|
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
|
||||||
bak_ib_logfile0
|
bak_ib_logfile0
|
||||||
bak_ib_logfile1
|
|
||||||
bak_ib_logfile2
|
|
||||||
bak_ibdata1
|
bak_ibdata1
|
||||||
bak_ibdata2
|
bak_ibdata2
|
||||||
bak_undo001
|
bak_undo001
|
||||||
@ -170,8 +146,6 @@ undo001
|
|||||||
undo003
|
undo003
|
||||||
# 6. Without ibdata*,ib_logfile* files & Without undo001, undo002
|
# 6. Without ibdata*,ib_logfile* files & Without undo001, undo002
|
||||||
bak_ib_logfile0
|
bak_ib_logfile0
|
||||||
bak_ib_logfile1
|
|
||||||
bak_ib_logfile2
|
|
||||||
bak_ibdata1
|
bak_ibdata1
|
||||||
bak_ibdata2
|
bak_ibdata2
|
||||||
bak_undo001
|
bak_undo001
|
||||||
@ -179,15 +153,13 @@ bak_undo002
|
|||||||
bak_undo003
|
bak_undo003
|
||||||
ib_buffer_pool
|
ib_buffer_pool
|
||||||
undo003
|
undo003
|
||||||
# restart: --innodb-log-files-in-group=3 --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-directory=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-logs=20 --innodb-undo-tablespaces=3 --innodb-data-file-path=ibdata1:16M;ibdata2:10M:autoextend
|
# restart: --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-directory=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-logs=20 --innodb-undo-tablespaces=3 --innodb-data-file-path=ibdata1:16M;ibdata2:10M:autoextend
|
||||||
SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
||||||
WHERE engine = 'innodb'
|
WHERE engine = 'innodb'
|
||||||
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
||||||
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
|
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
|
||||||
FOUND 1 /undo tablespace .*undo003.* exists\. Creating system tablespace with existing undo tablespaces is not supported\. Please delete all undo tablespaces before creating new system tablespace\./ in mysqld.1.err
|
FOUND 1 /undo tablespace .*undo003.* exists\. Creating system tablespace with existing undo tablespaces is not supported\. Please delete all undo tablespaces before creating new system tablespace\./ in mysqld.1.err
|
||||||
bak_ib_logfile0
|
bak_ib_logfile0
|
||||||
bak_ib_logfile1
|
|
||||||
bak_ib_logfile2
|
|
||||||
bak_ibdata1
|
bak_ibdata1
|
||||||
bak_ibdata2
|
bak_ibdata2
|
||||||
bak_undo001
|
bak_undo001
|
||||||
@ -197,8 +169,6 @@ ib_buffer_pool
|
|||||||
undo003
|
undo003
|
||||||
# 7. With ibdata files & Without undo002
|
# 7. With ibdata files & Without undo002
|
||||||
bak_ib_logfile0
|
bak_ib_logfile0
|
||||||
bak_ib_logfile1
|
|
||||||
bak_ib_logfile2
|
|
||||||
bak_ibdata1
|
bak_ibdata1
|
||||||
bak_ibdata2
|
bak_ibdata2
|
||||||
bak_undo001
|
bak_undo001
|
||||||
@ -206,21 +176,17 @@ bak_undo002
|
|||||||
bak_undo003
|
bak_undo003
|
||||||
ib_buffer_pool
|
ib_buffer_pool
|
||||||
ib_logfile0
|
ib_logfile0
|
||||||
ib_logfile1
|
|
||||||
ib_logfile2
|
|
||||||
ibdata1
|
ibdata1
|
||||||
ibdata2
|
ibdata2
|
||||||
undo001
|
undo001
|
||||||
undo003
|
undo003
|
||||||
# restart: --innodb-log-files-in-group=3 --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-directory=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-logs=20 --innodb-undo-tablespaces=3 --innodb-data-file-path=ibdata1:16M;ibdata2:10M:autoextend
|
# restart: --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-directory=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-logs=20 --innodb-undo-tablespaces=3 --innodb-data-file-path=ibdata1:16M;ibdata2:10M:autoextend
|
||||||
SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
||||||
WHERE engine = 'innodb'
|
WHERE engine = 'innodb'
|
||||||
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
||||||
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
|
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
|
||||||
FOUND 1 /InnoDB: Expected to open innodb_undo_tablespaces=3 but was able to find only 1/ in mysqld.1.err
|
FOUND 1 /InnoDB: Expected to open innodb_undo_tablespaces=3 but was able to find only 1/ in mysqld.1.err
|
||||||
bak_ib_logfile0
|
bak_ib_logfile0
|
||||||
bak_ib_logfile1
|
|
||||||
bak_ib_logfile2
|
|
||||||
bak_ibdata1
|
bak_ibdata1
|
||||||
bak_ibdata2
|
bak_ibdata2
|
||||||
bak_undo001
|
bak_undo001
|
||||||
@ -228,16 +194,12 @@ bak_undo002
|
|||||||
bak_undo003
|
bak_undo003
|
||||||
ib_buffer_pool
|
ib_buffer_pool
|
||||||
ib_logfile0
|
ib_logfile0
|
||||||
ib_logfile1
|
|
||||||
ib_logfile2
|
|
||||||
ibdata1
|
ibdata1
|
||||||
ibdata2
|
ibdata2
|
||||||
undo001
|
undo001
|
||||||
undo003
|
undo003
|
||||||
# 8. With ibdata files & Without undo001, undo002
|
# 8. With ibdata files & Without undo001, undo002
|
||||||
bak_ib_logfile0
|
bak_ib_logfile0
|
||||||
bak_ib_logfile1
|
|
||||||
bak_ib_logfile2
|
|
||||||
bak_ibdata1
|
bak_ibdata1
|
||||||
bak_ibdata2
|
bak_ibdata2
|
||||||
bak_undo001
|
bak_undo001
|
||||||
@ -245,20 +207,16 @@ bak_undo002
|
|||||||
bak_undo003
|
bak_undo003
|
||||||
ib_buffer_pool
|
ib_buffer_pool
|
||||||
ib_logfile0
|
ib_logfile0
|
||||||
ib_logfile1
|
|
||||||
ib_logfile2
|
|
||||||
ibdata1
|
ibdata1
|
||||||
ibdata2
|
ibdata2
|
||||||
undo003
|
undo003
|
||||||
# restart: --innodb-log-files-in-group=3 --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-directory=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-logs=20 --innodb-undo-tablespaces=3 --innodb-data-file-path=ibdata1:16M;ibdata2:10M:autoextend
|
# restart: --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-directory=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-logs=20 --innodb-undo-tablespaces=3 --innodb-data-file-path=ibdata1:16M;ibdata2:10M:autoextend
|
||||||
SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
||||||
WHERE engine = 'innodb'
|
WHERE engine = 'innodb'
|
||||||
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
||||||
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
|
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
|
||||||
FOUND 1 /InnoDB: Expected to open innodb_undo_tablespaces=3 but was able to find only 0/ in mysqld.1.err
|
FOUND 1 /InnoDB: Expected to open innodb_undo_tablespaces=3 but was able to find only 0/ in mysqld.1.err
|
||||||
bak_ib_logfile0
|
bak_ib_logfile0
|
||||||
bak_ib_logfile1
|
|
||||||
bak_ib_logfile2
|
|
||||||
bak_ibdata1
|
bak_ibdata1
|
||||||
bak_ibdata2
|
bak_ibdata2
|
||||||
bak_undo001
|
bak_undo001
|
||||||
@ -266,15 +224,11 @@ bak_undo002
|
|||||||
bak_undo003
|
bak_undo003
|
||||||
ib_buffer_pool
|
ib_buffer_pool
|
||||||
ib_logfile0
|
ib_logfile0
|
||||||
ib_logfile1
|
|
||||||
ib_logfile2
|
|
||||||
ibdata1
|
ibdata1
|
||||||
ibdata2
|
ibdata2
|
||||||
undo003
|
undo003
|
||||||
# 9. Without ibdata*, without undo*, Without ib_logfile1 and with ib_logfile2
|
# 9. Without ibdata*, without undo*
|
||||||
bak_ib_logfile0
|
bak_ib_logfile0
|
||||||
bak_ib_logfile1
|
|
||||||
bak_ib_logfile2
|
|
||||||
bak_ibdata1
|
bak_ibdata1
|
||||||
bak_ibdata2
|
bak_ibdata2
|
||||||
bak_undo001
|
bak_undo001
|
||||||
@ -282,17 +236,13 @@ bak_undo002
|
|||||||
bak_undo003
|
bak_undo003
|
||||||
ib_buffer_pool
|
ib_buffer_pool
|
||||||
ib_logfile0
|
ib_logfile0
|
||||||
ib_logfile2
|
# restart: --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-directory=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-logs=20 --innodb-undo-tablespaces=3 --innodb-data-file-path=ibdata1:16M;ibdata2:10M:autoextend
|
||||||
# restart: --innodb-log-files-in-group=3 --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-directory=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-logs=20 --innodb-undo-tablespaces=3 --innodb-data-file-path=ibdata1:16M;ibdata2:10M:autoextend
|
|
||||||
SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
||||||
WHERE engine = 'innodb'
|
WHERE engine = 'innodb'
|
||||||
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
||||||
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
|
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
|
||||||
InnoDB YES Supports transactions, row-level locking, foreign keys and encryption for tables YES YES YES
|
FOUND 1 /redo log file .*ib_logfile0.* exists\. Creating system tablespace with existing redo log file is not recommended\. Please delete redo log file before creating new system tablespace\./ in mysqld.1.err
|
||||||
NOT FOUND /redo log file .*ib_logfile0.* exists\. Creating system tablespace with existing redo log files is not recommended\. Please delete all redo log files before creating new system tablespace\./ in mysqld.1.err
|
|
||||||
bak_ib_logfile0
|
bak_ib_logfile0
|
||||||
bak_ib_logfile1
|
|
||||||
bak_ib_logfile2
|
|
||||||
bak_ibdata1
|
bak_ibdata1
|
||||||
bak_ibdata2
|
bak_ibdata2
|
||||||
bak_undo001
|
bak_undo001
|
||||||
@ -300,23 +250,14 @@ bak_undo002
|
|||||||
bak_undo003
|
bak_undo003
|
||||||
ib_buffer_pool
|
ib_buffer_pool
|
||||||
ib_logfile0
|
ib_logfile0
|
||||||
ib_logfile1
|
|
||||||
ib_logfile2
|
|
||||||
ibdata1
|
|
||||||
ibdata2
|
|
||||||
undo001
|
|
||||||
undo002
|
|
||||||
undo003
|
|
||||||
# 10. With ibdata*, without ib_logfile0
|
# 10. With ibdata*, without ib_logfile0
|
||||||
# restart: --innodb-log-files-in-group=3 --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-directory=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-logs=20 --innodb-undo-tablespaces=3 --innodb-data-file-path=ibdata1:16M;ibdata2:10M:autoextend
|
# restart: --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-directory=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-logs=20 --innodb-undo-tablespaces=3 --innodb-data-file-path=ibdata1:16M;ibdata2:10M:autoextend
|
||||||
SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
||||||
WHERE engine = 'innodb'
|
WHERE engine = 'innodb'
|
||||||
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
||||||
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
|
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
|
||||||
InnoDB YES Supports transactions, row-level locking, foreign keys and encryption for tables YES YES YES
|
InnoDB YES Supports transactions, row-level locking, foreign keys and encryption for tables YES YES YES
|
||||||
bak_ib_logfile0
|
bak_ib_logfile0
|
||||||
bak_ib_logfile1
|
|
||||||
bak_ib_logfile2
|
|
||||||
bak_ibdata1
|
bak_ibdata1
|
||||||
bak_ibdata2
|
bak_ibdata2
|
||||||
bak_undo001
|
bak_undo001
|
||||||
@ -324,17 +265,13 @@ bak_undo002
|
|||||||
bak_undo003
|
bak_undo003
|
||||||
ib_buffer_pool
|
ib_buffer_pool
|
||||||
ib_logfile0
|
ib_logfile0
|
||||||
ib_logfile1
|
|
||||||
ib_logfile2
|
|
||||||
ibdata1
|
ibdata1
|
||||||
ibdata2
|
ibdata2
|
||||||
undo001
|
undo001
|
||||||
undo002
|
undo002
|
||||||
undo003
|
undo003
|
||||||
# 11. With ibdata*, without ib_logfile1
|
# 11. With ibdata*
|
||||||
bak_ib_logfile0
|
bak_ib_logfile0
|
||||||
bak_ib_logfile1
|
|
||||||
bak_ib_logfile2
|
|
||||||
bak_ibdata1
|
bak_ibdata1
|
||||||
bak_ibdata2
|
bak_ibdata2
|
||||||
bak_undo001
|
bak_undo001
|
||||||
@ -342,24 +279,21 @@ bak_undo002
|
|||||||
bak_undo003
|
bak_undo003
|
||||||
ib_buffer_pool
|
ib_buffer_pool
|
||||||
ib_logfile0
|
ib_logfile0
|
||||||
ib_logfile2
|
|
||||||
ibdata1
|
ibdata1
|
||||||
ibdata2
|
ibdata2
|
||||||
undo001
|
undo001
|
||||||
undo002
|
undo002
|
||||||
undo003
|
undo003
|
||||||
# restart: --innodb-log-files-in-group=3 --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-directory=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-logs=20 --innodb-undo-tablespaces=3 --innodb-data-file-path=ibdata1:16M;ibdata2:10M:autoextend
|
# restart: --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-directory=MYSQLTEST_VARDIR/tmp/log_file --innodb-undo-logs=20 --innodb-undo-tablespaces=3 --innodb-data-file-path=ibdata1:16M;ibdata2:10M:autoextend
|
||||||
SELECT COUNT(*) `1` FROM INFORMATION_SCHEMA.ENGINES
|
SELECT COUNT(*) `1` FROM INFORMATION_SCHEMA.ENGINES
|
||||||
WHERE engine='innodb'
|
WHERE engine='innodb'
|
||||||
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
||||||
1
|
1
|
||||||
1
|
1
|
||||||
FOUND 1 /Resizing redo log from 1\*\d+ to 3\*\d+ bytes; LSN=\d+/ in mysqld.1.err
|
NOT FOUND /Resizing redo log from 1\*\d+ to 3\*\d+ bytes; LSN=\d+/ in mysqld.1.err
|
||||||
# restart
|
# restart
|
||||||
# Cleanup
|
# Cleanup
|
||||||
bak_ib_logfile0
|
bak_ib_logfile0
|
||||||
bak_ib_logfile1
|
|
||||||
bak_ib_logfile2
|
|
||||||
bak_ibdata1
|
bak_ibdata1
|
||||||
bak_ibdata2
|
bak_ibdata2
|
||||||
bak_undo001
|
bak_undo001
|
||||||
@ -367,8 +301,6 @@ bak_undo002
|
|||||||
bak_undo003
|
bak_undo003
|
||||||
ib_buffer_pool
|
ib_buffer_pool
|
||||||
ib_logfile0
|
ib_logfile0
|
||||||
ib_logfile1
|
|
||||||
ib_logfile2
|
|
||||||
ibdata1
|
ibdata1
|
||||||
ibdata2
|
ibdata2
|
||||||
undo001
|
undo001
|
||||||
|
@ -5,14 +5,14 @@
|
|||||||
SET GLOBAL DEBUG_DBUG='+d,fil_names_write_bogus';
|
SET GLOBAL DEBUG_DBUG='+d,fil_names_write_bogus';
|
||||||
CREATE TABLE t1(a INT PRIMARY KEY) ENGINE=InnoDB;
|
CREATE TABLE t1(a INT PRIMARY KEY) ENGINE=InnoDB;
|
||||||
# Kill the server
|
# Kill the server
|
||||||
# restart: --debug=d,innodb_log_abort_1 --innodb-log-files-in-group=2 --innodb-log-file-size=4M
|
# restart: --debug=d,innodb_log_abort_1 --innodb-log-file-size=4194304
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
ERROR 42000: Unknown storage engine 'InnoDB'
|
ERROR 42000: Unknown storage engine 'InnoDB'
|
||||||
FOUND 1 /InnoDB: Tablespace 4294967280 was not found at .*, but there were no modifications either/ in mysqld.1.err
|
FOUND 1 /InnoDB: Tablespace 4294967280 was not found at .*, but there were no modifications either/ in mysqld.1.err
|
||||||
# restart: --debug=d,innodb_log_abort_3,ib_log --innodb-log-files-in-group=2 --innodb-log-file-size=4M
|
# restart: --debug=d,innodb_log_abort_3,ib_log --innodb-log-file-size=4194304
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
ERROR 42000: Unknown storage engine 'InnoDB'
|
ERROR 42000: Unknown storage engine 'InnoDB'
|
||||||
FOUND 1 /srv_prepare_to_delete_redo_log_files: ib_log: FILE_CHECKPOINT.* written/ in mysqld.1.err
|
FOUND 1 /srv_prepare_to_delete_redo_log_file: ib_log: FILE_CHECKPOINT.* written/ in mysqld.1.err
|
||||||
# restart
|
# restart
|
||||||
# restart
|
# restart
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
@ -1,12 +1,5 @@
|
|||||||
CREATE TABLE t1(a INT PRIMARY KEY) ENGINE=InnoDB;
|
CREATE TABLE t1(a INT PRIMARY KEY) ENGINE=InnoDB;
|
||||||
# restart: --innodb-thread-concurrency=1 --innodb-log-file-size=2m
|
# restart: --innodb-thread-concurrency=1 --innodb-log-file-size=2m
|
||||||
SELECT * FROM INFORMATION_SCHEMA.ENGINES
|
|
||||||
WHERE engine = 'innodb'
|
|
||||||
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
|
||||||
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
|
|
||||||
InnoDB YES Supports transactions, row-level locking, foreign keys and encryption for tables YES YES YES
|
|
||||||
NOT FOUND /InnoDB: Log file .*ib_logfile1 is of different size .* bytes than other log files 0 bytes!/ in mysqld.1.err
|
|
||||||
# restart: --innodb-thread-concurrency=1 --innodb-log-file-size=2m
|
|
||||||
CHECK TABLE t1;
|
CHECK TABLE t1;
|
||||||
Table Op Msg_type Msg_text
|
Table Op Msg_type Msg_text
|
||||||
test.t1 check status OK
|
test.t1 check status OK
|
||||||
@ -19,7 +12,7 @@ a
|
|||||||
INSERT INTO t1 VALUES (42);
|
INSERT INTO t1 VALUES (42);
|
||||||
BEGIN;
|
BEGIN;
|
||||||
DELETE FROM t1;
|
DELETE FROM t1;
|
||||||
# restart: --innodb-log-files-in-group=3 --innodb-log-file-size=5M
|
# restart: --innodb-log-file-size=5M
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
a
|
a
|
||||||
42
|
42
|
||||||
@ -52,11 +45,11 @@ FOUND 1 /InnoDB: innodb_read_only prevents crash recovery/ in mysqld.1.err
|
|||||||
# restart: --debug=d,innodb_log_abort_4
|
# restart: --debug=d,innodb_log_abort_4
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
ERROR 42000: Unknown storage engine 'InnoDB'
|
ERROR 42000: Unknown storage engine 'InnoDB'
|
||||||
FOUND 2 /redo log from 3\*[0-9]+ to 1\*[0-9]+ bytes/ in mysqld.1.err
|
FOUND 5 /redo log from [0-9]+ to [0-9]+ bytes/ in mysqld.1.err
|
||||||
# restart: --debug=d,innodb_log_abort_5
|
# restart: --debug=d,innodb_log_abort_5
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
ERROR 42000: Unknown storage engine 'InnoDB'
|
ERROR 42000: Unknown storage engine 'InnoDB'
|
||||||
FOUND 3 /redo log from 3\*[0-9]+ to 1\*[0-9]+ bytes/ in mysqld.1.err
|
FOUND 6 /redo log from [0-9]+ to [0-9]+ bytes/ in mysqld.1.err
|
||||||
# restart: --innodb-read-only
|
# restart: --innodb-read-only
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
ERROR 42000: Unknown storage engine 'InnoDB'
|
ERROR 42000: Unknown storage engine 'InnoDB'
|
||||||
@ -64,14 +57,14 @@ FOUND 2 /InnoDB: innodb_read_only prevents crash recovery/ in mysqld.1.err
|
|||||||
# restart: --debug=d,innodb_log_abort_6
|
# restart: --debug=d,innodb_log_abort_6
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
ERROR 42000: Unknown storage engine 'InnoDB'
|
ERROR 42000: Unknown storage engine 'InnoDB'
|
||||||
FOUND 4 /redo log from 3\*[0-9]+ to 1\*[0-9]+ bytes/ in mysqld.1.err
|
FOUND 7 /redo log from [0-9]+ to [0-9]+ bytes/ in mysqld.1.err
|
||||||
# restart: --debug=d,innodb_log_abort_7
|
# restart: --debug=d,innodb_log_abort_7
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
ERROR 42000: Unknown storage engine 'InnoDB'
|
ERROR 42000: Unknown storage engine 'InnoDB'
|
||||||
# restart: --innodb-read-only
|
# restart: --innodb-read-only
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
ERROR 42000: Unknown storage engine 'InnoDB'
|
ERROR 42000: Unknown storage engine 'InnoDB'
|
||||||
FOUND 1 /InnoDB: Cannot create log files in read-only mode/ in mysqld.1.err
|
FOUND 1 /InnoDB: Cannot create log file in read-only mode/ in mysqld.1.err
|
||||||
# restart: --debug=d,innodb_log_abort_8
|
# restart: --debug=d,innodb_log_abort_8
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
ERROR 42000: Unknown storage engine 'InnoDB'
|
ERROR 42000: Unknown storage engine 'InnoDB'
|
||||||
@ -86,8 +79,9 @@ ERROR 42000: Unknown storage engine 'InnoDB'
|
|||||||
FOUND 1 /InnoDB: Log file .*ib_logfile0 size 7 is not a multiple of 512 bytes/ in mysqld.1.err
|
FOUND 1 /InnoDB: Log file .*ib_logfile0 size 7 is not a multiple of 512 bytes/ in mysqld.1.err
|
||||||
# restart: --debug=d,innodb_log_abort_9
|
# restart: --debug=d,innodb_log_abort_9
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
ERROR 42000: Unknown storage engine 'InnoDB'
|
a
|
||||||
FOUND 1 /InnoDB: Log file .*ib_logfile1 is of different size 1048576 bytes than other log files/ in mysqld.1.err
|
42
|
||||||
|
123
|
||||||
# restart: --debug=d,innodb_log_abort_10
|
# restart: --debug=d,innodb_log_abort_10
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
ERROR 42000: Unknown storage engine 'InnoDB'
|
ERROR 42000: Unknown storage engine 'InnoDB'
|
||||||
|
@ -445,7 +445,7 @@ WHERE engine = 'innodb'
|
|||||||
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
||||||
|
|
||||||
--let $ibp=--innodb-log-group-home-dir=$bugdir --innodb-data-home-dir=$bugdir
|
--let $ibp=--innodb-log-group-home-dir=$bugdir --innodb-data-home-dir=$bugdir
|
||||||
--let $ibd=$ibp --innodb-undo-tablespaces=0 --innodb-log-files-in-group=2
|
--let $ibd=$ibp --innodb-undo-tablespaces=0
|
||||||
--let $ibp=$ibp --innodb-data-file-path=ibdata1:1M;ibdata2:1M:autoextend
|
--let $ibp=$ibp --innodb-data-file-path=ibdata1:1M;ibdata2:1M:autoextend
|
||||||
|
|
||||||
--let $restart_parameters= $ibp
|
--let $restart_parameters= $ibp
|
||||||
|
@ -16,7 +16,7 @@ call mtr.add_suppression("InnoDB: Log scan aborted at LSN");
|
|||||||
call mtr.add_suppression("InnoDB: Missing MLOG_FILE_NAME or MLOG_FILE_DELETE before MLOG_CHECKPOINT for tablespace 42\\r?$");
|
call mtr.add_suppression("InnoDB: Missing MLOG_FILE_NAME or MLOG_FILE_DELETE before MLOG_CHECKPOINT for tablespace 42\\r?$");
|
||||||
call mtr.add_suppression("InnoDB: Obtaining redo log encryption key version 1 failed");
|
call mtr.add_suppression("InnoDB: Obtaining redo log encryption key version 1 failed");
|
||||||
call mtr.add_suppression("InnoDB: Decrypting checkpoint failed");
|
call mtr.add_suppression("InnoDB: Decrypting checkpoint failed");
|
||||||
call mtr.add_suppression("InnoDB: Are you sure you are using the right ib_logfiles to start up the database\\? Log sequence number in the ib_logfiles is 1213964,");
|
call mtr.add_suppression("InnoDB: Are you sure you are using the right ib_logfile0 to start up the database\\? Log sequence number in the ib_logfile0 is 1213964,");
|
||||||
call mtr.add_suppression("InnoDB: Log file .*ib_logfile1 is of different size 1048576 bytes than other log files 2097152 bytes!");
|
call mtr.add_suppression("InnoDB: Log file .*ib_logfile1 is of different size 1048576 bytes than other log files 2097152 bytes!");
|
||||||
--enable_query_log
|
--enable_query_log
|
||||||
|
|
||||||
@ -246,6 +246,8 @@ AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
|||||||
--source include/shutdown_mysqld.inc
|
--source include/shutdown_mysqld.inc
|
||||||
--let SEARCH_PATTERN=InnoDB: Log file .*ib_logfile1 is of different size 1048576 bytes than other log files 2097152 bytes!
|
--let SEARCH_PATTERN=InnoDB: Log file .*ib_logfile1 is of different size 1048576 bytes than other log files 2097152 bytes!
|
||||||
--source include/search_pattern_in_file.inc
|
--source include/search_pattern_in_file.inc
|
||||||
|
--let SEARCH_PATTERN=InnoDB: Upgrade after a crash is not supported\\. The redo log was created with BogoDB 1\\.2\\.3\\.4, and it appears corrupted\\.
|
||||||
|
--source include/search_pattern_in_file.inc
|
||||||
|
|
||||||
perl;
|
perl;
|
||||||
die unless open OUT, ">", "$ENV{bugdir}/ib_logfile1";
|
die unless open OUT, ">", "$ENV{bugdir}/ib_logfile1";
|
||||||
|
@ -34,7 +34,7 @@ let $check_yes_innodb=SELECT COUNT(*) `1` FROM INFORMATION_SCHEMA.ENGINES
|
|||||||
WHERE engine='innodb'
|
WHERE engine='innodb'
|
||||||
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
||||||
|
|
||||||
--let $ibp=--innodb-log-files-in-group=3 --innodb-log-group-home-dir=$bugdir
|
--let $ibp=--innodb-log-group-home-dir=$bugdir
|
||||||
--let $ibp=$ibp --innodb-data-home-dir=$bugdir --innodb-undo-directory=$bugdir
|
--let $ibp=$ibp --innodb-data-home-dir=$bugdir --innodb-undo-directory=$bugdir
|
||||||
--let $ibp=$ibp --innodb-undo-logs=20 --innodb-undo-tablespaces=3
|
--let $ibp=$ibp --innodb-undo-logs=20 --innodb-undo-tablespaces=3
|
||||||
--let $ibp=$ibp --innodb-data-file-path=ibdata1:16M;ibdata2:10M:autoextend
|
--let $ibp=$ibp --innodb-data-file-path=ibdata1:16M;ibdata2:10M:autoextend
|
||||||
@ -49,13 +49,11 @@ eval $check_no_innodb;
|
|||||||
let SEARCH_PATTERN=\[ERROR\] InnoDB: Could not create undo tablespace '.*undo002';
|
let SEARCH_PATTERN=\[ERROR\] InnoDB: Could not create undo tablespace '.*undo002';
|
||||||
--source include/search_pattern_in_file.inc
|
--source include/search_pattern_in_file.inc
|
||||||
|
|
||||||
--echo # Remove undo001,undo002,ibdata1,ibdata2,ib_logfile1,ib_logfile2,ib_logfile101
|
--echo # Remove undo001,undo002,ibdata1,ibdata2,ib_logfile101
|
||||||
--remove_file $bugdir/undo001
|
--remove_file $bugdir/undo001
|
||||||
--rmdir $bugdir/undo002
|
--rmdir $bugdir/undo002
|
||||||
--remove_file $bugdir/ibdata1
|
--remove_file $bugdir/ibdata1
|
||||||
--remove_file $bugdir/ibdata2
|
--remove_file $bugdir/ibdata2
|
||||||
--remove_file $bugdir/ib_logfile1
|
|
||||||
--remove_file $bugdir/ib_logfile2
|
|
||||||
--remove_file $bugdir/ib_logfile101
|
--remove_file $bugdir/ib_logfile101
|
||||||
--list_files $bugdir
|
--list_files $bugdir
|
||||||
|
|
||||||
@ -82,8 +80,6 @@ eval $check_yes_innodb;
|
|||||||
--copy_file $bugdir/ibdata1 $bugdir/bak_ibdata1
|
--copy_file $bugdir/ibdata1 $bugdir/bak_ibdata1
|
||||||
--copy_file $bugdir/ibdata2 $bugdir/bak_ibdata2
|
--copy_file $bugdir/ibdata2 $bugdir/bak_ibdata2
|
||||||
--copy_file $bugdir/ib_logfile0 $bugdir/bak_ib_logfile0
|
--copy_file $bugdir/ib_logfile0 $bugdir/bak_ib_logfile0
|
||||||
--copy_file $bugdir/ib_logfile1 $bugdir/bak_ib_logfile1
|
|
||||||
--copy_file $bugdir/ib_logfile2 $bugdir/bak_ib_logfile2
|
|
||||||
--copy_file $bugdir/undo001 $bugdir/bak_undo001
|
--copy_file $bugdir/undo001 $bugdir/bak_undo001
|
||||||
--copy_file $bugdir/undo002 $bugdir/bak_undo002
|
--copy_file $bugdir/undo002 $bugdir/bak_undo002
|
||||||
--copy_file $bugdir/undo003 $bugdir/bak_undo003
|
--copy_file $bugdir/undo003 $bugdir/bak_undo003
|
||||||
@ -189,15 +185,14 @@ let SEARCH_PATTERN=InnoDB: Expected to open innodb_undo_tablespaces=3 but was ab
|
|||||||
# clean up & Restore
|
# clean up & Restore
|
||||||
--source ../include/log_file_cleanup.inc
|
--source ../include/log_file_cleanup.inc
|
||||||
|
|
||||||
--echo # 9. Without ibdata*, without undo*, Without ib_logfile1 and with ib_logfile2
|
--echo # 9. Without ibdata*, without undo*
|
||||||
--remove_files_wildcard $bugdir ibdata*
|
--remove_files_wildcard $bugdir ibdata*
|
||||||
--remove_files_wildcard $bugdir undo00*
|
--remove_files_wildcard $bugdir undo00*
|
||||||
--remove_file $bugdir/ib_logfile1
|
|
||||||
--list_files $bugdir
|
--list_files $bugdir
|
||||||
--source include/start_mysqld.inc
|
--source include/start_mysqld.inc
|
||||||
eval $check_no_innodb;
|
eval $check_no_innodb;
|
||||||
--source include/shutdown_mysqld.inc
|
--source include/shutdown_mysqld.inc
|
||||||
let SEARCH_PATTERN=redo log file .*ib_logfile0.* exists\. Creating system tablespace with existing redo log files is not recommended\. Please delete all redo log files before creating new system tablespace\.;
|
let SEARCH_PATTERN=redo log file .*ib_logfile0.* exists\. Creating system tablespace with existing redo log file is not recommended\. Please delete redo log file before creating new system tablespace\.;
|
||||||
--source include/search_pattern_in_file.inc
|
--source include/search_pattern_in_file.inc
|
||||||
|
|
||||||
# clean up & Restore
|
# clean up & Restore
|
||||||
@ -212,8 +207,7 @@ eval $check_no_innodb;
|
|||||||
|
|
||||||
--source ../include/log_file_cleanup.inc
|
--source ../include/log_file_cleanup.inc
|
||||||
|
|
||||||
--echo # 11. With ibdata*, without ib_logfile1
|
--echo # 11. With ibdata*
|
||||||
--remove_file $bugdir/ib_logfile1
|
|
||||||
--list_files $bugdir
|
--list_files $bugdir
|
||||||
--source include/start_mysqld.inc
|
--source include/start_mysqld.inc
|
||||||
eval $check_yes_innodb;
|
eval $check_yes_innodb;
|
||||||
|
@ -16,8 +16,8 @@ call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE faile
|
|||||||
FLUSH TABLES;
|
FLUSH TABLES;
|
||||||
--enable_query_log
|
--enable_query_log
|
||||||
|
|
||||||
--let $n_logs=`SELECT if(@@innodb_log_files_in_group = 1, 2, 1)`
|
--let $change=`SELECT if(@@innodb_log_file_size = 4194304, 8388608, 4194304)`
|
||||||
--let $resize= --innodb-log-files-in-group=$n_logs --innodb-log-file-size=4M
|
--let $resize= --innodb-log-file-size=$change
|
||||||
|
|
||||||
--source include/no_checkpoint_start.inc
|
--source include/no_checkpoint_start.inc
|
||||||
|
|
||||||
@ -39,7 +39,7 @@ SELECT * FROM t1;
|
|||||||
--source include/restart_mysqld.inc
|
--source include/restart_mysqld.inc
|
||||||
--error ER_UNKNOWN_STORAGE_ENGINE
|
--error ER_UNKNOWN_STORAGE_ENGINE
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
--let SEARCH_PATTERN= srv_prepare_to_delete_redo_log_files: ib_log: FILE_CHECKPOINT.* written
|
--let SEARCH_PATTERN= srv_prepare_to_delete_redo_log_file: ib_log: FILE_CHECKPOINT.* written
|
||||||
--source include/search_pattern_in_file.inc
|
--source include/search_pattern_in_file.inc
|
||||||
|
|
||||||
--let $restart_parameters=
|
--let $restart_parameters=
|
||||||
|
@ -12,17 +12,16 @@ if (`SELECT @@innodb_log_file_size = 1048576`) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
--disable_query_log
|
--disable_query_log
|
||||||
call mtr.add_suppression("InnoDB: The log sequence numbers [0-9]+ and [0-9]+ in ibdata files do not match the log sequence number [0-9]+ in the ib_logfiles");
|
call mtr.add_suppression("InnoDB: The log sequence numbers [0-9]+ and [0-9]+ in ibdata file do not match the log sequence number [0-9]+ in the ib_logfile");
|
||||||
call mtr.add_suppression("syntax error in innodb_log_group_home_dir");
|
call mtr.add_suppression("syntax error in innodb_log_group_home_dir");
|
||||||
call mtr.add_suppression("Plugin 'InnoDB' init function returned error");
|
call mtr.add_suppression("Plugin 'InnoDB' init function returned error");
|
||||||
call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed");
|
call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed");
|
||||||
call mtr.add_suppression("InnoDB: Plugin initialization aborted");
|
call mtr.add_suppression("InnoDB: Plugin initialization aborted");
|
||||||
call mtr.add_suppression("InnoDB: innodb_read_only prevents crash recovery");
|
call mtr.add_suppression("InnoDB: innodb_read_only prevents crash recovery");
|
||||||
call mtr.add_suppression("InnoDB: Are you sure you are using the right ib_logfiles");
|
call mtr.add_suppression("InnoDB: Are you sure you are using the right ib_logfile");
|
||||||
call mtr.add_suppression("InnoDB: Cannot (create|resize) log files in read-only mode");
|
call mtr.add_suppression("InnoDB: Cannot (create|resize) log file in read-only mode");
|
||||||
call mtr.add_suppression("InnoDB: Can't initiate database recovery, running in read-only-mode");
|
call mtr.add_suppression("InnoDB: Can't initiate database recovery, running in read-only-mode");
|
||||||
call mtr.add_suppression("InnoDB: Only one log file found");
|
call mtr.add_suppression("InnoDB: Log file .*ib_logfile0.* size");
|
||||||
call mtr.add_suppression("InnoDB: Log file .*ib_logfile[01].* size");
|
|
||||||
call mtr.add_suppression("InnoDB: Unable to open .*ib_logfile0. to check native AIO read support");
|
call mtr.add_suppression("InnoDB: Unable to open .*ib_logfile0. to check native AIO read support");
|
||||||
FLUSH TABLES;
|
FLUSH TABLES;
|
||||||
--enable_query_log
|
--enable_query_log
|
||||||
@ -40,14 +39,7 @@ AND support IN ('YES', 'DEFAULT', 'ENABLED');
|
|||||||
--let $restart_parameters= --innodb-thread-concurrency=1 --innodb-log-file-size=2m
|
--let $restart_parameters= --innodb-thread-concurrency=1 --innodb-log-file-size=2m
|
||||||
--source include/start_mysqld.inc
|
--source include/start_mysqld.inc
|
||||||
|
|
||||||
eval $check_no_innodb;
|
|
||||||
--remove_file $MYSQLD_DATADIR/ib_logfile0
|
|
||||||
--move_file $MYSQLD_DATADIR/ib_logfile.old $MYSQLD_DATADIR/ib_logfile.0
|
|
||||||
--source include/shutdown_mysqld.inc
|
|
||||||
let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err;
|
let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err;
|
||||||
let SEARCH_PATTERN= InnoDB: Log file .*ib_logfile1 is of different size .* bytes than other log files 0 bytes!;
|
|
||||||
--source include/search_pattern_in_file.inc
|
|
||||||
--source include/start_mysqld.inc
|
|
||||||
CHECK TABLE t1;
|
CHECK TABLE t1;
|
||||||
|
|
||||||
--let $restart_parameters= --innodb-thread-concurrency=100 --innodb-log-file-size=20M
|
--let $restart_parameters= --innodb-thread-concurrency=100 --innodb-log-file-size=20M
|
||||||
@ -66,7 +58,7 @@ INSERT INTO t1 VALUES (42);
|
|||||||
BEGIN;
|
BEGIN;
|
||||||
DELETE FROM t1;
|
DELETE FROM t1;
|
||||||
|
|
||||||
let $restart_parameters = --innodb-log-files-in-group=3 --innodb-log-file-size=5M;
|
let $restart_parameters = --innodb-log-file-size=5M;
|
||||||
--source include/restart_mysqld.inc
|
--source include/restart_mysqld.inc
|
||||||
let $shutdown_timeout=;
|
let $shutdown_timeout=;
|
||||||
|
|
||||||
@ -120,14 +112,14 @@ let SEARCH_PATTERN= InnoDB: innodb_read_only prevents crash recovery;
|
|||||||
--source include/restart_mysqld.inc
|
--source include/restart_mysqld.inc
|
||||||
--error ER_UNKNOWN_STORAGE_ENGINE
|
--error ER_UNKNOWN_STORAGE_ENGINE
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
let SEARCH_PATTERN= redo log from 3\*[0-9]+ to 1\*[0-9]+ bytes;
|
let SEARCH_PATTERN= redo log from [0-9]+ to [0-9]+ bytes;
|
||||||
--source include/search_pattern_in_file.inc
|
--source include/search_pattern_in_file.inc
|
||||||
|
|
||||||
--let $restart_parameters= --debug=d,innodb_log_abort_5
|
--let $restart_parameters= --debug=d,innodb_log_abort_5
|
||||||
--source include/restart_mysqld.inc
|
--source include/restart_mysqld.inc
|
||||||
--error ER_UNKNOWN_STORAGE_ENGINE
|
--error ER_UNKNOWN_STORAGE_ENGINE
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
let SEARCH_PATTERN= redo log from 3\*[0-9]+ to 1\*[0-9]+ bytes;
|
let SEARCH_PATTERN= redo log from [0-9]+ to [0-9]+ bytes;
|
||||||
--source include/search_pattern_in_file.inc
|
--source include/search_pattern_in_file.inc
|
||||||
|
|
||||||
--let $restart_parameters= --innodb-read-only
|
--let $restart_parameters= --innodb-read-only
|
||||||
@ -142,7 +134,7 @@ let SEARCH_PATTERN= InnoDB: innodb_read_only prevents crash recovery;
|
|||||||
--error ER_UNKNOWN_STORAGE_ENGINE
|
--error ER_UNKNOWN_STORAGE_ENGINE
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
|
|
||||||
let SEARCH_PATTERN= redo log from 3\*[0-9]+ to 1\*[0-9]+ bytes;
|
let SEARCH_PATTERN= redo log from [0-9]+ to [0-9]+ bytes;
|
||||||
--source include/search_pattern_in_file.inc
|
--source include/search_pattern_in_file.inc
|
||||||
|
|
||||||
--let $restart_parameters= --debug=d,innodb_log_abort_7
|
--let $restart_parameters= --debug=d,innodb_log_abort_7
|
||||||
@ -157,7 +149,7 @@ SELECT * FROM t1;
|
|||||||
--error ER_UNKNOWN_STORAGE_ENGINE
|
--error ER_UNKNOWN_STORAGE_ENGINE
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
|
|
||||||
let SEARCH_PATTERN= InnoDB: Cannot create log files in read-only mode;
|
let SEARCH_PATTERN= InnoDB: Cannot create log file in read-only mode;
|
||||||
--source include/search_pattern_in_file.inc
|
--source include/search_pattern_in_file.inc
|
||||||
|
|
||||||
--let $restart_parameters= --debug=d,innodb_log_abort_8
|
--let $restart_parameters= --debug=d,innodb_log_abort_8
|
||||||
@ -201,11 +193,8 @@ close(FILE);
|
|||||||
EOF
|
EOF
|
||||||
|
|
||||||
--source include/restart_mysqld.inc
|
--source include/restart_mysqld.inc
|
||||||
--error ER_UNKNOWN_STORAGE_ENGINE
|
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
|
|
||||||
let SEARCH_PATTERN= InnoDB: Log file .*ib_logfile1 is of different size 1048576 bytes than other log files;
|
|
||||||
--source include/search_pattern_in_file.inc
|
|
||||||
--remove_file $MYSQLD_DATADIR/ib_logfile1
|
--remove_file $MYSQLD_DATADIR/ib_logfile1
|
||||||
--move_file $MYSQLD_DATADIR/ib_logfile0 $MYSQLD_DATADIR/ib_logfile101
|
--move_file $MYSQLD_DATADIR/ib_logfile0 $MYSQLD_DATADIR/ib_logfile101
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
# MDEV-13416 mariabackup fails with EFAULT "Bad Address"
|
# MDEV-13416 mariabackup fails with EFAULT "Bad Address"
|
||||||
#
|
#
|
||||||
# restart
|
# restart
|
||||||
FOUND 1 /InnoDB: New log files created, LSN=175964\d{8}/ in mysqld.1.err
|
FOUND 1 /InnoDB: New log file created, LSN=175964\d{8}/ in mysqld.1.err
|
||||||
CREATE TABLE t(i INT) ENGINE INNODB;
|
CREATE TABLE t(i INT) ENGINE INNODB;
|
||||||
INSERT INTO t VALUES(1);
|
INSERT INTO t VALUES(1);
|
||||||
# xtrabackup backup
|
# xtrabackup backup
|
||||||
|
@ -35,7 +35,7 @@ EOF
|
|||||||
|
|
||||||
--source include/start_mysqld.inc
|
--source include/start_mysqld.inc
|
||||||
let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err;
|
let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err;
|
||||||
--let SEARCH_PATTERN= InnoDB: New log files created, LSN=175964\d{8}
|
--let SEARCH_PATTERN= InnoDB: New log file created, LSN=175964\d{8}
|
||||||
--source include/search_pattern_in_file.inc
|
--source include/search_pattern_in_file.inc
|
||||||
|
|
||||||
CREATE TABLE t(i INT) ENGINE INNODB;
|
CREATE TABLE t(i INT) ENGINE INNODB;
|
||||||
|
@ -1 +1 @@
|
|||||||
--loose-innodb-log-file-size=1048576 --loose-innodb-log-files-in-group=2
|
--loose-innodb-log-file-size=2097152
|
||||||
|
@ -1226,7 +1226,7 @@ SESSION_VALUE NULL
|
|||||||
DEFAULT_VALUE 1
|
DEFAULT_VALUE 1
|
||||||
VARIABLE_SCOPE GLOBAL
|
VARIABLE_SCOPE GLOBAL
|
||||||
VARIABLE_TYPE BIGINT UNSIGNED
|
VARIABLE_TYPE BIGINT UNSIGNED
|
||||||
VARIABLE_COMMENT Number of log files in the log group. InnoDB writes to the files in a circular fashion.
|
VARIABLE_COMMENT Deprecated parameter with no effect.
|
||||||
NUMERIC_MIN_VALUE 1
|
NUMERIC_MIN_VALUE 1
|
||||||
NUMERIC_MAX_VALUE 100
|
NUMERIC_MAX_VALUE 100
|
||||||
NUMERIC_BLOCK_SIZE 0
|
NUMERIC_BLOCK_SIZE 0
|
||||||
|
@ -195,11 +195,6 @@ static char* innobase_reset_all_monitor_counter;
|
|||||||
|
|
||||||
static ulong innodb_flush_method;
|
static ulong innodb_flush_method;
|
||||||
|
|
||||||
/** Deprecated; no effect other than issuing a deprecation warning. */
|
|
||||||
static char* innodb_file_format;
|
|
||||||
/** Deprecated; no effect other than issuing a deprecation warning. */
|
|
||||||
static char* innodb_large_prefix;
|
|
||||||
|
|
||||||
/* This variable can be set in the server configure file, specifying
|
/* This variable can be set in the server configure file, specifying
|
||||||
stopword table to be used */
|
stopword table to be used */
|
||||||
static char* innobase_server_stopword_table;
|
static char* innobase_server_stopword_table;
|
||||||
@ -3417,33 +3412,42 @@ static void innodb_buffer_pool_size_init()
|
|||||||
innobase_buffer_pool_size = srv_buf_pool_size;
|
innobase_buffer_pool_size = srv_buf_pool_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace deprecated {
|
||||||
|
/** Deprecated; no effect other than issuing a deprecation warning. */
|
||||||
|
char* innodb_file_format;
|
||||||
|
/** Deprecated; no effect other than issuing a deprecation warning. */
|
||||||
|
char* innodb_large_prefix;
|
||||||
|
|
||||||
/** Deprecated parameter with no effect */
|
/** Deprecated parameter with no effect */
|
||||||
static my_bool innodb_log_checksums;
|
static my_bool innodb_log_checksums;
|
||||||
/** Deprecation message for innodb_log_checksums */
|
/** Deprecation message for innodb_log_checksums */
|
||||||
static const char* innodb_log_checksums_deprecated
|
static const char* innodb_log_checksums_msg
|
||||||
= "The parameter innodb_log_checksums is deprecated and has no effect.";
|
= "The parameter innodb_log_checksums is deprecated and has no effect.";
|
||||||
/** Deprecated parameter with no effect */
|
/** Deprecated parameter with no effect */
|
||||||
static my_bool innodb_log_compressed_pages;
|
static my_bool innodb_log_compressed_pages;
|
||||||
/** Deprecation message for innodb_log_compressed_pages */
|
/** Deprecation message for innodb_log_compressed_pages */
|
||||||
static const char* innodb_log_compressed_pages_deprecated
|
static const char* innodb_log_compressed_pages_msg
|
||||||
= "The parameter innodb_log_compressed_pages is deprecated and has no effect.";
|
= "The parameter innodb_log_compressed_pages is deprecated and has no effect.";
|
||||||
/** Deprecated parameter with no effect */
|
/** Deprecated parameter with no effect */
|
||||||
static my_bool innodb_log_optimize_ddl;
|
static my_bool innodb_log_optimize_ddl;
|
||||||
static const char* innodb_log_optimize_ddl_deprecated
|
static const char* innodb_log_optimize_ddl_msg
|
||||||
= "The parameter innodb_log_optimize_ddl is deprecated and has no effect.";
|
= "The parameter innodb_log_optimize_ddl is deprecated and has no effect.";
|
||||||
|
|
||||||
/** Deprecated parameter with no effect */
|
/** Deprecated parameter with no effect */
|
||||||
static ulong innodb_undo_logs;
|
static ulong innodb_undo_logs;
|
||||||
/** Deprecation message for innodb_undo_logs */
|
/** Deprecation message for innodb_undo_logs */
|
||||||
static const char* innodb_undo_logs_deprecated
|
static const char* innodb_undo_logs_msg
|
||||||
= "The parameter innodb_undo_logs is deprecated and has no effect.";
|
= "The parameter innodb_undo_logs is deprecated and has no effect.";
|
||||||
/** Deprecated parameter with no effect */
|
/** Deprecated parameter with no effect */
|
||||||
static ulong innodb_buffer_pool_instances;
|
static ulong innodb_buffer_pool_instances;
|
||||||
/** Deprecated parameter with no effect */
|
/** Deprecated parameter with no effect */
|
||||||
static ulong innodb_page_cleaners;
|
static ulong innodb_page_cleaners;
|
||||||
static const char* innodb_page_cleaners_deprecated
|
static const char* innodb_page_cleaners_msg
|
||||||
= "The parameter innodb_page_cleaners is deprecated and has no effect.";
|
= "The parameter innodb_page_cleaners is deprecated and has no effect.";
|
||||||
|
|
||||||
|
ulong srv_n_log_files;
|
||||||
|
} // namespace deprecated
|
||||||
|
|
||||||
/** Initialize, validate and normalize the InnoDB startup parameters.
|
/** Initialize, validate and normalize the InnoDB startup parameters.
|
||||||
@return failure code
|
@return failure code
|
||||||
@retval 0 on success
|
@retval 0 on success
|
||||||
@ -3457,8 +3461,8 @@ static int innodb_init_params()
|
|||||||
char *default_path;
|
char *default_path;
|
||||||
ulong num_pll_degree;
|
ulong num_pll_degree;
|
||||||
|
|
||||||
if (innodb_large_prefix || innodb_file_format) {
|
if (deprecated::innodb_large_prefix || deprecated::innodb_file_format) {
|
||||||
const char* p = innodb_file_format
|
const char* p = deprecated::innodb_file_format
|
||||||
? "file_format"
|
? "file_format"
|
||||||
: "large_prefix";
|
: "large_prefix";
|
||||||
sql_print_warning("The parameter innodb_%s is deprecated"
|
sql_print_warning("The parameter innodb_%s is deprecated"
|
||||||
@ -3742,37 +3746,37 @@ static int innodb_init_params()
|
|||||||
|
|
||||||
srv_buf_pool_size = ulint(innobase_buffer_pool_size);
|
srv_buf_pool_size = ulint(innobase_buffer_pool_size);
|
||||||
|
|
||||||
if (UNIV_UNLIKELY(!innodb_log_checksums)) {
|
if (UNIV_UNLIKELY(!deprecated::innodb_log_checksums)) {
|
||||||
sql_print_warning(innodb_log_checksums_deprecated);
|
sql_print_warning(deprecated::innodb_log_checksums_msg);
|
||||||
innodb_log_checksums = TRUE;
|
deprecated::innodb_log_checksums = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (UNIV_UNLIKELY(!innodb_log_compressed_pages)) {
|
if (UNIV_UNLIKELY(!deprecated::innodb_log_compressed_pages)) {
|
||||||
sql_print_warning(innodb_log_compressed_pages_deprecated);
|
sql_print_warning(deprecated::innodb_log_compressed_pages_msg);
|
||||||
innodb_log_compressed_pages = TRUE;
|
deprecated::innodb_log_compressed_pages = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (UNIV_UNLIKELY(innodb_log_optimize_ddl)) {
|
if (UNIV_UNLIKELY(deprecated::innodb_log_optimize_ddl)) {
|
||||||
sql_print_warning(innodb_log_optimize_ddl_deprecated);
|
sql_print_warning(deprecated::innodb_log_optimize_ddl_msg);
|
||||||
innodb_log_optimize_ddl = FALSE;
|
deprecated::innodb_log_optimize_ddl = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (UNIV_UNLIKELY(innodb_buffer_pool_instances)) {
|
if (UNIV_UNLIKELY(deprecated::innodb_buffer_pool_instances)) {
|
||||||
sql_print_warning("The parameter innodb_buffer_pool_instances"
|
sql_print_warning("The parameter innodb_buffer_pool_instances"
|
||||||
" is deprecated and has no effect.");
|
" is deprecated and has no effect.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (UNIV_UNLIKELY(innodb_page_cleaners)) {
|
if (UNIV_UNLIKELY(deprecated::innodb_page_cleaners)) {
|
||||||
sql_print_warning(innodb_page_cleaners_deprecated);
|
sql_print_warning(deprecated::innodb_page_cleaners_msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
innodb_buffer_pool_instances = 1;
|
deprecated::innodb_buffer_pool_instances = 1;
|
||||||
|
|
||||||
innodb_page_cleaners = 1;
|
deprecated::innodb_page_cleaners = 1;
|
||||||
|
|
||||||
if (UNIV_UNLIKELY(innodb_undo_logs != TRX_SYS_N_RSEGS)) {
|
if (UNIV_UNLIKELY(deprecated::innodb_undo_logs != TRX_SYS_N_RSEGS)) {
|
||||||
sql_print_warning(innodb_undo_logs_deprecated);
|
sql_print_warning(deprecated::innodb_undo_logs_msg);
|
||||||
innodb_undo_logs = TRX_SYS_N_RSEGS;
|
deprecated::innodb_undo_logs = TRX_SYS_N_RSEGS;
|
||||||
}
|
}
|
||||||
|
|
||||||
row_rollback_on_timeout = (ibool) innobase_rollback_on_timeout;
|
row_rollback_on_timeout = (ibool) innobase_rollback_on_timeout;
|
||||||
@ -18860,7 +18864,7 @@ innodb_log_checksums_warn(THD* thd, st_mysql_sys_var*, void*, const void*)
|
|||||||
{
|
{
|
||||||
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
|
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
|
||||||
HA_ERR_UNSUPPORTED,
|
HA_ERR_UNSUPPORTED,
|
||||||
innodb_log_checksums_deprecated);
|
deprecated::innodb_log_checksums_msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Issue a deprecation warning for SET GLOBAL innodb_log_compressed_pages.
|
/** Issue a deprecation warning for SET GLOBAL innodb_log_compressed_pages.
|
||||||
@ -18871,7 +18875,7 @@ innodb_log_compressed_pages_warn(THD* thd, st_mysql_sys_var*, void*,
|
|||||||
{
|
{
|
||||||
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
|
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
|
||||||
HA_ERR_UNSUPPORTED,
|
HA_ERR_UNSUPPORTED,
|
||||||
innodb_log_compressed_pages_deprecated);
|
deprecated::innodb_log_compressed_pages_msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Issue a deprecation warning for SET GLOBAL innodb_log_optimize_ddl.
|
/** Issue a deprecation warning for SET GLOBAL innodb_log_optimize_ddl.
|
||||||
@ -18881,7 +18885,7 @@ innodb_log_optimize_ddl_warn(THD* thd, st_mysql_sys_var*, void*, const void*)
|
|||||||
{
|
{
|
||||||
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
|
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
|
||||||
HA_ERR_UNSUPPORTED,
|
HA_ERR_UNSUPPORTED,
|
||||||
innodb_log_optimize_ddl_deprecated);
|
deprecated::innodb_log_optimize_ddl_msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Issue a deprecation warning for SET GLOBAL innodb_page_cleaners.
|
/** Issue a deprecation warning for SET GLOBAL innodb_page_cleaners.
|
||||||
@ -18891,7 +18895,7 @@ innodb_page_cleaners_warn(THD* thd, st_mysql_sys_var*, void*, const void*)
|
|||||||
{
|
{
|
||||||
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
|
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
|
||||||
HA_ERR_UNSUPPORTED,
|
HA_ERR_UNSUPPORTED,
|
||||||
innodb_page_cleaners_deprecated);
|
deprecated::innodb_page_cleaners_msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Issue a deprecation warning for SET GLOBAL innodb_undo_logs.
|
/** Issue a deprecation warning for SET GLOBAL innodb_undo_logs.
|
||||||
@ -18901,7 +18905,7 @@ innodb_undo_logs_warn(THD* thd, st_mysql_sys_var*, void*, const void*)
|
|||||||
{
|
{
|
||||||
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
|
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
|
||||||
HA_ERR_UNSUPPORTED,
|
HA_ERR_UNSUPPORTED,
|
||||||
innodb_undo_logs_deprecated);
|
deprecated::innodb_undo_logs_msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static SHOW_VAR innodb_status_variables_export[]= {
|
static SHOW_VAR innodb_status_variables_export[]= {
|
||||||
@ -19102,7 +19106,7 @@ static MYSQL_SYSVAR_ENUM(checksum_algorithm, srv_checksum_algorithm,
|
|||||||
static const char* innodb_deprecated_ignored
|
static const char* innodb_deprecated_ignored
|
||||||
= "Deprecated parameter with no effect.";
|
= "Deprecated parameter with no effect.";
|
||||||
|
|
||||||
static MYSQL_SYSVAR_BOOL(log_checksums, innodb_log_checksums,
|
static MYSQL_SYSVAR_BOOL(log_checksums, deprecated::innodb_log_checksums,
|
||||||
PLUGIN_VAR_RQCMDARG,
|
PLUGIN_VAR_RQCMDARG,
|
||||||
innodb_deprecated_ignored, NULL, innodb_log_checksums_warn, TRUE);
|
innodb_deprecated_ignored, NULL, innodb_log_checksums_warn, TRUE);
|
||||||
|
|
||||||
@ -19246,10 +19250,10 @@ static MYSQL_SYSVAR_ENUM(flush_method, innodb_flush_method,
|
|||||||
NULL, NULL, IF_WIN(SRV_ALL_O_DIRECT_FSYNC, SRV_FSYNC),
|
NULL, NULL, IF_WIN(SRV_ALL_O_DIRECT_FSYNC, SRV_FSYNC),
|
||||||
&innodb_flush_method_typelib);
|
&innodb_flush_method_typelib);
|
||||||
|
|
||||||
static MYSQL_SYSVAR_STR(file_format, innodb_file_format,
|
static MYSQL_SYSVAR_STR(file_format, deprecated::innodb_file_format,
|
||||||
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
|
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
|
||||||
innodb_deprecated_ignored, NULL, NULL, NULL);
|
innodb_deprecated_ignored, NULL, NULL, NULL);
|
||||||
static MYSQL_SYSVAR_STR(large_prefix, innodb_large_prefix,
|
static MYSQL_SYSVAR_STR(large_prefix, deprecated::innodb_large_prefix,
|
||||||
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
|
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
|
||||||
innodb_deprecated_ignored, NULL, NULL, NULL);
|
innodb_deprecated_ignored, NULL, NULL, NULL);
|
||||||
|
|
||||||
@ -19262,7 +19266,7 @@ static MYSQL_SYSVAR_STR(log_group_home_dir, srv_log_group_home_dir,
|
|||||||
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
|
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
|
||||||
"Path to InnoDB log files.", NULL, NULL, NULL);
|
"Path to InnoDB log files.", NULL, NULL, NULL);
|
||||||
|
|
||||||
static MYSQL_SYSVAR_ULONG(page_cleaners, innodb_page_cleaners,
|
static MYSQL_SYSVAR_ULONG(page_cleaners, deprecated::innodb_page_cleaners,
|
||||||
PLUGIN_VAR_RQCMDARG,
|
PLUGIN_VAR_RQCMDARG,
|
||||||
innodb_deprecated_ignored, NULL, innodb_page_cleaners_warn, 0, 0, 64, 0);
|
innodb_deprecated_ignored, NULL, innodb_page_cleaners_warn, 0, 0, 64, 0);
|
||||||
|
|
||||||
@ -19393,11 +19397,12 @@ static MYSQL_SYSVAR_UINT(compression_level, page_zip_level,
|
|||||||
", 1 is fastest, 9 is best compression and default is 6.",
|
", 1 is fastest, 9 is best compression and default is 6.",
|
||||||
NULL, NULL, DEFAULT_COMPRESSION_LEVEL, 0, 9, 0);
|
NULL, NULL, DEFAULT_COMPRESSION_LEVEL, 0, 9, 0);
|
||||||
|
|
||||||
static MYSQL_SYSVAR_BOOL(log_compressed_pages, innodb_log_compressed_pages,
|
static MYSQL_SYSVAR_BOOL(log_compressed_pages,
|
||||||
|
deprecated::innodb_log_compressed_pages,
|
||||||
PLUGIN_VAR_OPCMDARG,
|
PLUGIN_VAR_OPCMDARG,
|
||||||
innodb_deprecated_ignored, NULL, innodb_log_compressed_pages_warn, TRUE);
|
innodb_deprecated_ignored, NULL, innodb_log_compressed_pages_warn, TRUE);
|
||||||
|
|
||||||
static MYSQL_SYSVAR_BOOL(log_optimize_ddl, innodb_log_optimize_ddl,
|
static MYSQL_SYSVAR_BOOL(log_optimize_ddl, deprecated::innodb_log_optimize_ddl,
|
||||||
PLUGIN_VAR_OPCMDARG,
|
PLUGIN_VAR_OPCMDARG,
|
||||||
innodb_deprecated_ignored, NULL, innodb_log_optimize_ddl_warn, FALSE);
|
innodb_deprecated_ignored, NULL, innodb_log_optimize_ddl_warn, FALSE);
|
||||||
|
|
||||||
@ -19464,7 +19469,8 @@ static MYSQL_SYSVAR_ENUM(lock_schedule_algorithm, innodb_lock_schedule_algorithm
|
|||||||
NULL, NULL, INNODB_LOCK_SCHEDULE_ALGORITHM_FCFS,
|
NULL, NULL, INNODB_LOCK_SCHEDULE_ALGORITHM_FCFS,
|
||||||
&innodb_lock_schedule_algorithm_typelib);
|
&innodb_lock_schedule_algorithm_typelib);
|
||||||
|
|
||||||
static MYSQL_SYSVAR_ULONG(buffer_pool_instances, innodb_buffer_pool_instances,
|
static MYSQL_SYSVAR_ULONG(buffer_pool_instances,
|
||||||
|
deprecated::innodb_buffer_pool_instances,
|
||||||
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
|
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
|
||||||
innodb_deprecated_ignored, NULL, NULL, 0, 0, 64, 0);
|
innodb_deprecated_ignored, NULL, NULL, 0, 0, 64, 0);
|
||||||
|
|
||||||
@ -19705,10 +19711,9 @@ static MYSQL_SYSVAR_ULONGLONG(log_file_size, srv_log_file_size,
|
|||||||
/* OS_FILE_LOG_BLOCK_SIZE would be more appropriate than UNIV_PAGE_SIZE_MAX,
|
/* OS_FILE_LOG_BLOCK_SIZE would be more appropriate than UNIV_PAGE_SIZE_MAX,
|
||||||
but fil_space_t is being used for the redo log, and it uses data pages. */
|
but fil_space_t is being used for the redo log, and it uses data pages. */
|
||||||
|
|
||||||
static MYSQL_SYSVAR_ULONG(log_files_in_group, srv_n_log_files,
|
static MYSQL_SYSVAR_ULONG(log_files_in_group, deprecated::srv_n_log_files,
|
||||||
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
|
PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
|
||||||
"Number of log files in the log group. InnoDB writes to the files in a circular fashion.",
|
innodb_deprecated_ignored, NULL, NULL, 1, 1, 100, 0);
|
||||||
NULL, NULL, 1, 1, SRV_N_LOG_FILES_MAX, 0);
|
|
||||||
|
|
||||||
static MYSQL_SYSVAR_ULONG(log_write_ahead_size, srv_log_write_ahead_size,
|
static MYSQL_SYSVAR_ULONG(log_write_ahead_size, srv_log_write_ahead_size,
|
||||||
PLUGIN_VAR_RQCMDARG,
|
PLUGIN_VAR_RQCMDARG,
|
||||||
@ -19796,7 +19801,7 @@ static MYSQL_SYSVAR_ULONG(undo_tablespaces, srv_undo_tablespaces,
|
|||||||
0L, /* Minimum value */
|
0L, /* Minimum value */
|
||||||
TRX_SYS_MAX_UNDO_SPACES, 0); /* Maximum value */
|
TRX_SYS_MAX_UNDO_SPACES, 0); /* Maximum value */
|
||||||
|
|
||||||
static MYSQL_SYSVAR_ULONG(undo_logs, innodb_undo_logs,
|
static MYSQL_SYSVAR_ULONG(undo_logs, deprecated::innodb_undo_logs,
|
||||||
PLUGIN_VAR_OPCMDARG,
|
PLUGIN_VAR_OPCMDARG,
|
||||||
innodb_deprecated_ignored, NULL, innodb_undo_logs_warn,
|
innodb_deprecated_ignored, NULL, innodb_undo_logs_warn,
|
||||||
TRX_SYS_N_RSEGS, 0, TRX_SYS_N_RSEGS, 0);
|
TRX_SYS_N_RSEGS, 0, TRX_SYS_N_RSEGS, 0);
|
||||||
|
@ -863,8 +863,7 @@ fil_space_get(
|
|||||||
MY_ATTRIBUTE((warn_unused_result));
|
MY_ATTRIBUTE((warn_unused_result));
|
||||||
|
|
||||||
/** The tablespace memory cache; also the totality of logs (the log
|
/** The tablespace memory cache; also the totality of logs (the log
|
||||||
data space) is stored here; below we talk about tablespaces, but also
|
data space) is stored here; below we talk about tablespaces */
|
||||||
the ib_logfiles form a 'space' and it is handled here */
|
|
||||||
struct fil_system_t {
|
struct fil_system_t {
|
||||||
/**
|
/**
|
||||||
Constructor.
|
Constructor.
|
||||||
|
@ -43,13 +43,10 @@ Created 12/9/1995 Heikki Tuuri
|
|||||||
|
|
||||||
using st_::span;
|
using st_::span;
|
||||||
|
|
||||||
/** Maximum number of srv_n_log_files, or innodb_log_files_in_group */
|
|
||||||
#define SRV_N_LOG_FILES_MAX 100
|
|
||||||
|
|
||||||
/** Magic value to use instead of log checksums when they are disabled */
|
/** Magic value to use instead of log checksums when they are disabled */
|
||||||
#define LOG_NO_CHECKSUM_MAGIC 0xDEADBEEFUL
|
#define LOG_NO_CHECKSUM_MAGIC 0xDEADBEEFUL
|
||||||
|
|
||||||
/* Margin for the free space in the smallest log group, before a new query
|
/* Margin for the free space in the smallest log, before a new query
|
||||||
step which modifies the database, is started */
|
step which modifies the database, is started */
|
||||||
|
|
||||||
#define LOG_CHECKPOINT_FREE_PER_THREAD (4U << srv_page_size_shift)
|
#define LOG_CHECKPOINT_FREE_PER_THREAD (4U << srv_page_size_shift)
|
||||||
@ -57,6 +54,25 @@ step which modifies the database, is started */
|
|||||||
|
|
||||||
typedef ulint (*log_checksum_func_t)(const byte* log_block);
|
typedef ulint (*log_checksum_func_t)(const byte* log_block);
|
||||||
|
|
||||||
|
static const char LOG_FILE_NAME_PREFIX[] = "ib_logfile";
|
||||||
|
static const char LOG_FILE_NAME[] = "ib_logfile0";
|
||||||
|
|
||||||
|
/** Composes full path for a redo log file
|
||||||
|
@param[in] filename name of the redo log file
|
||||||
|
@return path with log file name*/
|
||||||
|
std::string get_log_file_path(const char *filename= LOG_FILE_NAME);
|
||||||
|
|
||||||
|
/** Returns paths for all existing log files */
|
||||||
|
std::vector<std::string> get_existing_log_files_paths();
|
||||||
|
|
||||||
|
/** Delete log file.
|
||||||
|
@param[in] suffix suffix of the file name */
|
||||||
|
static inline void delete_log_file(const char* suffix)
|
||||||
|
{
|
||||||
|
auto path = get_log_file_path(LOG_FILE_NAME_PREFIX).append(suffix);
|
||||||
|
os_file_delete_if_exists(innodb_log_file_key, path.c_str(), nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
/** Append a string to the log.
|
/** Append a string to the log.
|
||||||
@param[in] str string
|
@param[in] str string
|
||||||
@param[in] len string length
|
@param[in] len string length
|
||||||
@ -83,7 +99,7 @@ log_free_check(void);
|
|||||||
void log_buffer_extend(ulong len);
|
void log_buffer_extend(ulong len);
|
||||||
|
|
||||||
/** Check margin not to overwrite transaction log from the last checkpoint.
|
/** Check margin not to overwrite transaction log from the last checkpoint.
|
||||||
If would estimate the log write to exceed the log_group_capacity,
|
If would estimate the log write to exceed the log_capacity,
|
||||||
waits for the checkpoint is done enough.
|
waits for the checkpoint is done enough.
|
||||||
@param[in] len length of the data to be written */
|
@param[in] len length of the data to be written */
|
||||||
|
|
||||||
@ -132,14 +148,7 @@ UNIV_INLINE
|
|||||||
ib_uint64_t
|
ib_uint64_t
|
||||||
log_get_flush_lsn(void);
|
log_get_flush_lsn(void);
|
||||||
/*=============*/
|
/*=============*/
|
||||||
/****************************************************************
|
|
||||||
Gets the log group capacity. It is OK to read the value without
|
|
||||||
holding log_sys.mutex because it is constant.
|
|
||||||
@return log group capacity */
|
|
||||||
UNIV_INLINE
|
|
||||||
lsn_t
|
|
||||||
log_get_capacity(void);
|
|
||||||
/*==================*/
|
|
||||||
/****************************************************************
|
/****************************************************************
|
||||||
Get log_sys::max_modified_age_async. It is OK to read the value without
|
Get log_sys::max_modified_age_async. It is OK to read the value without
|
||||||
holding log_sys::mutex because it is constant.
|
holding log_sys::mutex because it is constant.
|
||||||
@ -153,7 +162,7 @@ log_get_max_modified_age_async(void);
|
|||||||
and lsn - buf_get_oldest_modification().
|
and lsn - buf_get_oldest_modification().
|
||||||
@param[in] file_size requested innodb_log_file_size
|
@param[in] file_size requested innodb_log_file_size
|
||||||
@retval true on success
|
@retval true on success
|
||||||
@retval false if the smallest log group is too small to
|
@retval false if the smallest log is too small to
|
||||||
accommodate the number of OS threads in the database server */
|
accommodate the number of OS threads in the database server */
|
||||||
bool
|
bool
|
||||||
log_set_capacity(ulonglong file_size)
|
log_set_capacity(ulonglong file_size)
|
||||||
@ -187,7 +196,7 @@ log_buffer_sync_in_background(
|
|||||||
/** Make a checkpoint. Note that this function does not flush dirty
|
/** Make a checkpoint. Note that this function does not flush dirty
|
||||||
blocks from the buffer pool: it only checks what is lsn of the oldest
|
blocks from the buffer pool: it only checks what is lsn of the oldest
|
||||||
modification in the pool, and writes information about the lsn in
|
modification in the pool, and writes information about the lsn in
|
||||||
log files. Use log_make_checkpoint() to flush also the pool.
|
log file. Use log_make_checkpoint() to flush also the pool.
|
||||||
@return true if success, false if a checkpoint write was already running */
|
@return true if success, false if a checkpoint write was already running */
|
||||||
bool log_checkpoint();
|
bool log_checkpoint();
|
||||||
|
|
||||||
@ -198,7 +207,7 @@ void log_make_checkpoint();
|
|||||||
Makes a checkpoint at the latest lsn and writes it to first page of each
|
Makes a checkpoint at the latest lsn and writes it to first page of each
|
||||||
data file in the database, so that we know that the file spaces contain
|
data file in the database, so that we know that the file spaces contain
|
||||||
all modifications up to that lsn. This can only be called at database
|
all modifications up to that lsn. This can only be called at database
|
||||||
shutdown. This function also writes all log in log files to the log archive. */
|
shutdown. This function also writes all log in log file to the log archive. */
|
||||||
void
|
void
|
||||||
logs_empty_and_mark_files_at_shutdown(void);
|
logs_empty_and_mark_files_at_shutdown(void);
|
||||||
/*=======================================*/
|
/*=======================================*/
|
||||||
@ -414,7 +423,7 @@ because InnoDB never supported more than one copy of the redo log. */
|
|||||||
LOG_FILE_START_LSN started here, 4 bytes earlier than LOG_HEADER_START_LSN,
|
LOG_FILE_START_LSN started here, 4 bytes earlier than LOG_HEADER_START_LSN,
|
||||||
which the LOG_FILE_START_LSN was renamed to.
|
which the LOG_FILE_START_LSN was renamed to.
|
||||||
Subformat 1 is for the fully redo-logged TRUNCATE
|
Subformat 1 is for the fully redo-logged TRUNCATE
|
||||||
(no MLOG_TRUNCATE records or extra log checkpoints or log files) */
|
(no MLOG_TRUNCATE records or extra log checkpoints or log file) */
|
||||||
#define LOG_HEADER_SUBFORMAT 4
|
#define LOG_HEADER_SUBFORMAT 4
|
||||||
/** LSN of the start of data in this log file (with format version 1;
|
/** LSN of the start of data in this log file (with format version 1;
|
||||||
in format version 0, it was called LOG_FILE_START_LSN and at offset 4). */
|
in format version 0, it was called LOG_FILE_START_LSN and at offset 4). */
|
||||||
@ -439,7 +448,7 @@ or the MySQL version that created the redo log file. */
|
|||||||
header; we write alternately to the
|
header; we write alternately to the
|
||||||
checkpoint fields when we make new
|
checkpoint fields when we make new
|
||||||
checkpoints; this field is only defined
|
checkpoints; this field is only defined
|
||||||
in the first log file of a log group */
|
in the first log file of a log */
|
||||||
#define LOG_CHECKPOINT_2 (3 * OS_FILE_LOG_BLOCK_SIZE)
|
#define LOG_CHECKPOINT_2 (3 * OS_FILE_LOG_BLOCK_SIZE)
|
||||||
/* second checkpoint field in the log
|
/* second checkpoint field in the log
|
||||||
header */
|
header */
|
||||||
@ -603,10 +612,8 @@ struct log_t{
|
|||||||
peeked at by log_free_check(), which
|
peeked at by log_free_check(), which
|
||||||
does not reserve the log mutex */
|
does not reserve the log mutex */
|
||||||
|
|
||||||
/** Log files. Protected by mutex or write_mutex. */
|
/** Log file stuff. Protected by mutex or write_mutex. */
|
||||||
struct files {
|
struct file {
|
||||||
/** number of files */
|
|
||||||
ulint n_files;
|
|
||||||
/** format of the redo log: e.g., FORMAT_10_5 */
|
/** format of the redo log: e.g., FORMAT_10_5 */
|
||||||
uint32_t format;
|
uint32_t format;
|
||||||
/** redo log subformat: 0 with separately logged TRUNCATE,
|
/** redo log subformat: 0 with separately logged TRUNCATE,
|
||||||
@ -619,31 +626,32 @@ struct log_t{
|
|||||||
lsn_t lsn;
|
lsn_t lsn;
|
||||||
/** the byte offset of the above lsn */
|
/** the byte offset of the above lsn */
|
||||||
lsn_t lsn_offset;
|
lsn_t lsn_offset;
|
||||||
|
/** log file */
|
||||||
|
log_file_t fd;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/** used only in recovery: recovery scan succeeded up to this
|
/** used only in recovery: recovery scan succeeded up to this
|
||||||
lsn in this log group */
|
lsn in this log group */
|
||||||
lsn_t scanned_lsn;
|
lsn_t scanned_lsn;
|
||||||
|
|
||||||
/** file descriptors for all log files */
|
/** opens log file which must be closed prior this call */
|
||||||
std::vector<log_file_t> files;
|
void open_file(std::string path);
|
||||||
|
/** opens log file which must be closed prior this call */
|
||||||
/** opens log files which must be closed prior this call */
|
dberr_t rename(std::string path) { return fd.rename(path); }
|
||||||
void open_files(std::vector<std::string> paths);
|
/** reads buffer from log file
|
||||||
/** reads buffer from log files
|
@param[in] offset offset in log file
|
||||||
@param[in] total_offset offset in log files treated as a single file
|
|
||||||
@param[in] buf buffer where to read */
|
@param[in] buf buffer where to read */
|
||||||
void read(os_offset_t total_offset, span<byte> buf);
|
void read(os_offset_t offset, span<byte> buf);
|
||||||
/** Tells whether writes require calling flush_data_only() */
|
/** Tells whether writes require calling flush_data_only() */
|
||||||
bool writes_are_durable() const noexcept;
|
bool writes_are_durable() const noexcept;
|
||||||
/** writes buffer to log files
|
/** writes buffer to log file
|
||||||
@param[in] total_offset offset in log files treated as a single file
|
@param[in] offset offset in log file
|
||||||
@param[in] buf buffer from which to write */
|
@param[in] buf buffer from which to write */
|
||||||
void write(os_offset_t total_offset, span<byte> buf);
|
void write(os_offset_t offset, span<byte> buf);
|
||||||
/** flushes OS page cache (excluding metadata!) for all log files */
|
/** flushes OS page cache (excluding metadata!) for log file */
|
||||||
void flush_data_only();
|
void flush_data_only();
|
||||||
/** closes all log files */
|
/** closes log file */
|
||||||
void close_files();
|
void close_file();
|
||||||
|
|
||||||
/** @return whether the redo log is encrypted */
|
/** @return whether the redo log is encrypted */
|
||||||
bool is_encrypted() const { return format & FORMAT_ENCRYPTED; }
|
bool is_encrypted() const { return format & FORMAT_ENCRYPTED; }
|
||||||
@ -651,11 +659,12 @@ struct log_t{
|
|||||||
bool is_physical() const
|
bool is_physical() const
|
||||||
{ return (format & ~FORMAT_ENCRYPTED) == FORMAT_10_5; }
|
{ return (format & ~FORMAT_ENCRYPTED) == FORMAT_10_5; }
|
||||||
/** @return capacity in bytes */
|
/** @return capacity in bytes */
|
||||||
lsn_t capacity() const{ return (file_size - LOG_FILE_HDR_SIZE) * n_files; }
|
lsn_t capacity() const{ return file_size - LOG_FILE_HDR_SIZE; }
|
||||||
/** Calculate the offset of a log sequence number.
|
/** Calculate the offset of a log sequence number.
|
||||||
@param[in] lsn log sequence number
|
@param[in] lsn log sequence number
|
||||||
@return offset within the log */
|
@return offset within the log */
|
||||||
inline lsn_t calc_lsn_offset(lsn_t lsn) const;
|
inline lsn_t calc_lsn_offset(lsn_t lsn) const;
|
||||||
|
lsn_t calc_lsn_offset_old(lsn_t lsn) const;
|
||||||
|
|
||||||
/** Set the field values to correspond to a given lsn. */
|
/** Set the field values to correspond to a given lsn. */
|
||||||
void set_fields(lsn_t lsn)
|
void set_fields(lsn_t lsn)
|
||||||
@ -672,16 +681,11 @@ struct log_t{
|
|||||||
@return whether no invalid blocks (e.g checksum mismatch) were found */
|
@return whether no invalid blocks (e.g checksum mismatch) were found */
|
||||||
bool read_log_seg(lsn_t* start_lsn, lsn_t end_lsn);
|
bool read_log_seg(lsn_t* start_lsn, lsn_t end_lsn);
|
||||||
|
|
||||||
/** Initialize the redo log buffer.
|
/** Initialize the redo log buffer. */
|
||||||
@param[in] n_files number of files */
|
void create();
|
||||||
void create(ulint n_files);
|
|
||||||
|
|
||||||
/** Close the redo log buffer. */
|
/** Close the redo log buffer. */
|
||||||
void close()
|
void close() { close_file(); }
|
||||||
{
|
|
||||||
n_files = 0;
|
|
||||||
close_files();
|
|
||||||
}
|
|
||||||
void set_lsn(lsn_t a_lsn);
|
void set_lsn(lsn_t a_lsn);
|
||||||
lsn_t get_lsn() const { return lsn; }
|
lsn_t get_lsn() const { return lsn; }
|
||||||
void set_lsn_offset(lsn_t a_lsn);
|
void set_lsn_offset(lsn_t a_lsn);
|
||||||
@ -721,7 +725,7 @@ struct log_t{
|
|||||||
/* @} */
|
/* @} */
|
||||||
|
|
||||||
/** Fields involved in checkpoints @{ */
|
/** Fields involved in checkpoints @{ */
|
||||||
lsn_t log_group_capacity; /*!< capacity of the log group; if
|
lsn_t log_capacity; /*!< capacity of the log; if
|
||||||
the checkpoint age exceeds this, it is
|
the checkpoint age exceeds this, it is
|
||||||
a serious error because it is possible
|
a serious error because it is possible
|
||||||
we will then overwrite log and spoil
|
we will then overwrite log and spoil
|
||||||
@ -830,33 +834,38 @@ public:
|
|||||||
/** Redo log system */
|
/** Redo log system */
|
||||||
extern log_t log_sys;
|
extern log_t log_sys;
|
||||||
|
|
||||||
|
/** Gets the log capacity. It is OK to read the value without
|
||||||
|
holding log_sys.mutex because it is constant.
|
||||||
|
@return log capacity */
|
||||||
|
inline lsn_t log_get_capacity(void) { return log_sys.log_capacity; }
|
||||||
|
|
||||||
/** Calculate the offset of a log sequence number.
|
/** Calculate the offset of a log sequence number.
|
||||||
@param[in] lsn log sequence number
|
@param[in] lsn log sequence number
|
||||||
@return offset within the log */
|
@return offset within the log */
|
||||||
inline lsn_t log_t::files::calc_lsn_offset(lsn_t lsn) const
|
inline lsn_t log_t::file::calc_lsn_offset(lsn_t lsn) const
|
||||||
{
|
{
|
||||||
ut_ad(this == &log_sys.log);
|
ut_ad(this == &log_sys.log);
|
||||||
/* The lsn parameters are updated while holding both the mutexes
|
/* The lsn parameters are updated while holding both the mutexes
|
||||||
and it is ok to have either of them while reading */
|
and it is ok to have either of them while reading */
|
||||||
ut_ad(log_sys.mutex.is_owned() || log_sys.write_mutex.is_owned());
|
ut_ad(log_sys.mutex.is_owned() || log_sys.write_mutex.is_owned());
|
||||||
const lsn_t group_size= capacity();
|
const lsn_t size = capacity();
|
||||||
lsn_t l= lsn - this->lsn;
|
lsn_t l= lsn - this->lsn;
|
||||||
if (longlong(l) < 0) {
|
if (longlong(l) < 0) {
|
||||||
l= lsn_t(-longlong(l)) % group_size;
|
l = lsn_t(-longlong(l)) % size;
|
||||||
l= group_size - l;
|
l = size - l;
|
||||||
}
|
}
|
||||||
|
|
||||||
l+= lsn_offset - LOG_FILE_HDR_SIZE * (1 + lsn_offset / file_size);
|
l+= lsn_offset - LOG_FILE_HDR_SIZE * (1 + lsn_offset / file_size);
|
||||||
l%= group_size;
|
l %= size;
|
||||||
return l + LOG_FILE_HDR_SIZE * (1 + l / (file_size - LOG_FILE_HDR_SIZE));
|
return l + LOG_FILE_HDR_SIZE * (1 + l / (file_size - LOG_FILE_HDR_SIZE));
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void log_t::files::set_lsn(lsn_t a_lsn) {
|
inline void log_t::file::set_lsn(lsn_t a_lsn) {
|
||||||
ut_ad(log_sys.mutex.is_owned() || log_sys.write_mutex.is_owned());
|
ut_ad(log_sys.mutex.is_owned() || log_sys.write_mutex.is_owned());
|
||||||
lsn = a_lsn;
|
lsn = a_lsn;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void log_t::files::set_lsn_offset(lsn_t a_lsn) {
|
inline void log_t::file::set_lsn_offset(lsn_t a_lsn) {
|
||||||
ut_ad(log_sys.mutex.is_owned() || log_sys.write_mutex.is_owned());
|
ut_ad(log_sys.mutex.is_owned() || log_sys.write_mutex.is_owned());
|
||||||
ut_ad((lsn % OS_FILE_LOG_BLOCK_SIZE) == (a_lsn % OS_FILE_LOG_BLOCK_SIZE));
|
ut_ad((lsn % OS_FILE_LOG_BLOCK_SIZE) == (a_lsn % OS_FILE_LOG_BLOCK_SIZE));
|
||||||
lsn_offset = a_lsn;
|
lsn_offset = a_lsn;
|
||||||
|
@ -375,18 +375,6 @@ log_get_lsn_nowait(void)
|
|||||||
return(lsn);
|
return(lsn);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************
|
|
||||||
Gets the log group capacity. It is OK to read the value without
|
|
||||||
holding log_sys.mutex because it is constant.
|
|
||||||
@return log group capacity */
|
|
||||||
UNIV_INLINE
|
|
||||||
lsn_t
|
|
||||||
log_get_capacity(void)
|
|
||||||
/*==================*/
|
|
||||||
{
|
|
||||||
return(log_sys.log_group_capacity);
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************
|
/****************************************************************
|
||||||
Get log_sys::max_modified_age_async. It is OK to read the value without
|
Get log_sys::max_modified_age_async. It is OK to read the value without
|
||||||
holding log_sys::mutex because it is constant.
|
holding log_sys::mutex because it is constant.
|
||||||
|
@ -296,7 +296,21 @@ struct recv_sys_t{
|
|||||||
/** Last added LSN to pages. */
|
/** Last added LSN to pages. */
|
||||||
lsn_t last_stored_lsn;
|
lsn_t last_stored_lsn;
|
||||||
|
|
||||||
|
/** After successful upgrade from multiple redo log files we'd like
|
||||||
|
to remove extra ones */
|
||||||
|
bool remove_extra_log_files{false};
|
||||||
|
|
||||||
|
void read(os_offset_t offset, span<byte> buf);
|
||||||
|
size_t files_size();
|
||||||
|
void close_files() { files.clear(); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
/** All found log files (more that one is possible if we're upgrading
|
||||||
|
from older MariaDB version */
|
||||||
|
std::vector<log_file_t> files;
|
||||||
|
|
||||||
|
void open_log_files_if_needed();
|
||||||
|
|
||||||
/** Maximum number of buffer pool blocks to allocate for redo log records */
|
/** Maximum number of buffer pool blocks to allocate for redo log records */
|
||||||
ulint max_log_blocks;
|
ulint max_log_blocks;
|
||||||
|
|
||||||
|
@ -327,7 +327,6 @@ constexpr ulint SRV_UNDO_TABLESPACE_SIZE_IN_PAGES= (10U << 20) /
|
|||||||
|
|
||||||
extern char* srv_log_group_home_dir;
|
extern char* srv_log_group_home_dir;
|
||||||
|
|
||||||
extern ulong srv_n_log_files;
|
|
||||||
/** The InnoDB redo log file size, or 0 when changing the redo log format
|
/** The InnoDB redo log file size, or 0 when changing the redo log format
|
||||||
at startup (while disallowing writes to the redo log). */
|
at startup (while disallowing writes to the redo log). */
|
||||||
extern ulonglong srv_log_file_size;
|
extern ulonglong srv_log_file_size;
|
||||||
@ -511,8 +510,8 @@ extern my_bool srv_purge_view_update_only_debug;
|
|||||||
extern my_bool srv_master_thread_disabled_debug;
|
extern my_bool srv_master_thread_disabled_debug;
|
||||||
/** InnoDB system tablespace to set during recovery */
|
/** InnoDB system tablespace to set during recovery */
|
||||||
extern uint srv_sys_space_size_debug;
|
extern uint srv_sys_space_size_debug;
|
||||||
/** whether redo log files have been created at startup */
|
/** whether redo log file has been created at startup */
|
||||||
extern bool srv_log_files_created;
|
extern bool srv_log_file_created;
|
||||||
#endif /* UNIV_DEBUG */
|
#endif /* UNIV_DEBUG */
|
||||||
|
|
||||||
extern ulint srv_dml_needed_delay;
|
extern ulint srv_dml_needed_delay;
|
||||||
|
@ -204,7 +204,7 @@ log_calculate_actual_len(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Check margin not to overwrite transaction log from the last checkpoint.
|
/** Check margin not to overwrite transaction log from the last checkpoint.
|
||||||
If would estimate the log write to exceed the log_group_capacity,
|
If would estimate the log write to exceed the log_capacity,
|
||||||
waits for the checkpoint is done enough.
|
waits for the checkpoint is done enough.
|
||||||
@param[in] len length of the data to be written */
|
@param[in] len length of the data to be written */
|
||||||
|
|
||||||
@ -216,7 +216,7 @@ log_margin_checkpoint_age(
|
|||||||
|
|
||||||
ut_ad(log_mutex_own());
|
ut_ad(log_mutex_own());
|
||||||
|
|
||||||
if (margin > log_sys.log_group_capacity) {
|
if (margin > log_sys.log_capacity) {
|
||||||
/* return with warning output to avoid deadlock */
|
/* return with warning output to avoid deadlock */
|
||||||
if (!log_has_printed_chkp_margine_warning
|
if (!log_has_printed_chkp_margine_warning
|
||||||
|| difftime(time(NULL),
|
|| difftime(time(NULL),
|
||||||
@ -224,11 +224,11 @@ log_margin_checkpoint_age(
|
|||||||
log_has_printed_chkp_margine_warning = true;
|
log_has_printed_chkp_margine_warning = true;
|
||||||
log_last_margine_warning_time = time(NULL);
|
log_last_margine_warning_time = time(NULL);
|
||||||
|
|
||||||
ib::error() << "The transaction log files are too"
|
ib::error() << "The transaction log file is too"
|
||||||
" small for the single transaction log (size="
|
" small for the single transaction log (size="
|
||||||
<< len << "). So, the last checkpoint age"
|
<< len << "). So, the last checkpoint age"
|
||||||
" might exceed the log group capacity "
|
" might exceed the log capacity "
|
||||||
<< log_sys.log_group_capacity << ".";
|
<< log_sys.log_capacity << ".";
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@ -238,7 +238,7 @@ log_margin_checkpoint_age(
|
|||||||
Try to do checkpoint once. We cannot keep waiting here as it might
|
Try to do checkpoint once. We cannot keep waiting here as it might
|
||||||
result in hang in case the current mtr has latch on oldest lsn */
|
result in hang in case the current mtr has latch on oldest lsn */
|
||||||
if (log_sys.lsn - log_sys.last_checkpoint_lsn + margin
|
if (log_sys.lsn - log_sys.last_checkpoint_lsn + margin
|
||||||
> log_sys.log_group_capacity) {
|
> log_sys.log_capacity) {
|
||||||
/* The log write of 'len' might overwrite the transaction log
|
/* The log write of 'len' might overwrite the transaction log
|
||||||
after the last checkpoint. Makes checkpoint. */
|
after the last checkpoint. Makes checkpoint. */
|
||||||
|
|
||||||
@ -246,7 +246,7 @@ log_margin_checkpoint_age(
|
|||||||
|
|
||||||
if (log_sys.lsn - log_buf_pool_get_oldest_modification()
|
if (log_sys.lsn - log_buf_pool_get_oldest_modification()
|
||||||
+ margin
|
+ margin
|
||||||
<= log_sys.log_group_capacity) {
|
<= log_sys.log_capacity) {
|
||||||
flushed_enough = true;
|
flushed_enough = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -412,7 +412,7 @@ log_close(void)
|
|||||||
|
|
||||||
checkpoint_age = lsn - log_sys.last_checkpoint_lsn;
|
checkpoint_age = lsn - log_sys.last_checkpoint_lsn;
|
||||||
|
|
||||||
if (checkpoint_age >= log_sys.log_group_capacity) {
|
if (checkpoint_age >= log_sys.log_capacity) {
|
||||||
DBUG_EXECUTE_IF(
|
DBUG_EXECUTE_IF(
|
||||||
"print_all_chkp_warnings",
|
"print_all_chkp_warnings",
|
||||||
log_has_printed_chkp_warning = false;);
|
log_has_printed_chkp_warning = false;);
|
||||||
@ -424,10 +424,9 @@ log_close(void)
|
|||||||
log_last_warning_time = time(NULL);
|
log_last_warning_time = time(NULL);
|
||||||
|
|
||||||
ib::error() << "The age of the last checkpoint is "
|
ib::error() << "The age of the last checkpoint is "
|
||||||
<< checkpoint_age << ", which exceeds the log"
|
<< checkpoint_age
|
||||||
" group capacity "
|
<< ", which exceeds the log capacity "
|
||||||
<< log_sys.log_group_capacity
|
<< log_sys.log_capacity << ".";
|
||||||
<< ".";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -459,8 +458,7 @@ log_set_capacity(ulonglong file_size)
|
|||||||
lsn_t margin;
|
lsn_t margin;
|
||||||
ulint free;
|
ulint free;
|
||||||
|
|
||||||
lsn_t smallest_capacity = (file_size - LOG_FILE_HDR_SIZE)
|
lsn_t smallest_capacity = file_size - LOG_FILE_HDR_SIZE;
|
||||||
* srv_n_log_files;
|
|
||||||
/* Add extra safety */
|
/* Add extra safety */
|
||||||
smallest_capacity -= smallest_capacity / 10;
|
smallest_capacity -= smallest_capacity / 10;
|
||||||
|
|
||||||
@ -472,12 +470,13 @@ log_set_capacity(ulonglong file_size)
|
|||||||
free = LOG_CHECKPOINT_FREE_PER_THREAD * (10 + srv_thread_concurrency)
|
free = LOG_CHECKPOINT_FREE_PER_THREAD * (10 + srv_thread_concurrency)
|
||||||
+ LOG_CHECKPOINT_EXTRA_FREE;
|
+ LOG_CHECKPOINT_EXTRA_FREE;
|
||||||
if (free >= smallest_capacity / 2) {
|
if (free >= smallest_capacity / 2) {
|
||||||
ib::error() << "Cannot continue operation. ib_logfiles are too"
|
ib::error() << "Cannot continue operation. " << LOG_FILE_NAME
|
||||||
" small for innodb_thread_concurrency="
|
<< " is too small for innodb_thread_concurrency="
|
||||||
<< srv_thread_concurrency << ". The combined size of"
|
<< srv_thread_concurrency << ". The size of "
|
||||||
" ib_logfiles should be bigger than"
|
<< LOG_FILE_NAME
|
||||||
" 200 kB * innodb_thread_concurrency. "
|
<< " should be bigger than 200 kB * "
|
||||||
<< INNODB_PARAMETERS_MSG;
|
"innodb_thread_concurrency. "
|
||||||
|
<< INNODB_PARAMETERS_MSG;
|
||||||
return(false);
|
return(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -486,7 +485,7 @@ log_set_capacity(ulonglong file_size)
|
|||||||
|
|
||||||
log_mutex_enter();
|
log_mutex_enter();
|
||||||
|
|
||||||
log_sys.log_group_capacity = smallest_capacity;
|
log_sys.log_capacity = smallest_capacity;
|
||||||
|
|
||||||
log_sys.max_modified_age_async = margin
|
log_sys.max_modified_age_async = margin
|
||||||
- margin / LOG_POOL_PREFLUSH_RATIO_ASYNC;
|
- margin / LOG_POOL_PREFLUSH_RATIO_ASYNC;
|
||||||
@ -541,7 +540,7 @@ void log_t::create()
|
|||||||
os_event_set(flush_event);
|
os_event_set(flush_event);
|
||||||
n_log_ios= 0;
|
n_log_ios= 0;
|
||||||
n_log_ios_old= 0;
|
n_log_ios_old= 0;
|
||||||
log_group_capacity= 0;
|
log_capacity= 0;
|
||||||
max_modified_age_async= 0;
|
max_modified_age_async= 0;
|
||||||
max_modified_age_sync= 0;
|
max_modified_age_sync= 0;
|
||||||
max_checkpoint_age_async= 0;
|
max_checkpoint_age_async= 0;
|
||||||
@ -793,71 +792,54 @@ dberr_t log_file_t::flush_data_only() noexcept
|
|||||||
return m_file->flush_data_only();
|
return m_file->flush_data_only();
|
||||||
}
|
}
|
||||||
|
|
||||||
void log_t::files::open_files(std::vector<std::string> paths)
|
void log_t::file::open_file(std::string path)
|
||||||
{
|
{
|
||||||
files.clear();
|
fd= log_file_t(std::move(path));
|
||||||
files.reserve(paths.size());
|
if (const dberr_t err= fd.open())
|
||||||
for (auto &&path : paths)
|
ib::fatal() << "open(" << fd.get_path() << ") returned " << err;
|
||||||
{
|
|
||||||
files.push_back(std::move(path));
|
|
||||||
if (files.back().open() != DB_SUCCESS)
|
|
||||||
ib::fatal() << "open(" << files.back().get_path() << ") failed";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void log_t::files::read(os_offset_t total_offset, span<byte> buf)
|
void log_t::file::read(os_offset_t offset, span<byte> buf)
|
||||||
{
|
{
|
||||||
auto &file= files[static_cast<size_t>(total_offset / file_size)];
|
if (const dberr_t err= fd.read(offset, buf))
|
||||||
const os_offset_t offset= total_offset % file_size;
|
ib::fatal() << "read(" << fd.get_path() << ") returned "<< err;
|
||||||
|
|
||||||
if (const dberr_t err= file.read(offset, buf))
|
|
||||||
ib::fatal() << "read(" << file.get_path() << ") returned " << err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool log_t::files::writes_are_durable() const noexcept
|
bool log_t::file::writes_are_durable() const noexcept
|
||||||
{
|
{
|
||||||
return files[0].writes_are_durable();
|
return fd.writes_are_durable();
|
||||||
}
|
}
|
||||||
|
|
||||||
void log_t::files::write(os_offset_t total_offset, span<byte> buf)
|
void log_t::file::write(os_offset_t offset, span<byte> buf)
|
||||||
{
|
{
|
||||||
auto &file= files[static_cast<size_t>(total_offset / file_size)];
|
if (const dberr_t err= fd.write(offset, buf))
|
||||||
const os_offset_t offset= total_offset % file_size;
|
ib::fatal() << "write(" << fd.get_path() << ") returned " << err;
|
||||||
|
|
||||||
if (const dberr_t err= file.write(offset, buf))
|
|
||||||
ib::fatal() << "write(" << file.get_path() << ") returned " << err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void log_t::files::flush_data_only()
|
void log_t::file::flush_data_only()
|
||||||
{
|
{
|
||||||
log_sys.pending_flushes.fetch_add(1, std::memory_order_acquire);
|
log_sys.pending_flushes.fetch_add(1, std::memory_order_acquire);
|
||||||
for (auto &file : files)
|
if (const dberr_t err= fd.flush_data_only())
|
||||||
{
|
ib::fatal() << "flush_data_only(" << fd.get_path() << ") returned " << err;
|
||||||
if (file.flush_data_only() != DB_SUCCESS)
|
|
||||||
ib::fatal() << "flush_data_only(" << file.get_path() << ") failed";
|
|
||||||
}
|
|
||||||
log_sys.pending_flushes.fetch_sub(1, std::memory_order_release);
|
log_sys.pending_flushes.fetch_sub(1, std::memory_order_release);
|
||||||
log_sys.flushes.fetch_add(1, std::memory_order_release);
|
log_sys.flushes.fetch_add(1, std::memory_order_release);
|
||||||
}
|
}
|
||||||
|
|
||||||
void log_t::files::close_files()
|
void log_t::file::close_file()
|
||||||
{
|
{
|
||||||
for (auto &file : files)
|
if (!fd.is_opened())
|
||||||
{
|
return;
|
||||||
if (file.is_opened() && file.close() != DB_SUCCESS)
|
|
||||||
ib::fatal() << "close(" << file.get_path() << ") failed";
|
if (const dberr_t err= fd.close())
|
||||||
}
|
ib::fatal() << "close(" << fd.get_path() << ") returned " << err;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Initialize the redo log.
|
/** Initialize the redo log. */
|
||||||
@param[in] n_files number of files */
|
void log_t::file::create()
|
||||||
void log_t::files::create(ulint n_files)
|
|
||||||
{
|
{
|
||||||
ut_ad(n_files <= SRV_N_LOG_FILES_MAX);
|
|
||||||
ut_ad(this == &log_sys.log);
|
ut_ad(this == &log_sys.log);
|
||||||
ut_ad(log_sys.is_initialised());
|
ut_ad(log_sys.is_initialised());
|
||||||
|
|
||||||
this->n_files= n_files;
|
|
||||||
format= srv_encrypt_log ? log_t::FORMAT_ENC_10_5 : log_t::FORMAT_10_5;
|
format= srv_encrypt_log ? log_t::FORMAT_ENC_10_5 : log_t::FORMAT_10_5;
|
||||||
subformat= 2;
|
subformat= 2;
|
||||||
file_size= srv_log_file_size;
|
file_size= srv_log_file_size;
|
||||||
@ -876,16 +858,11 @@ Writes a log file header to a log file space. */
|
|||||||
static
|
static
|
||||||
void
|
void
|
||||||
log_file_header_flush(
|
log_file_header_flush(
|
||||||
ulint nth_file, /*!< in: header to the nth file in the
|
|
||||||
log file space */
|
|
||||||
lsn_t start_lsn) /*!< in: log file data starts at this
|
lsn_t start_lsn) /*!< in: log file data starts at this
|
||||||
lsn */
|
lsn */
|
||||||
{
|
{
|
||||||
lsn_t dest_offset;
|
|
||||||
|
|
||||||
ut_ad(log_write_mutex_own());
|
ut_ad(log_write_mutex_own());
|
||||||
ut_ad(!recv_no_log_write);
|
ut_ad(!recv_no_log_write);
|
||||||
ut_a(nth_file < log_sys.log.n_files);
|
|
||||||
ut_ad(log_sys.log.format == log_t::FORMAT_10_5
|
ut_ad(log_sys.log.format == log_t::FORMAT_10_5
|
||||||
|| log_sys.log.format == log_t::FORMAT_ENC_10_5);
|
|| log_sys.log.format == log_t::FORMAT_ENC_10_5);
|
||||||
|
|
||||||
@ -902,17 +879,13 @@ log_file_header_flush(
|
|||||||
>= sizeof LOG_HEADER_CREATOR_CURRENT);
|
>= sizeof LOG_HEADER_CREATOR_CURRENT);
|
||||||
log_block_store_checksum(buf);
|
log_block_store_checksum(buf);
|
||||||
|
|
||||||
dest_offset = nth_file * log_sys.log.file_size;
|
DBUG_PRINT("ib_log", ("write " LSN_PF, start_lsn));
|
||||||
|
|
||||||
DBUG_PRINT("ib_log", ("write " LSN_PF
|
|
||||||
" file " ULINTPF " header",
|
|
||||||
start_lsn, nth_file));
|
|
||||||
|
|
||||||
log_sys.n_log_ios++;
|
log_sys.n_log_ios++;
|
||||||
|
|
||||||
srv_stats.os_log_pending_writes.inc();
|
srv_stats.os_log_pending_writes.inc();
|
||||||
|
|
||||||
log_sys.log.write(static_cast<size_t>(dest_offset), buf);
|
log_sys.log.write(0, buf);
|
||||||
|
|
||||||
srv_stats.os_log_pending_writes.dec();
|
srv_stats.os_log_pending_writes.dec();
|
||||||
}
|
}
|
||||||
@ -960,8 +933,7 @@ loop:
|
|||||||
|
|
||||||
ut_a(next_offset / log_sys.log.file_size <= ULINT_MAX);
|
ut_a(next_offset / log_sys.log.file_size <= ULINT_MAX);
|
||||||
|
|
||||||
log_file_header_flush(
|
log_file_header_flush(start_lsn);
|
||||||
ulint(next_offset / log_sys.log.file_size), start_lsn);
|
|
||||||
srv_stats.os_log_written.add(OS_FILE_LOG_BLOCK_SIZE);
|
srv_stats.os_log_written.add(OS_FILE_LOG_BLOCK_SIZE);
|
||||||
|
|
||||||
srv_stats.log_writes.inc();
|
srv_stats.log_writes.inc();
|
||||||
@ -1106,7 +1078,7 @@ void log_write_up_to(lsn_t lsn, bool flush_to_disk, bool rotate_key)
|
|||||||
ut_ad(!rotate_key || flush_to_disk);
|
ut_ad(!rotate_key || flush_to_disk);
|
||||||
|
|
||||||
if (recv_no_ibuf_operations) {
|
if (recv_no_ibuf_operations) {
|
||||||
/* Recovery is running and no operations on the log files are
|
/* Recovery is running and no operations on the log file are
|
||||||
allowed yet (the variable name .._no_ibuf_.. is misleading) */
|
allowed yet (the variable name .._no_ibuf_.. is misleading) */
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@ -1120,7 +1092,7 @@ loop:
|
|||||||
/* NOTE: Currently doesn't do dirty read for
|
/* NOTE: Currently doesn't do dirty read for
|
||||||
(flush_to_disk == true) case, because the log_mutex
|
(flush_to_disk == true) case, because the log_mutex
|
||||||
contention also works as the arbitrator for write-IO
|
contention also works as the arbitrator for write-IO
|
||||||
(fsync) bandwidth between log files and data files. */
|
(fsync) bandwidth between log file and data files. */
|
||||||
if (!flush_to_disk && log_sys.write_lsn >= lsn) {
|
if (!flush_to_disk && log_sys.write_lsn >= lsn) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1252,7 +1224,7 @@ loop:
|
|||||||
rotate_key ? LOG_ENCRYPT_ROTATE_KEY : LOG_ENCRYPT);
|
rotate_key ? LOG_ENCRYPT_ROTATE_KEY : LOG_ENCRYPT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Do the write to the log files */
|
/* Do the write to the log file */
|
||||||
log_write_buf(
|
log_write_buf(
|
||||||
write_buf + area_start, area_end - area_start + pad_size,
|
write_buf + area_start, area_end - area_start + pad_size,
|
||||||
#ifdef UNIV_DEBUG
|
#ifdef UNIV_DEBUG
|
||||||
@ -1510,7 +1482,7 @@ log_append_on_checkpoint(
|
|||||||
/** Make a checkpoint. Note that this function does not flush dirty
|
/** Make a checkpoint. Note that this function does not flush dirty
|
||||||
blocks from the buffer pool: it only checks what is lsn of the oldest
|
blocks from the buffer pool: it only checks what is lsn of the oldest
|
||||||
modification in the pool, and writes information about the lsn in
|
modification in the pool, and writes information about the lsn in
|
||||||
log files. Use log_make_checkpoint() to flush also the pool.
|
log file. Use log_make_checkpoint() to flush also the pool.
|
||||||
@return true if success, false if a checkpoint write was already running */
|
@return true if success, false if a checkpoint write was already running */
|
||||||
bool log_checkpoint()
|
bool log_checkpoint()
|
||||||
{
|
{
|
||||||
@ -1727,7 +1699,7 @@ extern void buf_resize_shutdown();
|
|||||||
Makes a checkpoint at the latest lsn and writes it to first page of each
|
Makes a checkpoint at the latest lsn and writes it to first page of each
|
||||||
data file in the database, so that we know that the file spaces contain
|
data file in the database, so that we know that the file spaces contain
|
||||||
all modifications up to that lsn. This can only be called at database
|
all modifications up to that lsn. This can only be called at database
|
||||||
shutdown. This function also writes all log in log files to the log archive. */
|
shutdown. This function also writes log in log file to the log archive. */
|
||||||
void
|
void
|
||||||
logs_empty_and_mark_files_at_shutdown(void)
|
logs_empty_and_mark_files_at_shutdown(void)
|
||||||
/*=======================================*/
|
/*=======================================*/
|
||||||
@ -2093,7 +2065,7 @@ void log_t::close()
|
|||||||
|
|
||||||
/******************************************************//**
|
/******************************************************//**
|
||||||
Pads the current log block full with dummy log records. Used in producing
|
Pads the current log block full with dummy log records. Used in producing
|
||||||
consistent archived log files and scrubbing redo log. */
|
consistent archived log file and scrubbing redo log. */
|
||||||
static
|
static
|
||||||
void
|
void
|
||||||
log_pad_current_log_block(void)
|
log_pad_current_log_block(void)
|
||||||
@ -2182,3 +2154,41 @@ DECLARE_THREAD(log_scrub_thread)(void*)
|
|||||||
|
|
||||||
OS_THREAD_DUMMY_RETURN;
|
OS_THREAD_DUMMY_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string get_log_file_path(const char *filename)
|
||||||
|
{
|
||||||
|
const size_t size= strlen(srv_log_group_home_dir) + /* path separator */ 1 +
|
||||||
|
strlen(filename) + /* longest suffix */ 3;
|
||||||
|
std::string path;
|
||||||
|
path.reserve(size);
|
||||||
|
path.assign(srv_log_group_home_dir);
|
||||||
|
|
||||||
|
std::replace(path.begin(), path.end(), OS_PATH_SEPARATOR_ALT,
|
||||||
|
OS_PATH_SEPARATOR);
|
||||||
|
|
||||||
|
if (path.back() != OS_PATH_SEPARATOR)
|
||||||
|
path.push_back(OS_PATH_SEPARATOR);
|
||||||
|
path.append(filename);
|
||||||
|
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string> get_existing_log_files_paths() {
|
||||||
|
std::vector<std::string> result;
|
||||||
|
|
||||||
|
for (int i= 0; i < 101; i++) {
|
||||||
|
auto path= get_log_file_path(LOG_FILE_NAME_PREFIX)
|
||||||
|
.append(std::to_string(i));
|
||||||
|
os_file_stat_t stat;
|
||||||
|
dberr_t err= os_file_get_status(path.c_str(), &stat, false, true);
|
||||||
|
if (err)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (stat.type != OS_FILE_TYPE_FILE)
|
||||||
|
break;
|
||||||
|
|
||||||
|
result.push_back(std::move(path));
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
@ -86,7 +86,7 @@ to file pages already before the recovery is finished: in this case no
|
|||||||
ibuf operations are allowed, as they could modify the pages read in the
|
ibuf operations are allowed, as they could modify the pages read in the
|
||||||
buffer pool before the pages have been recovered to the up-to-date state.
|
buffer pool before the pages have been recovered to the up-to-date state.
|
||||||
|
|
||||||
TRUE means that recovery is running and no operations on the log files
|
true means that recovery is running and no operations on the log file
|
||||||
are allowed yet: the variable name is misleading. */
|
are allowed yet: the variable name is misleading. */
|
||||||
bool recv_no_ibuf_operations;
|
bool recv_no_ibuf_operations;
|
||||||
|
|
||||||
@ -544,6 +544,34 @@ inline void recv_sys_t::trim(const page_id_t page_id, lsn_t lsn)
|
|||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void recv_sys_t::open_log_files_if_needed()
|
||||||
|
{
|
||||||
|
if (!recv_sys.files.empty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (auto &&path : get_existing_log_files_paths())
|
||||||
|
{
|
||||||
|
recv_sys.files.emplace_back(std::move(path));
|
||||||
|
ut_a(recv_sys.files.back().open() == DB_SUCCESS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void recv_sys_t::read(os_offset_t total_offset, span<byte> buf)
|
||||||
|
{
|
||||||
|
open_log_files_if_needed();
|
||||||
|
|
||||||
|
size_t file_idx= static_cast<size_t>(total_offset / log_sys.log.file_size);
|
||||||
|
os_offset_t offset= total_offset % log_sys.log.file_size;
|
||||||
|
dberr_t err= recv_sys.files[file_idx].read(offset, buf);
|
||||||
|
ut_a(err == DB_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t recv_sys_t::files_size()
|
||||||
|
{
|
||||||
|
open_log_files_if_needed();
|
||||||
|
return files.size();
|
||||||
|
}
|
||||||
|
|
||||||
/** Process a file name from a FILE_* record.
|
/** Process a file name from a FILE_* record.
|
||||||
@param[in,out] name file name
|
@param[in,out] name file name
|
||||||
@param[in] len length of the file name
|
@param[in] len length of the file name
|
||||||
@ -708,6 +736,8 @@ void recv_sys_t::close()
|
|||||||
|
|
||||||
recv_spaces.clear();
|
recv_spaces.clear();
|
||||||
mlog_init.clear();
|
mlog_init.clear();
|
||||||
|
|
||||||
|
files.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************
|
/************************************************************
|
||||||
@ -951,7 +981,7 @@ inline void recv_sys_t::free(const void *data)
|
|||||||
out: the last read valid lsn
|
out: the last read valid lsn
|
||||||
@param[in] end_lsn read area end
|
@param[in] end_lsn read area end
|
||||||
@return whether no invalid blocks (e.g checksum mismatch) were found */
|
@return whether no invalid blocks (e.g checksum mismatch) were found */
|
||||||
bool log_t::files::read_log_seg(lsn_t* start_lsn, lsn_t end_lsn)
|
bool log_t::file::read_log_seg(lsn_t* start_lsn, lsn_t end_lsn)
|
||||||
{
|
{
|
||||||
ulint len;
|
ulint len;
|
||||||
bool success = true;
|
bool success = true;
|
||||||
@ -960,7 +990,7 @@ bool log_t::files::read_log_seg(lsn_t* start_lsn, lsn_t end_lsn)
|
|||||||
ut_ad(!(end_lsn % OS_FILE_LOG_BLOCK_SIZE));
|
ut_ad(!(end_lsn % OS_FILE_LOG_BLOCK_SIZE));
|
||||||
byte* buf = log_sys.buf;
|
byte* buf = log_sys.buf;
|
||||||
loop:
|
loop:
|
||||||
lsn_t source_offset = calc_lsn_offset(*start_lsn);
|
lsn_t source_offset = calc_lsn_offset_old(*start_lsn);
|
||||||
|
|
||||||
ut_a(end_lsn - *start_lsn <= ULINT_MAX);
|
ut_a(end_lsn - *start_lsn <= ULINT_MAX);
|
||||||
len = (ulint) (end_lsn - *start_lsn);
|
len = (ulint) (end_lsn - *start_lsn);
|
||||||
@ -980,7 +1010,7 @@ loop:
|
|||||||
|
|
||||||
ut_a((source_offset >> srv_page_size_shift) <= ULINT_MAX);
|
ut_a((source_offset >> srv_page_size_shift) <= ULINT_MAX);
|
||||||
|
|
||||||
log_sys.log.read(static_cast<size_t>(source_offset), {buf, len});
|
recv_sys.read(source_offset, {buf, len});
|
||||||
|
|
||||||
for (ulint l = 0; l < len; l += OS_FILE_LOG_BLOCK_SIZE,
|
for (ulint l = 0; l < len; l += OS_FILE_LOG_BLOCK_SIZE,
|
||||||
buf += OS_FILE_LOG_BLOCK_SIZE,
|
buf += OS_FILE_LOG_BLOCK_SIZE,
|
||||||
@ -1094,6 +1124,28 @@ recv_check_log_header_checksum(
|
|||||||
== log_block_calc_checksum_crc32(buf));
|
== log_block_calc_checksum_crc32(buf));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool redo_file_sizes_are_correct()
|
||||||
|
{
|
||||||
|
auto paths= get_existing_log_files_paths();
|
||||||
|
auto get_size= [](const std::string &path) {
|
||||||
|
return os_file_get_size(path.c_str()).m_total_size;
|
||||||
|
};
|
||||||
|
os_offset_t size= get_size(paths[0]);
|
||||||
|
|
||||||
|
auto it=
|
||||||
|
std::find_if(paths.begin(), paths.end(), [&](const std::string &path) {
|
||||||
|
return get_size(path) != size;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (it == paths.end())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
ib::error() << "Log file " << *it << " is of different size "
|
||||||
|
<< get_size(*it) << " bytes than other log files " << size
|
||||||
|
<< " bytes!";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/** Find the latest checkpoint in the format-0 log header.
|
/** Find the latest checkpoint in the format-0 log header.
|
||||||
@param[out] max_field LOG_CHECKPOINT_1 or LOG_CHECKPOINT_2
|
@param[out] max_field LOG_CHECKPOINT_1 or LOG_CHECKPOINT_2
|
||||||
@return error code or DB_SUCCESS */
|
@return error code or DB_SUCCESS */
|
||||||
@ -1105,6 +1157,10 @@ recv_find_max_checkpoint_0(ulint* max_field)
|
|||||||
ib_uint64_t checkpoint_no;
|
ib_uint64_t checkpoint_no;
|
||||||
byte* buf = log_sys.checkpoint_buf;
|
byte* buf = log_sys.checkpoint_buf;
|
||||||
|
|
||||||
|
if (!redo_file_sizes_are_correct()) {
|
||||||
|
return DB_CORRUPTION;
|
||||||
|
}
|
||||||
|
|
||||||
ut_ad(log_sys.log.format == 0);
|
ut_ad(log_sys.log.format == 0);
|
||||||
|
|
||||||
/** Offset of the first checkpoint checksum */
|
/** Offset of the first checkpoint checksum */
|
||||||
@ -1172,6 +1228,44 @@ recv_find_max_checkpoint_0(ulint* max_field)
|
|||||||
return(DB_ERROR);
|
return(DB_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Return number of ib_logfile0..100 files */
|
||||||
|
static size_t count_log_files()
|
||||||
|
{
|
||||||
|
size_t counter= 0;
|
||||||
|
for (int i= 0; i < 101; i++)
|
||||||
|
{
|
||||||
|
auto path=
|
||||||
|
get_log_file_path(LOG_FILE_NAME_PREFIX).append(std::to_string(i));
|
||||||
|
os_file_stat_t stat;
|
||||||
|
dberr_t err= os_file_get_status(path.c_str(), &stat, false, true);
|
||||||
|
if (err)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (stat.type != OS_FILE_TYPE_FILE)
|
||||||
|
break;
|
||||||
|
|
||||||
|
counter++;
|
||||||
|
}
|
||||||
|
return counter;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Same as cals_lsn_offset() except that it supports multiple files */
|
||||||
|
lsn_t log_t::file::calc_lsn_offset_old(lsn_t lsn) const
|
||||||
|
{
|
||||||
|
ut_ad(log_sys.mutex.is_owned() || log_sys.write_mutex.is_owned());
|
||||||
|
const lsn_t size= capacity() * recv_sys.files_size();
|
||||||
|
lsn_t l= lsn - this->lsn;
|
||||||
|
if (longlong(l) < 0)
|
||||||
|
{
|
||||||
|
l= lsn_t(-longlong(l)) % size;
|
||||||
|
l= size - l;
|
||||||
|
}
|
||||||
|
|
||||||
|
l+= lsn_offset - LOG_FILE_HDR_SIZE * (1 + lsn_offset / file_size);
|
||||||
|
l%= size;
|
||||||
|
return l + LOG_FILE_HDR_SIZE * (1 + l / (file_size - LOG_FILE_HDR_SIZE));
|
||||||
|
}
|
||||||
|
|
||||||
/** Determine if a pre-MySQL 5.7.9/MariaDB 10.2.2 redo log is clean.
|
/** Determine if a pre-MySQL 5.7.9/MariaDB 10.2.2 redo log is clean.
|
||||||
@param[in] lsn checkpoint LSN
|
@param[in] lsn checkpoint LSN
|
||||||
@param[in] crypt whether the log might be encrypted
|
@param[in] crypt whether the log might be encrypted
|
||||||
@ -1181,7 +1275,7 @@ recv_find_max_checkpoint_0(ulint* max_field)
|
|||||||
static dberr_t recv_log_format_0_recover(lsn_t lsn, bool crypt)
|
static dberr_t recv_log_format_0_recover(lsn_t lsn, bool crypt)
|
||||||
{
|
{
|
||||||
log_mutex_enter();
|
log_mutex_enter();
|
||||||
const lsn_t source_offset = log_sys.log.calc_lsn_offset(lsn);
|
const lsn_t source_offset = log_sys.log.calc_lsn_offset_old(lsn);
|
||||||
log_mutex_exit();
|
log_mutex_exit();
|
||||||
byte* buf = log_sys.buf;
|
byte* buf = log_sys.buf;
|
||||||
|
|
||||||
@ -1189,8 +1283,8 @@ static dberr_t recv_log_format_0_recover(lsn_t lsn, bool crypt)
|
|||||||
"Upgrade after a crash is not supported."
|
"Upgrade after a crash is not supported."
|
||||||
" This redo log was created before MariaDB 10.2.2";
|
" This redo log was created before MariaDB 10.2.2";
|
||||||
|
|
||||||
log_sys.log.read(source_offset & ~(OS_FILE_LOG_BLOCK_SIZE - 1),
|
recv_sys.read(source_offset & ~(OS_FILE_LOG_BLOCK_SIZE - 1),
|
||||||
{buf, OS_FILE_LOG_BLOCK_SIZE});
|
{buf, OS_FILE_LOG_BLOCK_SIZE});
|
||||||
|
|
||||||
if (log_block_calc_checksum_format_0(buf)
|
if (log_block_calc_checksum_format_0(buf)
|
||||||
!= log_block_get_checksum(buf)
|
!= log_block_get_checksum(buf)
|
||||||
@ -1222,6 +1316,7 @@ static dberr_t recv_log_format_0_recover(lsn_t lsn, bool crypt)
|
|||||||
= log_sys.current_flush_lsn = log_sys.flushed_to_disk_lsn
|
= log_sys.current_flush_lsn = log_sys.flushed_to_disk_lsn
|
||||||
= lsn;
|
= lsn;
|
||||||
log_sys.next_checkpoint_no = 0;
|
log_sys.next_checkpoint_no = 0;
|
||||||
|
recv_sys.remove_extra_log_files = true;
|
||||||
return(DB_SUCCESS);
|
return(DB_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1233,11 +1328,15 @@ static dberr_t recv_log_format_0_recover(lsn_t lsn, bool crypt)
|
|||||||
static dberr_t recv_log_recover_10_4()
|
static dberr_t recv_log_recover_10_4()
|
||||||
{
|
{
|
||||||
const lsn_t lsn = log_sys.log.get_lsn();
|
const lsn_t lsn = log_sys.log.get_lsn();
|
||||||
const lsn_t source_offset = log_sys.log.calc_lsn_offset(lsn);
|
const lsn_t source_offset = log_sys.log.calc_lsn_offset_old(lsn);
|
||||||
byte* buf = log_sys.buf;
|
byte* buf = log_sys.buf;
|
||||||
|
|
||||||
log_sys.log.read(source_offset & ~(OS_FILE_LOG_BLOCK_SIZE - 1),
|
if (!redo_file_sizes_are_correct()) {
|
||||||
{buf, OS_FILE_LOG_BLOCK_SIZE});
|
return DB_CORRUPTION;
|
||||||
|
}
|
||||||
|
|
||||||
|
recv_sys.read(source_offset & ~(OS_FILE_LOG_BLOCK_SIZE - 1),
|
||||||
|
{buf, OS_FILE_LOG_BLOCK_SIZE});
|
||||||
|
|
||||||
ulint crc = log_block_calc_checksum_crc32(buf);
|
ulint crc = log_block_calc_checksum_crc32(buf);
|
||||||
ulint cksum = log_block_get_checksum(buf);
|
ulint cksum = log_block_get_checksum(buf);
|
||||||
@ -1277,6 +1376,7 @@ static dberr_t recv_log_recover_10_4()
|
|||||||
= log_sys.current_flush_lsn = log_sys.flushed_to_disk_lsn
|
= log_sys.current_flush_lsn = log_sys.flushed_to_disk_lsn
|
||||||
= lsn;
|
= lsn;
|
||||||
log_sys.next_checkpoint_no = 0;
|
log_sys.next_checkpoint_no = 0;
|
||||||
|
recv_sys.remove_extra_log_files = true;
|
||||||
return DB_SUCCESS;
|
return DB_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1379,7 +1479,7 @@ recv_find_max_checkpoint(ulint* max_field)
|
|||||||
|
|
||||||
if (*max_field == 0) {
|
if (*max_field == 0) {
|
||||||
/* Before 10.2.2, we could get here during database
|
/* Before 10.2.2, we could get here during database
|
||||||
initialization if we created an ib_logfile0 file that
|
initialization if we created an LOG_FILE_NAME file that
|
||||||
was filled with zeroes, and were killed. After
|
was filled with zeroes, and were killed. After
|
||||||
10.2.2, we would reject such a file already earlier,
|
10.2.2, we would reject such a file already earlier,
|
||||||
when checking the file header. */
|
when checking the file header. */
|
||||||
@ -2661,7 +2761,7 @@ static bool recv_scan_log_recs(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (scanned_lsn > recv_sys.scanned_lsn) {
|
if (scanned_lsn > recv_sys.scanned_lsn) {
|
||||||
ut_ad(!srv_log_files_created);
|
ut_ad(!srv_log_file_created);
|
||||||
if (!recv_needed_recovery) {
|
if (!recv_needed_recovery) {
|
||||||
recv_needed_recovery = true;
|
recv_needed_recovery = true;
|
||||||
|
|
||||||
@ -3146,23 +3246,28 @@ completed:
|
|||||||
&& recv_sys.mlog_checkpoint_lsn == checkpoint_lsn) {
|
&& recv_sys.mlog_checkpoint_lsn == checkpoint_lsn) {
|
||||||
/* The redo log is logically empty. */
|
/* The redo log is logically empty. */
|
||||||
} else if (checkpoint_lsn != flush_lsn) {
|
} else if (checkpoint_lsn != flush_lsn) {
|
||||||
ut_ad(!srv_log_files_created);
|
ut_ad(!srv_log_file_created);
|
||||||
|
|
||||||
if (checkpoint_lsn + sizeof_checkpoint < flush_lsn) {
|
if (checkpoint_lsn + sizeof_checkpoint < flush_lsn) {
|
||||||
ib::warn() << "Are you sure you are using the"
|
ib::warn()
|
||||||
" right ib_logfiles to start up the database?"
|
<< "Are you sure you are using the right "
|
||||||
" Log sequence number in the ib_logfiles is "
|
<< LOG_FILE_NAME
|
||||||
<< checkpoint_lsn << ", less than the"
|
<< " to start up the database? Log sequence "
|
||||||
" log sequence number in the first system"
|
"number in the "
|
||||||
" tablespace file header, " << flush_lsn << ".";
|
<< LOG_FILE_NAME << " is " << checkpoint_lsn
|
||||||
|
<< ", less than the log sequence number in "
|
||||||
|
"the first system tablespace file header, "
|
||||||
|
<< flush_lsn << ".";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (log_sys.log.is_physical()
|
if (!recv_needed_recovery) {
|
||||||
&& !recv_needed_recovery) {
|
|
||||||
ib::info() << "The log sequence number " << flush_lsn
|
ib::info()
|
||||||
|
<< "The log sequence number " << flush_lsn
|
||||||
<< " in the system tablespace does not match"
|
<< " in the system tablespace does not match"
|
||||||
" the log sequence number " << checkpoint_lsn
|
" the log sequence number "
|
||||||
<< " in the ib_logfiles!";
|
<< checkpoint_lsn << " in the "
|
||||||
|
<< LOG_FILE_NAME << "!";
|
||||||
|
|
||||||
if (srv_read_only_mode) {
|
if (srv_read_only_mode) {
|
||||||
ib::error() << "innodb_read_only"
|
ib::error() << "innodb_read_only"
|
||||||
|
@ -2136,8 +2136,8 @@ os_file_create_simple_func(
|
|||||||
|
|
||||||
file = CreateFile(
|
file = CreateFile(
|
||||||
(LPCTSTR) name, access,
|
(LPCTSTR) name, access,
|
||||||
FILE_SHARE_READ | FILE_SHARE_DELETE, NULL,
|
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
|
||||||
create_flag, attributes, NULL);
|
NULL, create_flag, attributes, NULL);
|
||||||
|
|
||||||
if (file == INVALID_HANDLE_VALUE) {
|
if (file == INVALID_HANDLE_VALUE) {
|
||||||
|
|
||||||
@ -2404,9 +2404,8 @@ os_file_create_func(
|
|||||||
);
|
);
|
||||||
|
|
||||||
DWORD create_flag;
|
DWORD create_flag;
|
||||||
DWORD share_mode = srv_operation != SRV_OPERATION_NORMAL
|
const DWORD share_mode =
|
||||||
? FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE
|
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE;
|
||||||
: FILE_SHARE_READ | FILE_SHARE_DELETE;
|
|
||||||
|
|
||||||
if (create_mode != OS_FILE_OPEN && create_mode != OS_FILE_OPEN_RAW) {
|
if (create_mode != OS_FILE_OPEN && create_mode != OS_FILE_OPEN_RAW) {
|
||||||
WAIT_ALLOW_WRITES();
|
WAIT_ALLOW_WRITES();
|
||||||
@ -2426,12 +2425,6 @@ os_file_create_func(
|
|||||||
|
|
||||||
create_flag = OPEN_EXISTING;
|
create_flag = OPEN_EXISTING;
|
||||||
|
|
||||||
/* On Windows Physical devices require admin privileges and
|
|
||||||
have to have the write-share mode set. See the remarks
|
|
||||||
section for the CreateFile() function documentation in MSDN. */
|
|
||||||
|
|
||||||
share_mode |= FILE_SHARE_WRITE;
|
|
||||||
|
|
||||||
} else if (create_mode == OS_FILE_OPEN
|
} else if (create_mode == OS_FILE_OPEN
|
||||||
|| create_mode == OS_FILE_OPEN_RETRY) {
|
|| create_mode == OS_FILE_OPEN_RETRY) {
|
||||||
|
|
||||||
@ -2612,9 +2605,8 @@ os_file_create_simple_no_error_handling_func(
|
|||||||
DWORD access;
|
DWORD access;
|
||||||
DWORD create_flag;
|
DWORD create_flag;
|
||||||
DWORD attributes = 0;
|
DWORD attributes = 0;
|
||||||
DWORD share_mode = srv_operation != SRV_OPERATION_NORMAL
|
const DWORD share_mode =
|
||||||
? FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE
|
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE;
|
||||||
: FILE_SHARE_READ | FILE_SHARE_DELETE;
|
|
||||||
|
|
||||||
ut_a(name);
|
ut_a(name);
|
||||||
|
|
||||||
@ -2660,11 +2652,6 @@ os_file_create_simple_no_error_handling_func(
|
|||||||
|
|
||||||
access = GENERIC_READ;
|
access = GENERIC_READ;
|
||||||
|
|
||||||
/*!< A backup program has to give mysqld the maximum
|
|
||||||
freedom to do what it likes with the file */
|
|
||||||
|
|
||||||
share_mode |= FILE_SHARE_DELETE | FILE_SHARE_WRITE
|
|
||||||
| FILE_SHARE_READ;
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
ib::error()
|
ib::error()
|
||||||
@ -3911,7 +3898,7 @@ static bool is_linux_native_aio_supported()
|
|||||||
{
|
{
|
||||||
File fd;
|
File fd;
|
||||||
io_context_t io_ctx;
|
io_context_t io_ctx;
|
||||||
char name[1000];
|
std::string log_file_path = get_log_file_path();
|
||||||
|
|
||||||
memset(&io_ctx, 0, sizeof(io_ctx));
|
memset(&io_ctx, 0, sizeof(io_ctx));
|
||||||
if (io_setup(1, &io_ctx)) {
|
if (io_setup(1, &io_ctx)) {
|
||||||
@ -3939,31 +3926,14 @@ static bool is_linux_native_aio_supported()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
fd = my_open(log_file_path.c_str(), O_RDONLY | O_CLOEXEC,
|
||||||
os_normalize_path(srv_log_group_home_dir);
|
MYF(0));
|
||||||
|
|
||||||
ulint dirnamelen = strlen(srv_log_group_home_dir);
|
|
||||||
|
|
||||||
ut_a(dirnamelen < (sizeof name) - 10 - sizeof "ib_logfile");
|
|
||||||
|
|
||||||
memcpy(name, srv_log_group_home_dir, dirnamelen);
|
|
||||||
|
|
||||||
/* Add a path separator if needed. */
|
|
||||||
if (dirnamelen && name[dirnamelen - 1] != OS_PATH_SEPARATOR) {
|
|
||||||
|
|
||||||
name[dirnamelen++] = OS_PATH_SEPARATOR;
|
|
||||||
}
|
|
||||||
|
|
||||||
strcpy(name + dirnamelen, "ib_logfile0");
|
|
||||||
|
|
||||||
fd = my_open(name, O_RDONLY | O_CLOEXEC, MYF(0));
|
|
||||||
|
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
|
|
||||||
ib::warn()
|
ib::warn() << "Unable to open \"" << log_file_path
|
||||||
<< "Unable to open"
|
<< "\" to check native"
|
||||||
<< " \"" << name << "\" to check native"
|
<< " AIO read support.";
|
||||||
<< " AIO read support.";
|
|
||||||
|
|
||||||
int ret = io_destroy(io_ctx);
|
int ret = io_destroy(io_ctx);
|
||||||
ut_a(ret != EINVAL);
|
ut_a(ret != EINVAL);
|
||||||
@ -4024,7 +3994,7 @@ static bool is_linux_native_aio_supported()
|
|||||||
ib::error()
|
ib::error()
|
||||||
<< "Linux Native AIO not supported. You can either"
|
<< "Linux Native AIO not supported. You can either"
|
||||||
" move "
|
" move "
|
||||||
<< (srv_read_only_mode ? name : "tmpdir")
|
<< (srv_read_only_mode ? log_file_path : "tmpdir")
|
||||||
<< " to a file system that supports native"
|
<< " to a file system that supports native"
|
||||||
" AIO or you can set innodb_use_native_aio to"
|
" AIO or you can set innodb_use_native_aio to"
|
||||||
" FALSE to avoid this message.";
|
" FALSE to avoid this message.";
|
||||||
@ -4033,7 +4003,7 @@ static bool is_linux_native_aio_supported()
|
|||||||
default:
|
default:
|
||||||
ib::error()
|
ib::error()
|
||||||
<< "Linux Native AIO check on "
|
<< "Linux Native AIO check on "
|
||||||
<< (srv_read_only_mode ? name : "tmpdir")
|
<< (srv_read_only_mode ? log_file_path : "tmpdir")
|
||||||
<< "returned error[" << -err << "]";
|
<< "returned error[" << -err << "]";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -162,7 +162,6 @@ static os_event_t srv_master_thread_disabled_event;
|
|||||||
/*------------------------- LOG FILES ------------------------ */
|
/*------------------------- LOG FILES ------------------------ */
|
||||||
char* srv_log_group_home_dir;
|
char* srv_log_group_home_dir;
|
||||||
|
|
||||||
ulong srv_n_log_files;
|
|
||||||
/** The InnoDB redo log file size, or 0 when changing the redo log format
|
/** The InnoDB redo log file size, or 0 when changing the redo log format
|
||||||
at startup (while disallowing writes to the redo log). */
|
at startup (while disallowing writes to the redo log). */
|
||||||
ulonglong srv_log_file_size;
|
ulonglong srv_log_file_size;
|
||||||
|
@ -136,8 +136,8 @@ UNIV_INTERN bool srv_undo_sources;
|
|||||||
#ifdef UNIV_DEBUG
|
#ifdef UNIV_DEBUG
|
||||||
/** InnoDB system tablespace to set during recovery */
|
/** InnoDB system tablespace to set during recovery */
|
||||||
UNIV_INTERN uint srv_sys_space_size_debug;
|
UNIV_INTERN uint srv_sys_space_size_debug;
|
||||||
/** whether redo log files have been created at startup */
|
/** whether redo log file have been created at startup */
|
||||||
UNIV_INTERN bool srv_log_files_created;
|
UNIV_INTERN bool srv_log_file_created;
|
||||||
#endif /* UNIV_DEBUG */
|
#endif /* UNIV_DEBUG */
|
||||||
|
|
||||||
/** Bit flags for tracking background thread creation. They are used to
|
/** Bit flags for tracking background thread creation. They are used to
|
||||||
@ -247,133 +247,76 @@ srv_file_check_mode(
|
|||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Initial number of the redo log file */
|
||||||
|
static const char INIT_LOG_FILE0[]= "101";
|
||||||
|
|
||||||
/** Creates a log file.
|
/** Creates log file.
|
||||||
@param[in] name log file name
|
@param[in] lsn FIL_PAGE_FILE_FLUSH_LSN value
|
||||||
|
@param[out] logfile0 name of the log file
|
||||||
@return DB_SUCCESS or error code */
|
@return DB_SUCCESS or error code */
|
||||||
static MY_ATTRIBUTE((nonnull, warn_unused_result)) dberr_t
|
static dberr_t create_log_file(lsn_t lsn, std::string& logfile0)
|
||||||
create_log_file(const char* name)
|
|
||||||
{
|
{
|
||||||
bool ret;
|
if (srv_read_only_mode) {
|
||||||
|
ib::error() << "Cannot create log file in read-only mode";
|
||||||
|
return DB_READ_ONLY;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Crashing after deleting the first file should be
|
||||||
|
recoverable. The buffer pool was clean, and we can simply
|
||||||
|
create log file from the scratch. */
|
||||||
|
DBUG_EXECUTE_IF("innodb_log_abort_6", delete_log_file("0");
|
||||||
|
return DB_ERROR;);
|
||||||
|
|
||||||
|
delete_log_file("0");
|
||||||
|
delete_log_file(INIT_LOG_FILE0);
|
||||||
|
|
||||||
|
DBUG_PRINT("ib_log", ("After innodb_log_abort_6"));
|
||||||
|
ut_ad(!buf_pool_check_no_pending_io());
|
||||||
|
|
||||||
|
DBUG_EXECUTE_IF("innodb_log_abort_7", return DB_ERROR;);
|
||||||
|
DBUG_PRINT("ib_log", ("After innodb_log_abort_7"));
|
||||||
|
|
||||||
|
logfile0 = get_log_file_path(LOG_FILE_NAME_PREFIX)
|
||||||
|
.append(INIT_LOG_FILE0);
|
||||||
|
|
||||||
|
bool ret;
|
||||||
pfs_os_file_t file = os_file_create(
|
pfs_os_file_t file = os_file_create(
|
||||||
innodb_log_file_key, name,
|
innodb_log_file_key, logfile0.c_str(),
|
||||||
OS_FILE_CREATE|OS_FILE_ON_ERROR_NO_EXIT, OS_FILE_NORMAL,
|
OS_FILE_CREATE|OS_FILE_ON_ERROR_NO_EXIT, OS_FILE_NORMAL,
|
||||||
OS_LOG_FILE, srv_read_only_mode, &ret);
|
OS_LOG_FILE, srv_read_only_mode, &ret);
|
||||||
|
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
ib::error() << "Cannot create " << name;
|
ib::error() << "Cannot create " << logfile0;
|
||||||
return(DB_ERROR);
|
return DB_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
ib::info() << "Setting log file " << name << " size to "
|
ib::info() << "Setting log file " << logfile0 << " size to "
|
||||||
<< srv_log_file_size << " bytes";
|
<< srv_log_file_size << " bytes";
|
||||||
|
|
||||||
ret = os_file_set_size(name, file, srv_log_file_size);
|
ret = os_file_set_size(logfile0.c_str(), file, srv_log_file_size);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
os_file_close(file);
|
os_file_close(file);
|
||||||
ib::error() << "Cannot set log file " << name << " size to "
|
ib::error() << "Cannot set log file " << logfile0
|
||||||
<< srv_log_file_size << " bytes";
|
<< " size to " << srv_log_file_size << " bytes";
|
||||||
return(DB_ERROR);
|
return DB_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = os_file_close(file);
|
ret = os_file_close(file);
|
||||||
ut_a(ret);
|
ut_a(ret);
|
||||||
|
|
||||||
return(DB_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Initial number of the first redo log file */
|
|
||||||
#define INIT_LOG_FILE0 (SRV_N_LOG_FILES_MAX + 1)
|
|
||||||
|
|
||||||
/** Delete all log files.
|
|
||||||
@param[in,out] logfilename buffer for log file name
|
|
||||||
@param[in] dirnamelen length of the directory path
|
|
||||||
@param[in] n_files number of files to delete
|
|
||||||
@param[in] i first file to delete */
|
|
||||||
static
|
|
||||||
void
|
|
||||||
delete_log_files(char* logfilename, size_t dirnamelen, uint n_files, uint i=0)
|
|
||||||
{
|
|
||||||
/* Remove any old log files. */
|
|
||||||
for (; i < n_files; i++) {
|
|
||||||
sprintf(logfilename + dirnamelen, "ib_logfile%u", i);
|
|
||||||
|
|
||||||
/* Ignore errors about non-existent files or files
|
|
||||||
that cannot be removed. The create_log_file() will
|
|
||||||
return an error when the file exists. */
|
|
||||||
#ifdef _WIN32
|
|
||||||
DeleteFile((LPCTSTR) logfilename);
|
|
||||||
#else
|
|
||||||
unlink(logfilename);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********************************************************************//**
|
|
||||||
Creates all log files.
|
|
||||||
@return DB_SUCCESS or error code */
|
|
||||||
static
|
|
||||||
dberr_t
|
|
||||||
create_log_files(
|
|
||||||
/*=============*/
|
|
||||||
char* logfilename, /*!< in/out: buffer for log file name */
|
|
||||||
size_t dirnamelen, /*!< in: length of the directory path */
|
|
||||||
lsn_t lsn, /*!< in: FIL_PAGE_FILE_FLUSH_LSN value */
|
|
||||||
std::string& logfile0) /*!< out: name of the first log file */
|
|
||||||
{
|
|
||||||
dberr_t err;
|
|
||||||
|
|
||||||
if (srv_read_only_mode) {
|
|
||||||
ib::error() << "Cannot create log files in read-only mode";
|
|
||||||
return(DB_READ_ONLY);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Crashing after deleting the first file should be
|
|
||||||
recoverable. The buffer pool was clean, and we can simply
|
|
||||||
create all log files from the scratch. */
|
|
||||||
DBUG_EXECUTE_IF("innodb_log_abort_6",
|
|
||||||
delete_log_files(logfilename, dirnamelen, 1);
|
|
||||||
return(DB_ERROR););
|
|
||||||
|
|
||||||
delete_log_files(logfilename, dirnamelen, INIT_LOG_FILE0 + 1);
|
|
||||||
|
|
||||||
DBUG_PRINT("ib_log", ("After innodb_log_abort_6"));
|
|
||||||
ut_ad(!buf_pool_check_no_pending_io());
|
|
||||||
|
|
||||||
DBUG_EXECUTE_IF("innodb_log_abort_7", return(DB_ERROR););
|
|
||||||
DBUG_PRINT("ib_log", ("After innodb_log_abort_7"));
|
|
||||||
|
|
||||||
std::vector<std::string> file_names;
|
|
||||||
|
|
||||||
for (unsigned i = 0; i < srv_n_log_files; i++) {
|
|
||||||
sprintf(logfilename + dirnamelen,
|
|
||||||
"ib_logfile%u", i ? i : INIT_LOG_FILE0);
|
|
||||||
|
|
||||||
err = create_log_file(logfilename);
|
|
||||||
|
|
||||||
if (err != DB_SUCCESS) {
|
|
||||||
return(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
file_names.emplace_back(logfilename);
|
|
||||||
}
|
|
||||||
|
|
||||||
logfile0 = file_names[0];
|
|
||||||
|
|
||||||
DBUG_EXECUTE_IF("innodb_log_abort_8", return(DB_ERROR););
|
DBUG_EXECUTE_IF("innodb_log_abort_8", return(DB_ERROR););
|
||||||
DBUG_PRINT("ib_log", ("After innodb_log_abort_8"));
|
DBUG_PRINT("ib_log", ("After innodb_log_abort_8"));
|
||||||
|
|
||||||
/* We did not create the first log file initially as
|
/* We did not create the first log file initially as LOG_FILE_NAME, so
|
||||||
ib_logfile0, so that crash recovery cannot find it until it
|
that crash recovery cannot find it until it has been completed and
|
||||||
has been completed and renamed. */
|
renamed. */
|
||||||
|
|
||||||
log_sys.log.create(srv_n_log_files);
|
log_sys.log.create();
|
||||||
if (!log_set_capacity(srv_log_file_size_requested)) {
|
if (!log_set_capacity(srv_log_file_size_requested)) {
|
||||||
return(DB_ERROR);
|
return DB_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
log_sys.log.open_files(std::move(file_names));
|
log_sys.log.open_file(logfile0);
|
||||||
fil_open_system_tablespace_files();
|
fil_open_system_tablespace_files();
|
||||||
|
|
||||||
/* Create a log checkpoint. */
|
/* Create a log checkpoint. */
|
||||||
@ -406,44 +349,39 @@ create_log_files(
|
|||||||
|
|
||||||
log_make_checkpoint();
|
log_make_checkpoint();
|
||||||
|
|
||||||
return(DB_SUCCESS);
|
return DB_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Rename the first redo log file.
|
/** Rename the first redo log file.
|
||||||
@param[in,out] logfilename buffer for the log file name
|
|
||||||
@param[in] dirnamelen length of the directory path
|
|
||||||
@param[in] lsn FIL_PAGE_FILE_FLUSH_LSN value
|
@param[in] lsn FIL_PAGE_FILE_FLUSH_LSN value
|
||||||
@param[in,out] logfile0 name of the first log file
|
@param[in,out] logfile0 name of the first log file
|
||||||
@return error code
|
@return error code
|
||||||
@retval DB_SUCCESS on successful operation */
|
@retval DB_SUCCESS on successful operation */
|
||||||
MY_ATTRIBUTE((warn_unused_result, nonnull))
|
MY_ATTRIBUTE((warn_unused_result, nonnull))
|
||||||
static dberr_t create_log_files_rename(char *logfilename, size_t dirnamelen,
|
static dberr_t create_log_file_rename(lsn_t lsn, std::string &logfile0)
|
||||||
lsn_t lsn, std::string &logfile0)
|
|
||||||
{
|
{
|
||||||
ut_ad(!srv_log_files_created);
|
ut_ad(!srv_log_file_created);
|
||||||
ut_d(srv_log_files_created= true);
|
ut_d(srv_log_file_created= true);
|
||||||
|
|
||||||
DBUG_EXECUTE_IF("innodb_log_abort_9", return (DB_ERROR););
|
DBUG_EXECUTE_IF("innodb_log_abort_9", return (DB_ERROR););
|
||||||
DBUG_PRINT("ib_log", ("After innodb_log_abort_9"));
|
DBUG_PRINT("ib_log", ("After innodb_log_abort_9"));
|
||||||
|
|
||||||
/* Rename the first log file, now that a log
|
/* Rename the first log file, now that a log checkpoint has been created. */
|
||||||
checkpoint has been created. */
|
auto new_name = get_log_file_path();
|
||||||
sprintf(logfilename + dirnamelen, "ib_logfile%u", 0);
|
|
||||||
|
|
||||||
ib::info() << "Renaming log file " << logfile0 << " to " << logfilename;
|
ib::info() << "Renaming log file " << logfile0 << " to " << new_name;
|
||||||
|
|
||||||
log_mutex_enter();
|
log_mutex_enter();
|
||||||
ut_ad(logfile0.size() == 2 + strlen(logfilename));
|
ut_ad(logfile0.size() == 2 + new_name.size());
|
||||||
dberr_t err= log_sys.log.files[0].rename(logfilename);
|
logfile0= new_name;
|
||||||
|
dberr_t err= log_sys.log.rename(std::move(new_name));
|
||||||
|
|
||||||
/* Replace the first file with ib_logfile0. */
|
|
||||||
logfile0= logfilename;
|
|
||||||
log_mutex_exit();
|
log_mutex_exit();
|
||||||
|
|
||||||
DBUG_EXECUTE_IF("innodb_log_abort_10", err= DB_ERROR;);
|
DBUG_EXECUTE_IF("innodb_log_abort_10", err= DB_ERROR;);
|
||||||
|
|
||||||
if (err == DB_SUCCESS)
|
if (err == DB_SUCCESS)
|
||||||
ib::info() << "New log files created, LSN=" << lsn;
|
ib::info() << "New log file created, LSN=" << lsn;
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@ -707,34 +645,23 @@ srv_check_undo_redo_logs_exists()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if any redo log files exist */
|
/* Check if redo log file exists */
|
||||||
char logfilename[OS_FILE_MAX_PATH];
|
auto logfilename = get_log_file_path();
|
||||||
size_t dirnamelen = strlen(srv_log_group_home_dir);
|
|
||||||
memcpy(logfilename, srv_log_group_home_dir, dirnamelen);
|
|
||||||
|
|
||||||
for (unsigned i = 0; i < srv_n_log_files; i++) {
|
fh = os_file_create(innodb_log_file_key, logfilename.c_str(),
|
||||||
sprintf(logfilename + dirnamelen,
|
OS_FILE_OPEN_RETRY | OS_FILE_ON_ERROR_NO_EXIT
|
||||||
"ib_logfile%u", i);
|
| OS_FILE_ON_ERROR_SILENT,
|
||||||
|
OS_FILE_NORMAL, OS_LOG_FILE, srv_read_only_mode,
|
||||||
|
&ret);
|
||||||
|
|
||||||
fh = os_file_create(
|
if (ret) {
|
||||||
innodb_log_file_key, logfilename,
|
os_file_close(fh);
|
||||||
OS_FILE_OPEN_RETRY
|
ib::error() << "redo log file '" << logfilename
|
||||||
| OS_FILE_ON_ERROR_NO_EXIT
|
<< "' exists. Creating system tablespace with"
|
||||||
| OS_FILE_ON_ERROR_SILENT,
|
" existing redo log file is not recommended."
|
||||||
OS_FILE_NORMAL,
|
" Please delete redo log file before"
|
||||||
OS_LOG_FILE,
|
" creating new system tablespace.";
|
||||||
srv_read_only_mode,
|
return DB_ERROR;
|
||||||
&ret);
|
|
||||||
|
|
||||||
if (ret) {
|
|
||||||
os_file_close(fh);
|
|
||||||
ib::error() << "redo log file '" << logfilename
|
|
||||||
<< "' exists. Creating system tablespace with"
|
|
||||||
" existing redo log files is not recommended."
|
|
||||||
" Please delete all redo log files before"
|
|
||||||
" creating new system tablespace.";
|
|
||||||
return(DB_ERROR);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return(DB_SUCCESS);
|
return(DB_SUCCESS);
|
||||||
@ -1047,16 +974,13 @@ srv_init_abort_low(
|
|||||||
return(err);
|
return(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Prepare to delete the redo log files. Flush the dirty pages from all the
|
/** Prepare to delete the redo log file. Flush the dirty pages from all the
|
||||||
buffer pools. Flush the redo log buffer to the redo log file.
|
buffer pools. Flush the redo log buffer to the redo log file.
|
||||||
@param[in] n_files number of old redo log files
|
@param[in] old_exists old redo log file exists
|
||||||
@return lsn upto which data pages have been flushed. */
|
@return lsn upto which data pages have been flushed. */
|
||||||
static
|
static lsn_t srv_prepare_to_delete_redo_log_file(bool old_exists)
|
||||||
lsn_t
|
|
||||||
srv_prepare_to_delete_redo_log_files(
|
|
||||||
ulint n_files)
|
|
||||||
{
|
{
|
||||||
DBUG_ENTER("srv_prepare_to_delete_redo_log_files");
|
DBUG_ENTER("srv_prepare_to_delete_redo_log_file");
|
||||||
|
|
||||||
lsn_t flushed_lsn;
|
lsn_t flushed_lsn;
|
||||||
ulint pending_io = 0;
|
ulint pending_io = 0;
|
||||||
@ -1085,7 +1009,7 @@ srv_prepare_to_delete_redo_log_files(
|
|||||||
|| (log_sys.log.format & ~log_t::FORMAT_ENCRYPTED)
|
|| (log_sys.log.format & ~log_t::FORMAT_ENCRYPTED)
|
||||||
!= log_t::FORMAT_10_5) {
|
!= log_t::FORMAT_10_5) {
|
||||||
info << "Upgrading redo log: ";
|
info << "Upgrading redo log: ";
|
||||||
} else if (n_files != srv_n_log_files
|
} else if (!old_exists
|
||||||
|| srv_log_file_size
|
|| srv_log_file_size
|
||||||
!= srv_log_file_size_requested) {
|
!= srv_log_file_size_requested) {
|
||||||
if (srv_encrypt_log
|
if (srv_encrypt_log
|
||||||
@ -1100,21 +1024,20 @@ srv_prepare_to_delete_redo_log_files(
|
|||||||
" and resizing";
|
" and resizing";
|
||||||
}
|
}
|
||||||
|
|
||||||
info << " redo log from " << n_files
|
info << " redo log from " << srv_log_file_size
|
||||||
<< "*" << srv_log_file_size << " to ";
|
<< " to ";
|
||||||
} else if (srv_encrypt_log) {
|
} else if (srv_encrypt_log) {
|
||||||
info << "Encrypting redo log: ";
|
info << "Encrypting redo log: ";
|
||||||
} else {
|
} else {
|
||||||
info << "Removing redo log encryption: ";
|
info << "Removing redo log encryption: ";
|
||||||
}
|
}
|
||||||
|
|
||||||
info << srv_n_log_files << "*"
|
info << srv_log_file_size_requested
|
||||||
<< srv_log_file_size_requested
|
|
||||||
<< " bytes; LSN=" << flushed_lsn;
|
<< " bytes; LSN=" << flushed_lsn;
|
||||||
}
|
}
|
||||||
|
|
||||||
srv_start_lsn = flushed_lsn;
|
srv_start_lsn = flushed_lsn;
|
||||||
/* Flush the old log files. */
|
/* Flush the old log file. */
|
||||||
log_mutex_exit();
|
log_mutex_exit();
|
||||||
|
|
||||||
log_write_up_to(flushed_lsn, true);
|
log_write_up_to(flushed_lsn, true);
|
||||||
@ -1145,6 +1068,70 @@ srv_prepare_to_delete_redo_log_files(
|
|||||||
DBUG_RETURN(flushed_lsn);
|
DBUG_RETURN(flushed_lsn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Tries to locate LOG_FILE_NAME and check it's size, etc
|
||||||
|
@param[out] log_file_found returns true here if correct file was found
|
||||||
|
@return dberr_t with DB_SUCCESS or some error */
|
||||||
|
static dberr_t find_and_check_log_file(bool &log_file_found)
|
||||||
|
{
|
||||||
|
log_file_found= false;
|
||||||
|
|
||||||
|
auto logfile0= get_log_file_path();
|
||||||
|
os_file_stat_t stat_info;
|
||||||
|
const dberr_t err= os_file_get_status(logfile0.c_str(), &stat_info, false,
|
||||||
|
srv_read_only_mode);
|
||||||
|
|
||||||
|
auto is_operation_restore= []() -> bool {
|
||||||
|
return srv_operation == SRV_OPERATION_RESTORE ||
|
||||||
|
srv_operation == SRV_OPERATION_RESTORE_EXPORT;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (err == DB_NOT_FOUND)
|
||||||
|
{
|
||||||
|
if (is_operation_restore())
|
||||||
|
return DB_NOT_FOUND;
|
||||||
|
|
||||||
|
return DB_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stat_info.type != OS_FILE_TYPE_FILE)
|
||||||
|
return DB_SUCCESS;
|
||||||
|
|
||||||
|
if (!srv_file_check_mode(logfile0.c_str()))
|
||||||
|
return DB_ERROR;
|
||||||
|
|
||||||
|
const os_offset_t size= stat_info.size;
|
||||||
|
ut_a(size != (os_offset_t) -1);
|
||||||
|
|
||||||
|
if (size % OS_FILE_LOG_BLOCK_SIZE)
|
||||||
|
{
|
||||||
|
ib::error() << "Log file " << logfile0 << " size " << size
|
||||||
|
<< " is not a multiple of " << OS_FILE_LOG_BLOCK_SIZE
|
||||||
|
<< " bytes";
|
||||||
|
return DB_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size == 0 && is_operation_restore())
|
||||||
|
{
|
||||||
|
/* Tolerate an empty LOG_FILE_NAME from a previous run of
|
||||||
|
mariabackup --prepare. */
|
||||||
|
return DB_NOT_FOUND;
|
||||||
|
}
|
||||||
|
/* The first log file must consist of at least the following 512-byte pages:
|
||||||
|
header, checkpoint page 1, empty, checkpoint page 2, redo log page(s).
|
||||||
|
|
||||||
|
Mariabackup --prepare would create an empty LOG_FILE_NAME. Tolerate it. */
|
||||||
|
if (size != 0 && size <= OS_FILE_LOG_BLOCK_SIZE * 4)
|
||||||
|
{
|
||||||
|
ib::error() << "Log file " << logfile0 << " size " << size
|
||||||
|
<< " is too small";
|
||||||
|
return DB_ERROR;
|
||||||
|
}
|
||||||
|
srv_log_file_size= size;
|
||||||
|
|
||||||
|
log_file_found= true;
|
||||||
|
return DB_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
/** Start InnoDB.
|
/** Start InnoDB.
|
||||||
@param[in] create_new_db whether to create a new database
|
@param[in] create_new_db whether to create a new database
|
||||||
@return DB_SUCCESS or error code */
|
@return DB_SUCCESS or error code */
|
||||||
@ -1152,9 +1139,8 @@ dberr_t srv_start(bool create_new_db)
|
|||||||
{
|
{
|
||||||
lsn_t flushed_lsn;
|
lsn_t flushed_lsn;
|
||||||
dberr_t err = DB_SUCCESS;
|
dberr_t err = DB_SUCCESS;
|
||||||
ulint srv_n_log_files_found = srv_n_log_files;
|
bool srv_log_file_found = true;
|
||||||
mtr_t mtr;
|
mtr_t mtr;
|
||||||
unsigned i = 0;
|
|
||||||
|
|
||||||
ut_ad(srv_operation == SRV_OPERATION_NORMAL
|
ut_ad(srv_operation == SRV_OPERATION_NORMAL
|
||||||
|| srv_operation == SRV_OPERATION_RESTORE
|
|| srv_operation == SRV_OPERATION_RESTORE
|
||||||
@ -1403,16 +1389,6 @@ dberr_t srv_start(bool create_new_db)
|
|||||||
return(srv_init_abort(err));
|
return(srv_init_abort(err));
|
||||||
}
|
}
|
||||||
|
|
||||||
char logfilename[10000];
|
|
||||||
size_t dirnamelen = strlen(srv_log_group_home_dir);
|
|
||||||
ut_a(dirnamelen < (sizeof logfilename) - 10 - sizeof "ib_logfile");
|
|
||||||
memcpy(logfilename, srv_log_group_home_dir, dirnamelen);
|
|
||||||
|
|
||||||
/* Add a path separator if needed. */
|
|
||||||
if (dirnamelen && logfilename[dirnamelen - 1] != OS_PATH_SEPARATOR) {
|
|
||||||
logfilename[dirnamelen++] = OS_PATH_SEPARATOR;
|
|
||||||
}
|
|
||||||
|
|
||||||
srv_log_file_size_requested = srv_log_file_size;
|
srv_log_file_size_requested = srv_log_file_size;
|
||||||
|
|
||||||
if (innodb_encrypt_temporary_tables && !log_crypt_init()) {
|
if (innodb_encrypt_temporary_tables && !log_crypt_init()) {
|
||||||
@ -1426,8 +1402,7 @@ dberr_t srv_start(bool create_new_db)
|
|||||||
|
|
||||||
flushed_lsn = log_get_lsn();
|
flushed_lsn = log_get_lsn();
|
||||||
|
|
||||||
err = create_log_files(
|
err = create_log_file(flushed_lsn, logfile0);
|
||||||
logfilename, dirnamelen, flushed_lsn, logfile0);
|
|
||||||
|
|
||||||
if (err != DB_SUCCESS) {
|
if (err != DB_SUCCESS) {
|
||||||
return(srv_init_abort(err));
|
return(srv_init_abort(err));
|
||||||
@ -1435,107 +1410,31 @@ dberr_t srv_start(bool create_new_db)
|
|||||||
} else {
|
} else {
|
||||||
srv_log_file_size = 0;
|
srv_log_file_size = 0;
|
||||||
|
|
||||||
for (i = 0; i < SRV_N_LOG_FILES_MAX; i++) {
|
bool log_file_found;
|
||||||
os_file_stat_t stat_info;
|
if (dberr_t err = find_and_check_log_file(log_file_found)) {
|
||||||
|
|
||||||
sprintf(logfilename + dirnamelen,
|
|
||||||
"ib_logfile%u", i);
|
|
||||||
|
|
||||||
err = os_file_get_status(
|
|
||||||
logfilename, &stat_info, false,
|
|
||||||
srv_read_only_mode);
|
|
||||||
|
|
||||||
if (err == DB_NOT_FOUND) {
|
if (err == DB_NOT_FOUND) {
|
||||||
if (i == 0) {
|
return DB_SUCCESS;
|
||||||
if (srv_operation
|
|
||||||
== SRV_OPERATION_RESTORE
|
|
||||||
|| srv_operation
|
|
||||||
== SRV_OPERATION_RESTORE_EXPORT) {
|
|
||||||
return(DB_SUCCESS);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* opened all files */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stat_info.type != OS_FILE_TYPE_FILE) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!srv_file_check_mode(logfilename)) {
|
|
||||||
return(srv_init_abort(DB_ERROR));
|
|
||||||
}
|
|
||||||
|
|
||||||
const os_offset_t size = stat_info.size;
|
|
||||||
ut_a(size != (os_offset_t) -1);
|
|
||||||
|
|
||||||
if (size & (OS_FILE_LOG_BLOCK_SIZE - 1)) {
|
|
||||||
|
|
||||||
ib::error() << "Log file " << logfilename
|
|
||||||
<< " size " << size << " is not a"
|
|
||||||
" multiple of 512 bytes";
|
|
||||||
return(srv_init_abort(DB_ERROR));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i == 0) {
|
|
||||||
if (size == 0
|
|
||||||
&& (srv_operation
|
|
||||||
== SRV_OPERATION_RESTORE
|
|
||||||
|| srv_operation
|
|
||||||
== SRV_OPERATION_RESTORE_EXPORT)) {
|
|
||||||
/* Tolerate an empty ib_logfile0
|
|
||||||
from a previous run of
|
|
||||||
mariabackup --prepare. */
|
|
||||||
return(DB_SUCCESS);
|
|
||||||
}
|
|
||||||
/* The first log file must consist of
|
|
||||||
at least the following 512-byte pages:
|
|
||||||
header, checkpoint page 1, empty,
|
|
||||||
checkpoint page 2, redo log page(s).
|
|
||||||
|
|
||||||
Mariabackup --prepare would create an
|
|
||||||
empty ib_logfile0. Tolerate it if there
|
|
||||||
are no other ib_logfile* files. */
|
|
||||||
if ((size != 0 || i != 0)
|
|
||||||
&& size <= OS_FILE_LOG_BLOCK_SIZE * 4) {
|
|
||||||
ib::error() << "Log file "
|
|
||||||
<< logfilename << " size "
|
|
||||||
<< size << " is too small";
|
|
||||||
return(srv_init_abort(DB_ERROR));
|
|
||||||
}
|
|
||||||
srv_log_file_size = size;
|
|
||||||
} else if (size != srv_log_file_size) {
|
|
||||||
|
|
||||||
ib::error() << "Log file " << logfilename
|
|
||||||
<< " is of different size " << size
|
|
||||||
<< " bytes than other log files "
|
|
||||||
<< srv_log_file_size << " bytes!";
|
|
||||||
return(srv_init_abort(DB_ERROR));
|
|
||||||
}
|
}
|
||||||
|
return srv_init_abort(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (srv_log_file_size == 0) {
|
if (srv_log_file_size == 0) {
|
||||||
if (flushed_lsn < lsn_t(1000)) {
|
if (flushed_lsn < lsn_t(1000)) {
|
||||||
ib::error()
|
ib::error()
|
||||||
<< "Cannot create log files because"
|
<< "Cannot create log file because"
|
||||||
" data files are corrupt or the"
|
" data files are corrupt or the"
|
||||||
" database was not shut down cleanly"
|
" database was not shut down cleanly"
|
||||||
" after creating the data files.";
|
" after creating the data files.";
|
||||||
return srv_init_abort(DB_ERROR);
|
return srv_init_abort(DB_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
strcpy(logfilename + dirnamelen, "ib_logfile0");
|
|
||||||
srv_log_file_size = srv_log_file_size_requested;
|
srv_log_file_size = srv_log_file_size_requested;
|
||||||
|
|
||||||
err = create_log_files(
|
err = create_log_file(flushed_lsn, logfile0);
|
||||||
logfilename, dirnamelen,
|
|
||||||
flushed_lsn, logfile0);
|
|
||||||
|
|
||||||
if (err == DB_SUCCESS) {
|
if (err == DB_SUCCESS) {
|
||||||
err = create_log_files_rename(
|
err = create_log_file_rename(flushed_lsn,
|
||||||
logfilename, dirnamelen,
|
logfile0);
|
||||||
flushed_lsn, logfile0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (err != DB_SUCCESS) {
|
if (err != DB_SUCCESS) {
|
||||||
@ -1545,32 +1444,23 @@ dberr_t srv_start(bool create_new_db)
|
|||||||
/* Suppress the message about
|
/* Suppress the message about
|
||||||
crash recovery. */
|
crash recovery. */
|
||||||
flushed_lsn = log_get_lsn();
|
flushed_lsn = log_get_lsn();
|
||||||
goto files_checked;
|
goto file_checked;
|
||||||
}
|
}
|
||||||
|
|
||||||
srv_n_log_files_found = i;
|
srv_log_file_found = log_file_found;
|
||||||
|
|
||||||
std::vector<std::string> file_names;
|
log_sys.log.open_file(get_log_file_path());
|
||||||
|
|
||||||
for (unsigned j = 0; j < srv_n_log_files_found; j++) {
|
log_sys.log.create();
|
||||||
sprintf(logfilename + dirnamelen, "ib_logfile%u", j);
|
|
||||||
|
|
||||||
file_names.emplace_back(logfilename);
|
|
||||||
}
|
|
||||||
|
|
||||||
log_sys.log.open_files(std::move(file_names));
|
|
||||||
|
|
||||||
log_sys.log.create(srv_n_log_files_found);
|
|
||||||
|
|
||||||
if (!log_set_capacity(srv_log_file_size_requested)) {
|
if (!log_set_capacity(srv_log_file_size_requested)) {
|
||||||
return(srv_init_abort(DB_ERROR));
|
return(srv_init_abort(DB_ERROR));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
files_checked:
|
file_checked:
|
||||||
/* Open all log files and data files in the system
|
/* Open log file and data files in the systemtablespace: we keep
|
||||||
tablespace: we keep them open until database
|
them open until database shutdown */
|
||||||
shutdown */
|
|
||||||
|
|
||||||
fil_open_system_tablespace_files();
|
fil_open_system_tablespace_files();
|
||||||
ut_d(fil_system.sys_space->recv_size = srv_sys_space_size_debug);
|
ut_d(fil_system.sys_space->recv_size = srv_sys_space_size_debug);
|
||||||
@ -1635,9 +1525,7 @@ files_checked:
|
|||||||
err = fil_write_flushed_lsn(flushed_lsn);
|
err = fil_write_flushed_lsn(flushed_lsn);
|
||||||
|
|
||||||
if (err == DB_SUCCESS) {
|
if (err == DB_SUCCESS) {
|
||||||
err = create_log_files_rename(
|
err = create_log_file_rename(flushed_lsn, logfile0);
|
||||||
logfilename, dirnamelen,
|
|
||||||
flushed_lsn, logfile0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (err != DB_SUCCESS) {
|
if (err != DB_SUCCESS) {
|
||||||
@ -1648,6 +1536,16 @@ files_checked:
|
|||||||
been shut down normally: this is the normal startup path */
|
been shut down normally: this is the normal startup path */
|
||||||
|
|
||||||
err = recv_recovery_from_checkpoint_start(flushed_lsn);
|
err = recv_recovery_from_checkpoint_start(flushed_lsn);
|
||||||
|
recv_sys.close_files();
|
||||||
|
|
||||||
|
if (recv_sys.remove_extra_log_files) {
|
||||||
|
auto log_files_found = recv_sys.files_size();
|
||||||
|
recv_sys.close_files();
|
||||||
|
for (size_t i = 1; i < log_files_found; i++) {
|
||||||
|
delete_log_file(std::to_string(i).c_str());
|
||||||
|
}
|
||||||
|
recv_sys.remove_extra_log_files = false;
|
||||||
|
}
|
||||||
|
|
||||||
recv_sys.dblwr.pages.clear();
|
recv_sys.dblwr.pages.clear();
|
||||||
|
|
||||||
@ -1794,24 +1692,20 @@ files_checked:
|
|||||||
Unless --export is specified, no further change to
|
Unless --export is specified, no further change to
|
||||||
InnoDB files is needed. */
|
InnoDB files is needed. */
|
||||||
ut_ad(!srv_force_recovery);
|
ut_ad(!srv_force_recovery);
|
||||||
ut_ad(srv_n_log_files_found <= 1);
|
|
||||||
ut_ad(recv_no_log_write);
|
ut_ad(recv_no_log_write);
|
||||||
buf_flush_sync();
|
buf_flush_sync();
|
||||||
err = fil_write_flushed_lsn(log_get_lsn());
|
err = fil_write_flushed_lsn(log_get_lsn());
|
||||||
ut_ad(!buf_pool_check_no_pending_io());
|
ut_ad(!buf_pool_check_no_pending_io());
|
||||||
log_sys.log.close_files();
|
log_sys.log.close_file();
|
||||||
if (err == DB_SUCCESS) {
|
if (err == DB_SUCCESS) {
|
||||||
bool trunc = srv_operation
|
bool trunc = srv_operation
|
||||||
== SRV_OPERATION_RESTORE;
|
== SRV_OPERATION_RESTORE;
|
||||||
/* Delete subsequent log files. */
|
if (!trunc) {
|
||||||
delete_log_files(logfilename, dirnamelen,
|
delete_log_file("0");
|
||||||
(uint)srv_n_log_files_found, trunc);
|
} else {
|
||||||
if (trunc) {
|
auto logfile0 = get_log_file_path();
|
||||||
/* Truncate the first log file. */
|
/* Truncate the first log file. */
|
||||||
strcpy(logfilename + dirnamelen,
|
fclose(fopen(logfile0.c_str(), "w"));
|
||||||
"ib_logfile0");
|
|
||||||
FILE* f = fopen(logfilename, "w");
|
|
||||||
fclose(f);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return(err);
|
return(err);
|
||||||
@ -1819,14 +1713,14 @@ files_checked:
|
|||||||
|
|
||||||
/* Upgrade or resize or rebuild the redo logs before
|
/* Upgrade or resize or rebuild the redo logs before
|
||||||
generating any dirty pages, so that the old redo log
|
generating any dirty pages, so that the old redo log
|
||||||
files will not be written to. */
|
file will not be written to. */
|
||||||
|
|
||||||
if (srv_force_recovery == SRV_FORCE_NO_LOG_REDO) {
|
if (srv_force_recovery == SRV_FORCE_NO_LOG_REDO) {
|
||||||
/* Completely ignore the redo log. */
|
/* Completely ignore the redo log. */
|
||||||
} else if (srv_read_only_mode) {
|
} else if (srv_read_only_mode) {
|
||||||
/* Leave the redo log alone. */
|
/* Leave the redo log alone. */
|
||||||
} else if (srv_log_file_size_requested == srv_log_file_size
|
} else if (srv_log_file_size_requested == srv_log_file_size
|
||||||
&& srv_n_log_files_found == srv_n_log_files
|
&& srv_log_file_found
|
||||||
&& log_sys.log.format
|
&& log_sys.log.format
|
||||||
== (srv_encrypt_log
|
== (srv_encrypt_log
|
||||||
? log_t::FORMAT_ENC_10_5
|
? log_t::FORMAT_ENC_10_5
|
||||||
@ -1835,14 +1729,15 @@ files_checked:
|
|||||||
/* No need to add or remove encryption,
|
/* No need to add or remove encryption,
|
||||||
upgrade, downgrade, or resize. */
|
upgrade, downgrade, or resize. */
|
||||||
} else {
|
} else {
|
||||||
/* Prepare to delete the old redo log files */
|
/* Prepare to delete the old redo log file */
|
||||||
flushed_lsn = srv_prepare_to_delete_redo_log_files(i);
|
flushed_lsn = srv_prepare_to_delete_redo_log_file(
|
||||||
|
srv_log_file_found);
|
||||||
|
|
||||||
DBUG_EXECUTE_IF("innodb_log_abort_1",
|
DBUG_EXECUTE_IF("innodb_log_abort_1",
|
||||||
return(srv_init_abort(DB_ERROR)););
|
return(srv_init_abort(DB_ERROR)););
|
||||||
/* Prohibit redo log writes from any other
|
/* Prohibit redo log writes from any other
|
||||||
threads until creating a log checkpoint at the
|
threads until creating a log checkpoint at the
|
||||||
end of create_log_files(). */
|
end of create_log_file(). */
|
||||||
ut_d(recv_no_log_write = true);
|
ut_d(recv_no_log_write = true);
|
||||||
ut_ad(!buf_pool_check_no_pending_io());
|
ut_ad(!buf_pool_check_no_pending_io());
|
||||||
|
|
||||||
@ -1860,27 +1755,23 @@ files_checked:
|
|||||||
return(srv_init_abort(err));
|
return(srv_init_abort(err));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Close and free the redo log files, so that
|
/* Close the redo log file, so that we can replace it */
|
||||||
we can replace them. */
|
log_sys.log.close_file();
|
||||||
log_sys.log.close_files();
|
|
||||||
|
|
||||||
DBUG_EXECUTE_IF("innodb_log_abort_5",
|
DBUG_EXECUTE_IF("innodb_log_abort_5",
|
||||||
return(srv_init_abort(DB_ERROR)););
|
return(srv_init_abort(DB_ERROR)););
|
||||||
DBUG_PRINT("ib_log", ("After innodb_log_abort_5"));
|
DBUG_PRINT("ib_log", ("After innodb_log_abort_5"));
|
||||||
|
|
||||||
ib::info() << "Starting to delete and rewrite log"
|
ib::info()
|
||||||
" files.";
|
<< "Starting to delete and rewrite log file.";
|
||||||
|
|
||||||
srv_log_file_size = srv_log_file_size_requested;
|
srv_log_file_size = srv_log_file_size_requested;
|
||||||
|
|
||||||
err = create_log_files(
|
err = create_log_file(flushed_lsn, logfile0);
|
||||||
logfilename, dirnamelen, flushed_lsn,
|
|
||||||
logfile0);
|
|
||||||
|
|
||||||
if (err == DB_SUCCESS) {
|
if (err == DB_SUCCESS) {
|
||||||
err = create_log_files_rename(
|
err = create_log_file_rename(flushed_lsn,
|
||||||
logfilename, dirnamelen, flushed_lsn,
|
logfile0);
|
||||||
logfile0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (err != DB_SUCCESS) {
|
if (err != DB_SUCCESS) {
|
||||||
|
Reference in New Issue
Block a user