概述
本章,您将学习到 MySQL 中的命令行程序,主要包括:
- 服务器和服务器启动程序
- 连接到 MySQL 服务器的客户端工具
- 管理和实用程序
- 程序开发工具(非开发人员,略过)
- 杂项工具
要了解这些程序的更多信息,请参阅 官方网站的文档 。
服务器和服务器启动程序
mysqld_safe 命令
该命令是 UNIX 或 GNU/Linux 推荐启动 MySQL 实例的推荐方法。
作者采用的源代码编译安装,因此是这样启动的:
Shell > cat /etc/my.cnf
[client]
port = 3306
socket = /tmp/mysql.sock
[mysqld]
server-id = 1
port = 3306
socket = /tmp/mysql.sock
basedir = /usr/local/mysql8/
datadir = /usr/local/mysql8/data/
user = mysql
log-error = /usr/local/mysql8/data/mysqld_start.err
bind-address = *
default-storage-engine = INNODB
group-concat-max-len = 102400
skip-name-resolve
back-log = -1
max-connections = 700
wait-timeout = 90
max-allowed-packet = 64M
read-buffer-size = 128K
innodb-flush-log-at-trx-commit = 1
sync-binlog = 1
innodb-buffer-pool-size = 1G
innodb-io-capacity = 100
[mysqldump]
quick
Shell > /usr/local/mysql8/bin/mysqld_safe --user=mysql &
相关说明:
mysqld_safe启动实例时,会先读取配置文件(/etc/my.cnf)中的选项,再读取命令行中的选项,若配置文件与命令行存在相同的选项,则以最后读取到的选项或选项值为准。- 配置文件中,"[ ]" 表示要设置选项的程序或组的名称,除了接受
[mysqld]外,也接受[server]或[mysqld_safe]或[mysqld-8.4] - 命令行的选项需要添加
--前缀,但如果将选项写入到配置文件中,则不需要--前缀 - 除极个别的
mysqld_safe特定选项外(即mysqld_safe --help输出中的选项),绝大部分的选项都会传递给mysqld程序
mysqld_safe 的常用选项在 前面的文章 中已经介绍了,这里就不再多余介绍了。
连接到 MySQL 服务器的客户端工具
mysql 命令
该命令用来连接到 MySQL 服务器,前面的文章 已经介绍,这里就不多加赘述。
mysqladmin 命令
执行管理操作的命令行客户端,例如创建或删除数据库、重新加载授权表、检查服务器的配置以及状态、停止服务器等,语法为:
mysqladmin [options] command [command-arg] [command [command-arg]] ...
常用选项如下:
-h HOST_NAME或--host=HOST_NAME- 指定连接的主机名或 IP 地址-u USER或--user=USER- 指定连接的用户-P PORT_NUM或--port=PORT_NUM- 指定端口--password[=password]或-p[password]- 使用的密码,"[ ]"表示是可选的。若在命令行中指定密码,-p短选项的后面并没有空格。在命令行中直接使用密码并不安全
语法中的 command 可以是:
create DB_NAME- 创建指定的新库debug- 将 debug 信息写入到错误日志中。需要注意的是,连接的用户必须具有 super 静态权限。drop DB_NAME- 删除指定的库及其所有表extended-status- 显示服务器状态变量以及对应值flush-hosts- 清除主机缓存中的所有信息。需要注意的是,连接的用户必须具有 drop 或 reload 静态权限。flush-privileges-重新加载授权表reload- 重新加载授权表flush-status- 清除状态变量flush-tables- 刷新所有表的缓存password PASSWORD- 设置新密码(可用双引号包含有特殊字符的密码),在 Windows 中,应使用单引号包含有特殊字符的密码ping- 检查服务器是否可用shutdown- 关闭服务器start-replica- 在 replica server 上启动复制status- 显示简短的服务器状态信息stop-replica- 在 replica server 上停止复制
如您所见,有些 command 不需要添加参数,但有些 command 必须添加一个或多个参数。
mysqlcheck 命令
该客户端命令用来执行对表的维护(检查、修复、优化或分析),并调用 CHECK TABLE 、REPAIR TABLE 、ANALYZE TABLE 和 OPTIMIZE TABLE 这四个 SQL 语句来完成特定操作,需要注意的是,并不是所有存储引擎都支持这四种操作,比如对于 Innodb 存储引擎,可以使用 CHECK TABLE 进行检查,但不能使用 REPAIR TABLE 进行修复。
三种通用语法如下:
# 若在数据库名称后不指定任何表,则表示检查当前库的所有表
mysqlcheck [options] db_name [tbl_name ...]
# "--databases" 后指定一个或多个数据库名称,多个数据库名称用空格隔开
mysqlcheck [options] --databases db_name1 db_name2 ...
# "--all-databases" 表示检查所有库
mysqlcheck [options] --all-databases
例如,您需要检查 world 库下的 city 表:
mysqlcheck world city
mysqlcheck 命令之前,最好对操作的库或表进行备份,这是因为执行 mysqlcheck 命令有可能会导致数据丢失。除了在命令行中使用选项外,您也可以在配置文件(/etc/my.cnf) 的 "[mysqlcheck]" 或 "[client]" 组下面使用选项。
常用选项如下:
-h HOST_NAME或--host=HOST_NAME- 指定连接的主机名或 IP 地址-u USER或--user=USER- 指定连接的用户-P PORT_NUM或--port=PORT_NUM- 指定端口--password[=password]或-p[password]- 使用的密码,"[ ]"表示是可选的。若在命令行中指定密码,-p短选项的后面并没有空格。在命令行中直接使用密码并不安全--all-databases- 检查所有库下的所有表--analyze- 分析表--auto-repair- 如果检查的表已经损坏,自动修复它--check- 命令的默认选项(即mysqlcheck等于mysqlcheck --check),用来检查表是否有错误--databases- 将该选项后的参数全部解释为数据库名称--extended- 检查并修复表,该过程需要很长时间并产生大量的垃圾行--medium-check- 执行比 --extended 操作更快的检查(在大多数场景下足够使用)--optimize- 优化表--repair- 执行一个可以修复几乎所有问题的修复(除了不唯一的唯一键)
示例如下:
# 检查 world 库下的 city 表
Shell > /usr/local/mysql8/bin/mysqlcheck -h localhost -u root -p world city
# 检查表的同时也修复损坏的表
Shell > /usr/local/mysql8/bin/mysqlcheck -h localhost -u root -p --auto-repair world city
# 检查所有数据库下的所有表,并修复它们
Shell > /usr/local/mysql8/bin/mysqlcheck -h localhost -u root -p --auto-repair --all-databases
# 优化特定的表来提升性能
Shell > /usr/local/mysql8/bin/mysqlcheck -h localhost -u root -p --optimize world city
mysqldump 命令
前面的文章 已经说明。
mysqlslap 命令
前面的文章 已经说明。
mysqlshow 命令
该命令用来显示数据库、表、列以及索引信息,语法为:
# 若未指定数据库,则显示数据库名称列表;若未指定表,则显示数据库中所有匹配的表;若未指定列,则显示表中所有匹配的列以及列的类型。
mysqlshow [options] [db_name [tbl_name [col_name]]]
常用选项如下:
-h HOST_NAME或--host=HOST_NAME- 指定连接的主机名或 IP 地址-u USER或--user=USER- 指定连接的用户-P PORT_NUM或--port=PORT_NUM- 指定端口--password[=password]或-p[password]- 使用的密码,"[ ]"表示是可选的。若在命令行中指定密码,-p短选项的后面并没有空格。在命令行中直接使用密码并不安全
示例如下:
Shell > /usr/local/mysql8/bin/mysqlshow -h localhost -u root -p world
Enter password:
Database: world
+-----------------+
| Tables |
+-----------------+
| city |
| country |
| countrylanguage |
+-----------------+
Shell > /usr/local/mysql8/bin/mysqlshow -h localhost -u root -p world city
Enter password:
Database: world Table: city
+-------------+----------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |
+-------------+----------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
| ID | int | | NO | PRI | | auto_increment | select,insert,update,references | |
| Name | char(35) | utf8mb4_0900_ai_ci | NO | | | | select,insert,update,references | |
| CountryCode | char(3) | utf8mb4_0900_ai_ci | NO | MUL | | | select,insert,update,references | |
| District | char(20) | utf8mb4_0900_ai_ci | NO | | | | select,insert,update,references | |
| Population | int | | NO | | 0 | | select,insert,update,references | |
+-------------+----------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
管理和实用程序
主要介绍这三个:
- innochecksum - 对于 InnoDB 存储引擎,用来打印 InnoDB 文件的校验和(需 MySQL 实例未运行)。
- mysqlbinlog - 用来读取二进制日志文件中的内容
- mysqldumpslow - 用来读取慢查询日志文件的内容
innochecksum 命令
语法为:
innochecksum [options] file_name
常用选项:
--help- 帮助信息--count- 打印文件中的页数--start-page=NUM- 从指定页开始--end-page=NUM- 从指定页结束--page=NUM- 检查指定的页--strict-check- 执行严格的校验和算法
示例如下:
# 检查所有表空间文件
## 通配符(*) 不适用于 Windows 操作系统
Shell > /usr/local/mysql8/bin/innochecksum /usr/local/mysql8/data/*/*.ibd
mysqlbinlog 命令
语法为:
mysqlbinlog [options] log_file ...
# 旧版本的 "show master status;" 已被弃用并不再支持
## 在复制技术中,若要查看副本的状态,请使用 "show replica status;"
show binary log status;
+---------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000080 | 158 | | | |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
从输出内容可知,当前 MySQL 实例所使用的是 binlog.000080 这个文件。
Shell > /usr/local/mysql8/bin/mysqlbinlog /usr/local/mysql8/data/binlog.000080
# The proper term is pseudo_replica_mode, but we use this compatibility alias
# to make the statement usable on server versions 8.0.24 and older.
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#260110 12:00:48 server id 1 end_log_pos 127 CRC32 0xb8e15345 Start: binlog v 4, server v 8.4.6 created 260110 12:00:48 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG '
8M5haQ8BAAAAewAAAH8AAAABAAQAOC40LjYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADwzmFpEwANAAgAAAAABAAEAAAAYwAEGggAAAAAAAACAAAACgoKKioAEjQA
CigAAAFFU+G4
'/*!*/;
# at 127
#260110 12:00:49 server id 1 end_log_pos 158 CRC32 0x00172e3d Previous-GTIDs
# [empty]
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
mysqlbinlog 还可以用来读取远程机器的二进制日志信息:
Shell > /usr/local/mysql8/bin/mysqlbinlog -h 192.168.100.20 -u jack -p /data/binlog.binlog.000001
mysqldumpslow 命令
语法为:
mysqldumpslow [options] [log_file ...]
慢查询日志:该日志的主要作用用来分析当前 MySQL 实例的性能瓶颈问题(当超过了 long_query_time=10 时就会被记录),默认未开启(slow_query_log=0)。
杂项工具
pererr 命令
该命令用来显示错误代码的详细信息,语法为:
perror [options] errorcode ...
例如:
Shell > /usr/local/mysql8/bin/perror 1 13 1064
OS error code 1: Operation not permitted
MySQL error code MY-000001: Can't create/write to file '%s' (OS errno %d - %s)
OS error code 13: Permission denied
MySQL error code MY-000013: Can't get stat of '%s' (OS errno %d - %s)
MySQL error code MY-001064 (ER_PARSE_ERROR): %s near '%-.80s' at line %d
需要注意的是,同一个错误代码在不同操作系统中有不同的含义。










