mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 04:22:27 +01:00
Automatic merge
This commit is contained in:
commit
f0f2103695
7 changed files with 146 additions and 75 deletions
|
@ -1,48 +0,0 @@
|
||||||
SELECT @@GLOBAL.innodb_use_sys_malloc;
|
|
||||||
@@GLOBAL.innodb_use_sys_malloc
|
|
||||||
1
|
|
||||||
1 Expected
|
|
||||||
SET @@GLOBAL.innodb_use_sys_malloc=0;
|
|
||||||
ERROR HY000: Variable 'innodb_use_sys_malloc' is a read only variable
|
|
||||||
Expected error 'Read only variable'
|
|
||||||
SELECT @@GLOBAL.innodb_use_sys_malloc;
|
|
||||||
@@GLOBAL.innodb_use_sys_malloc
|
|
||||||
1
|
|
||||||
1 Expected
|
|
||||||
drop table if exists t1;
|
|
||||||
create table t1(a int not null) engine=innodb DEFAULT CHARSET=latin1;
|
|
||||||
insert into t1 values (1),(2),(3),(4),(5),(6),(7);
|
|
||||||
select * from t1;
|
|
||||||
a
|
|
||||||
1
|
|
||||||
2
|
|
||||||
3
|
|
||||||
4
|
|
||||||
5
|
|
||||||
6
|
|
||||||
7
|
|
||||||
drop table t1;
|
|
||||||
SELECT @@GLOBAL.innodb_use_sys_malloc;
|
|
||||||
@@GLOBAL.innodb_use_sys_malloc
|
|
||||||
1
|
|
||||||
1 Expected
|
|
||||||
SET @@GLOBAL.innodb_use_sys_malloc=0;
|
|
||||||
ERROR HY000: Variable 'innodb_use_sys_malloc' is a read only variable
|
|
||||||
Expected error 'Read only variable'
|
|
||||||
SELECT @@GLOBAL.innodb_use_sys_malloc;
|
|
||||||
@@GLOBAL.innodb_use_sys_malloc
|
|
||||||
1
|
|
||||||
1 Expected
|
|
||||||
drop table if exists t1;
|
|
||||||
create table t1(a int not null) engine=innodb DEFAULT CHARSET=latin1;
|
|
||||||
insert into t1 values (1),(2),(3),(4),(5),(6),(7);
|
|
||||||
select * from t1;
|
|
||||||
a
|
|
||||||
1
|
|
||||||
2
|
|
||||||
3
|
|
||||||
4
|
|
||||||
5
|
|
||||||
6
|
|
||||||
7
|
|
||||||
drop table t1;
|
|
|
@ -1 +0,0 @@
|
||||||
--loose-innodb-use-sys-malloc=true
|
|
|
@ -109,7 +109,8 @@ prototype_undo_exec_hook(UNDO_KEY_DELETE);
|
||||||
prototype_undo_exec_hook(UNDO_KEY_DELETE_WITH_ROOT);
|
prototype_undo_exec_hook(UNDO_KEY_DELETE_WITH_ROOT);
|
||||||
prototype_undo_exec_hook(UNDO_BULK_INSERT);
|
prototype_undo_exec_hook(UNDO_BULK_INSERT);
|
||||||
|
|
||||||
static int run_redo_phase(LSN lsn, enum maria_apply_log_way apply);
|
static int run_redo_phase(LSN lsn, LSN end_lsn,
|
||||||
|
enum maria_apply_log_way apply);
|
||||||
static uint end_of_redo_phase(my_bool prepare_for_undo_phase);
|
static uint end_of_redo_phase(my_bool prepare_for_undo_phase);
|
||||||
static int run_undo_phase(uint uncommitted);
|
static int run_undo_phase(uint uncommitted);
|
||||||
static void display_record_position(const LOG_DESC *log_desc,
|
static void display_record_position(const LOG_DESC *log_desc,
|
||||||
|
@ -217,8 +218,8 @@ int maria_recovery_from_log(void)
|
||||||
#endif
|
#endif
|
||||||
tprint(trace_file, "TRACE of the last MARIA recovery from mysqld\n");
|
tprint(trace_file, "TRACE of the last MARIA recovery from mysqld\n");
|
||||||
DBUG_ASSERT(maria_pagecache->inited);
|
DBUG_ASSERT(maria_pagecache->inited);
|
||||||
res= maria_apply_log(LSN_IMPOSSIBLE, MARIA_LOG_APPLY, trace_file,
|
res= maria_apply_log(LSN_IMPOSSIBLE, LSN_IMPOSSIBLE, MARIA_LOG_APPLY,
|
||||||
TRUE, TRUE, TRUE, &warnings_count);
|
trace_file, TRUE, TRUE, TRUE, &warnings_count);
|
||||||
if (!res)
|
if (!res)
|
||||||
{
|
{
|
||||||
if (warnings_count == 0 && recovery_found_crashed_tables == 0)
|
if (warnings_count == 0 && recovery_found_crashed_tables == 0)
|
||||||
|
@ -239,6 +240,7 @@ int maria_recovery_from_log(void)
|
||||||
|
|
||||||
@param from_lsn LSN from which log reading/applying should start;
|
@param from_lsn LSN from which log reading/applying should start;
|
||||||
LSN_IMPOSSIBLE means "use last checkpoint"
|
LSN_IMPOSSIBLE means "use last checkpoint"
|
||||||
|
@param end_lsn Apply until this. LSN_IMPOSSIBLE means until end.
|
||||||
@param apply how log records should be applied or not
|
@param apply how log records should be applied or not
|
||||||
@param trace_file trace file where progress/debug messages will go
|
@param trace_file trace file where progress/debug messages will go
|
||||||
@param skip_DDLs_arg Should DDL records (CREATE/RENAME/DROP/REPAIR)
|
@param skip_DDLs_arg Should DDL records (CREATE/RENAME/DROP/REPAIR)
|
||||||
|
@ -255,7 +257,8 @@ int maria_recovery_from_log(void)
|
||||||
@retval !=0 Error
|
@retval !=0 Error
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int maria_apply_log(LSN from_lsn, enum maria_apply_log_way apply,
|
int maria_apply_log(LSN from_lsn, LSN end_lsn,
|
||||||
|
enum maria_apply_log_way apply,
|
||||||
FILE *trace_file,
|
FILE *trace_file,
|
||||||
my_bool should_run_undo_phase, my_bool skip_DDLs_arg,
|
my_bool should_run_undo_phase, my_bool skip_DDLs_arg,
|
||||||
my_bool take_checkpoints, uint *warnings_count)
|
my_bool take_checkpoints, uint *warnings_count)
|
||||||
|
@ -263,6 +266,7 @@ int maria_apply_log(LSN from_lsn, enum maria_apply_log_way apply,
|
||||||
int error= 0;
|
int error= 0;
|
||||||
uint uncommitted_trans;
|
uint uncommitted_trans;
|
||||||
ulonglong old_now;
|
ulonglong old_now;
|
||||||
|
my_bool abort_message_printed= 0;
|
||||||
DBUG_ENTER("maria_apply_log");
|
DBUG_ENTER("maria_apply_log");
|
||||||
|
|
||||||
DBUG_ASSERT(apply == MARIA_LOG_APPLY || !should_run_undo_phase);
|
DBUG_ASSERT(apply == MARIA_LOG_APPLY || !should_run_undo_phase);
|
||||||
|
@ -271,6 +275,7 @@ int maria_apply_log(LSN from_lsn, enum maria_apply_log_way apply,
|
||||||
maria_recovery_changed_data= 0;
|
maria_recovery_changed_data= 0;
|
||||||
/* checkpoints can happen only if TRNs have been built */
|
/* checkpoints can happen only if TRNs have been built */
|
||||||
DBUG_ASSERT(should_run_undo_phase || !take_checkpoints);
|
DBUG_ASSERT(should_run_undo_phase || !take_checkpoints);
|
||||||
|
DBUG_ASSERT(end_lsn == LSN_IMPOSSIBLE || should_run_undo_phase == 0);
|
||||||
all_active_trans= (struct st_trn_for_recovery *)
|
all_active_trans= (struct st_trn_for_recovery *)
|
||||||
my_malloc((SHORT_TRID_MAX + 1) * sizeof(struct st_trn_for_recovery),
|
my_malloc((SHORT_TRID_MAX + 1) * sizeof(struct st_trn_for_recovery),
|
||||||
MYF(MY_ZEROFILL));
|
MYF(MY_ZEROFILL));
|
||||||
|
@ -316,7 +321,7 @@ int maria_apply_log(LSN from_lsn, enum maria_apply_log_way apply,
|
||||||
now= my_getsystime();
|
now= my_getsystime();
|
||||||
in_redo_phase= TRUE;
|
in_redo_phase= TRUE;
|
||||||
trnman_init(max_trid_in_control_file);
|
trnman_init(max_trid_in_control_file);
|
||||||
if (run_redo_phase(from_lsn, apply))
|
if (run_redo_phase(from_lsn, end_lsn, apply))
|
||||||
{
|
{
|
||||||
ma_message_no_user(0, "Redo phase failed");
|
ma_message_no_user(0, "Redo phase failed");
|
||||||
trnman_destroy();
|
trnman_destroy();
|
||||||
|
@ -324,6 +329,15 @@ int maria_apply_log(LSN from_lsn, enum maria_apply_log_way apply,
|
||||||
}
|
}
|
||||||
trnman_destroy();
|
trnman_destroy();
|
||||||
|
|
||||||
|
if (end_lsn != LSN_IMPOSSIBLE)
|
||||||
|
{
|
||||||
|
abort_message_printed= 1;
|
||||||
|
my_message(HA_ERR_INITIALIZATION,
|
||||||
|
"Maria recovery aborted as end_lsn/end of file was reached",
|
||||||
|
MYF(0));
|
||||||
|
goto err2;
|
||||||
|
}
|
||||||
|
|
||||||
if ((uncommitted_trans=
|
if ((uncommitted_trans=
|
||||||
end_of_redo_phase(should_run_undo_phase)) == (uint)-1)
|
end_of_redo_phase(should_run_undo_phase)) == (uint)-1)
|
||||||
{
|
{
|
||||||
|
@ -440,10 +454,15 @@ int maria_apply_log(LSN from_lsn, enum maria_apply_log_way apply,
|
||||||
|
|
||||||
goto end;
|
goto end;
|
||||||
err:
|
err:
|
||||||
error= 1;
|
|
||||||
tprint(tracef, "\nRecovery of tables with transaction logs FAILED\n");
|
tprint(tracef, "\nRecovery of tables with transaction logs FAILED\n");
|
||||||
|
err2:
|
||||||
if (trns_created)
|
if (trns_created)
|
||||||
delete_all_transactions();
|
delete_all_transactions();
|
||||||
|
error= 1;
|
||||||
|
if (close_all_tables())
|
||||||
|
{
|
||||||
|
ma_message_no_user(0, "closing of tables failed");
|
||||||
|
}
|
||||||
end:
|
end:
|
||||||
error_handler_hook= save_error_handler_hook;
|
error_handler_hook= save_error_handler_hook;
|
||||||
hash_free(&all_dirty_pages);
|
hash_free(&all_dirty_pages);
|
||||||
|
@ -480,7 +499,7 @@ end:
|
||||||
maria_recovery_changed_data= 1;
|
maria_recovery_changed_data= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (error)
|
if (error && !abort_message_printed)
|
||||||
my_message(HA_ERR_INITIALIZATION,
|
my_message(HA_ERR_INITIALIZATION,
|
||||||
"Maria recovery failed. Please run maria_chk -r on all maria "
|
"Maria recovery failed. Please run maria_chk -r on all maria "
|
||||||
"tables and delete all maria_log.######## files", MYF(0));
|
"tables and delete all maria_log.######## files", MYF(0));
|
||||||
|
@ -2370,7 +2389,7 @@ prototype_undo_exec_hook(UNDO_BULK_INSERT)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int run_redo_phase(LSN lsn, enum maria_apply_log_way apply)
|
static int run_redo_phase(LSN lsn, LSN lsn_end, enum maria_apply_log_way apply)
|
||||||
{
|
{
|
||||||
TRANSLOG_HEADER_BUFFER rec;
|
TRANSLOG_HEADER_BUFFER rec;
|
||||||
struct st_translog_scanner_data scanner;
|
struct st_translog_scanner_data scanner;
|
||||||
|
@ -2498,6 +2517,17 @@ static int run_redo_phase(LSN lsn, enum maria_apply_log_way apply)
|
||||||
tprint(tracef, "Cannot find record where it should be\n");
|
tprint(tracef, "Cannot find record where it should be\n");
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
if (lsn_end != LSN_IMPOSSIBLE && rec2.lsn >= lsn_end)
|
||||||
|
{
|
||||||
|
tprint(tracef,
|
||||||
|
"lsn_end reached at (%lu,0x%lx). "
|
||||||
|
"Skipping rest of redo entries",
|
||||||
|
LSN_IN_PARTS(rec2.lsn));
|
||||||
|
translog_destroy_scanner(&scanner);
|
||||||
|
translog_free_record_header(&rec);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
if (translog_scanner_init(rec2.lsn, 1, &scanner2, 1))
|
if (translog_scanner_init(rec2.lsn, 1, &scanner2, 1))
|
||||||
{
|
{
|
||||||
tprint(tracef, "Scanner2 init failed\n");
|
tprint(tracef, "Scanner2 init failed\n");
|
||||||
|
|
|
@ -26,7 +26,7 @@ C_MODE_START
|
||||||
enum maria_apply_log_way
|
enum maria_apply_log_way
|
||||||
{ MARIA_LOG_APPLY, MARIA_LOG_DISPLAY_HEADER, MARIA_LOG_CHECK };
|
{ MARIA_LOG_APPLY, MARIA_LOG_DISPLAY_HEADER, MARIA_LOG_CHECK };
|
||||||
int maria_recovery_from_log(void);
|
int maria_recovery_from_log(void);
|
||||||
int maria_apply_log(LSN lsn, enum maria_apply_log_way apply,
|
int maria_apply_log(LSN lsn, LSN lsn_end, enum maria_apply_log_way apply,
|
||||||
FILE *trace_file,
|
FILE *trace_file,
|
||||||
my_bool execute_undo_phase, my_bool skip_DDLs,
|
my_bool execute_undo_phase, my_bool skip_DDLs,
|
||||||
my_bool take_checkpoints, uint *warnings_count);
|
my_bool take_checkpoints, uint *warnings_count);
|
||||||
|
|
|
@ -1987,9 +1987,9 @@ static my_bool _ma_log_split(MARIA_PAGE *ma_page,
|
||||||
uint changed_length)
|
uint changed_length)
|
||||||
{
|
{
|
||||||
LSN lsn;
|
LSN lsn;
|
||||||
uchar log_data[FILEID_STORE_SIZE + PAGE_STORE_SIZE + 3+3+3+3+3+2];
|
uchar log_data[FILEID_STORE_SIZE + PAGE_STORE_SIZE + 3+3+3+3+3+2 +7];
|
||||||
uchar *log_pos;
|
uchar *log_pos;
|
||||||
LEX_CUSTRING log_array[TRANSLOG_INTERNAL_PARTS + 3];
|
LEX_CUSTRING log_array[TRANSLOG_INTERNAL_PARTS + 4];
|
||||||
uint offset= (uint) (key_pos - ma_page->buff);
|
uint offset= (uint) (key_pos - ma_page->buff);
|
||||||
uint translog_parts, extra_length;
|
uint translog_parts, extra_length;
|
||||||
MARIA_HA *info= ma_page->info;
|
MARIA_HA *info= ma_page->info;
|
||||||
|
@ -2085,6 +2085,22 @@ static my_bool _ma_log_split(MARIA_PAGE *ma_page,
|
||||||
log_array[TRANSLOG_INTERNAL_PARTS + 0].str= log_data;
|
log_array[TRANSLOG_INTERNAL_PARTS + 0].str= log_data;
|
||||||
log_array[TRANSLOG_INTERNAL_PARTS + 0].length= (uint) (log_pos -
|
log_array[TRANSLOG_INTERNAL_PARTS + 0].length= (uint) (log_pos -
|
||||||
log_data);
|
log_data);
|
||||||
|
#ifdef EXTRA_DEBUG_KEY_CHANGES
|
||||||
|
{
|
||||||
|
int page_length= ma_page->size;
|
||||||
|
ha_checksum crc;
|
||||||
|
crc= my_checksum(0, ma_page->buff + LSN_STORE_SIZE,
|
||||||
|
page_length - LSN_STORE_SIZE);
|
||||||
|
log_pos[0]= KEY_OP_CHECK;
|
||||||
|
int2store(log_pos+1, page_length);
|
||||||
|
int4store(log_pos+3, crc);
|
||||||
|
log_array[TRANSLOG_INTERNAL_PARTS + translog_parts].str= log_pos;
|
||||||
|
log_array[TRANSLOG_INTERNAL_PARTS + translog_parts].length= 7;
|
||||||
|
extra_length+= 7;
|
||||||
|
translog_parts++;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
DBUG_RETURN(translog_write_record(&lsn, LOGREC_REDO_INDEX,
|
DBUG_RETURN(translog_write_record(&lsn, LOGREC_REDO_INDEX,
|
||||||
info->trn, info,
|
info->trn, info,
|
||||||
(translog_size_t)
|
(translog_size_t)
|
||||||
|
@ -2122,8 +2138,8 @@ static my_bool _ma_log_del_prefix(MARIA_PAGE *ma_page,
|
||||||
int move_length)
|
int move_length)
|
||||||
{
|
{
|
||||||
LSN lsn;
|
LSN lsn;
|
||||||
uchar log_data[FILEID_STORE_SIZE + PAGE_STORE_SIZE + 12], *log_pos;
|
uchar log_data[FILEID_STORE_SIZE + PAGE_STORE_SIZE + 12 + 7], *log_pos;
|
||||||
LEX_CUSTRING log_array[TRANSLOG_INTERNAL_PARTS + 2];
|
LEX_CUSTRING log_array[TRANSLOG_INTERNAL_PARTS + 3];
|
||||||
uint offset= (uint) (key_pos - ma_page->buff);
|
uint offset= (uint) (key_pos - ma_page->buff);
|
||||||
uint diff_length= org_length + move_length - new_length;
|
uint diff_length= org_length + move_length - new_length;
|
||||||
uint translog_parts, extra_length;
|
uint translog_parts, extra_length;
|
||||||
|
@ -2190,6 +2206,22 @@ static my_bool _ma_log_del_prefix(MARIA_PAGE *ma_page,
|
||||||
log_array[TRANSLOG_INTERNAL_PARTS + 0].str= log_data;
|
log_array[TRANSLOG_INTERNAL_PARTS + 0].str= log_data;
|
||||||
log_array[TRANSLOG_INTERNAL_PARTS + 0].length= (uint) (log_pos -
|
log_array[TRANSLOG_INTERNAL_PARTS + 0].length= (uint) (log_pos -
|
||||||
log_data);
|
log_data);
|
||||||
|
#ifdef EXTRA_DEBUG_KEY_CHANGES
|
||||||
|
{
|
||||||
|
int page_length= ma_page->size;
|
||||||
|
ha_checksum crc;
|
||||||
|
crc= my_checksum(0, ma_page->buff + LSN_STORE_SIZE,
|
||||||
|
page_length - LSN_STORE_SIZE);
|
||||||
|
log_pos[0]= KEY_OP_CHECK;
|
||||||
|
int2store(log_pos+1, page_length);
|
||||||
|
int4store(log_pos+3, crc);
|
||||||
|
log_array[TRANSLOG_INTERNAL_PARTS + translog_parts].str= log_pos;
|
||||||
|
log_array[TRANSLOG_INTERNAL_PARTS + translog_parts].length= 7;
|
||||||
|
extra_length+= 7;
|
||||||
|
translog_parts++;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
DBUG_RETURN(translog_write_record(&lsn, LOGREC_REDO_INDEX,
|
DBUG_RETURN(translog_write_record(&lsn, LOGREC_REDO_INDEX,
|
||||||
info->trn, info,
|
info->trn, info,
|
||||||
(translog_size_t)
|
(translog_size_t)
|
||||||
|
@ -2215,9 +2247,9 @@ static my_bool _ma_log_key_middle(MARIA_PAGE *ma_page,
|
||||||
uint key_length, int move_length)
|
uint key_length, int move_length)
|
||||||
{
|
{
|
||||||
LSN lsn;
|
LSN lsn;
|
||||||
uchar log_data[FILEID_STORE_SIZE + PAGE_STORE_SIZE + 3+5+3+3+3];
|
uchar log_data[FILEID_STORE_SIZE + PAGE_STORE_SIZE + 3+5+3+3+3 + 7];
|
||||||
uchar *log_pos;
|
uchar *log_pos;
|
||||||
LEX_CUSTRING log_array[TRANSLOG_INTERNAL_PARTS + 4];
|
LEX_CUSTRING log_array[TRANSLOG_INTERNAL_PARTS + 5];
|
||||||
uint key_offset;
|
uint key_offset;
|
||||||
uint translog_parts, extra_length;
|
uint translog_parts, extra_length;
|
||||||
my_off_t page;
|
my_off_t page;
|
||||||
|
@ -2300,6 +2332,22 @@ static my_bool _ma_log_key_middle(MARIA_PAGE *ma_page,
|
||||||
key_length);
|
key_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef EXTRA_DEBUG_KEY_CHANGES
|
||||||
|
{
|
||||||
|
int page_length= ma_page->size;
|
||||||
|
ha_checksum crc;
|
||||||
|
crc= my_checksum(0, ma_page->buff + LSN_STORE_SIZE,
|
||||||
|
page_length - LSN_STORE_SIZE);
|
||||||
|
log_pos[0]= KEY_OP_CHECK;
|
||||||
|
int2store(log_pos+1, page_length);
|
||||||
|
int4store(log_pos+3, crc);
|
||||||
|
log_array[TRANSLOG_INTERNAL_PARTS + translog_parts].str= log_pos;
|
||||||
|
log_array[TRANSLOG_INTERNAL_PARTS + translog_parts].length= 7;
|
||||||
|
extra_length+= 7;
|
||||||
|
translog_parts++;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
DBUG_RETURN(translog_write_record(&lsn, LOGREC_REDO_INDEX,
|
DBUG_RETURN(translog_write_record(&lsn, LOGREC_REDO_INDEX,
|
||||||
info->trn, info,
|
info->trn, info,
|
||||||
(translog_size_t)
|
(translog_size_t)
|
||||||
|
@ -2327,6 +2375,7 @@ static my_bool _ma_log_middle(MARIA_PAGE *ma_page,
|
||||||
uchar log_data[FILEID_STORE_SIZE + PAGE_STORE_SIZE + 3 + 5], *log_pos;
|
uchar log_data[FILEID_STORE_SIZE + PAGE_STORE_SIZE + 3 + 5], *log_pos;
|
||||||
MARIA_HA *info= ma_page->info;
|
MARIA_HA *info= ma_page->info;
|
||||||
my_off_t page;
|
my_off_t page;
|
||||||
|
uint translog_parts, extra_length;
|
||||||
DBUG_ENTER("_ma_log_middle");
|
DBUG_ENTER("_ma_log_middle");
|
||||||
DBUG_PRINT("enter", ("page: %lu", (ulong) page));
|
DBUG_PRINT("enter", ("page: %lu", (ulong) page));
|
||||||
|
|
||||||
|
@ -2352,12 +2401,31 @@ static my_bool _ma_log_middle(MARIA_PAGE *ma_page,
|
||||||
log_array[TRANSLOG_INTERNAL_PARTS + 1].str= ((char*) buff +
|
log_array[TRANSLOG_INTERNAL_PARTS + 1].str= ((char*) buff +
|
||||||
info->s->keypage_header);
|
info->s->keypage_header);
|
||||||
log_array[TRANSLOG_INTERNAL_PARTS + 1].length= data_changed_first;
|
log_array[TRANSLOG_INTERNAL_PARTS + 1].length= data_changed_first;
|
||||||
|
translog_parts= 2;
|
||||||
|
extra_length= data_changed_first;
|
||||||
|
|
||||||
|
#ifdef EXTRA_DEBUG_KEY_CHANGES
|
||||||
|
{
|
||||||
|
int page_length= ma_page->size;
|
||||||
|
ha_checksum crc;
|
||||||
|
crc= my_checksum(0, ma_page->buff + LSN_STORE_SIZE,
|
||||||
|
page_length - LSN_STORE_SIZE);
|
||||||
|
log_pos[0]= KEY_OP_CHECK;
|
||||||
|
int2store(log_pos+1, page_length);
|
||||||
|
int4store(log_pos+3, crc);
|
||||||
|
log_array[TRANSLOG_INTERNAL_PARTS + translog_parts].str= log_pos;
|
||||||
|
log_array[TRANSLOG_INTERNAL_PARTS + translog_parts].length= 7;
|
||||||
|
extra_length+= 7;
|
||||||
|
translog_parts++;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
DBUG_RETURN(translog_write_record(&lsn, LOGREC_REDO_INDEX,
|
DBUG_RETURN(translog_write_record(&lsn, LOGREC_REDO_INDEX,
|
||||||
info->trn, info,
|
info->trn, info,
|
||||||
(translog_size_t)
|
(translog_size_t)
|
||||||
log_array[TRANSLOG_INTERNAL_PARTS +
|
log_array[TRANSLOG_INTERNAL_PARTS +
|
||||||
0].length + data_changed_first,
|
0].length + extra_length,
|
||||||
TRANSLOG_INTERNAL_PARTS + 2,
|
TRANSLOG_INTERNAL_PARTS + translog_parts,
|
||||||
log_array, log_data, NULL));
|
log_array, log_data, NULL));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -42,6 +42,7 @@ static CHARSET_INFO *set_collation;
|
||||||
static int stopwords_inited= 0;
|
static int stopwords_inited= 0;
|
||||||
static MY_TMPDIR maria_chk_tmpdir;
|
static MY_TMPDIR maria_chk_tmpdir;
|
||||||
static my_bool opt_transaction_logging, opt_debug, opt_require_control_file;
|
static my_bool opt_transaction_logging, opt_debug, opt_require_control_file;
|
||||||
|
static my_bool opt_warning_for_wrong_transid;
|
||||||
|
|
||||||
static const char *type_names[]=
|
static const char *type_names[]=
|
||||||
{
|
{
|
||||||
|
@ -193,7 +194,7 @@ enum options_mc {
|
||||||
OPT_FT_MAX_WORD_LEN, OPT_FT_STOPWORD_FILE,
|
OPT_FT_MAX_WORD_LEN, OPT_FT_STOPWORD_FILE,
|
||||||
OPT_MAX_RECORD_LENGTH, OPT_AUTO_CLOSE, OPT_STATS_METHOD, OPT_TRANSACTION_LOG,
|
OPT_MAX_RECORD_LENGTH, OPT_AUTO_CLOSE, OPT_STATS_METHOD, OPT_TRANSACTION_LOG,
|
||||||
OPT_SKIP_SAFEMALLOC, OPT_ZEROFILL_KEEP_LSN, OPT_REQUIRE_CONTROL_FILE,
|
OPT_SKIP_SAFEMALLOC, OPT_ZEROFILL_KEEP_LSN, OPT_REQUIRE_CONTROL_FILE,
|
||||||
OPT_LOG_DIR, OPT_DATADIR
|
OPT_LOG_DIR, OPT_DATADIR, OPT_WARNING_FOR_WRONG_TRANSID
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct my_option my_long_options[] =
|
static struct my_option my_long_options[] =
|
||||||
|
@ -337,7 +338,9 @@ static struct my_option my_long_options[] =
|
||||||
&opt_transaction_logging, &opt_transaction_logging,
|
&opt_transaction_logging, &opt_transaction_logging,
|
||||||
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
{"update-state", 'U',
|
{"update-state", 'U',
|
||||||
"Mark tables as crashed if any errors were found.",
|
"Mark tables as crashed if any errors were found and clean if check didn't "
|
||||||
|
"find any errors. This allows one to get rid of warnings like 'table not "
|
||||||
|
"properly closed'",
|
||||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
{"unpack", 'u',
|
{"unpack", 'u',
|
||||||
"Unpack file packed with mariapack.",
|
"Unpack file packed with mariapack.",
|
||||||
|
@ -349,6 +352,11 @@ static struct my_option my_long_options[] =
|
||||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
{"wait", 'w', "Wait if table is locked.",
|
{"wait", 'w', "Wait if table is locked.",
|
||||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
|
{"warning-for-wrong-transaction-id", OPT_WARNING_FOR_WRONG_TRANSID,
|
||||||
|
"Give a warning if we find a transaction id in the table that is bigger"
|
||||||
|
"than what exists in the control file. Use --skip-... to disable warning",
|
||||||
|
&opt_warning_for_wrong_transid, &opt_warning_for_wrong_transid,
|
||||||
|
0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
|
||||||
{ "page_buffer_size", OPT_PAGE_BUFFER_SIZE,
|
{ "page_buffer_size", OPT_PAGE_BUFFER_SIZE,
|
||||||
"Size of page buffer. Used by --safe-repair",
|
"Size of page buffer. Used by --safe-repair",
|
||||||
&check_param.use_buffers, &check_param.use_buffers, 0,
|
&check_param.use_buffers, &check_param.use_buffers, 0,
|
||||||
|
@ -1241,6 +1249,8 @@ static int maria_chk(HA_CHECK *param, char *filename)
|
||||||
llstr(info->state->records,llbuff),
|
llstr(info->state->records,llbuff),
|
||||||
llstr(info->state->del,llbuff2));
|
llstr(info->state->del,llbuff2));
|
||||||
maria_chk_init_for_check(param, info);
|
maria_chk_init_for_check(param, info);
|
||||||
|
if (opt_warning_for_wrong_transid == 0)
|
||||||
|
param->max_trid= ~ (ulonglong) 0;
|
||||||
error= maria_chk_status(param,info);
|
error= maria_chk_status(param,info);
|
||||||
maria_intersect_keys_active(share->state.key_map, param->keys_in_use);
|
maria_intersect_keys_active(share->state.key_map, param->keys_in_use);
|
||||||
error|= maria_chk_size(param,info);
|
error|= maria_chk_size(param,info);
|
||||||
|
@ -1277,8 +1287,11 @@ static int maria_chk(HA_CHECK *param, char *filename)
|
||||||
}
|
}
|
||||||
if (!error)
|
if (!error)
|
||||||
{
|
{
|
||||||
if ((share->state.changed & STATE_CHANGED) &&
|
if (((share->state.changed &
|
||||||
(param->testflag & T_UPDATE_STATE))
|
(STATE_CHANGED | STATE_CRASHED | STATE_CRASHED_ON_REPAIR |
|
||||||
|
STATE_IN_REPAIR)) ||
|
||||||
|
share->state.open_count != 0)
|
||||||
|
&& (param->testflag & T_UPDATE_STATE))
|
||||||
info->update|=HA_STATE_CHANGED | HA_STATE_ROW_CHANGED;
|
info->update|=HA_STATE_CHANGED | HA_STATE_ROW_CHANGED;
|
||||||
DBUG_PRINT("info", ("Reseting crashed state"));
|
DBUG_PRINT("info", ("Reseting crashed state"));
|
||||||
share->state.changed&= ~(STATE_CHANGED | STATE_CRASHED |
|
share->state.changed&= ~(STATE_CHANGED | STATE_CRASHED |
|
||||||
|
|
|
@ -33,7 +33,7 @@ static my_bool opt_display_only, opt_apply, opt_apply_undo, opt_silent;
|
||||||
static my_bool opt_check;
|
static my_bool opt_check;
|
||||||
static const char *opt_tmpdir;
|
static const char *opt_tmpdir;
|
||||||
static ulong opt_page_buffer_size;
|
static ulong opt_page_buffer_size;
|
||||||
static ulonglong opt_start_from_lsn;
|
static ulonglong opt_start_from_lsn, opt_end_lsn;
|
||||||
static MY_TMPDIR maria_chk_tmpdir;
|
static MY_TMPDIR maria_chk_tmpdir;
|
||||||
|
|
||||||
|
|
||||||
|
@ -120,8 +120,14 @@ int main(int argc, char **argv)
|
||||||
LSN_IN_PARTS(lsn));
|
LSN_IN_PARTS(lsn));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (opt_end_lsn != LSN_IMPOSSIBLE)
|
||||||
|
{
|
||||||
|
/* We can't apply undo if we use end_lsn */
|
||||||
|
opt_apply_undo= 0;
|
||||||
|
}
|
||||||
|
|
||||||
fprintf(stdout, "TRACE of the last maria_read_log\n");
|
fprintf(stdout, "TRACE of the last maria_read_log\n");
|
||||||
if (maria_apply_log(lsn, opt_apply ? MARIA_LOG_APPLY :
|
if (maria_apply_log(lsn, opt_end_lsn, opt_apply ? MARIA_LOG_APPLY :
|
||||||
(opt_check ? MARIA_LOG_CHECK :
|
(opt_check ? MARIA_LOG_CHECK :
|
||||||
MARIA_LOG_DISPLAY_HEADER), opt_silent ? NULL : stdout,
|
MARIA_LOG_DISPLAY_HEADER), opt_silent ? NULL : stdout,
|
||||||
opt_apply_undo, FALSE, FALSE, &warnings_count))
|
opt_apply_undo, FALSE, FALSE, &warnings_count))
|
||||||
|
@ -178,18 +184,21 @@ static struct my_option my_long_options[] =
|
||||||
{"display-only", 'd', "display brief info read from records' header",
|
{"display-only", 'd', "display brief info read from records' header",
|
||||||
(uchar **) &opt_display_only, (uchar **) &opt_display_only, 0, GET_BOOL,
|
(uchar **) &opt_display_only, (uchar **) &opt_display_only, 0, GET_BOOL,
|
||||||
NO_ARG,0, 0, 0, 0, 0, 0},
|
NO_ARG,0, 0, 0, 0, 0, 0},
|
||||||
{"maria_log_dir_path", 'l',
|
{"maria-log-dir-path", 'l',
|
||||||
"Path to the directory where to store transactional log",
|
"Path to the directory where to store transactional log",
|
||||||
(uchar **) &maria_data_root, (uchar **) &maria_data_root, 0,
|
(uchar **) &maria_data_root, (uchar **) &maria_data_root, 0,
|
||||||
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
{ "page_buffer_size", 'P', "",
|
{ "page-buffer-size", 'P', "",
|
||||||
&opt_page_buffer_size, &opt_page_buffer_size, 0,
|
&opt_page_buffer_size, &opt_page_buffer_size, 0,
|
||||||
GET_ULONG, REQUIRED_ARG, (long) USE_BUFFER_INIT,
|
GET_ULONG, REQUIRED_ARG, (long) USE_BUFFER_INIT,
|
||||||
(long) USE_BUFFER_INIT, (long) ~(ulong) 0, (long) MALLOC_OVERHEAD,
|
(long) USE_BUFFER_INIT, (long) ~(ulong) 0, (long) MALLOC_OVERHEAD,
|
||||||
(long) IO_SIZE, 0},
|
(long) IO_SIZE, 0},
|
||||||
{ "start_from_lsn", 'o', "Start reading log from this lsn",
|
{ "start-from-lsn", 'o', "Start reading log from this lsn",
|
||||||
&opt_start_from_lsn, &opt_start_from_lsn,
|
&opt_start_from_lsn, &opt_start_from_lsn,
|
||||||
0, GET_ULL, REQUIRED_ARG, 0, 0, ~(longlong) 0, 0, 0, 0 },
|
0, GET_ULL, REQUIRED_ARG, 0, 0, ~(longlong) 0, 0, 0, 0 },
|
||||||
|
{ "end-lsn", 'e', "Stop applying at this lsn. If end-lsn is used, UNDO:s "
|
||||||
|
"will not be applied", &opt_end_lsn, &opt_end_lsn,
|
||||||
|
0, GET_ULL, REQUIRED_ARG, 0, 0, ~(longlong) 0, 0, 0, 0 },
|
||||||
{"silent", 's', "Print less information during apply/undo phase",
|
{"silent", 's', "Print less information during apply/undo phase",
|
||||||
(uchar **) &opt_silent, (uchar **) &opt_silent, 0,
|
(uchar **) &opt_silent, (uchar **) &opt_silent, 0,
|
||||||
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
|
|
Loading…
Reference in a new issue