Merge 5.5 into 10.0
Also, implement MDEV-11027 a little differently from 5.5: recv_sys_t::report(ib_time_t): Determine whether progress should be reported. recv_apply_hashed_log_recs(): Rename the parameter to last_batch.
This commit is contained in:
commit
47396ddea9
@ -2436,5 +2436,39 @@ EXECUTE stmt;
|
|||||||
i
|
i
|
||||||
6
|
6
|
||||||
drop table t1, t2, t3;
|
drop table t1, t2, t3;
|
||||||
|
#
|
||||||
|
# MDEV-11078: NULL NOT IN (non-empty subquery) should never return results
|
||||||
|
#
|
||||||
|
create table t1(a int,b int);
|
||||||
|
create table t2(a int,b int);
|
||||||
|
insert into t1 value (1,2);
|
||||||
|
select (NULL) in (select 1 from t1);
|
||||||
|
(NULL) in (select 1 from t1)
|
||||||
|
NULL
|
||||||
|
select (null) in (select 1 from t2);
|
||||||
|
(null) in (select 1 from t2)
|
||||||
|
0
|
||||||
|
select 1 in (select 1 from t1);
|
||||||
|
1 in (select 1 from t1)
|
||||||
|
1
|
||||||
|
select 1 in (select 1 from t2);
|
||||||
|
1 in (select 1 from t2)
|
||||||
|
0
|
||||||
|
select 1 from dual where null in (select 1 from t1);
|
||||||
|
1
|
||||||
|
select 1 from dual where null in (select 1 from t2);
|
||||||
|
1
|
||||||
|
select (null,null) in (select * from t1);
|
||||||
|
(null,null) in (select * from t1)
|
||||||
|
NULL
|
||||||
|
select (null,null) in (select * from t2);
|
||||||
|
(null,null) in (select * from t2)
|
||||||
|
0
|
||||||
|
select 1 from dual where null not in (select 1 from t1);
|
||||||
|
1
|
||||||
|
select 1 from dual where null not in (select 1 from t2);
|
||||||
|
1
|
||||||
|
1
|
||||||
|
drop table t1,t2;
|
||||||
SET optimizer_switch= @@global.optimizer_switch;
|
SET optimizer_switch= @@global.optimizer_switch;
|
||||||
set @@tmp_table_size= @@global.tmp_table_size;
|
set @@tmp_table_size= @@global.tmp_table_size;
|
||||||
|
@ -496,6 +496,21 @@ HAVING SQ2_alias1 . col_int_key >= 7
|
|||||||
drop table t1;
|
drop table t1;
|
||||||
set optimizer_switch=@subselect_innodb_tmp;
|
set optimizer_switch=@subselect_innodb_tmp;
|
||||||
#
|
#
|
||||||
|
# MDEV-9635:Server crashes in part_of_refkey or assertion
|
||||||
|
# `!created && key_to_save < (int)s->keys' failed in
|
||||||
|
# TABLE::use_index(int) or with join_cache_level>2
|
||||||
|
#
|
||||||
|
SET join_cache_level=3;
|
||||||
|
CREATE TABLE t1 (f1 VARCHAR(1024)) ENGINE=InnoDB;
|
||||||
|
CREATE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT * FROM t1;
|
||||||
|
CREATE TABLE t2 (f2 VARCHAR(4)) ENGINE=InnoDB;
|
||||||
|
INSERT INTO t2 VALUES ('foo'),('bar');
|
||||||
|
SELECT * FROM v1, t2 WHERE ( f1, f2 ) IN ( SELECT f1, f1 FROM t1 );
|
||||||
|
f1 f2
|
||||||
|
set join_cache_level = default;
|
||||||
|
drop view v1;
|
||||||
|
drop table t1,t2;
|
||||||
|
#
|
||||||
# MDEV-6041: ORDER BY+subqueries: subquery_table.key=outer_table.col is not recongized as binding
|
# MDEV-6041: ORDER BY+subqueries: subquery_table.key=outer_table.col is not recongized as binding
|
||||||
#
|
#
|
||||||
create table t1(a int) engine=innodb;
|
create table t1(a int) engine=innodb;
|
||||||
|
@ -20,28 +20,24 @@ ERROR 42000: Unknown storage engine 'InnoDB'
|
|||||||
FOUND /syntax error in innodb_log_group_home_dir/ in mysqld.1.err
|
FOUND /syntax error in innodb_log_group_home_dir/ in mysqld.1.err
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
ERROR 42000: Unknown storage engine 'InnoDB'
|
ERROR 42000: Unknown storage engine 'InnoDB'
|
||||||
FOUND /InnoDB: Starting an apply batch of log records/ in mysqld.1.err
|
FOUND /InnoDB: Starting crash recovery from checkpoint LSN=/ in mysqld.1.err
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
ERROR 42000: Unknown storage engine 'InnoDB'
|
ERROR 42000: Unknown storage engine 'InnoDB'
|
||||||
FOUND /InnoDB: Starting an apply batch of log records/ in mysqld.1.err
|
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
ERROR 42000: Unknown storage engine 'InnoDB'
|
ERROR 42000: Unknown storage engine 'InnoDB'
|
||||||
FOUND /InnoDB: innodb_read_only prevents crash recovery/ in mysqld.1.err
|
FOUND /InnoDB: innodb_read_only prevents crash recovery/ in mysqld.1.err
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
ERROR 42000: Unknown storage engine 'InnoDB'
|
ERROR 42000: Unknown storage engine 'InnoDB'
|
||||||
FOUND /InnoDB: Starting an apply batch of log records/ in mysqld.1.err
|
FOUND /redo log from 3\*[0-9]+ to 2\*[0-9]+ pages/ in mysqld.1.err
|
||||||
FOUND /InnoDB: Resizing redo log from 3\*[0-9]+ to 2\*[0-9]+ pages/ in mysqld.1.err
|
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
ERROR 42000: Unknown storage engine 'InnoDB'
|
ERROR 42000: Unknown storage engine 'InnoDB'
|
||||||
FOUND /InnoDB: Starting an apply batch of log records/ in mysqld.1.err
|
FOUND /redo log from 3\*[0-9]+ to 2\*[0-9]+ pages/ in mysqld.1.err
|
||||||
FOUND /InnoDB: Resizing redo log from 3\*[0-9]+ to 2\*[0-9]+ pages/ in mysqld.1.err
|
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
ERROR 42000: Unknown storage engine 'InnoDB'
|
ERROR 42000: Unknown storage engine 'InnoDB'
|
||||||
FOUND /InnoDB: innodb_read_only prevents crash recovery/ in mysqld.1.err
|
FOUND /InnoDB: innodb_read_only prevents crash recovery/ in mysqld.1.err
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
ERROR 42000: Unknown storage engine 'InnoDB'
|
ERROR 42000: Unknown storage engine 'InnoDB'
|
||||||
FOUND /InnoDB: Starting an apply batch of log records/ in mysqld.1.err
|
FOUND /redo log from 3\*[0-9]+ to 2\*[0-9]+ pages/ in mysqld.1.err
|
||||||
FOUND /InnoDB: Resizing redo log from 3\*[0-9]+ to 2\*[0-9]+ pages/ in mysqld.1.err
|
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
ERROR 42000: Unknown storage engine 'InnoDB'
|
ERROR 42000: Unknown storage engine 'InnoDB'
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
|
@ -76,15 +76,13 @@ let SEARCH_PATTERN= syntax error in innodb_log_group_home_dir;
|
|||||||
--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= InnoDB: Starting an apply batch of log records;
|
let SEARCH_PATTERN= InnoDB: Starting crash recovery from checkpoint LSN=;
|
||||||
--source include/search_pattern_in_file.inc
|
--source include/search_pattern_in_file.inc
|
||||||
|
|
||||||
--let $restart_parameters= --debug=d,innodb_log_abort_3
|
--let $restart_parameters= --debug=d,innodb_log_abort_3
|
||||||
--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= InnoDB: Starting an apply batch of log records;
|
|
||||||
--source include/search_pattern_in_file.inc
|
|
||||||
|
|
||||||
--let $restart_parameters= --innodb-read-only
|
--let $restart_parameters= --innodb-read-only
|
||||||
--source include/restart_mysqld.inc
|
--source include/restart_mysqld.inc
|
||||||
@ -98,18 +96,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= InnoDB: Starting an apply batch of log records;
|
let SEARCH_PATTERN= redo log from 3\*[0-9]+ to 2\*[0-9]+ pages;
|
||||||
--source include/search_pattern_in_file.inc
|
|
||||||
let SEARCH_PATTERN= InnoDB: Resizing redo log from 3\*[0-9]+ to 2\*[0-9]+ pages;
|
|
||||||
--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= InnoDB: Starting an apply batch of log records;
|
let SEARCH_PATTERN= redo log from 3\*[0-9]+ to 2\*[0-9]+ pages;
|
||||||
--source include/search_pattern_in_file.inc
|
|
||||||
let SEARCH_PATTERN= InnoDB: Resizing redo log from 3\*[0-9]+ to 2\*[0-9]+ pages;
|
|
||||||
--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
|
||||||
@ -124,9 +118,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= InnoDB: Starting an apply batch of log records;
|
let SEARCH_PATTERN= redo log from 3\*[0-9]+ to 2\*[0-9]+ pages;
|
||||||
--source include/search_pattern_in_file.inc
|
|
||||||
let SEARCH_PATTERN= InnoDB: Resizing redo log from 3\*[0-9]+ to 2\*[0-9]+ pages;
|
|
||||||
--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
|
||||||
|
@ -1997,5 +1997,24 @@ EXECUTE stmt;
|
|||||||
|
|
||||||
drop table t1, t2, t3;
|
drop table t1, t2, t3;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-11078: NULL NOT IN (non-empty subquery) should never return results
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
create table t1(a int,b int);
|
||||||
|
create table t2(a int,b int);
|
||||||
|
insert into t1 value (1,2);
|
||||||
|
select (NULL) in (select 1 from t1);
|
||||||
|
select (null) in (select 1 from t2);
|
||||||
|
select 1 in (select 1 from t1);
|
||||||
|
select 1 in (select 1 from t2);
|
||||||
|
select 1 from dual where null in (select 1 from t1);
|
||||||
|
select 1 from dual where null in (select 1 from t2);
|
||||||
|
select (null,null) in (select * from t1);
|
||||||
|
select (null,null) in (select * from t2);
|
||||||
|
select 1 from dual where null not in (select 1 from t1);
|
||||||
|
select 1 from dual where null not in (select 1 from t2);
|
||||||
|
drop table t1,t2;
|
||||||
|
|
||||||
SET optimizer_switch= @@global.optimizer_switch;
|
SET optimizer_switch= @@global.optimizer_switch;
|
||||||
set @@tmp_table_size= @@global.tmp_table_size;
|
set @@tmp_table_size= @@global.tmp_table_size;
|
||||||
|
@ -483,56 +483,21 @@ drop table t1;
|
|||||||
set optimizer_switch=@subselect_innodb_tmp;
|
set optimizer_switch=@subselect_innodb_tmp;
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # MDEV-6041: ORDER BY+subqueries: subquery_table.key=outer_table.col is not recongized as binding
|
--echo # MDEV-9635:Server crashes in part_of_refkey or assertion
|
||||||
--echo #
|
--echo # `!created && key_to_save < (int)s->keys' failed in
|
||||||
create table t1(a int) engine=innodb;
|
--echo # TABLE::use_index(int) or with join_cache_level>2
|
||||||
insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
|
||||||
|
|
||||||
create table t2(
|
|
||||||
id int primary key,
|
|
||||||
key1 int,
|
|
||||||
col1 int,
|
|
||||||
key(key1)
|
|
||||||
) engine=innodb;
|
|
||||||
|
|
||||||
insert into t2
|
|
||||||
select
|
|
||||||
A.a + B.a*10 + C.a*100 + D.a* 1000,
|
|
||||||
A.a + 10*B.a,
|
|
||||||
123456
|
|
||||||
from t1 A, t1 B, t1 C, t1 D;
|
|
||||||
|
|
||||||
--echo # Table tsubq:
|
|
||||||
--echo # - must use 'ref' (not 'index'), and must not use 'Using filesort'
|
|
||||||
--echo # - shows a bad estimate for 'rows' (but I'm not sure if one can do better w/o histograms)
|
|
||||||
explain select
|
|
||||||
(SELECT
|
|
||||||
concat(id, '-', key1, '-', col1)
|
|
||||||
FROM t2
|
|
||||||
WHERE t2.key1 = t1.a
|
|
||||||
ORDER BY t2.id ASC LIMIT 1)
|
|
||||||
from
|
|
||||||
t1;
|
|
||||||
|
|
||||||
--echo #
|
|
||||||
--echo # MDEV-6081: ORDER BY+ref(const): selectivity is very incorrect (MySQL Bug#14338686)
|
|
||||||
--echo #
|
--echo #
|
||||||
|
|
||||||
alter table t2 add key2 int;
|
SET join_cache_level=3;
|
||||||
update t2 set key2=key1;
|
|
||||||
alter table t2 add key(key2);
|
|
||||||
analyze table t2;
|
|
||||||
flush tables;
|
|
||||||
--echo # Table tsubq must use 'ref' + Using filesort (not 'index' w/o filesort)
|
|
||||||
--replace_column 9 #
|
|
||||||
explain select
|
|
||||||
(SELECT
|
|
||||||
concat(id, '-', key1, '-', col1)
|
|
||||||
FROM t2
|
|
||||||
WHERE t2.key1 = t1.a
|
|
||||||
ORDER BY t2.key2 ASC LIMIT 1)
|
|
||||||
from
|
|
||||||
t1;
|
|
||||||
|
|
||||||
|
CREATE TABLE t1 (f1 VARCHAR(1024)) ENGINE=InnoDB;
|
||||||
|
CREATE ALGORITHM=TEMPTABLE VIEW v1 AS SELECT * FROM t1;
|
||||||
|
|
||||||
|
CREATE TABLE t2 (f2 VARCHAR(4)) ENGINE=InnoDB;
|
||||||
|
INSERT INTO t2 VALUES ('foo'),('bar');
|
||||||
|
|
||||||
|
SELECT * FROM v1, t2 WHERE ( f1, f2 ) IN ( SELECT f1, f1 FROM t1 );
|
||||||
|
|
||||||
|
set join_cache_level = default;
|
||||||
|
drop view v1;
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#define PLUGIN_VERSION 0x104
|
#define PLUGIN_VERSION 0x104
|
||||||
#define PLUGIN_STR_VERSION "1.4.0"
|
#define PLUGIN_STR_VERSION "1.4.1"
|
||||||
|
|
||||||
#define _my_thread_var loc_thread_var
|
#define _my_thread_var loc_thread_var
|
||||||
|
|
||||||
|
@ -2048,6 +2048,7 @@ Item_in_subselect::create_single_in_to_exists_cond(JOIN *join,
|
|||||||
We can encounter "NULL IN (SELECT ...)". Wrap the added condition
|
We can encounter "NULL IN (SELECT ...)". Wrap the added condition
|
||||||
within a trig_cond.
|
within a trig_cond.
|
||||||
*/
|
*/
|
||||||
|
disable_cond_guard_for_const_null_left_expr(0);
|
||||||
item= new Item_func_trig_cond(item, get_cond_guard(0));
|
item= new Item_func_trig_cond(item, get_cond_guard(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2072,6 +2073,7 @@ Item_in_subselect::create_single_in_to_exists_cond(JOIN *join,
|
|||||||
having= new Item_is_not_null_test(this, having);
|
having= new Item_is_not_null_test(this, having);
|
||||||
if (left_expr->maybe_null)
|
if (left_expr->maybe_null)
|
||||||
{
|
{
|
||||||
|
disable_cond_guard_for_const_null_left_expr(0);
|
||||||
if (!(having= new Item_func_trig_cond(having,
|
if (!(having= new Item_func_trig_cond(having,
|
||||||
get_cond_guard(0))))
|
get_cond_guard(0))))
|
||||||
DBUG_RETURN(true);
|
DBUG_RETURN(true);
|
||||||
@ -2090,6 +2092,7 @@ Item_in_subselect::create_single_in_to_exists_cond(JOIN *join,
|
|||||||
*/
|
*/
|
||||||
if (!abort_on_null && left_expr->maybe_null)
|
if (!abort_on_null && left_expr->maybe_null)
|
||||||
{
|
{
|
||||||
|
disable_cond_guard_for_const_null_left_expr(0);
|
||||||
if (!(item= new Item_func_trig_cond(item, get_cond_guard(0))))
|
if (!(item= new Item_func_trig_cond(item, get_cond_guard(0))))
|
||||||
DBUG_RETURN(true);
|
DBUG_RETURN(true);
|
||||||
}
|
}
|
||||||
@ -2116,6 +2119,7 @@ Item_in_subselect::create_single_in_to_exists_cond(JOIN *join,
|
|||||||
(char *)"<result>"));
|
(char *)"<result>"));
|
||||||
if (!abort_on_null && left_expr->maybe_null)
|
if (!abort_on_null && left_expr->maybe_null)
|
||||||
{
|
{
|
||||||
|
disable_cond_guard_for_const_null_left_expr(0);
|
||||||
if (!(new_having= new Item_func_trig_cond(new_having,
|
if (!(new_having= new Item_func_trig_cond(new_having,
|
||||||
get_cond_guard(0))))
|
get_cond_guard(0))))
|
||||||
DBUG_RETURN(true);
|
DBUG_RETURN(true);
|
||||||
@ -2311,6 +2315,7 @@ Item_in_subselect::create_row_in_to_exists_cond(JOIN * join,
|
|||||||
Item *col_item= new Item_cond_or(item_eq, item_isnull);
|
Item *col_item= new Item_cond_or(item_eq, item_isnull);
|
||||||
if (!abort_on_null && left_expr->element_index(i)->maybe_null)
|
if (!abort_on_null && left_expr->element_index(i)->maybe_null)
|
||||||
{
|
{
|
||||||
|
disable_cond_guard_for_const_null_left_expr(i);
|
||||||
if (!(col_item= new Item_func_trig_cond(col_item, get_cond_guard(i))))
|
if (!(col_item= new Item_func_trig_cond(col_item, get_cond_guard(i))))
|
||||||
DBUG_RETURN(true);
|
DBUG_RETURN(true);
|
||||||
}
|
}
|
||||||
@ -2325,6 +2330,7 @@ Item_in_subselect::create_row_in_to_exists_cond(JOIN * join,
|
|||||||
(char *)"<list ref>"));
|
(char *)"<list ref>"));
|
||||||
if (!abort_on_null && left_expr->element_index(i)->maybe_null)
|
if (!abort_on_null && left_expr->element_index(i)->maybe_null)
|
||||||
{
|
{
|
||||||
|
disable_cond_guard_for_const_null_left_expr(i);
|
||||||
if (!(item_nnull_test=
|
if (!(item_nnull_test=
|
||||||
new Item_func_trig_cond(item_nnull_test, get_cond_guard(i))))
|
new Item_func_trig_cond(item_nnull_test, get_cond_guard(i))))
|
||||||
DBUG_RETURN(true);
|
DBUG_RETURN(true);
|
||||||
@ -2381,6 +2387,7 @@ Item_in_subselect::create_row_in_to_exists_cond(JOIN * join,
|
|||||||
item= new Item_cond_or(item, item_isnull);
|
item= new Item_cond_or(item, item_isnull);
|
||||||
if (left_expr->element_index(i)->maybe_null)
|
if (left_expr->element_index(i)->maybe_null)
|
||||||
{
|
{
|
||||||
|
disable_cond_guard_for_const_null_left_expr(i);
|
||||||
if (!(item= new Item_func_trig_cond(item, get_cond_guard(i))))
|
if (!(item= new Item_func_trig_cond(item, get_cond_guard(i))))
|
||||||
DBUG_RETURN(true);
|
DBUG_RETURN(true);
|
||||||
if (!(having_col_item=
|
if (!(having_col_item=
|
||||||
|
@ -619,6 +619,15 @@ public:
|
|||||||
bool expr_cache_is_needed(THD *thd);
|
bool expr_cache_is_needed(THD *thd);
|
||||||
inline bool left_expr_has_null();
|
inline bool left_expr_has_null();
|
||||||
|
|
||||||
|
void disable_cond_guard_for_const_null_left_expr(int i)
|
||||||
|
{
|
||||||
|
if (left_expr->const_item() && !left_expr->is_expensive())
|
||||||
|
{
|
||||||
|
if (left_expr->element_index(i)->is_null())
|
||||||
|
set_cond_guard_var(i,FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int optimize(double *out_rows, double *cost);
|
int optimize(double *out_rows, double *cost);
|
||||||
/*
|
/*
|
||||||
Return the identifier that we could use to identify the subquery for the
|
Return the identifier that we could use to identify the subquery for the
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 2009 Monty Program Ab
|
/* Copyright (C) 2009, 2017, MariaDB Corporation.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -16,23 +16,22 @@
|
|||||||
/* Defining what to log to slow log */
|
/* Defining what to log to slow log */
|
||||||
|
|
||||||
#define LOG_SLOW_VERBOSITY_INIT 0
|
#define LOG_SLOW_VERBOSITY_INIT 0
|
||||||
#define LOG_SLOW_VERBOSITY_INNODB (1 << 0)
|
#define LOG_SLOW_VERBOSITY_INNODB (1U << 0)
|
||||||
#define LOG_SLOW_VERBOSITY_QUERY_PLAN (1 << 1)
|
#define LOG_SLOW_VERBOSITY_QUERY_PLAN (1U << 1)
|
||||||
#define LOG_SLOW_VERBOSITY_EXPLAIN (1 << 2)
|
#define LOG_SLOW_VERBOSITY_EXPLAIN (1U << 2)
|
||||||
|
|
||||||
#define QPLAN_INIT QPLAN_QC_NO
|
#define QPLAN_INIT QPLAN_QC_NO
|
||||||
|
|
||||||
#define QPLAN_ADMIN (1 << 0)
|
#define QPLAN_ADMIN (1U << 0)
|
||||||
#define QPLAN_FILESORT (1 << 1)
|
#define QPLAN_FILESORT (1U << 1)
|
||||||
#define QPLAN_FILESORT_DISK (1 << 2)
|
#define QPLAN_FILESORT_DISK (1U << 2)
|
||||||
#define QPLAN_FULL_JOIN (1 << 3)
|
#define QPLAN_FULL_JOIN (1U << 3)
|
||||||
#define QPLAN_FULL_SCAN (1 << 4)
|
#define QPLAN_FULL_SCAN (1U << 4)
|
||||||
#define QPLAN_QC (1 << 5)
|
#define QPLAN_QC (1U << 5)
|
||||||
#define QPLAN_QC_NO (1 << 6)
|
#define QPLAN_QC_NO (1U << 6)
|
||||||
#define QPLAN_TMP_DISK (1 << 7)
|
#define QPLAN_TMP_DISK (1U << 7)
|
||||||
#define QPLAN_TMP_TABLE (1 << 8)
|
#define QPLAN_TMP_TABLE (1U << 8)
|
||||||
#define QPLAN_FILESORT_PRIORITY_QUEUE (1 << 9)
|
#define QPLAN_FILESORT_PRIORITY_QUEUE (1U << 9)
|
||||||
|
|
||||||
/* ... */
|
/* ... */
|
||||||
#define QPLAN_MAX (((ulong) 1) << 31) /* reserved as placeholder */
|
#define QPLAN_MAX (1U << 31) /* reserved as placeholder */
|
||||||
|
|
||||||
|
@ -10149,7 +10149,7 @@ void JOIN::drop_unused_derived_keys()
|
|||||||
continue;
|
continue;
|
||||||
if (!table->pos_in_table_list->is_materialized_derived())
|
if (!table->pos_in_table_list->is_materialized_derived())
|
||||||
continue;
|
continue;
|
||||||
if (table->max_keys > 1)
|
if (table->max_keys > 1 && !tab->is_ref_for_hash_join())
|
||||||
table->use_index(tab->ref.key);
|
table->use_index(tab->ref.key);
|
||||||
if (table->s->keys)
|
if (table->s->keys)
|
||||||
{
|
{
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||||
|
Copyright (c) 2017, MariaDB Corporation.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it under
|
This program is free software; you can redistribute it and/or modify it under
|
||||||
the terms of the GNU General Public License as published by the Free Software
|
the terms of the GNU General Public License as published by the Free Software
|
||||||
@ -271,20 +272,12 @@ void
|
|||||||
recv_sys_var_init(void);
|
recv_sys_var_init(void);
|
||||||
/*===================*/
|
/*===================*/
|
||||||
#endif /* !UNIV_HOTBACKUP */
|
#endif /* !UNIV_HOTBACKUP */
|
||||||
/*******************************************************************//**
|
/** Apply the hash table of stored log records to persistent data pages.
|
||||||
Empties the hash table of stored log records, applying them to appropriate
|
@param[in] last_batch whether the change buffer merge will be
|
||||||
pages. */
|
performed as part of the operation */
|
||||||
UNIV_INTERN
|
UNIV_INTERN
|
||||||
void
|
void
|
||||||
recv_apply_hashed_log_recs(
|
recv_apply_hashed_log_recs(bool last_batch);
|
||||||
/*=======================*/
|
|
||||||
ibool allow_ibuf); /*!< in: if TRUE, also ibuf operations are
|
|
||||||
allowed during the application; if FALSE,
|
|
||||||
no ibuf operations are allowed, and after
|
|
||||||
the application all file pages are flushed to
|
|
||||||
disk and invalidated in buffer pool: this
|
|
||||||
alternative means that no new log records
|
|
||||||
can be generated during the application */
|
|
||||||
#ifdef UNIV_HOTBACKUP
|
#ifdef UNIV_HOTBACKUP
|
||||||
/*******************************************************************//**
|
/*******************************************************************//**
|
||||||
Applies log records in the hash table to a backup. */
|
Applies log records in the hash table to a backup. */
|
||||||
@ -434,6 +427,8 @@ struct recv_sys_t{
|
|||||||
scan find a corrupt log block, or a corrupt
|
scan find a corrupt log block, or a corrupt
|
||||||
log record, or there is a log parsing
|
log record, or there is a log parsing
|
||||||
buffer overflow */
|
buffer overflow */
|
||||||
|
/** the time when progress was last reported */
|
||||||
|
ib_time_t progress_time;
|
||||||
#ifdef UNIV_LOG_ARCHIVE
|
#ifdef UNIV_LOG_ARCHIVE
|
||||||
log_group_t* archive_group;
|
log_group_t* archive_group;
|
||||||
/*!< in archive recovery: the log group whose
|
/*!< in archive recovery: the log group whose
|
||||||
@ -446,6 +441,20 @@ struct recv_sys_t{
|
|||||||
addresses in the hash table */
|
addresses in the hash table */
|
||||||
|
|
||||||
recv_dblwr_t dblwr;
|
recv_dblwr_t dblwr;
|
||||||
|
|
||||||
|
/** Determine whether redo log recovery progress should be reported.
|
||||||
|
@param[in] time the current time
|
||||||
|
@return whether progress should be reported
|
||||||
|
(the last report was at least 15 seconds ago) */
|
||||||
|
bool report(ib_time_t time)
|
||||||
|
{
|
||||||
|
if (time - progress_time < 15) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
progress_time = time;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/** The recovery system */
|
/** The recovery system */
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||||
Copyright (c) 2009, Google Inc.
|
Copyright (c) 2009, Google Inc.
|
||||||
Copyright (c) 2017, MariaDB Corporation. All Rights Reserved.
|
Copyright (c) 2017, MariaDB Corporation.
|
||||||
|
|
||||||
Portions of this file contain modifications contributed and copyrighted by
|
Portions of this file contain modifications contributed and copyrighted by
|
||||||
Google, Inc. Those modifications are gratefully acknowledged and are described
|
Google, Inc. Those modifications are gratefully acknowledged and are described
|
||||||
@ -1746,7 +1746,7 @@ log_preflush_pool_modified_pages(
|
|||||||
and we could not make a new checkpoint on the basis of the
|
and we could not make a new checkpoint on the basis of the
|
||||||
info on the buffer pool only. */
|
info on the buffer pool only. */
|
||||||
|
|
||||||
recv_apply_hashed_log_recs(TRUE);
|
recv_apply_hashed_log_recs(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
success = buf_flush_list(ULINT_MAX, new_oldest, &n_pages);
|
success = buf_flush_list(ULINT_MAX, new_oldest, &n_pages);
|
||||||
@ -2085,7 +2085,7 @@ log_checkpoint(
|
|||||||
ut_ad(!srv_read_only_mode);
|
ut_ad(!srv_read_only_mode);
|
||||||
|
|
||||||
if (recv_recovery_is_on()) {
|
if (recv_recovery_is_on()) {
|
||||||
recv_apply_hashed_log_recs(TRUE);
|
recv_apply_hashed_log_recs(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (srv_unix_file_flush_method != SRV_UNIX_NOSYNC) {
|
if (srv_unix_file_flush_method != SRV_UNIX_NOSYNC) {
|
||||||
@ -2336,6 +2336,11 @@ loop:
|
|||||||
start_lsn += len;
|
start_lsn += len;
|
||||||
buf += len;
|
buf += len;
|
||||||
|
|
||||||
|
if (recv_sys->report(ut_time())) {
|
||||||
|
ib_logf(IB_LOG_LEVEL_INFO, "Read redo log up to LSN=" LSN_PF,
|
||||||
|
start_lsn);
|
||||||
|
}
|
||||||
|
|
||||||
if (start_lsn != end_lsn) {
|
if (start_lsn != end_lsn) {
|
||||||
|
|
||||||
goto loop;
|
goto loop;
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||||
Copyright (c) 2012, Facebook Inc.
|
Copyright (c) 2012, Facebook Inc.
|
||||||
Copyright (c) 2017, MariaDB Corporation. All Rights Reserved.
|
Copyright (c) 2017, MariaDB Corporation.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it under
|
This program is free software; you can redistribute it and/or modify it under
|
||||||
the terms of the GNU General Public License as published by the Free Software
|
the terms of the GNU General Public License as published by the Free Software
|
||||||
@ -73,7 +73,7 @@ this must be less than UNIV_PAGE_SIZE as it is stored in the buffer pool */
|
|||||||
#define RECV_READ_AHEAD_AREA 32
|
#define RECV_READ_AHEAD_AREA 32
|
||||||
|
|
||||||
/** The recovery system */
|
/** The recovery system */
|
||||||
UNIV_INTERN recv_sys_t* recv_sys = NULL;
|
UNIV_INTERN recv_sys_t* recv_sys;
|
||||||
/** TRUE when applying redo log records during crash recovery; FALSE
|
/** TRUE when applying redo log records during crash recovery; FALSE
|
||||||
otherwise. Note that this is FALSE while a background thread is
|
otherwise. Note that this is FALSE while a background thread is
|
||||||
rolling back incomplete transactions. */
|
rolling back incomplete transactions. */
|
||||||
@ -129,9 +129,6 @@ UNIV_INTERN ibool recv_is_making_a_backup = FALSE;
|
|||||||
UNIV_INTERN ibool recv_is_from_backup = FALSE;
|
UNIV_INTERN ibool recv_is_from_backup = FALSE;
|
||||||
# define buf_pool_get_curr_size() (5 * 1024 * 1024)
|
# define buf_pool_get_curr_size() (5 * 1024 * 1024)
|
||||||
#endif /* !UNIV_HOTBACKUP */
|
#endif /* !UNIV_HOTBACKUP */
|
||||||
/** The following counter is used to decide when to print info on
|
|
||||||
log scan */
|
|
||||||
static ulint recv_scan_print_counter;
|
|
||||||
|
|
||||||
/** The type of the previous parsed redo log record */
|
/** The type of the previous parsed redo log record */
|
||||||
static ulint recv_previous_parsed_rec_type;
|
static ulint recv_previous_parsed_rec_type;
|
||||||
@ -306,8 +303,6 @@ recv_sys_var_init(void)
|
|||||||
|
|
||||||
recv_no_ibuf_operations = FALSE;
|
recv_no_ibuf_operations = FALSE;
|
||||||
|
|
||||||
recv_scan_print_counter = 0;
|
|
||||||
|
|
||||||
recv_previous_parsed_rec_type = 999999;
|
recv_previous_parsed_rec_type = 999999;
|
||||||
|
|
||||||
recv_previous_parsed_rec_offset = 0;
|
recv_previous_parsed_rec_offset = 0;
|
||||||
@ -418,6 +413,7 @@ recv_sys_init(
|
|||||||
recv_sys->last_block_buf_start, OS_FILE_LOG_BLOCK_SIZE));
|
recv_sys->last_block_buf_start, OS_FILE_LOG_BLOCK_SIZE));
|
||||||
|
|
||||||
recv_sys->found_corrupt_log = FALSE;
|
recv_sys->found_corrupt_log = FALSE;
|
||||||
|
recv_sys->progress_time = ut_time();
|
||||||
|
|
||||||
recv_max_page_lsn = 0;
|
recv_max_page_lsn = 0;
|
||||||
|
|
||||||
@ -1587,6 +1583,7 @@ recv_recover_page_func(
|
|||||||
ibool success;
|
ibool success;
|
||||||
#endif /* !UNIV_HOTBACKUP */
|
#endif /* !UNIV_HOTBACKUP */
|
||||||
mtr_t mtr;
|
mtr_t mtr;
|
||||||
|
ib_time_t time;
|
||||||
|
|
||||||
mutex_enter(&(recv_sys->mutex));
|
mutex_enter(&(recv_sys->mutex));
|
||||||
|
|
||||||
@ -1762,6 +1759,8 @@ recv_recover_page_func(
|
|||||||
|
|
||||||
mtr_commit(&mtr);
|
mtr_commit(&mtr);
|
||||||
|
|
||||||
|
time = ut_time();
|
||||||
|
|
||||||
mutex_enter(&(recv_sys->mutex));
|
mutex_enter(&(recv_sys->mutex));
|
||||||
|
|
||||||
if (recv_max_page_lsn < page_lsn) {
|
if (recv_max_page_lsn < page_lsn) {
|
||||||
@ -1770,11 +1769,16 @@ recv_recover_page_func(
|
|||||||
|
|
||||||
recv_addr->state = RECV_PROCESSED;
|
recv_addr->state = RECV_PROCESSED;
|
||||||
|
|
||||||
ut_a(recv_sys->n_addrs);
|
ut_a(recv_sys->n_addrs > 0);
|
||||||
recv_sys->n_addrs--;
|
if (--recv_sys->n_addrs && recv_sys->progress_time - time >= 15) {
|
||||||
|
recv_sys->progress_time = time;
|
||||||
mutex_exit(&(recv_sys->mutex));
|
ut_print_timestamp(stderr);
|
||||||
|
fprintf(stderr,
|
||||||
|
" InnoDB: To recover: " ULINTPF " pages from log\n",
|
||||||
|
recv_sys->n_addrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
mutex_exit(&recv_sys->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef UNIV_HOTBACKUP
|
#ifndef UNIV_HOTBACKUP
|
||||||
@ -1820,59 +1824,48 @@ recv_read_in_area(
|
|||||||
}
|
}
|
||||||
|
|
||||||
buf_read_recv_pages(FALSE, space, zip_size, page_nos, n);
|
buf_read_recv_pages(FALSE, space, zip_size, page_nos, n);
|
||||||
/*
|
|
||||||
fprintf(stderr, "Recv pages at %lu n %lu\n", page_nos[0], n);
|
|
||||||
*/
|
|
||||||
return(n);
|
return(n);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************//**
|
/** Apply the hash table of stored log records to persistent data pages.
|
||||||
Empties the hash table of stored log records, applying them to appropriate
|
@param[in] last_batch whether the change buffer merge will be
|
||||||
pages. */
|
performed as part of the operation */
|
||||||
UNIV_INTERN
|
UNIV_INTERN
|
||||||
void
|
void
|
||||||
recv_apply_hashed_log_recs(
|
recv_apply_hashed_log_recs(bool last_batch)
|
||||||
/*=======================*/
|
|
||||||
ibool allow_ibuf) /*!< in: if TRUE, also ibuf operations are
|
|
||||||
allowed during the application; if FALSE,
|
|
||||||
no ibuf operations are allowed, and after
|
|
||||||
the application all file pages are flushed to
|
|
||||||
disk and invalidated in buffer pool: this
|
|
||||||
alternative means that no new log records
|
|
||||||
can be generated during the application;
|
|
||||||
the caller must in this case own the log
|
|
||||||
mutex */
|
|
||||||
{
|
{
|
||||||
recv_addr_t* recv_addr;
|
for (;;) {
|
||||||
ulint i;
|
mutex_enter(&recv_sys->mutex);
|
||||||
ibool has_printed = FALSE;
|
|
||||||
mtr_t mtr;
|
|
||||||
loop:
|
|
||||||
mutex_enter(&(recv_sys->mutex));
|
|
||||||
|
|
||||||
if (recv_sys->apply_batch_on) {
|
if (!recv_sys->apply_batch_on) {
|
||||||
|
break;
|
||||||
mutex_exit(&(recv_sys->mutex));
|
}
|
||||||
|
|
||||||
|
mutex_exit(&recv_sys->mutex);
|
||||||
os_thread_sleep(500000);
|
os_thread_sleep(500000);
|
||||||
|
|
||||||
goto loop;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ut_ad((!allow_ibuf) == mutex_own(&log_sys->mutex));
|
ut_ad(!last_batch == mutex_own(&log_sys->mutex));
|
||||||
|
|
||||||
if (!allow_ibuf) {
|
if (!last_batch) {
|
||||||
recv_no_ibuf_operations = TRUE;
|
recv_no_ibuf_operations = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ulint n = recv_sys->n_addrs) {
|
||||||
|
const char* msg = last_batch
|
||||||
|
? "Starting final batch to recover "
|
||||||
|
: "Starting a batch to recover ";
|
||||||
|
ib_logf(IB_LOG_LEVEL_INFO,
|
||||||
|
"%s" ULINTPF " pages from redo log", msg, n);
|
||||||
|
}
|
||||||
|
|
||||||
recv_sys->apply_log_recs = TRUE;
|
recv_sys->apply_log_recs = TRUE;
|
||||||
recv_sys->apply_batch_on = TRUE;
|
recv_sys->apply_batch_on = TRUE;
|
||||||
|
|
||||||
for (i = 0; i < hash_get_n_cells(recv_sys->addr_hash); i++) {
|
for (ulint i = 0; i < hash_get_n_cells(recv_sys->addr_hash); i++) {
|
||||||
|
for (recv_addr_t* recv_addr = static_cast<recv_addr_t*>(
|
||||||
for (recv_addr = static_cast<recv_addr_t*>(
|
HASH_GET_FIRST(recv_sys->addr_hash, i));
|
||||||
HASH_GET_FIRST(recv_sys->addr_hash, i));
|
recv_addr;
|
||||||
recv_addr != 0;
|
|
||||||
recv_addr = static_cast<recv_addr_t*>(
|
recv_addr = static_cast<recv_addr_t*>(
|
||||||
HASH_GET_NEXT(addr_hash, recv_addr))) {
|
HASH_GET_NEXT(addr_hash, recv_addr))) {
|
||||||
|
|
||||||
@ -1881,24 +1874,12 @@ loop:
|
|||||||
ulint page_no = recv_addr->page_no;
|
ulint page_no = recv_addr->page_no;
|
||||||
|
|
||||||
if (recv_addr->state == RECV_NOT_PROCESSED) {
|
if (recv_addr->state == RECV_NOT_PROCESSED) {
|
||||||
if (!has_printed) {
|
mutex_exit(&recv_sys->mutex);
|
||||||
ib_logf(IB_LOG_LEVEL_INFO,
|
|
||||||
"Starting an apply batch"
|
|
||||||
" of log records"
|
|
||||||
" to the database...");
|
|
||||||
fputs("InnoDB: Progress in percent: ",
|
|
||||||
stderr);
|
|
||||||
has_printed = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
mutex_exit(&(recv_sys->mutex));
|
|
||||||
|
|
||||||
if (buf_page_peek(space, page_no)) {
|
if (buf_page_peek(space, page_no)) {
|
||||||
buf_block_t* block;
|
mtr_t mtr;
|
||||||
|
|
||||||
mtr_start(&mtr);
|
mtr_start(&mtr);
|
||||||
|
buf_block_t* block = buf_page_get(
|
||||||
block = buf_page_get(
|
|
||||||
space, zip_size, page_no,
|
space, zip_size, page_no,
|
||||||
RW_X_LATCH, &mtr);
|
RW_X_LATCH, &mtr);
|
||||||
buf_block_dbg_add_level(
|
buf_block_dbg_add_level(
|
||||||
@ -1911,19 +1892,9 @@ loop:
|
|||||||
page_no);
|
page_no);
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_enter(&(recv_sys->mutex));
|
mutex_enter(&recv_sys->mutex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (has_printed
|
|
||||||
&& (i * 100) / hash_get_n_cells(recv_sys->addr_hash)
|
|
||||||
!= ((i + 1) * 100)
|
|
||||||
/ hash_get_n_cells(recv_sys->addr_hash)) {
|
|
||||||
|
|
||||||
fprintf(stderr, "%lu ", (ulong)
|
|
||||||
((i * 100)
|
|
||||||
/ hash_get_n_cells(recv_sys->addr_hash)));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Wait until all the pages have been processed */
|
/* Wait until all the pages have been processed */
|
||||||
@ -1937,12 +1908,7 @@ loop:
|
|||||||
mutex_enter(&(recv_sys->mutex));
|
mutex_enter(&(recv_sys->mutex));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (has_printed) {
|
if (!last_batch) {
|
||||||
|
|
||||||
fprintf(stderr, "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!allow_ibuf) {
|
|
||||||
bool success;
|
bool success;
|
||||||
|
|
||||||
/* Flush all the file pages to disk and invalidate them in
|
/* Flush all the file pages to disk and invalidate them in
|
||||||
@ -1982,11 +1948,7 @@ loop:
|
|||||||
|
|
||||||
recv_sys_empty_hash();
|
recv_sys_empty_hash();
|
||||||
|
|
||||||
if (has_printed) {
|
mutex_exit(&recv_sys->mutex);
|
||||||
fprintf(stderr, "InnoDB: Apply batch completed\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
mutex_exit(&(recv_sys->mutex));
|
|
||||||
}
|
}
|
||||||
#else /* !UNIV_HOTBACKUP */
|
#else /* !UNIV_HOTBACKUP */
|
||||||
/*******************************************************************//**
|
/*******************************************************************//**
|
||||||
@ -2009,11 +1971,6 @@ recv_apply_log_recs_for_backup(void)
|
|||||||
|
|
||||||
block = back_block1;
|
block = back_block1;
|
||||||
|
|
||||||
ib_logf(IB_LOG_LEVEL_INFO,
|
|
||||||
"Starting an apply batch of log records to the database...");
|
|
||||||
|
|
||||||
fputs("InnoDB: Progress in percent: ", stderr);
|
|
||||||
|
|
||||||
n_hash_cells = hash_get_n_cells(recv_sys->addr_hash);
|
n_hash_cells = hash_get_n_cells(recv_sys->addr_hash);
|
||||||
|
|
||||||
for (i = 0; i < n_hash_cells; i++) {
|
for (i = 0; i < n_hash_cells; i++) {
|
||||||
@ -2125,13 +2082,6 @@ recv_apply_log_recs_for_backup(void)
|
|||||||
skip_this_recv_addr:
|
skip_this_recv_addr:
|
||||||
recv_addr = HASH_GET_NEXT(addr_hash, recv_addr);
|
recv_addr = HASH_GET_NEXT(addr_hash, recv_addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((100 * i) / n_hash_cells
|
|
||||||
!= (100 * (i + 1)) / n_hash_cells) {
|
|
||||||
fprintf(stderr, "%lu ",
|
|
||||||
(ulong) ((100 * i) / n_hash_cells));
|
|
||||||
fflush(stderr);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
recv_sys_empty_hash();
|
recv_sys_empty_hash();
|
||||||
@ -2795,11 +2745,10 @@ recv_scan_log_recs(
|
|||||||
#ifndef UNIV_HOTBACKUP
|
#ifndef UNIV_HOTBACKUP
|
||||||
if (recv_log_scan_is_startup_type
|
if (recv_log_scan_is_startup_type
|
||||||
&& !recv_needed_recovery) {
|
&& !recv_needed_recovery) {
|
||||||
|
|
||||||
if (!srv_read_only_mode) {
|
if (!srv_read_only_mode) {
|
||||||
ib_logf(IB_LOG_LEVEL_INFO,
|
ib_logf(IB_LOG_LEVEL_INFO,
|
||||||
"Log scan progressed past the "
|
"Starting crash recovery from "
|
||||||
"checkpoint lsn " LSN_PF "",
|
"checkpoint LSN=" LSN_PF,
|
||||||
recv_sys->scanned_lsn);
|
recv_sys->scanned_lsn);
|
||||||
|
|
||||||
recv_init_crash_recovery();
|
recv_init_crash_recovery();
|
||||||
@ -2858,19 +2807,6 @@ recv_scan_log_recs(
|
|||||||
|
|
||||||
*group_scanned_lsn = scanned_lsn;
|
*group_scanned_lsn = scanned_lsn;
|
||||||
|
|
||||||
if (recv_needed_recovery
|
|
||||||
|| (recv_is_from_backup && !recv_is_making_a_backup)) {
|
|
||||||
recv_scan_print_counter++;
|
|
||||||
|
|
||||||
if (finished || (recv_scan_print_counter % 80 == 0)) {
|
|
||||||
|
|
||||||
fprintf(stderr,
|
|
||||||
"InnoDB: Doing recovery: scanned up to"
|
|
||||||
" log sequence number " LSN_PF "\n",
|
|
||||||
*group_scanned_lsn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (more_data && !recv_sys->found_corrupt_log) {
|
if (more_data && !recv_sys->found_corrupt_log) {
|
||||||
/* Try to parse more log records */
|
/* Try to parse more log records */
|
||||||
|
|
||||||
@ -2886,7 +2822,7 @@ recv_scan_log_recs(
|
|||||||
log yet: they would be produced by ibuf
|
log yet: they would be produced by ibuf
|
||||||
operations */
|
operations */
|
||||||
|
|
||||||
recv_apply_hashed_log_recs(FALSE);
|
recv_apply_hashed_log_recs(false);
|
||||||
}
|
}
|
||||||
#endif /* !UNIV_HOTBACKUP */
|
#endif /* !UNIV_HOTBACKUP */
|
||||||
|
|
||||||
@ -2962,11 +2898,6 @@ recv_init_crash_recovery(void)
|
|||||||
|
|
||||||
recv_needed_recovery = TRUE;
|
recv_needed_recovery = TRUE;
|
||||||
|
|
||||||
ib_logf(IB_LOG_LEVEL_INFO, "Database was not shutdown normally!");
|
|
||||||
ib_logf(IB_LOG_LEVEL_INFO, "Starting crash recovery.");
|
|
||||||
ib_logf(IB_LOG_LEVEL_INFO,
|
|
||||||
"Reading tablespace information from the .ibd files...");
|
|
||||||
|
|
||||||
fil_load_single_table_tablespaces();
|
fil_load_single_table_tablespaces();
|
||||||
|
|
||||||
/* If we are using the doublewrite method, we will
|
/* If we are using the doublewrite method, we will
|
||||||
@ -2977,9 +2908,7 @@ recv_init_crash_recovery(void)
|
|||||||
if (srv_force_recovery < SRV_FORCE_NO_LOG_REDO) {
|
if (srv_force_recovery < SRV_FORCE_NO_LOG_REDO) {
|
||||||
|
|
||||||
ib_logf(IB_LOG_LEVEL_INFO,
|
ib_logf(IB_LOG_LEVEL_INFO,
|
||||||
"Restoring possible half-written data pages ");
|
"Restoring possible half-written data pages "
|
||||||
|
|
||||||
ib_logf(IB_LOG_LEVEL_INFO,
|
|
||||||
"from the doublewrite buffer...");
|
"from the doublewrite buffer...");
|
||||||
|
|
||||||
buf_dblwr_process();
|
buf_dblwr_process();
|
||||||
@ -3950,7 +3879,7 @@ recv_recovery_from_archive_start(
|
|||||||
|
|
||||||
if (limit_lsn != LSN_MAX) {
|
if (limit_lsn != LSN_MAX) {
|
||||||
|
|
||||||
recv_apply_hashed_log_recs(FALSE);
|
recv_apply_hashed_log_recs(false);
|
||||||
|
|
||||||
recv_reset_logs(0, FALSE, recv_sys->recovered_lsn);
|
recv_reset_logs(0, FALSE, recv_sys->recovered_lsn);
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved.
|
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||||
Copyright (c) 2008, Google Inc.
|
Copyright (c) 2008, Google Inc.
|
||||||
Copyright (c) 2009, Percona Inc.
|
Copyright (c) 2009, Percona Inc.
|
||||||
Copyright (c) 2013, 2017, MariaDB Corporation
|
Copyright (c) 2013, 2017, MariaDB Corporation.
|
||||||
|
|
||||||
Portions of this file contain modifications contributed and copyrighted by
|
Portions of this file contain modifications contributed and copyrighted by
|
||||||
Google, Inc. Those modifications are gratefully acknowledged and are described
|
Google, Inc. Those modifications are gratefully acknowledged and are described
|
||||||
@ -2520,7 +2520,7 @@ files_checked:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This must precede recv_apply_hashed_log_recs(TRUE). */
|
/* This must precede recv_apply_hashed_log_recs(true). */
|
||||||
ib_bh = trx_sys_init_at_db_start();
|
ib_bh = trx_sys_init_at_db_start();
|
||||||
|
|
||||||
if (srv_force_recovery < SRV_FORCE_NO_LOG_REDO) {
|
if (srv_force_recovery < SRV_FORCE_NO_LOG_REDO) {
|
||||||
@ -2528,7 +2528,7 @@ files_checked:
|
|||||||
respective file pages, for the last batch of
|
respective file pages, for the last batch of
|
||||||
recv_group_scan_log_recs(). */
|
recv_group_scan_log_recs(). */
|
||||||
|
|
||||||
recv_apply_hashed_log_recs(TRUE);
|
recv_apply_hashed_log_recs(true);
|
||||||
DBUG_PRINT("ib_log", ("apply completed"));
|
DBUG_PRINT("ib_log", ("apply completed"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* Copyright (C) 2004-2008 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
|
/* Copyright (C) 2004-2008 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
|
||||||
Copyright (C) 2008-2009 Sun Microsystems, Inc.
|
Copyright (C) 2008-2009 Sun Microsystems, Inc.
|
||||||
Copyright (c) 2009, 2014, SkySQL Ab.
|
Copyright (c) 2009, 2017, MariaDB Corporation.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -1284,75 +1284,75 @@ int ha_maria::write_row(uchar * buf)
|
|||||||
int ha_maria::check(THD * thd, HA_CHECK_OPT * check_opt)
|
int ha_maria::check(THD * thd, HA_CHECK_OPT * check_opt)
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
HA_CHECK ¶m= *(HA_CHECK*) thd->alloc(sizeof(param));
|
HA_CHECK *param= (HA_CHECK*) thd->alloc(sizeof *param);
|
||||||
MARIA_SHARE *share= file->s;
|
MARIA_SHARE *share= file->s;
|
||||||
const char *old_proc_info;
|
const char *old_proc_info;
|
||||||
TRN *old_trn= file->trn;
|
TRN *old_trn= file->trn;
|
||||||
|
|
||||||
if (!file || !¶m) return HA_ADMIN_INTERNAL_ERROR;
|
if (!file || !param) return HA_ADMIN_INTERNAL_ERROR;
|
||||||
|
|
||||||
maria_chk_init(¶m);
|
maria_chk_init(param);
|
||||||
param.thd= thd;
|
param->thd= thd;
|
||||||
param.op_name= "check";
|
param->op_name= "check";
|
||||||
param.db_name= table->s->db.str;
|
param->db_name= table->s->db.str;
|
||||||
param.table_name= table->alias.c_ptr();
|
param->table_name= table->alias.c_ptr();
|
||||||
param.testflag= check_opt->flags | T_CHECK | T_SILENT;
|
param->testflag= check_opt->flags | T_CHECK | T_SILENT;
|
||||||
param.stats_method= (enum_handler_stats_method)THDVAR(thd,stats_method);
|
param->stats_method= (enum_handler_stats_method)THDVAR(thd,stats_method);
|
||||||
|
|
||||||
if (!(table->db_stat & HA_READ_ONLY))
|
if (!(table->db_stat & HA_READ_ONLY))
|
||||||
param.testflag |= T_STATISTICS;
|
param->testflag |= T_STATISTICS;
|
||||||
param.using_global_keycache= 1;
|
param->using_global_keycache= 1;
|
||||||
|
|
||||||
if (!maria_is_crashed(file) &&
|
if (!maria_is_crashed(file) &&
|
||||||
(((param.testflag & T_CHECK_ONLY_CHANGED) &&
|
(((param->testflag & T_CHECK_ONLY_CHANGED) &&
|
||||||
!(share->state.changed & (STATE_CHANGED | STATE_CRASHED_FLAGS |
|
!(share->state.changed & (STATE_CHANGED | STATE_CRASHED_FLAGS |
|
||||||
STATE_IN_REPAIR)) &&
|
STATE_IN_REPAIR)) &&
|
||||||
share->state.open_count == 0) ||
|
share->state.open_count == 0) ||
|
||||||
((param.testflag & T_FAST) && (share->state.open_count ==
|
((param->testflag & T_FAST) && (share->state.open_count ==
|
||||||
(uint) (share->global_changed ? 1 :
|
(uint) (share->global_changed ? 1 :
|
||||||
0)))))
|
0)))))
|
||||||
return HA_ADMIN_ALREADY_DONE;
|
return HA_ADMIN_ALREADY_DONE;
|
||||||
|
|
||||||
maria_chk_init_for_check(¶m, file);
|
maria_chk_init_for_check(param, file);
|
||||||
|
|
||||||
if ((file->s->state.changed & (STATE_CRASHED_FLAGS | STATE_MOVED)) ==
|
if ((file->s->state.changed & (STATE_CRASHED_FLAGS | STATE_MOVED)) ==
|
||||||
STATE_MOVED)
|
STATE_MOVED)
|
||||||
{
|
{
|
||||||
_ma_check_print_error(¶m, "%s", zerofill_error_msg);
|
_ma_check_print_error(param, "%s", zerofill_error_msg);
|
||||||
return HA_ADMIN_CORRUPT;
|
return HA_ADMIN_CORRUPT;
|
||||||
}
|
}
|
||||||
|
|
||||||
old_proc_info= thd_proc_info(thd, "Checking status");
|
old_proc_info= thd_proc_info(thd, "Checking status");
|
||||||
thd_progress_init(thd, 3);
|
thd_progress_init(thd, 3);
|
||||||
error= maria_chk_status(¶m, file); // Not fatal
|
error= maria_chk_status(param, file); // Not fatal
|
||||||
if (maria_chk_size(¶m, file))
|
if (maria_chk_size(param, file))
|
||||||
error= 1;
|
error= 1;
|
||||||
if (!error)
|
if (!error)
|
||||||
error|= maria_chk_del(¶m, file, param.testflag);
|
error|= maria_chk_del(param, file, param->testflag);
|
||||||
thd_proc_info(thd, "Checking keys");
|
thd_proc_info(thd, "Checking keys");
|
||||||
thd_progress_next_stage(thd);
|
thd_progress_next_stage(thd);
|
||||||
if (!error)
|
if (!error)
|
||||||
error= maria_chk_key(¶m, file);
|
error= maria_chk_key(param, file);
|
||||||
thd_proc_info(thd, "Checking data");
|
thd_proc_info(thd, "Checking data");
|
||||||
thd_progress_next_stage(thd);
|
thd_progress_next_stage(thd);
|
||||||
if (!error)
|
if (!error)
|
||||||
{
|
{
|
||||||
if ((!(param.testflag & T_QUICK) &&
|
if ((!(param->testflag & T_QUICK) &&
|
||||||
((share->options &
|
((share->options &
|
||||||
(HA_OPTION_PACK_RECORD | HA_OPTION_COMPRESS_RECORD)) ||
|
(HA_OPTION_PACK_RECORD | HA_OPTION_COMPRESS_RECORD)) ||
|
||||||
(param.testflag & (T_EXTEND | T_MEDIUM)))) || maria_is_crashed(file))
|
(param->testflag & (T_EXTEND | T_MEDIUM)))) || maria_is_crashed(file))
|
||||||
{
|
{
|
||||||
ulonglong old_testflag= param.testflag;
|
ulonglong old_testflag= param->testflag;
|
||||||
param.testflag |= T_MEDIUM;
|
param->testflag |= T_MEDIUM;
|
||||||
if (!(error= init_io_cache(¶m.read_cache, file->dfile.file,
|
if (!(error= init_io_cache(¶m->read_cache, file->dfile.file,
|
||||||
my_default_record_cache_size, READ_CACHE,
|
my_default_record_cache_size, READ_CACHE,
|
||||||
share->pack.header_length, 1, MYF(MY_WME))))
|
share->pack.header_length, 1, MYF(MY_WME))))
|
||||||
{
|
{
|
||||||
error= maria_chk_data_link(¶m, file,
|
error= maria_chk_data_link(param, file,
|
||||||
MY_TEST(param.testflag & T_EXTEND));
|
MY_TEST(param->testflag & T_EXTEND));
|
||||||
end_io_cache(&(param.read_cache));
|
end_io_cache(¶m->read_cache);
|
||||||
}
|
}
|
||||||
param.testflag= old_testflag;
|
param->testflag= old_testflag;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!error)
|
if (!error)
|
||||||
@ -1360,7 +1360,7 @@ int ha_maria::check(THD * thd, HA_CHECK_OPT * check_opt)
|
|||||||
if ((share->state.changed & (STATE_CHANGED |
|
if ((share->state.changed & (STATE_CHANGED |
|
||||||
STATE_CRASHED_FLAGS |
|
STATE_CRASHED_FLAGS |
|
||||||
STATE_IN_REPAIR | STATE_NOT_ANALYZED)) ||
|
STATE_IN_REPAIR | STATE_NOT_ANALYZED)) ||
|
||||||
(param.testflag & T_STATISTICS) || maria_is_crashed(file))
|
(param->testflag & T_STATISTICS) || maria_is_crashed(file))
|
||||||
{
|
{
|
||||||
file->update |= HA_STATE_CHANGED | HA_STATE_ROW_CHANGED;
|
file->update |= HA_STATE_CHANGED | HA_STATE_ROW_CHANGED;
|
||||||
mysql_mutex_lock(&share->intern_lock);
|
mysql_mutex_lock(&share->intern_lock);
|
||||||
@ -1368,7 +1368,7 @@ int ha_maria::check(THD * thd, HA_CHECK_OPT * check_opt)
|
|||||||
share->state.changed&= ~(STATE_CHANGED | STATE_CRASHED_FLAGS |
|
share->state.changed&= ~(STATE_CHANGED | STATE_CRASHED_FLAGS |
|
||||||
STATE_IN_REPAIR);
|
STATE_IN_REPAIR);
|
||||||
if (!(table->db_stat & HA_READ_ONLY))
|
if (!(table->db_stat & HA_READ_ONLY))
|
||||||
error= maria_update_state_info(¶m, file,
|
error= maria_update_state_info(param, file,
|
||||||
UPDATE_TIME | UPDATE_OPEN_COUNT |
|
UPDATE_TIME | UPDATE_OPEN_COUNT |
|
||||||
UPDATE_STAT);
|
UPDATE_STAT);
|
||||||
mysql_mutex_unlock(&share->intern_lock);
|
mysql_mutex_unlock(&share->intern_lock);
|
||||||
@ -1399,33 +1399,33 @@ int ha_maria::check(THD * thd, HA_CHECK_OPT * check_opt)
|
|||||||
int ha_maria::analyze(THD *thd, HA_CHECK_OPT * check_opt)
|
int ha_maria::analyze(THD *thd, HA_CHECK_OPT * check_opt)
|
||||||
{
|
{
|
||||||
int error= 0;
|
int error= 0;
|
||||||
HA_CHECK ¶m= *(HA_CHECK*) thd->alloc(sizeof(param));
|
HA_CHECK *param= (HA_CHECK*) thd->alloc(sizeof *param);
|
||||||
MARIA_SHARE *share= file->s;
|
MARIA_SHARE *share= file->s;
|
||||||
const char *old_proc_info;
|
const char *old_proc_info;
|
||||||
|
|
||||||
if (!¶m)
|
if (!param)
|
||||||
return HA_ADMIN_INTERNAL_ERROR;
|
return HA_ADMIN_INTERNAL_ERROR;
|
||||||
|
|
||||||
maria_chk_init(¶m);
|
maria_chk_init(param);
|
||||||
param.thd= thd;
|
param->thd= thd;
|
||||||
param.op_name= "analyze";
|
param->op_name= "analyze";
|
||||||
param.db_name= table->s->db.str;
|
param->db_name= table->s->db.str;
|
||||||
param.table_name= table->alias.c_ptr();
|
param->table_name= table->alias.c_ptr();
|
||||||
param.testflag= (T_FAST | T_CHECK | T_SILENT | T_STATISTICS |
|
param->testflag= (T_FAST | T_CHECK | T_SILENT | T_STATISTICS |
|
||||||
T_DONT_CHECK_CHECKSUM);
|
T_DONT_CHECK_CHECKSUM);
|
||||||
param.using_global_keycache= 1;
|
param->using_global_keycache= 1;
|
||||||
param.stats_method= (enum_handler_stats_method)THDVAR(thd,stats_method);
|
param->stats_method= (enum_handler_stats_method)THDVAR(thd,stats_method);
|
||||||
|
|
||||||
if (!(share->state.changed & STATE_NOT_ANALYZED))
|
if (!(share->state.changed & STATE_NOT_ANALYZED))
|
||||||
return HA_ADMIN_ALREADY_DONE;
|
return HA_ADMIN_ALREADY_DONE;
|
||||||
|
|
||||||
old_proc_info= thd_proc_info(thd, "Scanning");
|
old_proc_info= thd_proc_info(thd, "Scanning");
|
||||||
thd_progress_init(thd, 1);
|
thd_progress_init(thd, 1);
|
||||||
error= maria_chk_key(¶m, file);
|
error= maria_chk_key(param, file);
|
||||||
if (!error)
|
if (!error)
|
||||||
{
|
{
|
||||||
mysql_mutex_lock(&share->intern_lock);
|
mysql_mutex_lock(&share->intern_lock);
|
||||||
error= maria_update_state_info(¶m, file, UPDATE_STAT);
|
error= maria_update_state_info(param, file, UPDATE_STAT);
|
||||||
mysql_mutex_unlock(&share->intern_lock);
|
mysql_mutex_unlock(&share->intern_lock);
|
||||||
}
|
}
|
||||||
else if (!maria_is_crashed(file) && !thd->killed)
|
else if (!maria_is_crashed(file) && !thd->killed)
|
||||||
@ -1438,46 +1438,46 @@ int ha_maria::analyze(THD *thd, HA_CHECK_OPT * check_opt)
|
|||||||
int ha_maria::repair(THD * thd, HA_CHECK_OPT *check_opt)
|
int ha_maria::repair(THD * thd, HA_CHECK_OPT *check_opt)
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
HA_CHECK ¶m= *(HA_CHECK*) thd->alloc(sizeof(param));
|
HA_CHECK *param= (HA_CHECK*) thd->alloc(sizeof *param);
|
||||||
ha_rows start_records;
|
ha_rows start_records;
|
||||||
const char *old_proc_info;
|
const char *old_proc_info;
|
||||||
|
|
||||||
if (!file || !¶m)
|
if (!file || !param)
|
||||||
return HA_ADMIN_INTERNAL_ERROR;
|
return HA_ADMIN_INTERNAL_ERROR;
|
||||||
|
|
||||||
maria_chk_init(¶m);
|
maria_chk_init(param);
|
||||||
param.thd= thd;
|
param->thd= thd;
|
||||||
param.op_name= "repair";
|
param->op_name= "repair";
|
||||||
param.testflag= ((check_opt->flags & ~(T_EXTEND)) |
|
param->testflag= ((check_opt->flags & ~(T_EXTEND)) |
|
||||||
T_SILENT | T_FORCE_CREATE | T_CALC_CHECKSUM |
|
T_SILENT | T_FORCE_CREATE | T_CALC_CHECKSUM |
|
||||||
(check_opt->flags & T_EXTEND ? T_REP : T_REP_BY_SORT));
|
(check_opt->flags & T_EXTEND ? T_REP : T_REP_BY_SORT));
|
||||||
param.sort_buffer_length= THDVAR(thd, sort_buffer_size);
|
param->sort_buffer_length= THDVAR(thd, sort_buffer_size);
|
||||||
param.backup_time= check_opt->start_time;
|
param->backup_time= check_opt->start_time;
|
||||||
start_records= file->state->records;
|
start_records= file->state->records;
|
||||||
old_proc_info= thd_proc_info(thd, "Checking table");
|
old_proc_info= thd_proc_info(thd, "Checking table");
|
||||||
thd_progress_init(thd, 1);
|
thd_progress_init(thd, 1);
|
||||||
while ((error= repair(thd, ¶m, 0)) && param.retry_repair)
|
while ((error= repair(thd, param, 0)) && param->retry_repair)
|
||||||
{
|
{
|
||||||
param.retry_repair= 0;
|
param->retry_repair= 0;
|
||||||
if (test_all_bits(param.testflag,
|
if (test_all_bits(param->testflag,
|
||||||
(uint) (T_RETRY_WITHOUT_QUICK | T_QUICK)))
|
(uint) (T_RETRY_WITHOUT_QUICK | T_QUICK)))
|
||||||
{
|
{
|
||||||
param.testflag&= ~(T_RETRY_WITHOUT_QUICK | T_QUICK);
|
param->testflag&= ~(T_RETRY_WITHOUT_QUICK | T_QUICK);
|
||||||
/* Ensure we don't loose any rows when retrying without quick */
|
/* Ensure we don't loose any rows when retrying without quick */
|
||||||
param.testflag|= T_SAFE_REPAIR;
|
param->testflag|= T_SAFE_REPAIR;
|
||||||
if (thd->vio_ok())
|
if (thd->vio_ok())
|
||||||
_ma_check_print_info(¶m, "Retrying repair without quick");
|
_ma_check_print_info(param, "Retrying repair without quick");
|
||||||
else
|
else
|
||||||
sql_print_information("Retrying repair of: '%s' without quick",
|
sql_print_information("Retrying repair of: '%s' without quick",
|
||||||
table->s->path.str);
|
table->s->path.str);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
param.testflag &= ~T_QUICK;
|
param->testflag &= ~T_QUICK;
|
||||||
if ((param.testflag & T_REP_BY_SORT))
|
if (param->testflag & T_REP_BY_SORT)
|
||||||
{
|
{
|
||||||
param.testflag= (param.testflag & ~T_REP_BY_SORT) | T_REP;
|
param->testflag= (param->testflag & ~T_REP_BY_SORT) | T_REP;
|
||||||
if (thd->vio_ok())
|
if (thd->vio_ok())
|
||||||
_ma_check_print_info(¶m, "Retrying repair with keycache");
|
_ma_check_print_info(param, "Retrying repair with keycache");
|
||||||
sql_print_information("Retrying repair of: '%s' with keycache",
|
sql_print_information("Retrying repair of: '%s' with keycache",
|
||||||
table->s->path.str);
|
table->s->path.str);
|
||||||
continue;
|
continue;
|
||||||
@ -1501,20 +1501,20 @@ int ha_maria::repair(THD * thd, HA_CHECK_OPT *check_opt)
|
|||||||
int ha_maria::zerofill(THD * thd, HA_CHECK_OPT *check_opt)
|
int ha_maria::zerofill(THD * thd, HA_CHECK_OPT *check_opt)
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
HA_CHECK ¶m= *(HA_CHECK*) thd->alloc(sizeof(param));
|
HA_CHECK *param= (HA_CHECK*) thd->alloc(sizeof *param);
|
||||||
TRN *old_trn;
|
TRN *old_trn;
|
||||||
MARIA_SHARE *share= file->s;
|
MARIA_SHARE *share= file->s;
|
||||||
|
|
||||||
if (!file || !¶m)
|
if (!file || !param)
|
||||||
return HA_ADMIN_INTERNAL_ERROR;
|
return HA_ADMIN_INTERNAL_ERROR;
|
||||||
|
|
||||||
old_trn= file->trn;
|
old_trn= file->trn;
|
||||||
maria_chk_init(¶m);
|
maria_chk_init(param);
|
||||||
param.thd= thd;
|
param->thd= thd;
|
||||||
param.op_name= "zerofill";
|
param->op_name= "zerofill";
|
||||||
param.testflag= check_opt->flags | T_SILENT | T_ZEROFILL;
|
param->testflag= check_opt->flags | T_SILENT | T_ZEROFILL;
|
||||||
param.sort_buffer_length= THDVAR(thd, sort_buffer_size);
|
param->sort_buffer_length= THDVAR(thd, sort_buffer_size);
|
||||||
error=maria_zerofill(¶m, file, share->open_file_name.str);
|
error=maria_zerofill(param, file, share->open_file_name.str);
|
||||||
|
|
||||||
/* Reset trn, that may have been set by repair */
|
/* Reset trn, that may have been set by repair */
|
||||||
_ma_set_trn_for_table(file, old_trn);
|
_ma_set_trn_for_table(file, old_trn);
|
||||||
@ -1524,7 +1524,7 @@ int ha_maria::zerofill(THD * thd, HA_CHECK_OPT *check_opt)
|
|||||||
TrID create_trid= trnman_get_min_safe_trid();
|
TrID create_trid= trnman_get_min_safe_trid();
|
||||||
mysql_mutex_lock(&share->intern_lock);
|
mysql_mutex_lock(&share->intern_lock);
|
||||||
share->state.changed|= STATE_NOT_MOVABLE;
|
share->state.changed|= STATE_NOT_MOVABLE;
|
||||||
maria_update_state_info(¶m, file, UPDATE_TIME | UPDATE_OPEN_COUNT);
|
maria_update_state_info(param, file, UPDATE_TIME | UPDATE_OPEN_COUNT);
|
||||||
_ma_update_state_lsns_sub(share, LSN_IMPOSSIBLE, create_trid,
|
_ma_update_state_lsns_sub(share, LSN_IMPOSSIBLE, create_trid,
|
||||||
TRUE, TRUE);
|
TRUE, TRUE);
|
||||||
mysql_mutex_unlock(&share->intern_lock);
|
mysql_mutex_unlock(&share->intern_lock);
|
||||||
@ -1535,24 +1535,24 @@ int ha_maria::zerofill(THD * thd, HA_CHECK_OPT *check_opt)
|
|||||||
int ha_maria::optimize(THD * thd, HA_CHECK_OPT *check_opt)
|
int ha_maria::optimize(THD * thd, HA_CHECK_OPT *check_opt)
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
HA_CHECK ¶m= *(HA_CHECK*) thd->alloc(sizeof(param));
|
HA_CHECK *param= (HA_CHECK*) thd->alloc(sizeof *param);
|
||||||
|
|
||||||
if (!file || !¶m)
|
if (!file || !param)
|
||||||
return HA_ADMIN_INTERNAL_ERROR;
|
return HA_ADMIN_INTERNAL_ERROR;
|
||||||
|
|
||||||
maria_chk_init(¶m);
|
maria_chk_init(param);
|
||||||
param.thd= thd;
|
param->thd= thd;
|
||||||
param.op_name= "optimize";
|
param->op_name= "optimize";
|
||||||
param.testflag= (check_opt->flags | T_SILENT | T_FORCE_CREATE |
|
param->testflag= (check_opt->flags | T_SILENT | T_FORCE_CREATE |
|
||||||
T_REP_BY_SORT | T_STATISTICS | T_SORT_INDEX);
|
T_REP_BY_SORT | T_STATISTICS | T_SORT_INDEX);
|
||||||
param.sort_buffer_length= THDVAR(thd, sort_buffer_size);
|
param->sort_buffer_length= THDVAR(thd, sort_buffer_size);
|
||||||
thd_progress_init(thd, 1);
|
thd_progress_init(thd, 1);
|
||||||
if ((error= repair(thd, ¶m, 1)) && param.retry_repair)
|
if ((error= repair(thd, param, 1)) && param->retry_repair)
|
||||||
{
|
{
|
||||||
sql_print_warning("Warning: Optimize table got errno %d on %s.%s, retrying",
|
sql_print_warning("Warning: Optimize table got errno %d on %s.%s, retrying",
|
||||||
my_errno, param.db_name, param.table_name);
|
my_errno, param->db_name, param->table_name);
|
||||||
param.testflag &= ~T_REP_BY_SORT;
|
param->testflag &= ~T_REP_BY_SORT;
|
||||||
error= repair(thd, ¶m, 0);
|
error= repair(thd, param, 0);
|
||||||
}
|
}
|
||||||
thd_progress_end(thd);
|
thd_progress_end(thd);
|
||||||
return error;
|
return error;
|
||||||
@ -1802,17 +1802,17 @@ int ha_maria::assign_to_keycache(THD * thd, HA_CHECK_OPT *check_opt)
|
|||||||
if (error != HA_ADMIN_OK)
|
if (error != HA_ADMIN_OK)
|
||||||
{
|
{
|
||||||
/* Send error to user */
|
/* Send error to user */
|
||||||
HA_CHECK ¶m= *(HA_CHECK*) thd->alloc(sizeof(param));
|
HA_CHECK *param= (HA_CHECK*) thd->alloc(sizeof *param);
|
||||||
if (!¶m)
|
if (!param)
|
||||||
return HA_ADMIN_INTERNAL_ERROR;
|
return HA_ADMIN_INTERNAL_ERROR;
|
||||||
|
|
||||||
maria_chk_init(¶m);
|
maria_chk_init(param);
|
||||||
param.thd= thd;
|
param->thd= thd;
|
||||||
param.op_name= "assign_to_keycache";
|
param->op_name= "assign_to_keycache";
|
||||||
param.db_name= table->s->db.str;
|
param->db_name= table->s->db.str;
|
||||||
param.table_name= table->s->table_name.str;
|
param->table_name= table->s->table_name.str;
|
||||||
param.testflag= 0;
|
param->testflag= 0;
|
||||||
_ma_check_print_error(¶m, errmsg);
|
_ma_check_print_error(param, errmsg);
|
||||||
}
|
}
|
||||||
DBUG_RETURN(error);
|
DBUG_RETURN(error);
|
||||||
#else
|
#else
|
||||||
@ -1866,17 +1866,17 @@ int ha_maria::preload_keys(THD * thd, HA_CHECK_OPT *check_opt)
|
|||||||
errmsg= buf;
|
errmsg= buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
HA_CHECK ¶m= *(HA_CHECK*) thd->alloc(sizeof(param));
|
HA_CHECK *param= (HA_CHECK*) thd->alloc(sizeof *param);
|
||||||
if (!¶m)
|
if (!param)
|
||||||
return HA_ADMIN_INTERNAL_ERROR;
|
return HA_ADMIN_INTERNAL_ERROR;
|
||||||
|
|
||||||
maria_chk_init(¶m);
|
maria_chk_init(param);
|
||||||
param.thd= thd;
|
param->thd= thd;
|
||||||
param.op_name= "preload_keys";
|
param->op_name= "preload_keys";
|
||||||
param.db_name= table->s->db.str;
|
param->db_name= table->s->db.str;
|
||||||
param.table_name= table->s->table_name.str;
|
param->table_name= table->s->table_name.str;
|
||||||
param.testflag= 0;
|
param->testflag= 0;
|
||||||
_ma_check_print_error(¶m, "%s", errmsg);
|
_ma_check_print_error(param, "%s", errmsg);
|
||||||
DBUG_RETURN(HA_ADMIN_FAILED);
|
DBUG_RETURN(HA_ADMIN_FAILED);
|
||||||
}
|
}
|
||||||
DBUG_RETURN(HA_ADMIN_OK);
|
DBUG_RETURN(HA_ADMIN_OK);
|
||||||
@ -1977,25 +1977,25 @@ int ha_maria::enable_indexes(uint mode)
|
|||||||
else if (mode == HA_KEY_SWITCH_NONUNIQ_SAVE)
|
else if (mode == HA_KEY_SWITCH_NONUNIQ_SAVE)
|
||||||
{
|
{
|
||||||
THD *thd= table->in_use;
|
THD *thd= table->in_use;
|
||||||
HA_CHECK ¶m= *(HA_CHECK*) thd->alloc(sizeof(param));
|
HA_CHECK *param= (HA_CHECK*) thd->alloc(sizeof *param);
|
||||||
if (!¶m)
|
if (!param)
|
||||||
return HA_ADMIN_INTERNAL_ERROR;
|
return HA_ADMIN_INTERNAL_ERROR;
|
||||||
|
|
||||||
const char *save_proc_info= thd_proc_info(thd, "Creating index");
|
const char *save_proc_info= thd_proc_info(thd, "Creating index");
|
||||||
|
|
||||||
maria_chk_init(¶m);
|
maria_chk_init(param);
|
||||||
param.op_name= "recreating_index";
|
param->op_name= "recreating_index";
|
||||||
param.testflag= (T_SILENT | T_REP_BY_SORT | T_QUICK |
|
param->testflag= (T_SILENT | T_REP_BY_SORT | T_QUICK |
|
||||||
T_CREATE_MISSING_KEYS | T_SAFE_REPAIR);
|
T_CREATE_MISSING_KEYS | T_SAFE_REPAIR);
|
||||||
/*
|
/*
|
||||||
Don't lock and unlock table if it's locked.
|
Don't lock and unlock table if it's locked.
|
||||||
Normally table should be locked. This test is mostly for safety.
|
Normally table should be locked. This test is mostly for safety.
|
||||||
*/
|
*/
|
||||||
if (likely(file->lock_type != F_UNLCK))
|
if (likely(file->lock_type != F_UNLCK))
|
||||||
param.testflag|= T_NO_LOCKS;
|
param->testflag|= T_NO_LOCKS;
|
||||||
|
|
||||||
if (file->create_unique_index_by_sort)
|
if (file->create_unique_index_by_sort)
|
||||||
param.testflag|= T_CREATE_UNIQUE_BY_SORT;
|
param->testflag|= T_CREATE_UNIQUE_BY_SORT;
|
||||||
|
|
||||||
if (bulk_insert_single_undo == BULK_INSERT_SINGLE_UNDO_AND_NO_REPAIR)
|
if (bulk_insert_single_undo == BULK_INSERT_SINGLE_UNDO_AND_NO_REPAIR)
|
||||||
{
|
{
|
||||||
@ -2004,23 +2004,23 @@ int ha_maria::enable_indexes(uint mode)
|
|||||||
Don't bump create_rename_lsn, because UNDO_BULK_INSERT
|
Don't bump create_rename_lsn, because UNDO_BULK_INSERT
|
||||||
should not be skipped in case of crash during repair.
|
should not be skipped in case of crash during repair.
|
||||||
*/
|
*/
|
||||||
param.testflag|= T_NO_CREATE_RENAME_LSN;
|
param->testflag|= T_NO_CREATE_RENAME_LSN;
|
||||||
}
|
}
|
||||||
|
|
||||||
param.myf_rw &= ~MY_WAIT_IF_FULL;
|
param->myf_rw &= ~MY_WAIT_IF_FULL;
|
||||||
param.sort_buffer_length= THDVAR(thd,sort_buffer_size);
|
param->sort_buffer_length= THDVAR(thd,sort_buffer_size);
|
||||||
param.stats_method= (enum_handler_stats_method)THDVAR(thd,stats_method);
|
param->stats_method= (enum_handler_stats_method)THDVAR(thd,stats_method);
|
||||||
param.tmpdir= &mysql_tmpdir_list;
|
param->tmpdir= &mysql_tmpdir_list;
|
||||||
if ((error= (repair(thd, ¶m, 0) != HA_ADMIN_OK)) && param.retry_repair)
|
if ((error= (repair(thd, param, 0) != HA_ADMIN_OK)) && param->retry_repair)
|
||||||
{
|
{
|
||||||
sql_print_warning("Warning: Enabling keys got errno %d on %s.%s, "
|
sql_print_warning("Warning: Enabling keys got errno %d on %s.%s, "
|
||||||
"retrying",
|
"retrying",
|
||||||
my_errno, param.db_name, param.table_name);
|
my_errno, param->db_name, param->table_name);
|
||||||
/* This should never fail normally */
|
/* This should never fail normally */
|
||||||
DBUG_ASSERT(thd->killed != 0);
|
DBUG_ASSERT(thd->killed != 0);
|
||||||
/* Repairing by sort failed. Now try standard repair method. */
|
/* Repairing by sort failed. Now try standard repair method. */
|
||||||
param.testflag &= ~T_REP_BY_SORT;
|
param->testflag &= ~T_REP_BY_SORT;
|
||||||
error= (repair(thd, ¶m, 0) != HA_ADMIN_OK);
|
error= (repair(thd, param, 0) != HA_ADMIN_OK);
|
||||||
/*
|
/*
|
||||||
If the standard repair succeeded, clear all error messages which
|
If the standard repair succeeded, clear all error messages which
|
||||||
might have been set by the first repair. They can still be seen
|
might have been set by the first repair. They can still be seen
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2000, 2012, Oracle and/or its affiliates.
|
Copyright (c) 2000, 2012, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2009, 2014, SkySQL Ab.
|
Copyright (c) 2009, 2017, MariaDB Corporation.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -872,59 +872,59 @@ int ha_myisam::check(THD* thd, HA_CHECK_OPT* check_opt)
|
|||||||
{
|
{
|
||||||
if (!file) return HA_ADMIN_INTERNAL_ERROR;
|
if (!file) return HA_ADMIN_INTERNAL_ERROR;
|
||||||
int error;
|
int error;
|
||||||
HA_CHECK ¶m= *(HA_CHECK*) thd->alloc(sizeof(param));
|
HA_CHECK *param= (HA_CHECK*) thd->alloc(sizeof *param);
|
||||||
MYISAM_SHARE* share = file->s;
|
MYISAM_SHARE* share = file->s;
|
||||||
const char *old_proc_info=thd->proc_info;
|
const char *old_proc_info=thd->proc_info;
|
||||||
|
|
||||||
if (!¶m)
|
if (!param)
|
||||||
return HA_ADMIN_INTERNAL_ERROR;
|
return HA_ADMIN_INTERNAL_ERROR;
|
||||||
|
|
||||||
thd_proc_info(thd, "Checking table");
|
thd_proc_info(thd, "Checking table");
|
||||||
myisamchk_init(¶m);
|
myisamchk_init(param);
|
||||||
param.thd = thd;
|
param->thd = thd;
|
||||||
param.op_name = "check";
|
param->op_name = "check";
|
||||||
param.db_name= table->s->db.str;
|
param->db_name= table->s->db.str;
|
||||||
param.table_name= table->alias.c_ptr();
|
param->table_name= table->alias.c_ptr();
|
||||||
param.testflag = check_opt->flags | T_CHECK | T_SILENT;
|
param->testflag = check_opt->flags | T_CHECK | T_SILENT;
|
||||||
param.stats_method= (enum_handler_stats_method)THDVAR(thd, stats_method);
|
param->stats_method= (enum_handler_stats_method)THDVAR(thd, stats_method);
|
||||||
|
|
||||||
if (!(table->db_stat & HA_READ_ONLY))
|
if (!(table->db_stat & HA_READ_ONLY))
|
||||||
param.testflag|= T_STATISTICS;
|
param->testflag|= T_STATISTICS;
|
||||||
param.using_global_keycache = 1;
|
param->using_global_keycache = 1;
|
||||||
|
|
||||||
if (!mi_is_crashed(file) &&
|
if (!mi_is_crashed(file) &&
|
||||||
(((param.testflag & T_CHECK_ONLY_CHANGED) &&
|
(((param->testflag & T_CHECK_ONLY_CHANGED) &&
|
||||||
!(share->state.changed & (STATE_CHANGED | STATE_CRASHED |
|
!(share->state.changed & (STATE_CHANGED | STATE_CRASHED |
|
||||||
STATE_CRASHED_ON_REPAIR)) &&
|
STATE_CRASHED_ON_REPAIR)) &&
|
||||||
share->state.open_count == 0) ||
|
share->state.open_count == 0) ||
|
||||||
((param.testflag & T_FAST) && (share->state.open_count ==
|
((param->testflag & T_FAST) && (share->state.open_count ==
|
||||||
(uint) (share->global_changed ? 1 : 0)))))
|
(uint) (share->global_changed ? 1 : 0)))))
|
||||||
return HA_ADMIN_ALREADY_DONE;
|
return HA_ADMIN_ALREADY_DONE;
|
||||||
|
|
||||||
error = chk_status(¶m, file); // Not fatal
|
error = chk_status(param, file); // Not fatal
|
||||||
error = chk_size(¶m, file);
|
error = chk_size(param, file);
|
||||||
if (!error)
|
if (!error)
|
||||||
error |= chk_del(¶m, file, param.testflag);
|
error |= chk_del(param, file, param->testflag);
|
||||||
if (!error)
|
if (!error)
|
||||||
error = chk_key(¶m, file);
|
error = chk_key(param, file);
|
||||||
if (!error)
|
if (!error)
|
||||||
{
|
{
|
||||||
if ((!(param.testflag & T_QUICK) &&
|
if ((!(param->testflag & T_QUICK) &&
|
||||||
((share->options &
|
((share->options &
|
||||||
(HA_OPTION_PACK_RECORD | HA_OPTION_COMPRESS_RECORD)) ||
|
(HA_OPTION_PACK_RECORD | HA_OPTION_COMPRESS_RECORD)) ||
|
||||||
(param.testflag & (T_EXTEND | T_MEDIUM)))) ||
|
(param->testflag & (T_EXTEND | T_MEDIUM)))) ||
|
||||||
mi_is_crashed(file))
|
mi_is_crashed(file))
|
||||||
{
|
{
|
||||||
ulonglong old_testflag= param.testflag;
|
ulonglong old_testflag= param->testflag;
|
||||||
param.testflag|=T_MEDIUM;
|
param->testflag|=T_MEDIUM;
|
||||||
if (!(error= init_io_cache(¶m.read_cache, file->dfile,
|
if (!(error= init_io_cache(¶m->read_cache, file->dfile,
|
||||||
my_default_record_cache_size, READ_CACHE,
|
my_default_record_cache_size, READ_CACHE,
|
||||||
share->pack.header_length, 1, MYF(MY_WME))))
|
share->pack.header_length, 1, MYF(MY_WME))))
|
||||||
{
|
{
|
||||||
error= chk_data_link(¶m, file, MY_TEST(param.testflag & T_EXTEND));
|
error= chk_data_link(param, file, MY_TEST(param->testflag & T_EXTEND));
|
||||||
end_io_cache(&(param.read_cache));
|
end_io_cache(¶m->read_cache);
|
||||||
}
|
}
|
||||||
param.testflag= old_testflag;
|
param->testflag= old_testflag;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!error)
|
if (!error)
|
||||||
@ -932,7 +932,7 @@ int ha_myisam::check(THD* thd, HA_CHECK_OPT* check_opt)
|
|||||||
if ((share->state.changed & (STATE_CHANGED |
|
if ((share->state.changed & (STATE_CHANGED |
|
||||||
STATE_CRASHED_ON_REPAIR |
|
STATE_CRASHED_ON_REPAIR |
|
||||||
STATE_CRASHED | STATE_NOT_ANALYZED)) ||
|
STATE_CRASHED | STATE_NOT_ANALYZED)) ||
|
||||||
(param.testflag & T_STATISTICS) ||
|
(param->testflag & T_STATISTICS) ||
|
||||||
mi_is_crashed(file))
|
mi_is_crashed(file))
|
||||||
{
|
{
|
||||||
file->update|=HA_STATE_CHANGED | HA_STATE_ROW_CHANGED;
|
file->update|=HA_STATE_CHANGED | HA_STATE_ROW_CHANGED;
|
||||||
@ -940,7 +940,7 @@ int ha_myisam::check(THD* thd, HA_CHECK_OPT* check_opt)
|
|||||||
share->state.changed&= ~(STATE_CHANGED | STATE_CRASHED |
|
share->state.changed&= ~(STATE_CHANGED | STATE_CRASHED |
|
||||||
STATE_CRASHED_ON_REPAIR);
|
STATE_CRASHED_ON_REPAIR);
|
||||||
if (!(table->db_stat & HA_READ_ONLY))
|
if (!(table->db_stat & HA_READ_ONLY))
|
||||||
error=update_state_info(¶m,file,UPDATE_TIME | UPDATE_OPEN_COUNT |
|
error=update_state_info(param,file,UPDATE_TIME | UPDATE_OPEN_COUNT |
|
||||||
UPDATE_STAT);
|
UPDATE_STAT);
|
||||||
mysql_mutex_unlock(&share->intern_lock);
|
mysql_mutex_unlock(&share->intern_lock);
|
||||||
info(HA_STATUS_NO_LOCK | HA_STATUS_TIME | HA_STATUS_VARIABLE |
|
info(HA_STATUS_NO_LOCK | HA_STATUS_TIME | HA_STATUS_VARIABLE |
|
||||||
@ -967,30 +967,30 @@ int ha_myisam::check(THD* thd, HA_CHECK_OPT* check_opt)
|
|||||||
int ha_myisam::analyze(THD *thd, HA_CHECK_OPT* check_opt)
|
int ha_myisam::analyze(THD *thd, HA_CHECK_OPT* check_opt)
|
||||||
{
|
{
|
||||||
int error=0;
|
int error=0;
|
||||||
HA_CHECK ¶m= *(HA_CHECK*) thd->alloc(sizeof(param));
|
HA_CHECK *param= (HA_CHECK*) thd->alloc(sizeof *param);
|
||||||
MYISAM_SHARE* share = file->s;
|
MYISAM_SHARE* share = file->s;
|
||||||
|
|
||||||
if (!¶m)
|
if (!param)
|
||||||
return HA_ADMIN_INTERNAL_ERROR;
|
return HA_ADMIN_INTERNAL_ERROR;
|
||||||
|
|
||||||
myisamchk_init(¶m);
|
myisamchk_init(param);
|
||||||
param.thd = thd;
|
param->thd = thd;
|
||||||
param.op_name= "analyze";
|
param->op_name= "analyze";
|
||||||
param.db_name= table->s->db.str;
|
param->db_name= table->s->db.str;
|
||||||
param.table_name= table->alias.c_ptr();
|
param->table_name= table->alias.c_ptr();
|
||||||
param.testflag= (T_FAST | T_CHECK | T_SILENT | T_STATISTICS |
|
param->testflag= (T_FAST | T_CHECK | T_SILENT | T_STATISTICS |
|
||||||
T_DONT_CHECK_CHECKSUM);
|
T_DONT_CHECK_CHECKSUM);
|
||||||
param.using_global_keycache = 1;
|
param->using_global_keycache = 1;
|
||||||
param.stats_method= (enum_handler_stats_method)THDVAR(thd, stats_method);
|
param->stats_method= (enum_handler_stats_method)THDVAR(thd, stats_method);
|
||||||
|
|
||||||
if (!(share->state.changed & STATE_NOT_ANALYZED))
|
if (!(share->state.changed & STATE_NOT_ANALYZED))
|
||||||
return HA_ADMIN_ALREADY_DONE;
|
return HA_ADMIN_ALREADY_DONE;
|
||||||
|
|
||||||
error = chk_key(¶m, file);
|
error = chk_key(param, file);
|
||||||
if (!error)
|
if (!error)
|
||||||
{
|
{
|
||||||
mysql_mutex_lock(&share->intern_lock);
|
mysql_mutex_lock(&share->intern_lock);
|
||||||
error=update_state_info(¶m,file,UPDATE_STAT);
|
error=update_state_info(param,file,UPDATE_STAT);
|
||||||
mysql_mutex_unlock(&share->intern_lock);
|
mysql_mutex_unlock(&share->intern_lock);
|
||||||
}
|
}
|
||||||
else if (!mi_is_crashed(file) && !thd->killed)
|
else if (!mi_is_crashed(file) && !thd->killed)
|
||||||
@ -1002,37 +1002,37 @@ int ha_myisam::analyze(THD *thd, HA_CHECK_OPT* check_opt)
|
|||||||
int ha_myisam::repair(THD* thd, HA_CHECK_OPT *check_opt)
|
int ha_myisam::repair(THD* thd, HA_CHECK_OPT *check_opt)
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
HA_CHECK ¶m= *(HA_CHECK*) thd->alloc(sizeof(param));
|
HA_CHECK *param= (HA_CHECK*) thd->alloc(sizeof *param);
|
||||||
ha_rows start_records;
|
ha_rows start_records;
|
||||||
|
|
||||||
if (!file || !¶m) return HA_ADMIN_INTERNAL_ERROR;
|
if (!file || !param) return HA_ADMIN_INTERNAL_ERROR;
|
||||||
|
|
||||||
myisamchk_init(¶m);
|
myisamchk_init(param);
|
||||||
param.thd = thd;
|
param->thd = thd;
|
||||||
param.op_name= "repair";
|
param->op_name= "repair";
|
||||||
param.testflag= ((check_opt->flags & ~(T_EXTEND)) |
|
param->testflag= ((check_opt->flags & ~(T_EXTEND)) |
|
||||||
T_SILENT | T_FORCE_CREATE | T_CALC_CHECKSUM |
|
T_SILENT | T_FORCE_CREATE | T_CALC_CHECKSUM |
|
||||||
(check_opt->flags & T_EXTEND ? T_REP : T_REP_BY_SORT));
|
(check_opt->flags & T_EXTEND ? T_REP : T_REP_BY_SORT));
|
||||||
param.sort_buffer_length= THDVAR(thd, sort_buffer_size);
|
param->sort_buffer_length= THDVAR(thd, sort_buffer_size);
|
||||||
param.backup_time= check_opt->start_time;
|
param->backup_time= check_opt->start_time;
|
||||||
start_records=file->state->records;
|
start_records=file->state->records;
|
||||||
while ((error=repair(thd,param,0)) && param.retry_repair)
|
while ((error=repair(thd,*param,0)) && param->retry_repair)
|
||||||
{
|
{
|
||||||
param.retry_repair=0;
|
param->retry_repair=0;
|
||||||
if (test_all_bits(param.testflag,
|
if (test_all_bits(param->testflag,
|
||||||
(uint) (T_RETRY_WITHOUT_QUICK | T_QUICK)))
|
(uint) (T_RETRY_WITHOUT_QUICK | T_QUICK)))
|
||||||
{
|
{
|
||||||
param.testflag&= ~(T_RETRY_WITHOUT_QUICK | T_QUICK);
|
param->testflag&= ~(T_RETRY_WITHOUT_QUICK | T_QUICK);
|
||||||
/* Ensure we don't loose any rows when retrying without quick */
|
/* Ensure we don't loose any rows when retrying without quick */
|
||||||
param.testflag|= T_SAFE_REPAIR;
|
param->testflag|= T_SAFE_REPAIR;
|
||||||
sql_print_information("Retrying repair of: '%s' including modifying data file",
|
sql_print_information("Retrying repair of: '%s' including modifying data file",
|
||||||
table->s->path.str);
|
table->s->path.str);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
param.testflag&= ~T_QUICK;
|
param->testflag&= ~T_QUICK;
|
||||||
if ((param.testflag & T_REP_BY_SORT))
|
if ((param->testflag & T_REP_BY_SORT))
|
||||||
{
|
{
|
||||||
param.testflag= (param.testflag & ~T_REP_BY_SORT) | T_REP;
|
param->testflag= (param->testflag & ~T_REP_BY_SORT) | T_REP;
|
||||||
sql_print_information("Retrying repair of: '%s' with keycache",
|
sql_print_information("Retrying repair of: '%s' with keycache",
|
||||||
table->s->path.str);
|
table->s->path.str);
|
||||||
continue;
|
continue;
|
||||||
@ -1054,22 +1054,22 @@ int ha_myisam::repair(THD* thd, HA_CHECK_OPT *check_opt)
|
|||||||
int ha_myisam::optimize(THD* thd, HA_CHECK_OPT *check_opt)
|
int ha_myisam::optimize(THD* thd, HA_CHECK_OPT *check_opt)
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
HA_CHECK ¶m= *(HA_CHECK*) thd->alloc(sizeof(param));
|
HA_CHECK *param= (HA_CHECK*) thd->alloc(sizeof *param);
|
||||||
|
|
||||||
if (!file || !¶m) return HA_ADMIN_INTERNAL_ERROR;
|
if (!file || !param) return HA_ADMIN_INTERNAL_ERROR;
|
||||||
|
|
||||||
myisamchk_init(¶m);
|
myisamchk_init(param);
|
||||||
param.thd = thd;
|
param->thd = thd;
|
||||||
param.op_name= "optimize";
|
param->op_name= "optimize";
|
||||||
param.testflag= (check_opt->flags | T_SILENT | T_FORCE_CREATE |
|
param->testflag= (check_opt->flags | T_SILENT | T_FORCE_CREATE |
|
||||||
T_REP_BY_SORT | T_STATISTICS | T_SORT_INDEX);
|
T_REP_BY_SORT | T_STATISTICS | T_SORT_INDEX);
|
||||||
param.sort_buffer_length= THDVAR(thd, sort_buffer_size);
|
param->sort_buffer_length= THDVAR(thd, sort_buffer_size);
|
||||||
if ((error= repair(thd,param,1)) && param.retry_repair)
|
if ((error= repair(thd,*param,1)) && param->retry_repair)
|
||||||
{
|
{
|
||||||
sql_print_warning("Warning: Optimize table got errno %d on %s.%s, retrying",
|
sql_print_warning("Warning: Optimize table got errno %d on %s.%s, retrying",
|
||||||
my_errno, param.db_name, param.table_name);
|
my_errno, param->db_name, param->table_name);
|
||||||
param.testflag&= ~T_REP_BY_SORT;
|
param->testflag&= ~T_REP_BY_SORT;
|
||||||
error= repair(thd,param,1);
|
error= repair(thd,*param,1);
|
||||||
}
|
}
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
@ -1274,17 +1274,17 @@ int ha_myisam::assign_to_keycache(THD* thd, HA_CHECK_OPT *check_opt)
|
|||||||
if (error != HA_ADMIN_OK)
|
if (error != HA_ADMIN_OK)
|
||||||
{
|
{
|
||||||
/* Send error to user */
|
/* Send error to user */
|
||||||
HA_CHECK ¶m= *(HA_CHECK*) thd->alloc(sizeof(param));
|
HA_CHECK *param= (HA_CHECK*) thd->alloc(sizeof *param);
|
||||||
if (!¶m)
|
if (!param)
|
||||||
return HA_ADMIN_INTERNAL_ERROR;
|
return HA_ADMIN_INTERNAL_ERROR;
|
||||||
|
|
||||||
myisamchk_init(¶m);
|
myisamchk_init(param);
|
||||||
param.thd= thd;
|
param->thd= thd;
|
||||||
param.op_name= "assign_to_keycache";
|
param->op_name= "assign_to_keycache";
|
||||||
param.db_name= table->s->db.str;
|
param->db_name= table->s->db.str;
|
||||||
param.table_name= table->s->table_name.str;
|
param->table_name= table->s->table_name.str;
|
||||||
param.testflag= 0;
|
param->testflag= 0;
|
||||||
mi_check_print_error(¶m, errmsg);
|
mi_check_print_error(param, errmsg);
|
||||||
}
|
}
|
||||||
DBUG_RETURN(error);
|
DBUG_RETURN(error);
|
||||||
}
|
}
|
||||||
@ -1341,16 +1341,16 @@ int ha_myisam::preload_keys(THD* thd, HA_CHECK_OPT *check_opt)
|
|||||||
|
|
||||||
err:
|
err:
|
||||||
{
|
{
|
||||||
HA_CHECK ¶m= *(HA_CHECK*) thd->alloc(sizeof(param));
|
HA_CHECK *param= (HA_CHECK*) thd->alloc(sizeof *param);
|
||||||
if (!¶m)
|
if (!param)
|
||||||
return HA_ADMIN_INTERNAL_ERROR;
|
return HA_ADMIN_INTERNAL_ERROR;
|
||||||
myisamchk_init(¶m);
|
myisamchk_init(param);
|
||||||
param.thd= thd;
|
param->thd= thd;
|
||||||
param.op_name= "preload_keys";
|
param->op_name= "preload_keys";
|
||||||
param.db_name= table->s->db.str;
|
param->db_name= table->s->db.str;
|
||||||
param.table_name= table->s->table_name.str;
|
param->table_name= table->s->table_name.str;
|
||||||
param.testflag= 0;
|
param->testflag= 0;
|
||||||
mi_check_print_error(¶m, errmsg);
|
mi_check_print_error(param, errmsg);
|
||||||
DBUG_RETURN(error);
|
DBUG_RETURN(error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1455,45 +1455,45 @@ int ha_myisam::enable_indexes(uint mode)
|
|||||||
{
|
{
|
||||||
THD *thd= table->in_use;
|
THD *thd= table->in_use;
|
||||||
int was_error= thd->is_error();
|
int was_error= thd->is_error();
|
||||||
HA_CHECK ¶m= *(HA_CHECK*) thd->alloc(sizeof(param));
|
HA_CHECK *param= (HA_CHECK*) thd->alloc(sizeof *param);
|
||||||
const char *save_proc_info=thd->proc_info;
|
const char *save_proc_info=thd->proc_info;
|
||||||
|
|
||||||
if (!¶m)
|
if (!param)
|
||||||
DBUG_RETURN(HA_ADMIN_INTERNAL_ERROR);
|
DBUG_RETURN(HA_ADMIN_INTERNAL_ERROR);
|
||||||
|
|
||||||
thd_proc_info(thd, "Creating index");
|
thd_proc_info(thd, "Creating index");
|
||||||
myisamchk_init(¶m);
|
myisamchk_init(param);
|
||||||
param.op_name= "recreating_index";
|
param->op_name= "recreating_index";
|
||||||
param.testflag= (T_SILENT | T_REP_BY_SORT | T_QUICK |
|
param->testflag= (T_SILENT | T_REP_BY_SORT | T_QUICK |
|
||||||
T_CREATE_MISSING_KEYS);
|
T_CREATE_MISSING_KEYS);
|
||||||
/*
|
/*
|
||||||
Don't lock and unlock table if it's locked.
|
Don't lock and unlock table if it's locked.
|
||||||
Normally table should be locked. This test is mostly for safety.
|
Normally table should be locked. This test is mostly for safety.
|
||||||
*/
|
*/
|
||||||
if (likely(file->lock_type != F_UNLCK))
|
if (likely(file->lock_type != F_UNLCK))
|
||||||
param.testflag|= T_NO_LOCKS;
|
param->testflag|= T_NO_LOCKS;
|
||||||
|
|
||||||
if (file->create_unique_index_by_sort)
|
|
||||||
param.testflag|= T_CREATE_UNIQUE_BY_SORT;
|
|
||||||
|
|
||||||
param.myf_rw&= ~MY_WAIT_IF_FULL;
|
if (file->create_unique_index_by_sort)
|
||||||
param.sort_buffer_length= THDVAR(thd, sort_buffer_size);
|
param->testflag|= T_CREATE_UNIQUE_BY_SORT;
|
||||||
param.stats_method= (enum_handler_stats_method)THDVAR(thd, stats_method);
|
|
||||||
param.tmpdir=&mysql_tmpdir_list;
|
param->myf_rw&= ~MY_WAIT_IF_FULL;
|
||||||
if ((error= (repair(thd,param,0) != HA_ADMIN_OK)) && param.retry_repair)
|
param->sort_buffer_length= THDVAR(thd, sort_buffer_size);
|
||||||
|
param->stats_method= (enum_handler_stats_method)THDVAR(thd, stats_method);
|
||||||
|
param->tmpdir=&mysql_tmpdir_list;
|
||||||
|
if ((error= (repair(thd,*param,0) != HA_ADMIN_OK)) && param->retry_repair)
|
||||||
{
|
{
|
||||||
sql_print_warning("Warning: Enabling keys got errno %d on %s.%s, retrying",
|
sql_print_warning("Warning: Enabling keys got errno %d on %s.%s, retrying",
|
||||||
my_errno, param.db_name, param.table_name);
|
my_errno, param->db_name, param->table_name);
|
||||||
/*
|
/*
|
||||||
Repairing by sort failed. Now try standard repair method.
|
Repairing by sort failed. Now try standard repair method.
|
||||||
Still we want to fix only index file. If data file corruption
|
Still we want to fix only index file. If data file corruption
|
||||||
was detected (T_RETRY_WITHOUT_QUICK), we shouldn't do much here.
|
was detected (T_RETRY_WITHOUT_QUICK), we shouldn't do much here.
|
||||||
Let implicit repair do this job.
|
Let implicit repair do this job.
|
||||||
*/
|
*/
|
||||||
if (!(param.testflag & T_RETRY_WITHOUT_QUICK))
|
if (!(param->testflag & T_RETRY_WITHOUT_QUICK))
|
||||||
{
|
{
|
||||||
param.testflag&= ~T_REP_BY_SORT;
|
param->testflag&= ~T_REP_BY_SORT;
|
||||||
error= (repair(thd,param,0) != HA_ADMIN_OK);
|
error= (repair(thd,*param,0) != HA_ADMIN_OK);
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
If the standard repair succeeded, clear all error messages which
|
If the standard repair succeeded, clear all error messages which
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||||
|
Copyright (c) 2017, MariaDB Corporation.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it under
|
This program is free software; you can redistribute it and/or modify it under
|
||||||
the terms of the GNU General Public License as published by the Free Software
|
the terms of the GNU General Public License as published by the Free Software
|
||||||
@ -299,20 +300,12 @@ void
|
|||||||
recv_sys_var_init(void);
|
recv_sys_var_init(void);
|
||||||
/*===================*/
|
/*===================*/
|
||||||
#endif /* !UNIV_HOTBACKUP */
|
#endif /* !UNIV_HOTBACKUP */
|
||||||
/*******************************************************************//**
|
/** Apply the hash table of stored log records to persistent data pages.
|
||||||
Empties the hash table of stored log records, applying them to appropriate
|
@param[in] last_batch whether the change buffer merge will be
|
||||||
pages. */
|
performed as part of the operation */
|
||||||
UNIV_INTERN
|
UNIV_INTERN
|
||||||
void
|
void
|
||||||
recv_apply_hashed_log_recs(
|
recv_apply_hashed_log_recs(bool last_batch);
|
||||||
/*=======================*/
|
|
||||||
ibool allow_ibuf); /*!< in: if TRUE, also ibuf operations are
|
|
||||||
allowed during the application; if FALSE,
|
|
||||||
no ibuf operations are allowed, and after
|
|
||||||
the application all file pages are flushed to
|
|
||||||
disk and invalidated in buffer pool: this
|
|
||||||
alternative means that no new log records
|
|
||||||
can be generated during the application */
|
|
||||||
#ifdef UNIV_HOTBACKUP
|
#ifdef UNIV_HOTBACKUP
|
||||||
/*******************************************************************//**
|
/*******************************************************************//**
|
||||||
Applies log records in the hash table to a backup. */
|
Applies log records in the hash table to a backup. */
|
||||||
@ -438,6 +431,8 @@ struct recv_sys_t{
|
|||||||
scan find a corrupt log block, or a corrupt
|
scan find a corrupt log block, or a corrupt
|
||||||
log record, or there is a log parsing
|
log record, or there is a log parsing
|
||||||
buffer overflow */
|
buffer overflow */
|
||||||
|
/** the time when progress was last reported */
|
||||||
|
ib_time_t progress_time;
|
||||||
#ifdef UNIV_LOG_ARCHIVE
|
#ifdef UNIV_LOG_ARCHIVE
|
||||||
log_group_t* archive_group;
|
log_group_t* archive_group;
|
||||||
/*!< in archive recovery: the log group whose
|
/*!< in archive recovery: the log group whose
|
||||||
@ -450,6 +445,20 @@ struct recv_sys_t{
|
|||||||
addresses in the hash table */
|
addresses in the hash table */
|
||||||
|
|
||||||
recv_dblwr_t dblwr;
|
recv_dblwr_t dblwr;
|
||||||
|
|
||||||
|
/** Determine whether redo log recovery progress should be reported.
|
||||||
|
@param[in] time the current time
|
||||||
|
@return whether progress should be reported
|
||||||
|
(the last report was at least 15 seconds ago) */
|
||||||
|
bool report(ib_time_t time)
|
||||||
|
{
|
||||||
|
if (time - progress_time < 15) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
progress_time = time;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/** The recovery system */
|
/** The recovery system */
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||||
Copyright (c) 2009, Google Inc.
|
Copyright (c) 2009, Google Inc.
|
||||||
Copyright (c) 2017, MariaDB Corporation. All Rights Reserved.
|
Copyright (c) 2017, MariaDB Corporation.
|
||||||
|
|
||||||
Portions of this file contain modifications contributed and copyrighted by
|
Portions of this file contain modifications contributed and copyrighted by
|
||||||
Google, Inc. Those modifications are gratefully acknowledged and are described
|
Google, Inc. Those modifications are gratefully acknowledged and are described
|
||||||
@ -1858,7 +1858,7 @@ log_preflush_pool_modified_pages(
|
|||||||
and we could not make a new checkpoint on the basis of the
|
and we could not make a new checkpoint on the basis of the
|
||||||
info on the buffer pool only. */
|
info on the buffer pool only. */
|
||||||
|
|
||||||
recv_apply_hashed_log_recs(TRUE);
|
recv_apply_hashed_log_recs(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!buf_page_cleaner_is_active
|
if (!buf_page_cleaner_is_active
|
||||||
@ -2229,7 +2229,7 @@ log_checkpoint(
|
|||||||
ut_ad(!srv_read_only_mode);
|
ut_ad(!srv_read_only_mode);
|
||||||
|
|
||||||
if (recv_recovery_is_on()) {
|
if (recv_recovery_is_on()) {
|
||||||
recv_apply_hashed_log_recs(TRUE);
|
recv_apply_hashed_log_recs(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (srv_unix_file_flush_method != SRV_UNIX_NOSYNC &&
|
if (srv_unix_file_flush_method != SRV_UNIX_NOSYNC &&
|
||||||
@ -2568,6 +2568,11 @@ loop:
|
|||||||
start_lsn += len;
|
start_lsn += len;
|
||||||
buf += len;
|
buf += len;
|
||||||
|
|
||||||
|
if (recv_sys->report(ut_time())) {
|
||||||
|
ib_logf(IB_LOG_LEVEL_INFO, "Read redo log up to LSN=" LSN_PF,
|
||||||
|
start_lsn);
|
||||||
|
}
|
||||||
|
|
||||||
if (start_lsn != end_lsn) {
|
if (start_lsn != end_lsn) {
|
||||||
|
|
||||||
if (release_mutex) {
|
if (release_mutex) {
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||||
Copyright (c) 2012, Facebook Inc.
|
Copyright (c) 2012, Facebook Inc.
|
||||||
Copyright (c) 2017, MariaDB Corporation. All Rights Reserved.
|
Copyright (c) 2017, MariaDB Corporation.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it under
|
This program is free software; you can redistribute it and/or modify it under
|
||||||
the terms of the GNU General Public License as published by the Free Software
|
the terms of the GNU General Public License as published by the Free Software
|
||||||
@ -80,7 +80,7 @@ this must be less than UNIV_PAGE_SIZE as it is stored in the buffer pool */
|
|||||||
#define RECV_READ_AHEAD_AREA 32
|
#define RECV_READ_AHEAD_AREA 32
|
||||||
|
|
||||||
/** The recovery system */
|
/** The recovery system */
|
||||||
UNIV_INTERN recv_sys_t* recv_sys = NULL;
|
UNIV_INTERN recv_sys_t* recv_sys;
|
||||||
/** TRUE when applying redo log records during crash recovery; FALSE
|
/** TRUE when applying redo log records during crash recovery; FALSE
|
||||||
otherwise. Note that this is FALSE while a background thread is
|
otherwise. Note that this is FALSE while a background thread is
|
||||||
rolling back incomplete transactions. */
|
rolling back incomplete transactions. */
|
||||||
@ -132,9 +132,6 @@ UNIV_INTERN ibool recv_is_making_a_backup = FALSE;
|
|||||||
UNIV_INTERN ibool recv_is_from_backup = FALSE;
|
UNIV_INTERN ibool recv_is_from_backup = FALSE;
|
||||||
# define buf_pool_get_curr_size() (5 * 1024 * 1024)
|
# define buf_pool_get_curr_size() (5 * 1024 * 1024)
|
||||||
#endif /* !UNIV_HOTBACKUP */
|
#endif /* !UNIV_HOTBACKUP */
|
||||||
/** The following counter is used to decide when to print info on
|
|
||||||
log scan */
|
|
||||||
static ulint recv_scan_print_counter;
|
|
||||||
|
|
||||||
/** The type of the previous parsed redo log record */
|
/** The type of the previous parsed redo log record */
|
||||||
static ulint recv_previous_parsed_rec_type;
|
static ulint recv_previous_parsed_rec_type;
|
||||||
@ -305,8 +302,6 @@ recv_sys_var_init(void)
|
|||||||
|
|
||||||
recv_no_ibuf_operations = FALSE;
|
recv_no_ibuf_operations = FALSE;
|
||||||
|
|
||||||
recv_scan_print_counter = 0;
|
|
||||||
|
|
||||||
recv_previous_parsed_rec_type = 999999;
|
recv_previous_parsed_rec_type = 999999;
|
||||||
|
|
||||||
recv_previous_parsed_rec_offset = 0;
|
recv_previous_parsed_rec_offset = 0;
|
||||||
@ -417,6 +412,7 @@ recv_sys_init(
|
|||||||
recv_sys->last_block_buf_start, OS_FILE_LOG_BLOCK_SIZE));
|
recv_sys->last_block_buf_start, OS_FILE_LOG_BLOCK_SIZE));
|
||||||
|
|
||||||
recv_sys->found_corrupt_log = FALSE;
|
recv_sys->found_corrupt_log = FALSE;
|
||||||
|
recv_sys->progress_time = ut_time();
|
||||||
|
|
||||||
recv_max_page_lsn = 0;
|
recv_max_page_lsn = 0;
|
||||||
|
|
||||||
@ -1675,6 +1671,7 @@ recv_recover_page_func(
|
|||||||
ibool success;
|
ibool success;
|
||||||
#endif /* !UNIV_HOTBACKUP */
|
#endif /* !UNIV_HOTBACKUP */
|
||||||
mtr_t mtr;
|
mtr_t mtr;
|
||||||
|
ib_time_t time;
|
||||||
|
|
||||||
mutex_enter(&(recv_sys->mutex));
|
mutex_enter(&(recv_sys->mutex));
|
||||||
|
|
||||||
@ -1852,6 +1849,8 @@ recv_recover_page_func(
|
|||||||
|
|
||||||
mtr_commit(&mtr);
|
mtr_commit(&mtr);
|
||||||
|
|
||||||
|
time = ut_time();
|
||||||
|
|
||||||
mutex_enter(&(recv_sys->mutex));
|
mutex_enter(&(recv_sys->mutex));
|
||||||
|
|
||||||
if (recv_max_page_lsn < page_lsn) {
|
if (recv_max_page_lsn < page_lsn) {
|
||||||
@ -1860,11 +1859,16 @@ recv_recover_page_func(
|
|||||||
|
|
||||||
recv_addr->state = RECV_PROCESSED;
|
recv_addr->state = RECV_PROCESSED;
|
||||||
|
|
||||||
ut_a(recv_sys->n_addrs);
|
ut_a(recv_sys->n_addrs > 0);
|
||||||
recv_sys->n_addrs--;
|
if (--recv_sys->n_addrs && recv_sys->progress_time - time >= 15) {
|
||||||
|
recv_sys->progress_time = time;
|
||||||
mutex_exit(&(recv_sys->mutex));
|
ut_print_timestamp(stderr);
|
||||||
|
fprintf(stderr,
|
||||||
|
" InnoDB: To recover: " ULINTPF " pages from log\n",
|
||||||
|
recv_sys->n_addrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
mutex_exit(&recv_sys->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef UNIV_HOTBACKUP
|
#ifndef UNIV_HOTBACKUP
|
||||||
@ -1910,59 +1914,48 @@ recv_read_in_area(
|
|||||||
}
|
}
|
||||||
|
|
||||||
buf_read_recv_pages(FALSE, space, zip_size, page_nos, n);
|
buf_read_recv_pages(FALSE, space, zip_size, page_nos, n);
|
||||||
/*
|
|
||||||
fprintf(stderr, "Recv pages at %lu n %lu\n", page_nos[0], n);
|
|
||||||
*/
|
|
||||||
return(n);
|
return(n);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************//**
|
/** Apply the hash table of stored log records to persistent data pages.
|
||||||
Empties the hash table of stored log records, applying them to appropriate
|
@param[in] last_batch whether the change buffer merge will be
|
||||||
pages. */
|
performed as part of the operation */
|
||||||
UNIV_INTERN
|
UNIV_INTERN
|
||||||
void
|
void
|
||||||
recv_apply_hashed_log_recs(
|
recv_apply_hashed_log_recs(bool last_batch)
|
||||||
/*=======================*/
|
|
||||||
ibool allow_ibuf) /*!< in: if TRUE, also ibuf operations are
|
|
||||||
allowed during the application; if FALSE,
|
|
||||||
no ibuf operations are allowed, and after
|
|
||||||
the application all file pages are flushed to
|
|
||||||
disk and invalidated in buffer pool: this
|
|
||||||
alternative means that no new log records
|
|
||||||
can be generated during the application;
|
|
||||||
the caller must in this case own the log
|
|
||||||
mutex */
|
|
||||||
{
|
{
|
||||||
recv_addr_t* recv_addr;
|
for (;;) {
|
||||||
ulint i;
|
mutex_enter(&recv_sys->mutex);
|
||||||
ibool has_printed = FALSE;
|
|
||||||
mtr_t mtr;
|
|
||||||
loop:
|
|
||||||
mutex_enter(&(recv_sys->mutex));
|
|
||||||
|
|
||||||
if (recv_sys->apply_batch_on) {
|
if (!recv_sys->apply_batch_on) {
|
||||||
|
break;
|
||||||
mutex_exit(&(recv_sys->mutex));
|
}
|
||||||
|
|
||||||
|
mutex_exit(&recv_sys->mutex);
|
||||||
os_thread_sleep(500000);
|
os_thread_sleep(500000);
|
||||||
|
|
||||||
goto loop;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ut_ad((allow_ibuf == 0) == (mutex_own(&log_sys->mutex) != 0));
|
ut_ad(!last_batch == mutex_own(&log_sys->mutex));
|
||||||
|
|
||||||
if (!allow_ibuf) {
|
if (!last_batch) {
|
||||||
recv_no_ibuf_operations = TRUE;
|
recv_no_ibuf_operations = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ulint n = recv_sys->n_addrs) {
|
||||||
|
const char* msg = last_batch
|
||||||
|
? "Starting final batch to recover "
|
||||||
|
: "Starting a batch to recover ";
|
||||||
|
ib_logf(IB_LOG_LEVEL_INFO,
|
||||||
|
"%s" ULINTPF " pages from redo log", msg, n);
|
||||||
|
}
|
||||||
|
|
||||||
recv_sys->apply_log_recs = TRUE;
|
recv_sys->apply_log_recs = TRUE;
|
||||||
recv_sys->apply_batch_on = TRUE;
|
recv_sys->apply_batch_on = TRUE;
|
||||||
|
|
||||||
for (i = 0; i < hash_get_n_cells(recv_sys->addr_hash); i++) {
|
for (ulint i = 0; i < hash_get_n_cells(recv_sys->addr_hash); i++) {
|
||||||
|
for (recv_addr_t* recv_addr = static_cast<recv_addr_t*>(
|
||||||
for (recv_addr = static_cast<recv_addr_t*>(
|
HASH_GET_FIRST(recv_sys->addr_hash, i));
|
||||||
HASH_GET_FIRST(recv_sys->addr_hash, i));
|
recv_addr;
|
||||||
recv_addr != 0;
|
|
||||||
recv_addr = static_cast<recv_addr_t*>(
|
recv_addr = static_cast<recv_addr_t*>(
|
||||||
HASH_GET_NEXT(addr_hash, recv_addr))) {
|
HASH_GET_NEXT(addr_hash, recv_addr))) {
|
||||||
|
|
||||||
@ -1971,24 +1964,12 @@ loop:
|
|||||||
ulint page_no = recv_addr->page_no;
|
ulint page_no = recv_addr->page_no;
|
||||||
|
|
||||||
if (recv_addr->state == RECV_NOT_PROCESSED) {
|
if (recv_addr->state == RECV_NOT_PROCESSED) {
|
||||||
if (!has_printed) {
|
mutex_exit(&recv_sys->mutex);
|
||||||
ib_logf(IB_LOG_LEVEL_INFO,
|
|
||||||
"Starting an apply batch"
|
|
||||||
" of log records"
|
|
||||||
" to the database...");
|
|
||||||
fputs("InnoDB: Progress in percent: ",
|
|
||||||
stderr);
|
|
||||||
has_printed = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
mutex_exit(&(recv_sys->mutex));
|
|
||||||
|
|
||||||
if (buf_page_peek(space, page_no)) {
|
if (buf_page_peek(space, page_no)) {
|
||||||
buf_block_t* block;
|
mtr_t mtr;
|
||||||
|
|
||||||
mtr_start(&mtr);
|
mtr_start(&mtr);
|
||||||
|
buf_block_t* block = buf_page_get(
|
||||||
block = buf_page_get(
|
|
||||||
space, zip_size, page_no,
|
space, zip_size, page_no,
|
||||||
RW_X_LATCH, &mtr);
|
RW_X_LATCH, &mtr);
|
||||||
buf_block_dbg_add_level(
|
buf_block_dbg_add_level(
|
||||||
@ -2001,19 +1982,9 @@ loop:
|
|||||||
page_no);
|
page_no);
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_enter(&(recv_sys->mutex));
|
mutex_enter(&recv_sys->mutex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (has_printed
|
|
||||||
&& (i * 100) / hash_get_n_cells(recv_sys->addr_hash)
|
|
||||||
!= ((i + 1) * 100)
|
|
||||||
/ hash_get_n_cells(recv_sys->addr_hash)) {
|
|
||||||
|
|
||||||
fprintf(stderr, "%lu ", (ulong)
|
|
||||||
((i * 100)
|
|
||||||
/ hash_get_n_cells(recv_sys->addr_hash)));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Wait until all the pages have been processed */
|
/* Wait until all the pages have been processed */
|
||||||
@ -2027,12 +1998,7 @@ loop:
|
|||||||
mutex_enter(&(recv_sys->mutex));
|
mutex_enter(&(recv_sys->mutex));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (has_printed) {
|
if (!last_batch) {
|
||||||
|
|
||||||
fprintf(stderr, "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!allow_ibuf) {
|
|
||||||
bool success;
|
bool success;
|
||||||
|
|
||||||
/* Flush all the file pages to disk and invalidate them in
|
/* Flush all the file pages to disk and invalidate them in
|
||||||
@ -2072,11 +2038,7 @@ loop:
|
|||||||
|
|
||||||
recv_sys_empty_hash();
|
recv_sys_empty_hash();
|
||||||
|
|
||||||
if (has_printed) {
|
mutex_exit(&recv_sys->mutex);
|
||||||
fprintf(stderr, "InnoDB: Apply batch completed\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
mutex_exit(&(recv_sys->mutex));
|
|
||||||
}
|
}
|
||||||
#else /* !UNIV_HOTBACKUP */
|
#else /* !UNIV_HOTBACKUP */
|
||||||
/*******************************************************************//**
|
/*******************************************************************//**
|
||||||
@ -2099,11 +2061,6 @@ recv_apply_log_recs_for_backup(void)
|
|||||||
|
|
||||||
block = back_block1;
|
block = back_block1;
|
||||||
|
|
||||||
ib_logf(IB_LOG_LEVEL_INFO,
|
|
||||||
"Starting an apply batch of log records to the database...");
|
|
||||||
|
|
||||||
fputs("InnoDB: Progress in percent: ", stderr);
|
|
||||||
|
|
||||||
n_hash_cells = hash_get_n_cells(recv_sys->addr_hash);
|
n_hash_cells = hash_get_n_cells(recv_sys->addr_hash);
|
||||||
|
|
||||||
for (i = 0; i < n_hash_cells; i++) {
|
for (i = 0; i < n_hash_cells; i++) {
|
||||||
@ -2215,13 +2172,6 @@ recv_apply_log_recs_for_backup(void)
|
|||||||
skip_this_recv_addr:
|
skip_this_recv_addr:
|
||||||
recv_addr = HASH_GET_NEXT(addr_hash, recv_addr);
|
recv_addr = HASH_GET_NEXT(addr_hash, recv_addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((100 * i) / n_hash_cells
|
|
||||||
!= (100 * (i + 1)) / n_hash_cells) {
|
|
||||||
fprintf(stderr, "%lu ",
|
|
||||||
(ulong) ((100 * i) / n_hash_cells));
|
|
||||||
fflush(stderr);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
recv_sys_empty_hash();
|
recv_sys_empty_hash();
|
||||||
@ -2885,11 +2835,10 @@ recv_scan_log_recs(
|
|||||||
#ifndef UNIV_HOTBACKUP
|
#ifndef UNIV_HOTBACKUP
|
||||||
if (recv_log_scan_is_startup_type
|
if (recv_log_scan_is_startup_type
|
||||||
&& !recv_needed_recovery) {
|
&& !recv_needed_recovery) {
|
||||||
|
|
||||||
if (!srv_read_only_mode) {
|
if (!srv_read_only_mode) {
|
||||||
ib_logf(IB_LOG_LEVEL_INFO,
|
ib_logf(IB_LOG_LEVEL_INFO,
|
||||||
"Log scan progressed past the "
|
"Starting crash recovery from "
|
||||||
"checkpoint lsn " LSN_PF "",
|
"checkpoint LSN=" LSN_PF,
|
||||||
recv_sys->scanned_lsn);
|
recv_sys->scanned_lsn);
|
||||||
|
|
||||||
recv_init_crash_recovery();
|
recv_init_crash_recovery();
|
||||||
@ -2948,19 +2897,6 @@ recv_scan_log_recs(
|
|||||||
|
|
||||||
*group_scanned_lsn = scanned_lsn;
|
*group_scanned_lsn = scanned_lsn;
|
||||||
|
|
||||||
if (recv_needed_recovery
|
|
||||||
|| (recv_is_from_backup && !recv_is_making_a_backup)) {
|
|
||||||
recv_scan_print_counter++;
|
|
||||||
|
|
||||||
if (finished || (recv_scan_print_counter % 80 == 0)) {
|
|
||||||
|
|
||||||
fprintf(stderr,
|
|
||||||
"InnoDB: Doing recovery: scanned up to"
|
|
||||||
" log sequence number " LSN_PF "\n",
|
|
||||||
*group_scanned_lsn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (more_data && !recv_sys->found_corrupt_log) {
|
if (more_data && !recv_sys->found_corrupt_log) {
|
||||||
/* Try to parse more log records */
|
/* Try to parse more log records */
|
||||||
|
|
||||||
@ -2976,7 +2912,7 @@ recv_scan_log_recs(
|
|||||||
log yet: they would be produced by ibuf
|
log yet: they would be produced by ibuf
|
||||||
operations */
|
operations */
|
||||||
|
|
||||||
recv_apply_hashed_log_recs(FALSE);
|
recv_apply_hashed_log_recs(false);
|
||||||
}
|
}
|
||||||
#endif /* !UNIV_HOTBACKUP */
|
#endif /* !UNIV_HOTBACKUP */
|
||||||
|
|
||||||
@ -3052,11 +2988,6 @@ recv_init_crash_recovery(void)
|
|||||||
|
|
||||||
recv_needed_recovery = TRUE;
|
recv_needed_recovery = TRUE;
|
||||||
|
|
||||||
ib_logf(IB_LOG_LEVEL_INFO, "Database was not shutdown normally!");
|
|
||||||
ib_logf(IB_LOG_LEVEL_INFO, "Starting crash recovery.");
|
|
||||||
ib_logf(IB_LOG_LEVEL_INFO,
|
|
||||||
"Reading tablespace information from the .ibd files...");
|
|
||||||
|
|
||||||
fil_load_single_table_tablespaces();
|
fil_load_single_table_tablespaces();
|
||||||
|
|
||||||
/* If we are using the doublewrite method, we will
|
/* If we are using the doublewrite method, we will
|
||||||
@ -3067,9 +2998,7 @@ recv_init_crash_recovery(void)
|
|||||||
if (srv_force_recovery < SRV_FORCE_NO_LOG_REDO) {
|
if (srv_force_recovery < SRV_FORCE_NO_LOG_REDO) {
|
||||||
|
|
||||||
ib_logf(IB_LOG_LEVEL_INFO,
|
ib_logf(IB_LOG_LEVEL_INFO,
|
||||||
"Restoring possible half-written data pages ");
|
"Restoring possible half-written data pages "
|
||||||
|
|
||||||
ib_logf(IB_LOG_LEVEL_INFO,
|
|
||||||
"from the doublewrite buffer...");
|
"from the doublewrite buffer...");
|
||||||
|
|
||||||
buf_dblwr_process();
|
buf_dblwr_process();
|
||||||
|
@ -2588,7 +2588,7 @@ files_checked:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This must precede recv_apply_hashed_log_recs(TRUE). */
|
/* This must precede recv_apply_hashed_log_recs(true). */
|
||||||
ib_bh = trx_sys_init_at_db_start();
|
ib_bh = trx_sys_init_at_db_start();
|
||||||
|
|
||||||
if (srv_force_recovery < SRV_FORCE_NO_LOG_REDO) {
|
if (srv_force_recovery < SRV_FORCE_NO_LOG_REDO) {
|
||||||
@ -2596,7 +2596,7 @@ files_checked:
|
|||||||
respective file pages, for the last batch of
|
respective file pages, for the last batch of
|
||||||
recv_group_scan_log_recs(). */
|
recv_group_scan_log_recs(). */
|
||||||
|
|
||||||
recv_apply_hashed_log_recs(TRUE);
|
recv_apply_hashed_log_recs(true);
|
||||||
DBUG_PRINT("ib_log", ("apply completed"));
|
DBUG_PRINT("ib_log", ("apply completed"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user