mirror of
https://github.com/MariaDB/server.git
synced 2025-07-27 18:02:13 +03:00
Fixed problem with auto-repair of MyISAM tables
Fixed bug in ISAM and MyISAM when updating from multiple-processes
This commit is contained in:
@ -28015,10 +28015,10 @@ Give a variable a value. @code{--help} lists variables.
|
|||||||
Only update the default database. This is useful for skipping updates to
|
Only update the default database. This is useful for skipping updates to
|
||||||
other database in the update log.
|
other database in the update log.
|
||||||
@cindex pager option
|
@cindex pager option
|
||||||
@item --pager[=...]
|
@item @code{--pager[=...]}
|
||||||
Output type. Default is your ENV variable PAGER. Valid pagers are less,
|
Output type. Default is your @code{ENV} variable @code{PAGER}. Valid
|
||||||
more, cat [> filename], etc. See interactive help (\h) also. This
|
pagers are less, more, cat [> filename], etc. See interactive help (\h)
|
||||||
option does not work in batch mode. Pager works only in UNIX.
|
also. This option does not work in batch mode. Pager works only in UNIX.
|
||||||
@cindex password option
|
@cindex password option
|
||||||
@item -p[password], --password[=...]
|
@item -p[password], --password[=...]
|
||||||
Password to use when connecting to server. If password is not given on
|
Password to use when connecting to server. If password is not given on
|
||||||
@ -28148,12 +28148,11 @@ mysql> select * from mails where length(txt) < 300 limit 300,1\G
|
|||||||
msg_nro: 3068
|
msg_nro: 3068
|
||||||
date: 2000-03-01 23:29:50
|
date: 2000-03-01 23:29:50
|
||||||
time_zone: +0200
|
time_zone: +0200
|
||||||
mail_from: Michael Widenius <monty@monty.pp.sci.fi>
|
mail_from: Monty
|
||||||
reply: monty@mysql.com
|
reply: monty@@no.spam.com
|
||||||
mail_to: "Thimble Smith" <tim@mysql.com>
|
mail_to: "Thimble Smith" <tim@@no.spam.com>
|
||||||
cc: mysql_all@mysql.com
|
|
||||||
sbj: UTF-8
|
sbj: UTF-8
|
||||||
txt: >>>>> "Thimble" == Thimble Smith <tim@mysql.com> writes:
|
txt: >>>>> "Thimble" == Thimble Smith writes:
|
||||||
|
|
||||||
Thimble> Hi. I think this is a good idea. Is anyone familiar with UTF-8
|
Thimble> Hi. I think this is a good idea. Is anyone familiar with UTF-8
|
||||||
Thimble> or Unicode? Otherwise I'll put this on my TODO list and see what
|
Thimble> or Unicode? Otherwise I'll put this on my TODO list and see what
|
||||||
@ -28166,8 +28165,6 @@ Monty
|
|||||||
file: inbox-jani-1
|
file: inbox-jani-1
|
||||||
hash: 190402944
|
hash: 190402944
|
||||||
1 row in set (0.09 sec)
|
1 row in set (0.09 sec)
|
||||||
|
|
||||||
mysql>
|
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
For logging, one can use the @code{tee} option. The @code{tee} can be
|
For logging, one can use the @code{tee} option. The @code{tee} can be
|
||||||
@ -38808,11 +38805,16 @@ though, so Version 3.23 is not released as a stable version yet.
|
|||||||
@appendixsubsec Changes in release 3.23.28
|
@appendixsubsec Changes in release 3.23.28
|
||||||
@itemize @bullet
|
@itemize @bullet
|
||||||
@item
|
@item
|
||||||
Fixed a major performance bug in the table locking code when you
|
Fixed crash when automatic repair of @code{MyISAM} table failed.
|
||||||
constantly had a LOT of @code{SELECT} running on a table on which you
|
@item
|
||||||
also did a lot of @code{UPDATE} and @code{INSERT}. The symptom was that
|
Fixed a major performance bug in the table locking code when one
|
||||||
the @code{UPDATE} and @code{INSERT} queries was locked a long time
|
constantly had a LOT of @code{SELECT}, @code{UPDATE} and @code{INSERT}
|
||||||
while @code{SELECT} statements where executed without locks.
|
statements running. The symptom was that the @code{UPDATE} and
|
||||||
|
@code{INSERT} queries was locked a long time while new @code{SELECT}
|
||||||
|
statements where executed without locks.
|
||||||
|
@item
|
||||||
|
When reading options_files with @code{mysql_options()} the
|
||||||
|
@code{return-found-rows} option was ignored.
|
||||||
@item
|
@item
|
||||||
One can now specify @code{interactive-timeout} in the option file that
|
One can now specify @code{interactive-timeout} in the option file that
|
||||||
is read by @code{mysql_options()}. This makes it possible to force
|
is read by @code{mysql_options()}. This makes it possible to force
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
#include <my_pthread.h> /* because of signal() */
|
#include <my_pthread.h> /* because of signal() */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define ADMIN_VERSION "8.11"
|
#define ADMIN_VERSION "8.12"
|
||||||
#define MAX_MYSQL_VAR 64
|
#define MAX_MYSQL_VAR 64
|
||||||
#define MAX_TIME_TO_WAIT 3600 /* Wait for shutdown */
|
#define MAX_TIME_TO_WAIT 3600 /* Wait for shutdown */
|
||||||
#define MAX_TRUNC_LENGTH 3
|
#define MAX_TRUNC_LENGTH 3
|
||||||
|
@ -66,6 +66,7 @@ static HA_ERRORS ha_errlist[]=
|
|||||||
{ 142,"Unknown character set used"},
|
{ 142,"Unknown character set used"},
|
||||||
{ 143,"Conflicting table definition between MERGE and mapped table"},
|
{ 143,"Conflicting table definition between MERGE and mapped table"},
|
||||||
{ 144,"Table is crashed and last repair failed"},
|
{ 144,"Table is crashed and last repair failed"},
|
||||||
|
{ 145,"Table was marked as crashed and should be repaired"},
|
||||||
{ 0,NullS },
|
{ 0,NullS },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -207,6 +207,7 @@ enum ha_base_keytype {
|
|||||||
#define HA_ERR_UNKNOWN_CHARSET 142 /* Can't open charset */
|
#define HA_ERR_UNKNOWN_CHARSET 142 /* Can't open charset */
|
||||||
#define HA_ERR_WRONG_TABLE_DEF 143
|
#define HA_ERR_WRONG_TABLE_DEF 143
|
||||||
#define HA_ERR_CRASHED_ON_REPAIR 144 /* Last (automatic?) repair failed */
|
#define HA_ERR_CRASHED_ON_REPAIR 144 /* Last (automatic?) repair failed */
|
||||||
|
#define HA_ERR_CRASHED_ON_USAGE 145 /* Table must be repaired */
|
||||||
|
|
||||||
/* Other constants */
|
/* Other constants */
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
int nisam_rnext(N_INFO *info, byte *buf, int inx)
|
int nisam_rnext(N_INFO *info, byte *buf, int inx)
|
||||||
{
|
{
|
||||||
int error;
|
int error,changed;
|
||||||
uint flag;
|
uint flag;
|
||||||
DBUG_ENTER("nisam_rnext");
|
DBUG_ENTER("nisam_rnext");
|
||||||
|
|
||||||
@ -40,10 +40,11 @@ int nisam_rnext(N_INFO *info, byte *buf, int inx)
|
|||||||
#ifndef NO_LOCKING
|
#ifndef NO_LOCKING
|
||||||
if (_nisam_readinfo(info,F_RDLCK,1)) DBUG_RETURN(-1);
|
if (_nisam_readinfo(info,F_RDLCK,1)) DBUG_RETURN(-1);
|
||||||
#endif
|
#endif
|
||||||
|
changed=_nisam_test_if_changed(info);
|
||||||
if (!flag)
|
if (!flag)
|
||||||
error=_nisam_search_first(info,info->s->keyinfo+inx,
|
error=_nisam_search_first(info,info->s->keyinfo+inx,
|
||||||
info->s->state.key_root[inx]);
|
info->s->state.key_root[inx]);
|
||||||
else if (_nisam_test_if_changed(info) == 0)
|
else if (!changed)
|
||||||
error=_nisam_search_next(info,info->s->keyinfo+inx,info->lastkey,flag,
|
error=_nisam_search_next(info,info->s->keyinfo+inx,info->lastkey,flag,
|
||||||
info->s->state.key_root[inx]);
|
info->s->state.key_root[inx]);
|
||||||
else
|
else
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
int nisam_rprev(N_INFO *info, byte *buf, int inx)
|
int nisam_rprev(N_INFO *info, byte *buf, int inx)
|
||||||
{
|
{
|
||||||
int error;
|
int error,changed;
|
||||||
register uint flag;
|
register uint flag;
|
||||||
DBUG_ENTER("nisam_rprev");
|
DBUG_ENTER("nisam_rprev");
|
||||||
|
|
||||||
@ -40,9 +40,10 @@ int nisam_rprev(N_INFO *info, byte *buf, int inx)
|
|||||||
#ifndef NO_LOCKING
|
#ifndef NO_LOCKING
|
||||||
if (_nisam_readinfo(info,F_RDLCK,1)) DBUG_RETURN(-1);
|
if (_nisam_readinfo(info,F_RDLCK,1)) DBUG_RETURN(-1);
|
||||||
#endif
|
#endif
|
||||||
|
changed=_nisam_test_if_changed(info);
|
||||||
if (!flag)
|
if (!flag)
|
||||||
error=_nisam_search_last(info,info->s->keyinfo+inx,info->s->state.key_root[inx]);
|
error=_nisam_search_last(info,info->s->keyinfo+inx,info->s->state.key_root[inx]);
|
||||||
else if (_nisam_test_if_changed(info) == 0)
|
else if (!changed)
|
||||||
error=_nisam_search_next(info,info->s->keyinfo+inx,info->lastkey,flag,
|
error=_nisam_search_next(info,info->s->keyinfo+inx,info->lastkey,flag,
|
||||||
info->s->state.key_root[inx]);
|
info->s->state.key_root[inx]);
|
||||||
else
|
else
|
||||||
|
@ -1450,10 +1450,7 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
|
|||||||
mysql->unix_socket=0;
|
mysql->unix_socket=0;
|
||||||
strmov(mysql->server_version,(char*) net->read_pos+1);
|
strmov(mysql->server_version,(char*) net->read_pos+1);
|
||||||
mysql->port=port;
|
mysql->port=port;
|
||||||
mysql->client_flag=client_flag | mysql->options.client_flag;
|
client_flag|=mysql->options.client_flag;
|
||||||
DBUG_PRINT("info",("Server version = '%s' capabilites: %ld status: %d",
|
|
||||||
mysql->server_version,mysql->server_capabilities,
|
|
||||||
mysql->server_status));
|
|
||||||
|
|
||||||
/* Send client information for access check */
|
/* Send client information for access check */
|
||||||
client_flag|=CLIENT_CAPABILITIES;
|
client_flag|=CLIENT_CAPABILITIES;
|
||||||
@ -1510,6 +1507,10 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
|
|||||||
}
|
}
|
||||||
#endif /* HAVE_OPENSSL */
|
#endif /* HAVE_OPENSSL */
|
||||||
|
|
||||||
|
DBUG_PRINT("info",("Server version = '%s' capabilites: %ld status: %d client_flag: %d",
|
||||||
|
mysql->server_version,mysql->server_capabilities,
|
||||||
|
mysql->server_status, client_flag));
|
||||||
|
|
||||||
int3store(buff+2,max_allowed_packet);
|
int3store(buff+2,max_allowed_packet);
|
||||||
if (user && user[0])
|
if (user && user[0])
|
||||||
strmake(buff+5,user,32); /* Max user name */
|
strmake(buff+5,user,32); /* Max user name */
|
||||||
|
@ -382,6 +382,7 @@ int _mi_test_if_changed(register MI_INFO *info)
|
|||||||
share->state.unique != info->last_unique ||
|
share->state.unique != info->last_unique ||
|
||||||
share->state.update_count != info->last_loop)
|
share->state.update_count != info->last_loop)
|
||||||
{ /* Keyfile has changed */
|
{ /* Keyfile has changed */
|
||||||
|
DBUG_PRINT("info",("index file changed"));
|
||||||
if (share->state.process != share->this_process)
|
if (share->state.process != share->this_process)
|
||||||
VOID(flush_key_blocks(share->kfile,FLUSH_RELEASE));
|
VOID(flush_key_blocks(share->kfile,FLUSH_RELEASE));
|
||||||
share->last_process=share->state.process;
|
share->last_process=share->state.process;
|
||||||
|
@ -182,7 +182,7 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
|
|||||||
{
|
{
|
||||||
DBUG_PRINT("error",("Table is marked as crashed"));
|
DBUG_PRINT("error",("Table is marked as crashed"));
|
||||||
my_errno=((share->state.changed & STATE_CRASHED_ON_REPAIR) ?
|
my_errno=((share->state.changed & STATE_CRASHED_ON_REPAIR) ?
|
||||||
HA_ERR_CRASHED_ON_REPAIR : HA_ERR_CRASHED);
|
HA_ERR_CRASHED_ON_REPAIR : HA_ERR_CRASHED_ON_USAGE);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
/* Correct max_file_length based on length of sizeof_t */
|
/* Correct max_file_length based on length of sizeof_t */
|
||||||
@ -732,7 +732,8 @@ char *mi_state_info_read(char *ptr, MI_STATE_INFO *state)
|
|||||||
state->process= mi_uint4korr(ptr); ptr +=4;
|
state->process= mi_uint4korr(ptr); ptr +=4;
|
||||||
state->unique = mi_uint4korr(ptr); ptr +=4;
|
state->unique = mi_uint4korr(ptr); ptr +=4;
|
||||||
state->status = mi_uint4korr(ptr); ptr +=4;
|
state->status = mi_uint4korr(ptr); ptr +=4;
|
||||||
ptr +=4; /* extra */
|
state->update_count=mi_uint4korr(ptr); ptr +=4;
|
||||||
|
|
||||||
for (i=0; i < keys; i++)
|
for (i=0; i < keys; i++)
|
||||||
{
|
{
|
||||||
state->key_root[i]= mi_sizekorr(ptr); ptr +=8;
|
state->key_root[i]= mi_sizekorr(ptr); ptr +=8;
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
int mi_rnext(MI_INFO *info, byte *buf, int inx)
|
int mi_rnext(MI_INFO *info, byte *buf, int inx)
|
||||||
{
|
{
|
||||||
int error;
|
int error,changed;
|
||||||
uint flag;
|
uint flag;
|
||||||
DBUG_ENTER("mi_rnext");
|
DBUG_ENTER("mi_rnext");
|
||||||
|
|
||||||
@ -39,10 +39,13 @@ int mi_rnext(MI_INFO *info, byte *buf, int inx)
|
|||||||
DBUG_RETURN(my_errno);
|
DBUG_RETURN(my_errno);
|
||||||
if (info->s->concurrent_insert)
|
if (info->s->concurrent_insert)
|
||||||
rw_rdlock(&info->s->key_root_lock[inx]);
|
rw_rdlock(&info->s->key_root_lock[inx]);
|
||||||
|
changed=_mi_test_if_changed(info);
|
||||||
if (!flag)
|
if (!flag)
|
||||||
|
{
|
||||||
error=_mi_search_first(info,info->s->keyinfo+inx,
|
error=_mi_search_first(info,info->s->keyinfo+inx,
|
||||||
info->s->state.key_root[inx]);
|
info->s->state.key_root[inx]);
|
||||||
else if (_mi_test_if_changed(info) == 0)
|
}
|
||||||
|
else if (!changed)
|
||||||
error=_mi_search_next(info,info->s->keyinfo+inx,info->lastkey,
|
error=_mi_search_next(info,info->s->keyinfo+inx,info->lastkey,
|
||||||
info->lastkey_length,flag,
|
info->lastkey_length,flag,
|
||||||
info->s->state.key_root[inx]);
|
info->s->state.key_root[inx]);
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
int mi_rprev(MI_INFO *info, byte *buf, int inx)
|
int mi_rprev(MI_INFO *info, byte *buf, int inx)
|
||||||
{
|
{
|
||||||
int error;
|
int error,changed;
|
||||||
register uint flag;
|
register uint flag;
|
||||||
MYISAM_SHARE *share=info->s;
|
MYISAM_SHARE *share=info->s;
|
||||||
DBUG_ENTER("mi_rprev");
|
DBUG_ENTER("mi_rprev");
|
||||||
@ -38,12 +38,13 @@ int mi_rprev(MI_INFO *info, byte *buf, int inx)
|
|||||||
|
|
||||||
if (_mi_readinfo(info,F_RDLCK,1))
|
if (_mi_readinfo(info,F_RDLCK,1))
|
||||||
DBUG_RETURN(my_errno);
|
DBUG_RETURN(my_errno);
|
||||||
|
changed=_mi_test_if_changed(info);
|
||||||
if (share->concurrent_insert)
|
if (share->concurrent_insert)
|
||||||
rw_rdlock(&share->key_root_lock[inx]);
|
rw_rdlock(&share->key_root_lock[inx]);
|
||||||
if (!flag)
|
if (!flag)
|
||||||
error=_mi_search_last(info, share->keyinfo+inx,
|
error=_mi_search_last(info, share->keyinfo+inx,
|
||||||
share->state.key_root[inx]);
|
share->state.key_root[inx]);
|
||||||
else if (_mi_test_if_changed(info) == 0)
|
else if (!changed)
|
||||||
error=_mi_search_next(info,share->keyinfo+inx,info->lastkey,
|
error=_mi_search_next(info,share->keyinfo+inx,info->lastkey,
|
||||||
info->lastkey_length,flag,
|
info->lastkey_length,flag,
|
||||||
share->state.key_root[inx]);
|
share->state.key_root[inx]);
|
||||||
|
@ -196,7 +196,7 @@ static struct option long_options[] =
|
|||||||
|
|
||||||
static void print_version(void)
|
static void print_version(void)
|
||||||
{
|
{
|
||||||
printf("%s Ver 1.36 for %s at %s\n",my_progname,SYSTEM_TYPE,
|
printf("%s Ver 1.37 for %s at %s\n",my_progname,SYSTEM_TYPE,
|
||||||
MACHINE_TYPE);
|
MACHINE_TYPE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -502,8 +502,15 @@ static int myisamchk(MI_CHECK *param, my_string filename)
|
|||||||
param->error_printed=1;
|
param->error_printed=1;
|
||||||
switch (my_errno) {
|
switch (my_errno) {
|
||||||
case HA_ERR_CRASHED:
|
case HA_ERR_CRASHED:
|
||||||
|
case HA_ERR_WRONG_TABLE_DEF:
|
||||||
mi_check_print_error(param,"'%s' is not a MyISAM-table",filename);
|
mi_check_print_error(param,"'%s' is not a MyISAM-table",filename);
|
||||||
break;
|
break;
|
||||||
|
case HA_ERR_CRASHED_ON_USAGE:
|
||||||
|
mi_check_print_error(param,"'%s' is marked as crashed",filename);
|
||||||
|
break;
|
||||||
|
case HA_ERR_CRASHED_ON_REPAIR:
|
||||||
|
mi_check_print_error(param,"'%s' is marked as crashed after last repair",filename);
|
||||||
|
break;
|
||||||
case HA_ERR_OLD_FILE:
|
case HA_ERR_OLD_FILE:
|
||||||
mi_check_print_error(param,"'%s' is a old type of MyISAM-table", filename);
|
mi_check_print_error(param,"'%s' is a old type of MyISAM-table", filename);
|
||||||
break;
|
break;
|
||||||
|
@ -1162,25 +1162,26 @@ static int open_unireg_entry(THD *thd, TABLE *entry, const char *db,
|
|||||||
HA_TRY_READ_ONLY),
|
HA_TRY_READ_ONLY),
|
||||||
READ_KEYINFO | COMPUTE_TYPES | EXTRA_RECORD,
|
READ_KEYINFO | COMPUTE_TYPES | EXTRA_RECORD,
|
||||||
ha_open_options | HA_OPEN_FOR_REPAIR,
|
ha_open_options | HA_OPEN_FOR_REPAIR,
|
||||||
entry) ||
|
entry) || ! entry->file ||
|
||||||
(entry->file->is_crashed() && entry->file->check_and_repair(thd)))
|
(entry->file->is_crashed() && entry->file->check_and_repair(thd)))
|
||||||
{
|
{
|
||||||
/* Give right error message */
|
/* Give right error message */
|
||||||
thd->net.last_error[0]=0;
|
thd->net.last_error[0]=0;
|
||||||
thd->net.last_errno=0;
|
thd->net.last_errno=0;
|
||||||
entry->file->print_error(HA_ERR_CRASHED,MYF(0));
|
my_error(ER_NOT_KEYFILE, MYF(0), name, my_errno);
|
||||||
sql_print_error("Error: Couldn't repair table: %s.%s",db,name);
|
sql_print_error("Error: Couldn't repair table: %s.%s",db,name);
|
||||||
closefrm(entry);
|
if (entry->file)
|
||||||
|
closefrm(entry);
|
||||||
error=1;
|
error=1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
thd->net.last_error[0]=0; // Clear error message
|
thd->net.last_error[0]=0; // Clear error message
|
||||||
thd->net.last_errno=0;
|
thd->net.last_errno=0;
|
||||||
}
|
}
|
||||||
unlock_table_name(thd,&table_list);
|
|
||||||
if (locked)
|
if (locked)
|
||||||
pthread_mutex_lock(&LOCK_open); // Get back original lock
|
pthread_mutex_lock(&LOCK_open); // Get back original lock
|
||||||
|
unlock_table_name(thd,&table_list);
|
||||||
if (error)
|
if (error)
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
@ -542,7 +542,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
|
|||||||
HA_OPEN_IGNORE_IF_LOCKED) | ha_open_flags))))
|
HA_OPEN_IGNORE_IF_LOCKED) | ha_open_flags))))
|
||||||
{
|
{
|
||||||
/* Set a flag if the table is crashed and it can be auto. repaired */
|
/* Set a flag if the table is crashed and it can be auto. repaired */
|
||||||
outparam->crashed=(err == HA_ERR_CRASHED &&
|
outparam->crashed=(err == HA_ERR_CRASHED_ON_USAGE &&
|
||||||
outparam->file->auto_repair() &&
|
outparam->file->auto_repair() &&
|
||||||
!(ha_open_flags & HA_OPEN_FOR_REPAIR));
|
!(ha_open_flags & HA_OPEN_FOR_REPAIR));
|
||||||
goto err_not_open; /* purecov: inspected */
|
goto err_not_open; /* purecov: inspected */
|
||||||
@ -569,6 +569,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
|
|||||||
frm_error(error,outparam,name,ME_ERROR+ME_WAITTANG);
|
frm_error(error,outparam,name,ME_ERROR+ME_WAITTANG);
|
||||||
delete outparam->file;
|
delete outparam->file;
|
||||||
outparam->file=0; // For easyer errorchecking
|
outparam->file=0; // For easyer errorchecking
|
||||||
|
outparam->db_stat=0;
|
||||||
free_root(&outparam->mem_root,MYF(0));
|
free_root(&outparam->mem_root,MYF(0));
|
||||||
my_free(outparam->table_name,MYF(MY_ALLOW_ZERO_PTR));
|
my_free(outparam->table_name,MYF(MY_ALLOW_ZERO_PTR));
|
||||||
DBUG_RETURN (error);
|
DBUG_RETURN (error);
|
||||||
|
Reference in New Issue
Block a user