mirror of
https://github.com/MariaDB/server.git
synced 2025-01-29 18:20:07 +01:00
Merging from mysql-5.1 to mysql-5.5.
This commit is contained in:
commit
a2c3ba2446
4 changed files with 74 additions and 5 deletions
|
@ -2702,7 +2702,7 @@ retry:
|
|||
mutex_exit(&fil_system->mutex);
|
||||
|
||||
#ifndef UNIV_HOTBACKUP
|
||||
if (success) {
|
||||
if (success && !recv_recovery_on) {
|
||||
mtr_t mtr;
|
||||
|
||||
mtr_start(&mtr);
|
||||
|
@ -4947,3 +4947,28 @@ fil_close(void)
|
|||
|
||||
fil_system = NULL;
|
||||
}
|
||||
|
||||
/****************************************************************//**
|
||||
Generate redo logs for swapping two .ibd files */
|
||||
UNIV_INTERN
|
||||
void
|
||||
fil_mtr_rename_log(
|
||||
/*===============*/
|
||||
ulint old_space_id, /*!< in: tablespace id of the old
|
||||
table. */
|
||||
const char* old_name, /*!< in: old table name */
|
||||
ulint new_space_id, /*!< in: tablespace id of the new
|
||||
table */
|
||||
const char* new_name, /*!< in: new table name */
|
||||
const char* tmp_name) /*!< in: temp table name used while
|
||||
swapping */
|
||||
{
|
||||
mtr_t mtr;
|
||||
mtr_start(&mtr);
|
||||
fil_op_write_log(MLOG_FILE_RENAME, old_space_id,
|
||||
0, 0, old_name, tmp_name, &mtr);
|
||||
fil_op_write_log(MLOG_FILE_RENAME, new_space_id,
|
||||
0, 0, new_name, old_name, &mtr);
|
||||
mtr_commit(&mtr);
|
||||
}
|
||||
|
||||
|
|
|
@ -734,6 +734,21 @@ fil_tablespace_is_being_deleted(
|
|||
/*============================*/
|
||||
ulint id); /*!< in: space id */
|
||||
|
||||
/****************************************************************//**
|
||||
Generate redo logs for swapping two .ibd files */
|
||||
UNIV_INTERN
|
||||
void
|
||||
fil_mtr_rename_log(
|
||||
/*===============*/
|
||||
ulint old_space_id, /*!< in: tablespace id of the old
|
||||
table. */
|
||||
const char* old_name, /*!< in: old table name */
|
||||
ulint new_space_id, /*!< in: tablespace id of the new
|
||||
table */
|
||||
const char* new_name, /*!< in: new table name */
|
||||
const char* tmp_name); /*!< in: temp table name used while
|
||||
swapping */
|
||||
|
||||
typedef struct fil_space_struct fil_space_t;
|
||||
|
||||
#endif
|
||||
|
|
|
@ -965,8 +965,11 @@ recv_parse_or_apply_log_rec_body(
|
|||
not NULL, then the log record is
|
||||
applied to the page, and the log
|
||||
record should be complete then */
|
||||
mtr_t* mtr) /*!< in: mtr or NULL; should be non-NULL
|
||||
mtr_t* mtr, /*!< in: mtr or NULL; should be non-NULL
|
||||
if and only if block is non-NULL */
|
||||
ulint space_id)
|
||||
/*!< in: tablespace id obtained by
|
||||
parsing initial log record */
|
||||
{
|
||||
dict_index_t* index = NULL;
|
||||
page_t* page;
|
||||
|
@ -1238,8 +1241,11 @@ recv_parse_or_apply_log_rec_body(
|
|||
ut_ad(!page || page_type != FIL_PAGE_TYPE_ALLOCATED);
|
||||
ptr = mlog_parse_string(ptr, end_ptr, page, page_zip);
|
||||
break;
|
||||
case MLOG_FILE_CREATE:
|
||||
case MLOG_FILE_RENAME:
|
||||
ptr = fil_op_log_parse_or_replay(ptr, end_ptr, type,
|
||||
space_id, 0);
|
||||
break;
|
||||
case MLOG_FILE_CREATE:
|
||||
case MLOG_FILE_DELETE:
|
||||
case MLOG_FILE_CREATE2:
|
||||
ptr = fil_op_log_parse_or_replay(ptr, end_ptr, type, 0, 0);
|
||||
|
@ -1611,7 +1617,8 @@ recv_recover_page_func(
|
|||
|
||||
recv_parse_or_apply_log_rec_body(recv->type, buf,
|
||||
buf + recv->len,
|
||||
block, &mtr);
|
||||
block, &mtr,
|
||||
recv_addr->space);
|
||||
|
||||
end_lsn = recv->start_lsn + recv->len;
|
||||
mach_write_to_8(FIL_PAGE_LSN + page, end_lsn);
|
||||
|
@ -2078,7 +2085,7 @@ recv_parse_log_rec(
|
|||
#endif /* UNIV_LOG_LSN_DEBUG */
|
||||
|
||||
new_ptr = recv_parse_or_apply_log_rec_body(*type, new_ptr, end_ptr,
|
||||
NULL, NULL);
|
||||
NULL, NULL, *space);
|
||||
if (UNIV_UNLIKELY(new_ptr == NULL)) {
|
||||
|
||||
return(0);
|
||||
|
|
|
@ -2494,6 +2494,28 @@ row_merge_rename_tables(
|
|||
goto err_exit;
|
||||
}
|
||||
|
||||
/* Generate the redo logs for file operations */
|
||||
fil_mtr_rename_log(old_table->space, old_name,
|
||||
new_table->space, new_table->name, tmp_name);
|
||||
|
||||
/* What if the redo logs are flushed to disk here? This is
|
||||
tested with following crash point */
|
||||
DBUG_EXECUTE_IF("bug14669848_precommit", log_buffer_flush_to_disk();
|
||||
DBUG_SUICIDE(););
|
||||
|
||||
/* File operations cannot be rolled back. So, before proceeding
|
||||
with file operations, commit the dictionary changes.*/
|
||||
trx_commit_for_mysql(trx);
|
||||
|
||||
/* If server crashes here, the dictionary in InnoDB and MySQL
|
||||
will differ. The .ibd files and the .frm files must be swapped
|
||||
manually by the administrator. No loss of data. */
|
||||
DBUG_EXECUTE_IF("bug14669848", DBUG_SUICIDE(););
|
||||
|
||||
/* Ensure that the redo logs are flushed to disk. The config
|
||||
innodb_flush_log_at_trx_commit must not affect this. */
|
||||
log_buffer_flush_to_disk();
|
||||
|
||||
/* The following calls will also rename the .ibd data files if
|
||||
the tables are stored in a single-table tablespace */
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue