mysqlcheck 客户端执行表维护:它检查、修复、优化或分析表。
每个表在被处理时都会被锁定,因此对其他会话不可用,尽管对于检查操作,表只是使用 READ 锁锁定(有关 READ 和 WRITE 锁的更多信息,请参阅 第 15.3.6 节,“LOCK TABLES 和 UNLOCK TABLES 语句”)。表维护操作可能很耗时,特别是对于大型表。如果您使用 --databases 或 --all-databases 选项处理一个或多个数据库中的所有表,则 mysqlcheck 的调用可能需要很长时间。(这对于 MySQL 升级过程也是如此,如果它确定需要表检查,因为它以相同的方式处理表。)
必须在 mysqld 服务器正在运行时使用 mysqlcheck,这意味着您无需停止服务器即可执行表维护。
mysqlcheck 使用 SQL 语句 CHECK TABLE、REPAIR TABLE、ANALYZE TABLE 和 OPTIMIZE TABLE,以便用户方便地使用。它确定要使用哪些语句来执行您要执行的操作,然后将这些语句发送到服务器以执行。有关每个语句与哪些存储引擎一起工作的详细信息,请参阅 第 15.7.3 节,“表维护语句” 中这些语句的说明。
并非所有存储引擎都支持所有四种维护操作。在这种情况下,将显示一条错误消息。例如,如果 test.t 是一个 MEMORY 表,尝试检查它会产生以下结果
$> mysqlcheck test t
test.t
note : The storage engine for the table doesn't support check如果 mysqlcheck 无法修复表,请参阅 第 3.14 节,“重建或修复表或索引”,了解手动表修复策略。例如,对于 InnoDB 表,可以使用 CHECK TABLE 检查,但不能使用 REPAIR TABLE 修复。
在执行表修复操作之前,最好备份表;在某些情况下,操作可能会导致数据丢失。可能的原因包括但不限于文件系统错误。
有三种通用的方法可以调用 mysqlcheck
mysqlcheck [options] db_name [tbl_name ...]
mysqlcheck [options] --databases db_name ...
mysqlcheck [options] --all-databases如果您在 db_name 后没有命名任何表,或者使用 --databases 或 --all-databases 选项,则会检查整个数据库。
mysqlcheck 与其他客户端程序相比有一个特殊的功能。检查表的默认行为(--check)可以通过重命名二进制文件来更改。如果您想拥有默认修复表的工具,您只需复制 mysqlcheck 并将其命名为 mysqlrepair,或者创建一个指向 mysqlcheck 的符号链接,并将其命名为 mysqlrepair。如果您调用 mysqlrepair,它将修复表。
下表中显示的名称可用于更改 mysqlcheck 的默认行为。
| 命令 | 意义 |
|---|---|
| mysqlrepair | 默认选项是 --repair |
| mysqlanalyze | 默认选项是 --analyze |
| mysqloptimize | 默认选项是 --optimize |
mysqlcheck 支持以下选项,这些选项可以在命令行上指定,也可以在选项文件的 [mysqlcheck] 和 [client] 组中指定。有关 MySQL 程序使用的选项文件的更多信息,请参阅 第 6.2.2.2 节,“使用选项文件”。
表 6.12 mysqlcheck 选项
| 选项名称 | 描述 |
|---|---|
| --all-databases | 检查所有数据库中的所有表 |
| --all-in-1 | 为每个数据库执行单个语句,该语句命名该数据库中的所有表 |
| --analyze | 分析表 |
| --auto-repair | 如果检查的表已损坏,则自动修复它 |
| --bind-address | 使用指定的网络接口连接到 MySQL 服务器 |
| --character-sets-dir | 安装字符集的目录 |
| --check | 检查表是否有错误 |
| --check-only-changed | 仅检查自上次检查以来已更改的表 |
| --check-upgrade | 使用 FOR UPGRADE 选项调用 CHECK TABLE |
| --compress | 压缩客户端和服务器之间发送的所有信息 |
| --compression-algorithms | 允许连接到服务器的压缩算法 |
| --databases | 将所有参数解释为数据库名称 |
| --debug | 写入调试日志 |
| --debug-check | 程序退出时打印调试信息 |
| --debug-info | 程序退出时打印调试信息、内存和 CPU 统计信息 |
| --default-character-set | 指定默认字符集 |
| --defaults-extra-file | 除了通常的选项文件外,还读取指定的选项文件 |
| --defaults-file | 只读取指定的选项文件 |
| --defaults-group-suffix | 选项组后缀值 |
| --enable-cleartext-plugin | 启用明文身份验证插件 |
| --extended | 检查并修复表 |
| --fast | 只检查没有正确关闭的表 |
| --force | 即使出现 SQL 错误,也要继续 |
| --get-server-public-key | 向服务器请求 RSA 公钥 |
| --help | 显示帮助消息并退出 |
| --host | MySQL 服务器所在的机器 |
| --login-path | 从 .mylogin.cnf 读取登录路径选项 |
| --medium-check | 执行比 --extended 操作更快的检查 |
| --no-defaults | 不读取任何选项文件 |
| --no-login-paths | 不要从登录路径文件读取登录路径 |
| --optimize | 优化表 |
| --password | 连接到服务器时使用的密码 |
| --password1 | 连接到服务器时使用的第一个多因素身份验证密码 |
| --password2 | 连接到服务器时使用的第二个多因素身份验证密码 |
| --password3 | 连接到服务器时使用的第三个多因素身份验证密码 |
| --pipe | 使用命名管道连接到服务器(仅限 Windows) |
| --port | 连接的 TCP/IP 端口号 |
| --print-defaults | 打印默认选项 |
| --protocol | 要使用的传输协议 |
| --quick | 最快的检查方法 |
| --repair | 执行可以修复几乎所有问题(除了不唯一的唯一键)的修复 |
| --server-public-key-path | 包含 RSA 公钥的文件的路径名 |
| --shared-memory-base-name | 共享内存连接的共享内存名称(仅限 Windows) |
| --silent | 静默模式 |
| --skip-database | 从执行的操作中省略此数据库 |
| --socket | 要使用的 Unix 套接字文件或 Windows 命名管道 |
| --ssl-ca | 包含受信任的 SSL 证书颁发机构列表的文件 |
| --ssl-capath | 包含受信任的 SSL 证书颁发机构证书文件的目录 |
| --ssl-cert | 包含 X.509 证书的文件 |
| --ssl-cipher | 连接加密允许的密码 |
| --ssl-fips-mode | 是否在客户端启用 FIPS 模式 |
| --ssl-key | 包含 X.509 密钥的文件 |
| --ssl-mode | 连接到服务器所需的安全性状态 |
| --ssl-session-data | 包含 SSL 会话数据的文件 |
| --ssl-session-data-continue-on-failed-reuse | 如果会话重用失败,是否建立连接 |
| --tables | 覆盖 --databases 或 -B 选项 |
| --tls-ciphersuites | 加密连接允许的 TLSv1.3 密码套件 |
| --tls-sni-servername | 客户端提供的服务器名称 |
| --tls-version | 加密连接允许的 TLS 协议 |
| --use-frm | 用于对 MyISAM 表进行修复操作 |
| --user | 连接到服务器时使用的 MySQL 用户名 |
| --verbose | 详细模式 |
| --version | 显示版本信息并退出 |
| --write-binlog | 将 ANALYZE、OPTIMIZE、REPAIR 语句记录到二进制日志中。--skip-write-binlog 会将 NO_WRITE_TO_BINLOG 添加到这些语句中 |
| --zstd-compression-level | 使用 zstd 压缩连接到服务器的压缩级别 |
--help,-?命令行格式 --help显示帮助消息并退出。
--all-databases,-A命令行格式 --all-databases检查所有数据库中的所有表。这与使用
--databases选项并在命令行中命名所有数据库相同,只是INFORMATION_SCHEMA和performance_schema数据库不会被检查。它们可以通过使用--databases选项显式命名它们来进行检查。--all-in-1,-1命令行格式 --all-in-1不为每个表发出语句,而是为每个数据库执行一个语句,该语句命名该数据库中的所有要处理的表。
--analyze,-a命令行格式 --analyze分析表。
-
命令行格式 --auto-repair如果检查的表已损坏,则自动修复它。任何必要的修复都在检查完所有表后完成。
-
命令行格式 --bind-address=ip_address在具有多个网络接口的计算机上,使用此选项选择要用于连接到 MySQL 服务器的接口。
-
命令行格式 --character-sets-dir=dir_name类型 目录名 安装字符集的目录。参见 Section 12.15, “Character Set Configuration”.
--check,-c命令行格式 --check检查表是否有错误。这是默认操作。
-
命令行格式 --check-only-changed只检查自上次检查以来已更改或未正确关闭的表。
--check-upgrade,-g命令行格式 --check-upgrade使用
FOR UPGRADE选项调用CHECK TABLE以检查表与当前服务器版本的不兼容性。-
命令行格式 --compress[={OFF|ON}]已弃用 是 类型 布尔值 默认值 OFF如果可能,压缩客户端和服务器之间发送的所有信息。参见 Section 6.2.8, “Connection Compression Control”.
此选项已弃用。预期它将在 MySQL 的未来版本中删除。参见 Configuring Legacy Connection Compression.
--compression-algorithms=value命令行格式 --compression-algorithms=value类型 设置 默认值 uncompressed有效值 zlibzstduncompressed连接到服务器允许的压缩算法。可用的算法与
protocol_compression_algorithms系统变量相同。默认值为uncompressed。--databases,-B命令行格式 --databases处理命名数据库中的所有表。通常,mysqlcheck 将命令行上的第一个名称参数视为数据库名称,将任何后续名称参数视为表名称。使用此选项,它将所有名称参数视为数据库名称。
--debug[=,debug_options]-# [debug_options]命令行格式 --debug[=debug_options]类型 字符串 默认值 d:t:o写入调试日志。典型的
debug_options字符串是d:t:o,。默认值为file_named:t:o。此选项仅在使用
WITH_DEBUG构建 MySQL 时可用。Oracle 提供的 MySQL 发布版二进制文件没有使用此选项构建。-
命令行格式 --debug-check类型 布尔值 默认值 FALSE程序退出时打印一些调试信息。
此选项仅在使用
WITH_DEBUG构建 MySQL 时可用。Oracle 提供的 MySQL 发布版二进制文件没有使用此选项构建。 -
命令行格式 --debug-info类型 布尔值 默认值 FALSE程序退出时打印调试信息以及内存和 CPU 使用率统计信息。
此选项仅在使用
WITH_DEBUG构建 MySQL 时可用。Oracle 提供的 MySQL 发布版二进制文件没有使用此选项构建。 --default-character-set=charset_name命令行格式 --default-character-set=charset_name类型 字符串 使用
charset_name作为默认字符集。参见 Section 12.15, “Character Set Configuration”.--defaults-extra-file=file_name命令行格式 --defaults-extra-file=file_name类型 文件名 在全局选项文件之后(但在 Unix 上在用户选项文件之前)读取此选项文件。如果文件不存在或无法访问,则会发生错误。如果
file_name不是绝对路径名,则会相对于当前目录进行解释。有关此选项和其他选项文件选项的更多信息,参见 Section 6.2.2.3, “Command-Line Options that Affect Option-File Handling”.
-
命令行格式 --defaults-file=file_name类型 文件名 仅使用给定的选项文件。如果文件不存在或无法访问,则会发生错误。如果
file_name不是绝对路径名,则会相对于当前目录进行解释。异常:即使使用
--defaults-file,客户端程序也会读取.mylogin.cnf。有关此选项和其他选项文件选项的更多信息,参见 Section 6.2.2.3, “Command-Line Options that Affect Option-File Handling”.
-
命令行格式 --defaults-group-suffix=str类型 字符串 不仅读取通常的选项组,而且还读取具有通常名称以及
str后缀的组。例如,mysqlcheck 通常会读取[client]和[mysqlcheck]组。如果此选项被给出为--defaults-group-suffix=_other,mysqlcheck 还会读取[client_other]和[mysqlcheck_other]组。有关此选项和其他选项文件选项的更多信息,参见 Section 6.2.2.3, “Command-Line Options that Affect Option-File Handling”.
--extended,-e命令行格式 --extended如果您使用此选项检查表,它将确保它们 100% 一致,但需要很长时间。
如果您使用此选项修复表,它将运行扩展修复,这不仅需要很长时间才能执行,而且还会生成大量垃圾行!
-
命令行格式 --default-auth=plugin类型 字符串 提示要使用的客户端身份验证插件。请参阅 第 8.2.17 节,“可插拔身份验证”。
-
命令行格式 --enable-cleartext-plugin类型 布尔值 默认值 FALSE启用
mysql_clear_password明文身份验证插件。(请参阅 第 8.4.1.3 节,“客户端明文可插拔身份验证”。) --fast,-F命令行格式 --fast仅检查未正确关闭的表。
--force,-f命令行格式 --force即使发生 SQL 错误也要继续。
-
命令行格式 --get-server-public-key类型 布尔值 从服务器请求基于 RSA 密钥对的密码交换所需的公钥。此选项适用于使用
caching_sha2_password身份验证插件进行身份验证的客户端。对于该插件,服务器不会发送公钥,除非被请求。此选项对于未使用该插件进行身份验证的帐户将被忽略。如果未使用基于 RSA 的密码交换,它也会被忽略,例如当客户端使用安全连接连接到服务器时。如果给出
--server-public-key-path=并且指定了有效的公钥文件,它将优先于file_name--get-server-public-key。有关
caching_sha2_password插件的信息,请参阅 第 8.4.1.1 节,“缓存 SHA-2 可插拔身份验证”。 --host=,host_name-hhost_name命令行格式 --host=host_name类型 字符串 默认值 localhost连接到指定主机上的 MySQL 服务器。
-
命令行格式 --login-path=name类型 字符串 从
.mylogin.cnf登录路径文件中命名的登录路径中读取选项。 “登录路径” 是一个选项组,包含指定要连接到的 MySQL 服务器以及要以其身份进行身份验证的帐户的选项。要创建或修改登录路径文件,请使用 mysql_config_editor 实用程序。请参阅 第 6.6.7 节,“mysql_config_editor — MySQL 配置实用程序”。有关此选项和其他选项文件选项的更多信息,参见 Section 6.2.2.3, “Command-Line Options that Affect Option-File Handling”.
-
命令行格式 --no-login-paths跳过从登录路径文件读取选项。
有关相关信息,请参阅
--login-path。有关此选项和其他选项文件选项的更多信息,参见 Section 6.2.2.3, “Command-Line Options that Affect Option-File Handling”.
--medium-check,-m命令行格式 --medium-check执行比
--extended操作更快的检查。这只会找到 99.99% 的所有错误,在大多数情况下应该足够了。-
命令行格式 --no-defaults不读取任何选项文件。如果程序启动由于从选项文件读取未知选项而失败,可以使用
--no-defaults来防止读取它们。例外情况是,如果
.mylogin.cnf文件存在,则在所有情况下都会读取该文件。即使使用--no-defaults,这也允许以比命令行更安全的方式指定密码。要创建.mylogin.cnf,请使用 mysql_config_editor 实用程序。请参阅 第 6.6.7 节,“mysql_config_editor — MySQL 配置实用程序”。有关此选项和其他选项文件选项的更多信息,参见 Section 6.2.2.3, “Command-Line Options that Affect Option-File Handling”.
--optimize,-o命令行格式 --optimize优化表。
--password[=,password]-p[password]命令行格式 --password[=password]类型 字符串 用于连接到服务器的 MySQL 帐户的密码。密码值是可选的。如果没有给出,mysqlcheck 会提示输入密码。如果给出,
--password=或-p与后面的密码之间必须 没有空格。如果没有指定密码选项,默认值是不发送密码。在命令行上指定密码被认为是不安全的。为了避免在命令行上给出密码,请使用选项文件。请参阅 第 8.1.2.1 节,“最终用户密码安全指南”。
要明确指定没有密码并且 mysqlcheck 不应提示输入密码,请使用
--skip-password选项。用于连接到服务器的 MySQL 帐户的多因素身份验证因素 1 的密码。密码值是可选的。如果没有给出,mysqlcheck 会提示输入密码。如果给出,
--password1=与后面的密码之间必须 没有空格。如果没有指定密码选项,默认值是不发送密码。在命令行上指定密码被认为是不安全的。为了避免在命令行上给出密码,请使用选项文件。请参阅 第 8.1.2.1 节,“最终用户密码安全指南”。
要明确指定没有密码并且 mysqlcheck 不应提示输入密码,请使用
--skip-password1选项。--password1和--password是同义词,--skip-password1和--skip-password也是同义词。用于连接到服务器的 MySQL 帐户的多因素身份验证因素 2 的密码。此选项的语义类似于
--password1的语义;有关详细信息,请参阅该选项的描述。用于连接到服务器的 MySQL 帐户的多因素身份验证因素 3 的密码。此选项的语义类似于
--password1的语义;有关详细信息,请参阅该选项的描述。--pipe,-W命令行格式 --pipe类型 字符串 在 Windows 上,使用命名管道连接到服务器。此选项仅适用于服务器在启用
named_pipe系统变量以支持命名管道连接的情况下启动。此外,进行连接的用户必须是named_pipe_full_access_group系统变量指定的 Windows 组的成员。-
命令行格式 --plugin-dir=dir_name类型 目录名 要查找插件的目录。如果使用
--default-auth选项指定身份验证插件,但 mysqlcheck 找不到它,请指定此选项。请参阅 第 8.2.17 节,“可插拔身份验证”。 --port=,port_num-Pport_num命令行格式 --port=port_num类型 Numeric 默认值 3306对于 TCP/IP 连接,要使用的端口号。
-
命令行格式 --print-defaults打印程序名称及其从选项文件获取的所有选项。
有关此选项和其他选项文件选项的更多信息,参见 Section 6.2.2.3, “Command-Line Options that Affect Option-File Handling”.
--protocol={TCP|SOCKET|PIPE|MEMORY}命令行格式 --protocol=type类型 字符串 默认值 [见文本]有效值 TCPSOCKETPIPEMEMORY用于连接到服务器的传输协议。当其他连接参数通常导致使用除您想要的协议之外的协议时,它很有用。有关允许值的详细信息,请参阅 第 6.2.7 节,“连接传输协议”。
--quick,-q命令行格式 --quick如果您使用此选项来检查表,它将阻止检查扫描行以检查不正确的链接。这是最快的检查方法。
如果您使用此选项来修复表,它将尝试仅修复索引树。这是最快的修复方法。
--repair,-r命令行格式 --repair执行可以修复几乎所有问题的修复,但不能修复不唯一的唯一键。
--server-public-key-path=file_name命令行格式 --server-public-key-path=file_name类型 文件名 指向 PEM 格式文件的路径名,该文件包含服务器为基于 RSA 密钥对的密码交换所需的公钥的客户端副本。此选项适用于使用
sha256_password或caching_sha2_password身份验证插件进行身份验证的客户端。此选项对于未使用其中一个插件进行身份验证的帐户将被忽略。如果未使用基于 RSA 的密码交换,它也会被忽略,例如当客户端使用安全连接连接到服务器时。如果给出
--server-public-key-path=并且指定了有效的公钥文件,它将优先于file_name--get-server-public-key。对于
sha256_password,此选项仅适用于使用 OpenSSL 构建的 MySQL。有关
sha256_password和caching_sha2_password插件的信息,请参阅 第 8.4.1.2 节,“SHA-256 可插拔身份验证” 和 第 8.4.1.1 节,“缓存 SHA-2 可插拔身份验证”。--shared-memory-base-name=name命令行格式 --shared-memory-base-name=name平台特定 Windows 在 Windows 上,用于通过共享内存连接到本地服务器的共享内存名称。默认值为
MYSQL。共享内存名称区分大小写。此选项仅在服务器启动时启用了
shared_memory系统变量以支持共享内存连接时适用。--silent,-s命令行格式 --silent静默模式。仅打印错误消息。
-
命令行格式 --skip-database=db_name在 mysqlcheck 执行的操作中,不包含指定的数据库(区分大小写)。
--socket=,path-Spath命令行格式 --socket={file_name|pipe_name}类型 字符串 对于连接到
localhost,要使用的 Unix 套接字文件,或者在 Windows 上,要使用的命名管道名称。在 Windows 上,此选项仅在服务器启动时启用了
named_pipe系统变量以支持命名管道连接时适用。此外,进行连接的用户必须是named_pipe_full_access_group系统变量指定的 Windows 组的成员。以
--ssl开头的选项指定是否使用加密连接到服务器,并指示在哪里查找 SSL 密钥和证书。请参阅 加密连接的命令选项。--ssl-fips-mode={OFF|ON|STRICT}命令行格式 --ssl-fips-mode={OFF|ON|STRICT}已弃用 是 类型 枚举 默认值 OFF有效值 OFFONSTRICT控制是否在客户端启用 FIPS 模式。
--ssl-fips-mode选项与其他--ssl-选项不同,因为它不用于建立加密连接,而是用于影响允许的加密操作。请参阅 第 8.8 节,“FIPS 支持”。xxx这些
--ssl-fips-mode值是允许的OFF: 禁用 FIPS 模式。ON: 启用 FIPS 模式。STRICT: 启用 “严格” FIPS 模式。
注意如果 OpenSSL FIPS 对象模块不可用,则
--ssl-fips-mode唯一允许的值是OFF。在这种情况下,将--ssl-fips-mode设置为ON或STRICT会导致客户端在启动时产生警告并在非 FIPS 模式下运行。此选项已弃用。预计将在 MySQL 的未来版本中删除它。
-
命令行格式 --tables覆盖
--databases或-B选项。此选项后面的所有名称参数都被视为表名。 --tls-ciphersuites=ciphersuite_list命令行格式 --tls-ciphersuites=ciphersuite_list类型 字符串 使用 TLSv1.3 的加密连接的允许的密码套件。该值是一个或多个以冒号分隔的密码套件名称的列表。此选项可以命名的密码套件取决于用于编译 MySQL 的 SSL 库。有关详细信息,请参阅 第 8.3.2 节,“加密连接 TLS 协议和密码”。
--tls-sni-servername=server_name命令行格式 --tls-sni-servername=server_name类型 字符串 指定时,该名称将使用
mysql_options()的MYSQL_OPT_TLS_SNI_SERVERNAME选项传递到libmysqlclientC API 库。服务器名称不区分大小写。若要显示客户端为当前会话指定的服务器名称(如果有),请检查Tls_sni_server_name状态变量。服务器名称指示 (SNI) 是 TLS 协议的扩展(OpenSSL 必须使用 TLS 扩展编译才能使此选项正常工作)。MySQL 中 SNI 的实现仅代表客户端。
-
命令行格式 --tls-version=protocol_list类型 字符串 默认值 TLSv1,TLSv1.1,TLSv1.2,TLSv1.3(OpenSSL 1.1.1 或更高版本)TLSv1,TLSv1.1,TLSv1.2(否则)加密连接的允许的 TLS 协议。该值是一个或多个以逗号分隔的协议名称的列表。此选项可以命名的协议取决于用于编译 MySQL 的 SSL 库。有关详细信息,请参阅 第 8.3.2 节,“加密连接 TLS 协议和密码”。
-
命令行格式 --use-frm对于
MyISAM表的修复操作,从数据字典中获取表结构,以便即使.MYI标头已损坏也可以修复表。 --user=,user_name-uuser_name命令行格式 --user=user_name,类型 字符串 用于连接到服务器的 MySQL 帐户的用户名。
--verbose,-v命令行格式 --verbose详细模式。打印有关程序操作各个阶段的信息。
--version,-V命令行格式 --version显示版本信息并退出。
-
命令行格式 --write-binlog此选项默认情况下处于启用状态,因此由 mysqlcheck 生成的
ANALYZE TABLE、OPTIMIZE TABLE和REPAIR TABLE语句将写入二进制日志。使用--skip-write-binlog将导致NO_WRITE_TO_BINLOG添加到这些语句中,以便它们不会被记录。当这些语句不应该发送到副本或在使用二进制日志从备份恢复时运行时,使用--skip-write-binlog。 --zstd-compression-level=level命令行格式 --zstd-compression-level=#类型 整数 用于连接到使用
zstd压缩算法的服务器的压缩级别。允许的级别为 1 到 22,较大的值表示更高的压缩级别。默认的zstd压缩级别为 3。压缩级别设置对不使用zstd压缩的连接没有影响。