Commit 7c3d3f19 authored by Anil Toshniwal's avatar Anil Toshniwal

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).
parent 1b199c14
/* 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" { ...@@ -33,7 +33,7 @@ extern "C" {
#endif #endif
#include "my_compare.h" #include "my_compare.h"
#include <mysql/plugin.h> #include <mysql/plugin.h>
#include <my_check_opt.h>
/* /*
Limit max keys according to HA_MAX_POSSIBLE_KEY Limit max keys according to HA_MAX_POSSIBLE_KEY
*/ */
...@@ -311,51 +311,6 @@ extern uint mi_get_pointer_length(ulonglong file_length, uint def); ...@@ -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_REPAIR 1 /* equivalent to myisamchk -r */
#define MYISAMCHK_VERIFY 2 /* Verify, run repair if failure */ #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 Flags used by myisamchk.c or/and ha_myisam.cc that are NOT passed
to mi_check.c follows: to mi_check.c follows:
......
...@@ -4485,6 +4485,8 @@ dict_update_statistics( ...@@ -4485,6 +4485,8 @@ dict_update_statistics(
dict_index_t* index; dict_index_t* index;
ulint sum_of_index_sizes = 0; ulint sum_of_index_sizes = 0;
DBUG_EXECUTE_IF("skip_innodb_statistics", return;);
if (table->ibd_file_missing) { if (table->ibd_file_missing) {
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fprintf(stderr, fprintf(stderr,
......
...@@ -53,6 +53,7 @@ this program; if not, write to the Free Software Foundation, Inc., ...@@ -53,6 +53,7 @@ this program; if not, write to the Free Software Foundation, Inc.,
#include <mysql/innodb_priv.h> #include <mysql/innodb_priv.h>
#include <mysql/psi/psi.h> #include <mysql/psi/psi.h>
#include <my_sys.h> #include <my_sys.h>
#include <my_check_opt.h>
/** @file ha_innodb.cc */ /** @file ha_innodb.cc */
...@@ -8466,8 +8467,7 @@ int ...@@ -8466,8 +8467,7 @@ int
ha_innobase::check( ha_innobase::check(
/*===============*/ /*===============*/
THD* thd, /*!< in: user thread handle */ THD* thd, /*!< in: user thread handle */
HA_CHECK_OPT* check_opt) /*!< in: check options, currently HA_CHECK_OPT* check_opt) /*!< in: check options */
ignored */
{ {
dict_index_t* index; dict_index_t* index;
ulint n_rows; ulint n_rows;
...@@ -8524,11 +8524,6 @@ ha_innobase::check( ...@@ -8524,11 +8524,6 @@ ha_innobase::check(
do additional check */ do additional check */
prebuilt->table->corrupted = FALSE; 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); for (index = dict_table_get_first_index(prebuilt->table);
index != NULL; index != NULL;
index = dict_table_get_next_index(index)) { index = dict_table_get_next_index(index)) {
...@@ -8541,20 +8536,41 @@ ha_innobase::check( ...@@ -8541,20 +8536,41 @@ ha_innobase::check(
/* If this is an index being created, break */ /* If this is an index being created, break */
if (*index->name == TEMP_INDEX_PREFIX) { if (*index->name == TEMP_INDEX_PREFIX) {
break; continue;
} else if (!btr_validate_index(index, prebuilt->trx)) { }
is_ok = FALSE; 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( innobase_format_name(
index_name, sizeof index_name, index_name, sizeof index_name,
prebuilt->index->name, TRUE); 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);
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, continue;
ER_NOT_KEYFILE, }
"InnoDB: The B-tree of"
" index %s is corrupted.",
index_name);
continue;
} }
/* Instead of invoking change_active_index(), set up /* Instead of invoking change_active_index(), set up
...@@ -8658,21 +8674,17 @@ ha_innobase::check( ...@@ -8658,21 +8674,17 @@ ha_innobase::check(
/* Restore the original isolation level */ /* Restore the original isolation level */
prebuilt->trx->isolation_level = old_isolation_level; prebuilt->trx->isolation_level = old_isolation_level;
/* We validate also the whole adaptive hash index for all tables #if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG
at every CHECK TABLE */ /* 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, push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
ER_NOT_KEYFILE, ER_NOT_KEYFILE,
"InnoDB: The adaptive hash index is corrupted."); "InnoDB: The adaptive hash index is corrupted.");
is_ok = FALSE; is_ok = FALSE;
} }
#endif /* defined UNIV_AHI_DEBUG || defined UNIV_DEBUG */
/* 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);
prebuilt->trx->op_info = ""; prebuilt->trx->op_info = "";
if (thd_killed(user_thd)) { if (thd_killed(user_thd)) {
my_error(ER_QUERY_INTERRUPTED, MYF(0)); my_error(ER_QUERY_INTERRUPTED, MYF(0));
......
...@@ -188,8 +188,6 @@ UNIV_INTERN ...@@ -188,8 +188,6 @@ UNIV_INTERN
ibool ibool
btr_search_validate(void); btr_search_validate(void);
/*======================*/ /*======================*/
#else
# define btr_search_validate() TRUE
#endif /* defined UNIV_AHI_DEBUG || defined UNIV_DEBUG */ #endif /* defined UNIV_AHI_DEBUG || defined UNIV_DEBUG */
/** The search info struct in an index */ /** The search info struct in an index */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment