REPAIR [LOCAL | NO_WRITE_TO_BINLOG] TABLE
tbl_name [, tbl_name] ... [QUICK] [EXTENDED] [USE_FRM]
REPAIR TABLE repairs a possibly corrupted
table. By default, it has the same effect as
myisamchk --recover
tbl_name. REPAIR
TABLE works for MyISAM and for
ARCHIVE tables. Starting with MySQL 5.1.9,
REPAIR is also valid for
CSV tables. See
Section 14.4, “The MyISAM Storage Engine”, and
Section 14.10, “The ARCHIVE Storage Engine”, and
Section 14.11, “The CSV Storage Engine”
This statement requires SELECT and
INSERT privileges for the table.
Normally, you should never have to run this statement.
However, if disaster strikes, REPAIR TABLE
is very likely to get back all your data from a
MyISAM table. If your tables become
corrupted often, you should try to find the reason for it, to
eliminate the need to use REPAIR TABLE. See
Section B.1.4.2, “What to Do If MySQL Keeps Crashing”, and
Section 14.4.4, “MyISAM Table Problems”.
Warning: If the server dies
during a REPAIR TABLE operation, it is
essential after restarting it that you immediately execute
another REPAIR TABLE statement for the
table before performing any other operations on it. (It is
always a good idea to start by making a backup.) In the worst
case, you might have a new clean index file without
information about the data file, and then the next operation
you perform could overwrite the data file. This is an unlikely
but possible scenario.
REPAIR TABLE returns a result set with the
following columns:
| Column | Value |
Table |
The table name |
Op |
Always repair
|
Msg_type |
One of status, error,
info, or warning
|
Msg_text |
The message |
The REPAIR TABLE statement might produce
many rows of information for each repaired table. The last row
has a Msg_type value of
status and Msg_test
normally should be OK. If you do not get
OK, you should try repairing the table with
myisamchk --safe-recover. (REPAIR
TABLE does not yet implement all the options of
myisamchk.) With myisamchk
--safe-recover, you can also use options that
REPAIR TABLE does not support, such as
--max-record-length.
If QUICK is given, REPAIR
TABLE tries to repair only the index tree. This type
of repair is like that done by myisamchk --recover
--quick.
If you use EXTENDED, MySQL creates the
index row by row instead of creating one index at a time with
sorting. This type of repair is like that done by
myisamchk --safe-recover.
There is also a USE_FRM mode available for
REPAIR TABLE. Use this if the
.MYI index file is missing or if its
header is corrupted. In this mode, MySQL re-creates the
.MYI file using information from the
.frm file. This kind of repair cannot be
done with myisamchk.
Note: Use this mode
only if you cannot use regular
REPAIR modes. The .MYI
header contains important table metadata (in particular,
current AUTO_INCREMENT value and
Delete link) that are lost in
REPAIR ... USE_FRM. Don't use
USE_FRM if the table is compressed because
this information is also stored in the
.MYI file.
REPAIR TABLE statements are written to the
binary log unless the optional
NO_WRITE_TO_BINLOG keyword (or its alias
LOCAL) is used. This is done so that
REPAIR TABLE statements used on a MySQL
server acting as a replication master will be replicated by
default to the replication slave.

User Comments
MySQL Berkley tables cannot be repaired using
REPAIR TABLE. However, after a BIG hardware
crash, I was able to recover data that I thought
had been lost by;
1) Shutting down all clients
2) Reloading the database (using mysqladmin
reload) then 3) Shutting down and restarting the
mySQL server.
I am truly amazed. :)) Well done guys!
After a hardware problem, I ended up with /var/lib/mysql on a linux machine and nothing else. All I had were the raw tables of 3 year old installation which might have been updated at some time. I did not remember which version of MySQL was used.
I tried to create one of the databases on a new installation and copied all the files into the empty directory.
But when I tried to access the tables it never worked...
Call me stupid, but it took me some hours to realize, that the copied files of course belonged to the wrong user instead of mysql:daemon.
This was the last point I was looking at, before I had the idea to check for the access-rights. So I post it here for the next one passing by.
Cheers
Sascha
Add your own comment.