Bug#17513737 INTRODUCE CHECK TABLE...QUICK
--Implemented CHECK TABLE...QUICK. Introduce CHECK TABLE...QUICK that would skip the btr_validate_index() and btr_search_validate() call, and count the no. of records in each index. Approved by Marko and Kevin. (rb#3567).
This commit is contained in:
parent
b3d390959b
commit
ccfd3a0e75
69
include/my_check_opt.h
Normal file
69
include/my_check_opt.h
Normal file
@ -0,0 +1,69 @@
|
||||
/* Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
|
||||
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 Foundation; version 2 of the License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */
|
||||
|
||||
#ifndef _my_check_opt_h
|
||||
#define _my_check_opt_h
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
All given definitions needed for MyISAM storage engine:
|
||||
myisamchk.c or/and ha_myisam.cc or/and micheck.c
|
||||
Some definitions are needed by the MySQL parser.
|
||||
*/
|
||||
|
||||
#define T_AUTO_INC (1UL << 0)
|
||||
#define T_AUTO_REPAIR (1UL << 1)
|
||||
#define T_BACKUP_DATA (1UL << 2)
|
||||
#define T_CALC_CHECKSUM (1UL << 3)
|
||||
#define T_CHECK (1UL << 4)
|
||||
#define T_CHECK_ONLY_CHANGED (1UL << 5)
|
||||
#define T_CREATE_MISSING_KEYS (1UL << 6)
|
||||
#define T_DESCRIPT (1UL << 7)
|
||||
#define T_DONT_CHECK_CHECKSUM (1UL << 8)
|
||||
#define T_EXTEND (1UL << 9)
|
||||
#define T_FAST (1UL << 10)
|
||||
#define T_FORCE_CREATE (1UL << 11)
|
||||
#define T_FORCE_UNIQUENESS (1UL << 12)
|
||||
#define T_INFO (1UL << 13)
|
||||
/** CHECK TABLE...MEDIUM (the default) */
|
||||
#define T_MEDIUM (1UL << 14)
|
||||
/** CHECK TABLE...QUICK */
|
||||
#define T_QUICK (1UL << 15)
|
||||
#define T_READONLY (1UL << 16)
|
||||
#define T_REP (1UL << 17)
|
||||
#define T_REP_BY_SORT (1UL << 18)
|
||||
#define T_REP_PARALLEL (1UL << 19)
|
||||
#define T_RETRY_WITHOUT_QUICK (1UL << 20)
|
||||
#define T_SAFE_REPAIR (1UL << 21)
|
||||
#define T_SILENT (1UL << 22)
|
||||
#define T_SORT_INDEX (1UL << 23)
|
||||
#define T_SORT_RECORDS (1UL << 24)
|
||||
#define T_STATISTICS (1UL << 25)
|
||||
#define T_UNPACK (1UL << 26)
|
||||
#define T_UPDATE_STATE (1UL << 27)
|
||||
#define T_VERBOSE (1UL << 28)
|
||||
#define T_VERY_SILENT (1UL << 29)
|
||||
#define T_WAIT_FOREVER (1UL << 30)
|
||||
#define T_WRITE_LOOP (1UL << 31)
|
||||
|
||||
#define T_REP_ANY (T_REP | T_REP_BY_SORT | T_REP_PARALLEL)
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
@ -33,7 +33,7 @@ extern "C" {
|
||||
#endif
|
||||
#include "my_compare.h"
|
||||
#include <mysql/plugin.h>
|
||||
|
||||
#include <my_check_opt.h>
|
||||
/*
|
||||
Limit max keys according to HA_MAX_POSSIBLE_KEY
|
||||
*/
|
||||
@ -311,51 +311,6 @@ extern uint mi_get_pointer_length(ulonglong file_length, uint def);
|
||||
#define MYISAMCHK_REPAIR 1 /* equivalent to myisamchk -r */
|
||||
#define MYISAMCHK_VERIFY 2 /* Verify, run repair if failure */
|
||||
|
||||
/*
|
||||
Definitions needed for myisamchk.c
|
||||
|
||||
Entries marked as "QQ to be removed" are NOT used to
|
||||
pass check/repair options to mi_check.c. They are used
|
||||
internally by myisamchk.c or/and ha_myisam.cc and should NOT
|
||||
be stored together with other flags. They should be removed
|
||||
from the following list to make addition of new flags possible.
|
||||
*/
|
||||
|
||||
#define T_AUTO_INC 1
|
||||
#define T_AUTO_REPAIR 2 /* QQ to be removed */
|
||||
#define T_BACKUP_DATA 4
|
||||
#define T_CALC_CHECKSUM 8
|
||||
#define T_CHECK 16 /* QQ to be removed */
|
||||
#define T_CHECK_ONLY_CHANGED 32 /* QQ to be removed */
|
||||
#define T_CREATE_MISSING_KEYS 64
|
||||
#define T_DESCRIPT 128
|
||||
#define T_DONT_CHECK_CHECKSUM 256
|
||||
#define T_EXTEND 512
|
||||
#define T_FAST (1L << 10) /* QQ to be removed */
|
||||
#define T_FORCE_CREATE (1L << 11) /* QQ to be removed */
|
||||
#define T_FORCE_UNIQUENESS (1L << 12)
|
||||
#define T_INFO (1L << 13)
|
||||
#define T_MEDIUM (1L << 14)
|
||||
#define T_QUICK (1L << 15) /* QQ to be removed */
|
||||
#define T_READONLY (1L << 16) /* QQ to be removed */
|
||||
#define T_REP (1L << 17)
|
||||
#define T_REP_BY_SORT (1L << 18) /* QQ to be removed */
|
||||
#define T_REP_PARALLEL (1L << 19) /* QQ to be removed */
|
||||
#define T_RETRY_WITHOUT_QUICK (1L << 20)
|
||||
#define T_SAFE_REPAIR (1L << 21)
|
||||
#define T_SILENT (1L << 22)
|
||||
#define T_SORT_INDEX (1L << 23) /* QQ to be removed */
|
||||
#define T_SORT_RECORDS (1L << 24) /* QQ to be removed */
|
||||
#define T_STATISTICS (1L << 25)
|
||||
#define T_UNPACK (1L << 26)
|
||||
#define T_UPDATE_STATE (1L << 27)
|
||||
#define T_VERBOSE (1L << 28)
|
||||
#define T_VERY_SILENT (1L << 29)
|
||||
#define T_WAIT_FOREVER (1L << 30)
|
||||
#define T_WRITE_LOOP ((ulong) 1L << 31)
|
||||
|
||||
#define T_REP_ANY (T_REP | T_REP_BY_SORT | T_REP_PARALLEL)
|
||||
|
||||
/*
|
||||
Flags used by myisamchk.c or/and ha_myisam.cc that are NOT passed
|
||||
to mi_check.c follows:
|
||||
|
@ -4485,6 +4485,8 @@ dict_update_statistics(
|
||||
dict_index_t* index;
|
||||
ulint sum_of_index_sizes = 0;
|
||||
|
||||
DBUG_EXECUTE_IF("skip_innodb_statistics", return;);
|
||||
|
||||
if (table->ibd_file_missing) {
|
||||
ut_print_timestamp(stderr);
|
||||
fprintf(stderr,
|
||||
|
@ -53,6 +53,7 @@ this program; if not, write to the Free Software Foundation, Inc.,
|
||||
#include <mysql/innodb_priv.h>
|
||||
#include <mysql/psi/psi.h>
|
||||
#include <my_sys.h>
|
||||
#include <my_check_opt.h>
|
||||
|
||||
/** @file ha_innodb.cc */
|
||||
|
||||
@ -8466,8 +8467,7 @@ int
|
||||
ha_innobase::check(
|
||||
/*===============*/
|
||||
THD* thd, /*!< in: user thread handle */
|
||||
HA_CHECK_OPT* check_opt) /*!< in: check options, currently
|
||||
ignored */
|
||||
HA_CHECK_OPT* check_opt) /*!< in: check options */
|
||||
{
|
||||
dict_index_t* index;
|
||||
ulint n_rows;
|
||||
@ -8524,11 +8524,6 @@ ha_innobase::check(
|
||||
do additional check */
|
||||
prebuilt->table->corrupted = FALSE;
|
||||
|
||||
/* Enlarge the fatal lock wait timeout during CHECK TABLE. */
|
||||
mutex_enter(&kernel_mutex);
|
||||
srv_fatal_semaphore_wait_threshold += SRV_SEMAPHORE_WAIT_EXTENSION;
|
||||
mutex_exit(&kernel_mutex);
|
||||
|
||||
for (index = dict_table_get_first_index(prebuilt->table);
|
||||
index != NULL;
|
||||
index = dict_table_get_next_index(index)) {
|
||||
@ -8541,21 +8536,42 @@ ha_innobase::check(
|
||||
|
||||
/* If this is an index being created, break */
|
||||
if (*index->name == TEMP_INDEX_PREFIX) {
|
||||
break;
|
||||
} else if (!btr_validate_index(index, prebuilt->trx)) {
|
||||
is_ok = FALSE;
|
||||
|
||||
innobase_format_name(
|
||||
index_name, sizeof index_name,
|
||||
prebuilt->index->name, TRUE);
|
||||
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_NOT_KEYFILE,
|
||||
"InnoDB: The B-tree of"
|
||||
" index %s is corrupted.",
|
||||
index_name);
|
||||
continue;
|
||||
}
|
||||
if (!(check_opt->flags & T_QUICK)) {
|
||||
/* Enlarge the fatal lock wait timeout during
|
||||
CHECK TABLE. */
|
||||
mutex_enter(&kernel_mutex);
|
||||
srv_fatal_semaphore_wait_threshold +=
|
||||
SRV_SEMAPHORE_WAIT_EXTENSION;
|
||||
mutex_exit(&kernel_mutex);
|
||||
|
||||
ibool valid = TRUE;
|
||||
valid = btr_validate_index(index, prebuilt->trx);
|
||||
|
||||
/* Restore the fatal lock wait timeout after
|
||||
CHECK TABLE. */
|
||||
mutex_enter(&kernel_mutex);
|
||||
srv_fatal_semaphore_wait_threshold -=
|
||||
SRV_SEMAPHORE_WAIT_EXTENSION;
|
||||
mutex_exit(&kernel_mutex);
|
||||
|
||||
if (!valid) {
|
||||
is_ok = FALSE;
|
||||
|
||||
innobase_format_name(
|
||||
index_name, sizeof index_name,
|
||||
index->name, TRUE);
|
||||
push_warning_printf(thd,
|
||||
MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_NOT_KEYFILE,
|
||||
"InnoDB: The B-tree of"
|
||||
" index %s is corrupted.",
|
||||
index_name);
|
||||
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/* Instead of invoking change_active_index(), set up
|
||||
a dummy template for non-locking reads, disabling
|
||||
@ -8658,21 +8674,17 @@ ha_innobase::check(
|
||||
/* Restore the original isolation level */
|
||||
prebuilt->trx->isolation_level = old_isolation_level;
|
||||
|
||||
/* We validate also the whole adaptive hash index for all tables
|
||||
at every CHECK TABLE */
|
||||
#if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG
|
||||
/* We validate the whole adaptive hash index for all tables
|
||||
at every CHECK TABLE only when QUICK flag is not present. */
|
||||
|
||||
if (!btr_search_validate()) {
|
||||
if (!(check_opt->flags & T_QUICK) && !btr_search_validate()) {
|
||||
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_NOT_KEYFILE,
|
||||
"InnoDB: The adaptive hash index is corrupted.");
|
||||
is_ok = FALSE;
|
||||
}
|
||||
|
||||
/* Restore the fatal lock wait timeout after CHECK TABLE. */
|
||||
mutex_enter(&kernel_mutex);
|
||||
srv_fatal_semaphore_wait_threshold -= SRV_SEMAPHORE_WAIT_EXTENSION;
|
||||
mutex_exit(&kernel_mutex);
|
||||
|
||||
#endif /* defined UNIV_AHI_DEBUG || defined UNIV_DEBUG */
|
||||
prebuilt->trx->op_info = "";
|
||||
if (thd_killed(user_thd)) {
|
||||
my_error(ER_QUERY_INTERRUPTED, MYF(0));
|
||||
|
@ -188,8 +188,6 @@ UNIV_INTERN
|
||||
ibool
|
||||
btr_search_validate(void);
|
||||
/*======================*/
|
||||
#else
|
||||
# define btr_search_validate() TRUE
|
||||
#endif /* defined UNIV_AHI_DEBUG || defined UNIV_DEBUG */
|
||||
|
||||
/** The search info struct in an index */
|
||||
|
Loading…
x
Reference in New Issue
Block a user