3.5 Checking Tables with mysqlcheck and myisamchk
The mysqlcheck and myisamchk programs are used to check and repair tables (primarily MyISAM tables). They can help you keep your tables free from problems, or repair them if problems do occurfor example, if a MyISAM table becomes damaged as the result of a server crash.
mysqlcheck and myisamchk are similar in purpose, but they do have some differences. Here's a comparison of the two programs:
Both programs can check, repair, and analyze MyISAM tables. mysqlcheck also can optimize MyISAM tables, as well as check InnoDB tables and analyze BDB tables. There are certain operations that myisamchk can perform that mysqlcheck cannot, such as disabling or enabling indexes, although these operations aren't discussed in this study guide.
The two programs differ significantly in their mode of operation. mysqlcheck is a client program that communicates with the MySQL server over a network connection. It provides a command-line interface to the table-maintenance SQL statements supported by the server, such as CHECK TABLE and REPAIR TABLE. mysqlcheck determines which options were given on the command line, and then sends appropriate SQL statements to the MySQL server to perform the requested operation. This means that mysqlcheck requires the server to be running. It also means that you can use mysqlcheck to connect to remote servers. In contrast, myisamchk isn't a client program. It's a utility that operates directly on the files that represent MyISAM tables. This means that you must run myisamchk on the server host where those files are located. In addition, you need filesystem read privileges on those files for table checking operations, and write privileges for table repair operations.
The two programs also differ in their relationship with the server while they're running. With mysqlcheck, there's no problem of interaction with the server because mysqlcheck asks the server itself to do the work of checking and repairing the tables. With myisamchk, you need to make sure that the server doesn't have the tables open and isn't using them at the same time. It's possible to get incorrect results or even to cause table damage if table files are used by myisamchk and the server simultaneously. The most certain way to avoid conflict is to bring the server down while running myisamchk. It's also possible to lock the tables while checking or repairing them with myisamchk, but the procedure is not described here. You can find the details in the MySQL Reference Manual.
The rest of this section describes how to use mysqlcheck and myisamchk.
mysqlcheck has three general modes of operation, depending on how it is invoked:
By default, mysqlcheck interprets its first nonoption argument as a database name and checks all the tables in that database. If any other arguments follow the database name, mysqlcheck treats them as table names and checks just those tables. For example, the first of the following commands checks all the tables in the world database; the second checks just the City and Country tables in that database:
shell> mysqlcheck world shell> mysqlcheck world City Country
With the --databases (or -B) option, mysqlcheck interprets its nonoption arguments as database names and checks all the tables in each of the named databases. The following command checks the tables in both the world and test databases:
shell> mysqlcheck --databases world test
With the --all-databases (or -A) option, mysqlcheck checks all tables in all databases:
shell> mysqlcheck --all-databases
The procedure for using myisamchk is quite different, due to the need to avoid using tables at the same time the server might be accessing them. Use myisamchk as follows:
Stop the server so that it cannot access the tables while you're working with them.
From a command prompt, change location into the database directory where the tables are located. This will be the subdirectory of the server's data directory that has the same name as the database containing the tables you would like to check. (The reason for changing location is to make it easier to refer to the table files. You can skip this step if you like, but you'll have to specify to myisamchk the directory where the tables are located.)
Invoke myisamchk with options indicating the operation you want performed, followed by arguments that name the tables on which myisamchk should operate. Each of these arguments can be either a table name or the name of the table's index file. An index filename is the same as the table name, plus an .MYI suffix.
The default myisamchk operation is to check tables. If that's what you want to do, no options are necessary and you need only name the table or tables to be checked. For example, to check a table named City, either of these commands will do:
shell> myisamchk City shell> myisamchk City.MYI
To repair a table, use the --recover option:
shell> myisamchk --recover City
mysqlcheck and myisamchk both take many options to control the type of table maintenance operation performed. The following list summarizes some of the more commonly used options. For the most part, the list contains options that are understood by both programs. Where this isn't the case, it's noted in the relevant option description.
--analyze or -a
--auto-repair (mysqlcheck only)
--check or -c
--check-only-changed or -C
--fast or -F
--extended (for mysqlcheck), --extend-check (for myisamchk), or -e (for both programs)
--medium-check or -m
--quick or -q
--repair (for mysqlcheck), --recover (for myisamchk), or -r (for both programs)
Analyze the distribution of key values in the table. This can improve performance of queries by speeding up index-based lookups.
Repair tables automatically if a check operation discovers problems.
Check tables for problems. This is the default action if no other operation is specified.
Skip table checking except for tables that have been changed since they were last checked or tables that haven't been properly closed. The latter condition might occur if the server crashes while a table is open.
Skip table checking except for tables that haven't been properly closed.
Run an extended table check. For mysqlcheck, when this option is given in conjunction with a repair option, a more thorough repair is performed than when the repair option is given alone. That is, the repair operation performed by mysqlcheck --repair --extended is more thorough than the operation performed by mysqlcheck --repair.
Run a medium table check.
For mysqlcheck, --quick without a repair option causes only the index file to be checked, leaving the datafile alone. For both programs, --quick in conjunction with a repair option causes the program to repair only the index file, leaving the datafile alone.
Run a table repair operation.