🔥个人主页: 中草药
🔥专栏:【MySQL】探秘:数据库世界的瑞士军刀
MySQL在安装完成后,通常会包含以下程序,以Ubuntu上的mysql为例,我们可以查看到
以下是常用的mysql程序
程序名 | 作用 |
---|---|
mysqld | MySQL 的守护进程即 MySQL 服务器,要使用 MySQL 服务器 mysqld 必须正在运行状态 |
mysql | MySQL 客户端程序,用于交互式输入 SQL 语句或以批处理模式从文件执行 SQL 的命令行工具 |
mysqlcheck | 用于检查、修复、分析和优化表的表维护客户端 |
mysqldump | 将 MySQL 数据库转储到 SQL、文本或 XML 文件中的客户端 |
mysqlimport | 将文本文件导入到表的客户端工具 |
mysqladmin | 执行管理操作的客户端,例如创建或删除数据库、重新加载授权表、将表刷新到磁盘以及重新打开日志文件。Mysqladmin 还可以用于从服务器检索版本、进程和状态信息 |
mysqlshow | 显示数据库、表、列和索引信息的客户端 |
mysqldumpslow | 用于读取和汇总慢速查询日志内容的实用程序 |
mysqlbinlog | 从二进制日志中读取 SQL 语句的实用程序。mysqlbinlog 文件中包含的已执行 SQL 语句的日志,可用于从崩溃中恢复数据 |
mysqlslap | 客户端负载工具,模拟多个客户端同时访问 MySQL 服务器,并报告每个阶段的使用时间 |
一、MySQL命令行客户端
MySQL是一个简单的 SQLshell,可以输入命令和执行SQL语句,当执行SQL语句时,查询结果以ASCII表格式显示
客户端常用命令
选项 - 长格式 | 短格式 | 说明 |
---|---|---|
--host | -h | --host=host_name,-host_name 连接到指定主机上的 MySQL 服务 |
--port | -P | --port=port_num,-Pport_num TCP/IP 连接使用的端口号 |
--user | -u | --user=user_name,-uuser_name 用于连接到 MySQL 服务器的用户名 |
--password | -p | --password[=password],-p[password] 用于连接到 MySQL 服务器的密码。可选,如果没有给出,会提示用户输入 |
--defaults-file | --defaults-file=file_name 使用指定的选项文件。如果该文件不存在,则会发生错误 | |
--default-character-set | --default-character-set=charset_name charset_name 将作为客户端和当前连接的默认字符集,例:utf8mb4 | |
--database | -D | --database=db_name,-Ddb_name 要使用的数据库 |
--compress | -C | --compress,-C 如果可能,压缩客户端和服务器之间传输的所有信息 |
--reconnect | --reconnect 如果客户端与服务器的连接丢失,自动尝试重新连接 | |
--quick | -q | --quick,-q 不缓存查询结果,收到一行打印一行,如果输出被挂起,可能会降低服务器速度 |
--protocol | --protocol={TCP | SOCKET | PIPE | MEMORY} 用于连接到服务器的传输协议,默认为 TCP | |
--delimiter | --delimiter=str 设置 SQL 语句分隔符。默认值为分号 ( ; ) | |
--execute | -e | --execute=statement,-estatement 执行指定的 SQL 语句并退出 |
--version | -V | --version,-V 显示版本信息并退出 |
--help | -? | --help,-? 显示帮助信息并退出 |
注意
1)选项名称区分大小写。-v 和-V 都是合法的,但含义不同,它们分别是 --verbose和--version 选项的相应缩写形式
#以下两个等价
mysqld --verbose --help
mysqld -v -?#以下两个等价
mysql --version
mysql -V
2)对于带值的长格式选项,通常用 = 符号分隔选项名称和值。对于带值的短选项,选项值可以紧跟在选项之后,也可以用空格隔开。
例如: --host=127.0.0.1 、 -h127.0.0.1 和 -h 127.0.0.1 是等价的。
但是对于密码选项的短格式,如果要指定密码,选项与值之间不能有空格,如下所示:
mysql -ptest # test 表示密码,但没有指定要访问的数据库
mysql -p test # test 表示指定了访问的数据库,但没有指定密码
3)在命令行之中,第一个不带破折号 — 的值被解析为要访问的数据库名,所以--database一般都进行省略
4)对于采用数值的选项,该值可以带有后缀 K,M 或 G 以指示乘数 1024、1024^2 或 1024^3,例如,以下命令告诉 mysqladmin 对服务器执行 1024 次 ping,每次 ping 之间休眠 3 秒
mysqladmin --count=1K --sleep=3 ping -uroot -p
5)如果选项的值包括空格,那么值需要包含在双引号之中
二、mysqlcheck-表维护程序
mysqlcheck是 MySQL 自带的命令行工具,用于检查、修复、优化和分析数据库表。它是对 SQL 命令 CHECK TABLE
, REPAIR TABLE
, ANALYZE TABLE
, 和 OPTIMIZE TABLE
的封装,支持批量处理多个数据库或表。
mysqlcheck 客户端用于执行表维护,可以对表进行:分析、检查、修复或优化操作。
-
分析表(Analyze):更新表的索引统计信息,优化查询计划。
-
检查表完整性(Check):验证表结构和数据是否损坏。
-
修复表(Repair):尝试修复损坏的表(主要针对 MyISAM 引擎)。
-
优化表(Optimize):重新组织表的物理存储,减少碎片(对 InnoDB 也有效)。
注意事项
1)存储引擎限制:
MyISAM:支持 REPAIR
,CHECK
,OPTIMIZE
。
InnoDB:
通常不需要手动修复,支持自动崩溃恢复。
OPTIMIZE TABLE
会重建表并释放未使用空间(相当于 ALTER TABLE ... FORCE
)。
若 InnoDB 表损坏,建议通过备份恢复或使用 mysqldump
导出后重新导入。
2)锁表问题:
OPTIMIZE TABLE
和 REPAIR TABLE
可能锁表,影响线上服务,建议在低峰期操作。
3)备份优先:
修复表前务必备份数据(如使用 mysqldump
),避免操作失败导致数据丢失。
4)状态:
在使用mysqlcheck工具时,MySQL服务器必须在运行状态
常用选项
选项 | 说明 |
---|---|
--analyze, -a | 分析表 |
--auto-repair | 如果检查的表有损坏,则自动修复它。所有表都检查过之后才进行必要的修复 |
--check, -c | 检查表中的错误。mysqlcheck 的默认操作 |
--check-only-changed, -C | 仅检查自上次检查以来更改过的表 |
--databases, -B | --databases db_name 多个数据库名用空格隔开 处理指定数据库中的所有表 |
--force, -f | 即使发生 SQL 错误也要继续 |
--optimize, -o | 优化表 |
--repair, -r | 执行可能进行的任务修复操作,除了唯一键 |
--skip-database | --skip-database=db_name 不需要执行检查的数据库名 (区分大小写) |
--tables | --tables=table_name 多个表名用空格隔开 在选项之后的所有名称参数都被视为表名 |
--use-frm | 对于 MyISAM 表的修复操作 |
特殊使用
mysqlcheck 程序的默认功能是对数据表进行 检查 操作 (相当于指定选项 --check),如果想要对表进行修复操作,可以通过复制原来的 mysqlcheck 程序,并重命名为 mysqlrepair,并运行 mysqlrepair 即可,还可以创建 mysqlcheck 的快捷方式,并把快捷方式命名为 mysqlrepair 然后直接运行,这时就执行的是修复操作,通过下表所示的命名方式可以改变 mysqlcheck 的默认行为:
程序名 | 说明 |
---|---|
mysqlrepair | 默认行为是修复,相当于选项 --repair |
mysqlanalyze | 默认行为是修复,相当于分析 --analyze |
mysqloptimize | 默认行为是修复,相当于优化 --optimize |
三、mysqldump-数据库备份程序
mysqldump是 MySQL 自带的命令行工具,用于生成数据库的逻辑备份文件(SQL 格式)。通过导出表结构和数据,用户可以在需要时恢复数据库到备份时的状态。
基本语法
mysqldump [选项] 数据库名 [表名] > 备份文件.sql
部分常用选项
选项 | 说明 |
---|---|
--all-databases 或 -A | 备份所有数据库。 |
--databases 或 -B | 指定多个数据库(空格分隔)。 |
--single-transaction | 对 InnoDB 表启用事务快照,确保备份一致性(需配合 REPEATABLE READ 隔离级别)。 |
--lock-tables 或 -l | 对非 InnoDB 表(如 MyISAM)锁表备份(默认锁单库的所有表)。 |
--lock-all-tables 或 -x | 全局锁表备份所有数据库(仅限 MyISAM)。 |
--no-data 或 -d | 仅备份表结构,不备份数据。 |
--no-create-info 或 -t | 仅备份数据,不备份表结构。 |
--where="条件" | 按条件备份部分数据(需指定表名)。 |
--result-file=文件名 | 指定备份文件的输出路径(替代 > 重定向)。 |
--compress | 启用压缩协议(减少网络传输量)。 |
--skip-comments | 忽略 SQL 注释。 |
--skip-add-drop-table | 不生成 DROP TABLE 语句(避免恢复时覆盖同名表)。 |
--ignore-table=数据库.表 | 忽略指定表(可多次使用)。 |
--user=用户名 或 -u | 连接数据库的用户名。 |
--password=密码 或 -p | 数据库密码(或提示输入)。 |
--host=主机 或 -h | 数据库服务器地址。 |
--port=端口 或 -P | 数据库端口(默认 3306)。 |
注意事项
- 转储表时必须要有 SELECT 权限
- 转储视图时必须要有 SHOW VIEW 权限
- 转储触发器时必须要有 TRIGGER 权限
- 如果没有使用 --single-transaction 选项时必须要有 LOCK TABLES 权限
- 如果没有使用 --no-tablespaces 选项时必须要有 PROCESS 权限
- 重新导入转储文件时,也需要有相应的权限
- 由于 mysqldump 是逐行转储数据,所以不适用于大数据量的转储与导入
四、mysqladmin-服务器管理程序
mysqladmin是 MySQL 自带的命令行工具,用于执行服务器管理操作,例如监控状态、关闭服务、创建数据库等。它是 DBA 和运维人员常用的工具之一,适合快速执行管理任务而无需进入 MySQL 客户端。使用mysqladmin必须是root权限。
mysqladmin [选项] 命令 [命令参数]
常用命令
命令 | 说明 |
---|---|
status | 显示服务器简要状态(如运行时间、查询数等)。 |
ping | 检查 MySQL 服务是否存活。 |
processlist | 显示当前活动的连接和查询(类似 SHOW PROCESSLIST )。 |
kill 连接ID | 终止指定连接(需结合 processlist 使用)。 |
shutdown | 关闭 MySQL 服务(需权限)。 |
create 数据库名 | 创建新数据库。 |
drop 数据库名 | 删除数据库。 |
refresh | 刷新日志和权限表(等效于 FLUSH PRIVILEGES + 日志轮转)。 |
variables | 查看服务器变量(类似 SHOW VARIABLES )。 |
password 新密码 | 修改当前用户密码(已弃用,建议用 SET PASSWORD 或 ALTER USER )。 |
常用选项
选项 | 说明 |
---|---|
--user=用户名 或 -u | 指定连接用户名。 |
--password=密码 或 -p | 密码(或提示输入)。 |
--host=主机 或 -h | MySQL 服务器地址。 |
--port=端口 或 -P | 指定端口(默认 3306)。 |
--sleep=秒数 或 -i | 循环执行命令(如监控状态)。 |
--count=次数 或 -c | 循环执行的总次数(需配合 --sleep )。 |
--vertical 或 -E | 以垂直格式输出结果(更易读)。 |
--silent 或 -s | 静默模式(仅输出错误信息)。 |
五、mysqlshow-显示数据库、表和列信息
mysqlshow是 MySQL 自带的命令行工具,用于快速查看数据库、表、列的结构信息,类似于在 MySQL 客户端中执行 SHOW DATABASES
、SHOW TABLES
和 DESCRIBE table
等命令的快捷方式。它适合在命令行环境中快速获取数据库元数据,无需进入交互式 MySQL Shell。
mysqlshow [选项] [数据库名 [表名 [列名]]]
举例
显示所有数据库
mysqlshow -u root -p
+--------------------+
| Databases |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sakila |
| sys |
| test_db |
+--------------------+
显示指定数据库的所有表
mysqlshow -u root -p sakilaDatabase: sakila
+------------+
| Tables |
+------------+
| actor |
| address |
| category |
| city |
| country |
| ... |
+------------+
六、mysqldumpslow-总结慢查询日志文件
mysqldumpslow 是 MySQL 自带的工具,用于分析慢查询日志文件,帮助开发者快速定位执行效率低下的 SQL 语句。
mysqldumpslow [选项] [日志文件路径]
常用选项
选项 | 说明 |
---|---|
-a | 不用 N 和 'S' 代替 numbers 和 String |
-n N | 在名称中包含 N 个以上的数字用 N 代替 |
-g pattern | 仅考虑与指定模式匹配的慢查询 |
--help | 显示帮助信息并退出 |
-h host_name | 与 *-slow.log 文件名对应的 MySQL 服务器主机名。可以包含通配符。默认值是 *(匹配所有) |
-i name | 服务器实例的名称 |
-l | 不要从总时间中减去锁占用的时间 |
-r | 倒序排列 |
-s sort_type | 如何对输出进行排序 |
-t N | 显示输出中的前 N 个查询 |
--verbose, -v | 打印有关程序功能的更多信息 |
-s sort_type sort_type 可选的值如下所示:
- t,at: 按查询时间或平均查询时间排序,默认排序
- l,al: 按锁占用时间或平均锁占用时间排序
- r,ar: 按发送的行数或平均发送的行数排序
- c: 按计数排序
show variables like '%query%'
这是一条 MySQL 语句,作用是查询名称中包含 “query” 的系统变量及其对应的值 。
Variable_name | 含义 |
---|---|
binlog_rows_query_log_events | 控制是否在二进制日志中记录基于行模式下的查询事件,OFF 代表不记录 |
ft_query_expansion_limit | 全文检索中查询扩展的限制数量 |
have_query_cache | 表示当前 MySQL 服务器未启用查询缓存功能 |
long_query_time | 慢查询的时间阈值(单位:秒),执行时间超过此值的查询会被记录到慢查询日志(若慢查询日志开启 ) |
query_alloc_block_size | 查询执行过程中分配内存块的大小 |
query_prealloc_size | 查询预分配内存的大小,用于优化查询执行时的内存申请效率 |
slow_query_log | 表示慢查询日志功能未开启 |
slow_query_log_file | 慢查询日志文件的存储路径(当慢查询日志功能开启时 ) |
输出示例:
Count: 3 Time=10.00s (30s total) Lock=0.00s (0s total) Rows=100.0 (300), user@hostSELECT * FROM orders WHERE user_id = N AND status = 'S'
-
Count: 执行次数
-
Time: 单次平均时间(总时间)
-
Lock: 显示查询过程中锁占用的时间
-
Rows: 返回行数
-
SQL: 参数化后的查询(
N
为数字占位符,'S'
为字符串占位符)
七、mysqlbinlog-处理二进制日志文件
mysqlbiinlog是 MySQL 自带的工具,用于解析、查看和管理 MySQL 的二进制日志(Binary Log)文件。二进制日志记录了数据库的所有数据变更操作(如 INSERT、UPDATE、DELETE、DDL 等),是数据恢复、主从复制(Replication)和审计的重要依据。
基本语法
mysqlbinlog [options] log_file...
常用选项
选项 | 说明 |
---|---|
--start-datetime | 指定解析的起始时间(格式:YYYY-MM-DD HH:MM:SS ) |
--stop-datetime | 指定解析的结束时间 |
--start-position | 指定解析的起始事件位置(Position) |
--stop-position | 指定解析的结束事件位置 |
--database=DB_NAME | 仅显示指定数据库的日志(需配合 -v 使用) |
-v 或 --verbose | 显示详细的 SQL 语句(默认仅显示 Base64 编码的 BINLOG) |
--base64-output=decode-rows | 自动解码行事件(ROW 格式日志专用) |
--result-file=FILE | 将解析结果输出到指定文件 |
--read-from-remote-server | 从远程 MySQL 服务器读取二进制日志(需指定 --host 和 --user ) |
--skip-gtids | 忽略 GTID 信息(用于跨实例恢复) |
--include-gtids=GTID_SET | 仅包含指定 GTID 的事件 |
--exclude-gtids=GTID_SET | 排除指定 GTID 的事件 |
--base64-output=value
,value 允许的值: (默认 AUTO)
- AUTO ("automatic") 或 UNSPEC ("unspecified") 在必要时自动显示 BINLOG 语句。如果使用 mysqlbinlog 重新执行二进制日志文件内容,那么使用 AUTO 选项是唯一安全的行为,其他选项值仅用于调试或测试,如果
--base64-output
没有指定,那么默认值是 AUTO- NEVER 不显示 BINLOG 语句。
- DECODE-ROWS 不显示加密内容,可以配合 mysqlbinlog 的
-verbose
选项以注释的形式只显示事件的 SQL 语句。
八、mysqlslap-负载仿真客户端
mysqlslap工具是一个专为数据库性能测试设计的负载仿真客户端。它通过模拟多个并发客户端访问数据库,执行 SQL 查询或自定义测试用例,帮助开发者或 DBA 评估数据库在高负载下的性能表现(如吞吐量、响应时间等)
mysqlslap [optioins]
并发与迭代
参数 | 说明 | 示例 |
---|---|---|
--concurrency | 并发客户端数(模拟用户数) | --concurrency=50,100 (测试不同并发量) |
--iterations | 测试重复次数 | --iterations=10 (重复执行 10 次取平均) |
--number-of-queries | 每个客户端执行的查询总数 | --number-of-queries=1000 |
测试数据生成
选项 | 说明 | |
---|---|---|
--auto-generate-sql, -a | 当命令选项或文件中没有提供 SQL 语句时,自动生成 SQL 语句 | |
--auto-generate-sql-add-autoincrement | 在自动生成的表中添加 AUTO_INCREMENT 列 | |
--auto-generate-sql-execute-number | --auto-generate-sql-execute-number=N 指定要自动生成多少查询 | |
--auto-generate-sql-guid-primary | 向自动生成的表添加基于 GUID 的主键 | |
--auto-generate-sql-load-type | --auto-generate-sql-load-type=type 指定测试负载类型。允许的值是 read(扫描表)、write(插入表)、key(读取主键)、update(更新主键)或 mixed(一半插入,一半扫描选择)。默认为 mixed 。 | |
--auto-generate-sql-secondary-indexes | --auto-generate-sql-secondary-indexes=N 指定要向自动生成的表添加多少索引。默认为 0。 | |
--auto-generate-sql-unique-query-number | --auto-generate-sql-unique-query-number=N 为自动测试生成多少个不同的查询 (where 条件不同)。默认值是 10。 | |
--auto-generate-sql-write-number | --auto-generate-sql-write-number=N 要执行多少行插入。默认值是 100。 | |
--auto-generate-sql-unique-write-number | --auto-generate-sql-unique-write-number=N 为 --auto-generate-sql-write-number 生成多少个不同的查询。默认值是 10 | |
--commit | --commit=N 在提交之前要执行多少语句。默认值是 0 | |
--concurrency, -c | --concurrency=N, -c N 要模拟并行客户端的数量 | |
--create | --create=value 用于创建表 SQL 语句或文件 | |
--create-schema | --create-schema=value 用于测试的库,测试完成后会自己动删除 | |
--csv | --csv[=file_name] 以逗号分隔的格式输出到指定的文件,如果没有给出文件,则输出到控制台 | |
--delimiter, -F | --delimiter=str, -F str SQL 语句的分隔符 | |
--engine, -e | --engine=engine_name, -e engine_name 创建表的存储引擎 | |
--iterations, -i | --iterations=N, -i N 每个客户端运行测试的次数 | |
--no-drop | 运行完测试后不删除创建的数据库 | |
--number-char-cols, -x | --number-char-cols=N, -x N 使用 --auto-generate-sql 选项时 VARCHAR 列的数量 | |
--number-int-cols, -y | --number-int-cols=N, -y N 使用 --auto-generate-sql 选项时 INT 列的数 | |
--number-of-queries | --number-of-queries=N 限制每个客户端最大的查询数 | |
--pre-query | --pre-query=value 测试开始前要执行 SQL 语句或 SQL 文件,不计入查询次数。 | |
--pre-system | --pre-system=str 测试开始前使用 system () 执行的命令。不计入查询次数。 | |
--post-query | --post-query=value 测试完成后要执行 SQL 语句或 SQL 文件,不计入查询次数。 | |
--post-system | --post-system=str 测试完成后使用 system () 执行的命令。不计入查询次数。 | |
--query, -q | --query=value, -q value 包含用于测试的 SELECT 语句的文件或 SQL 语句。 |
高级参数
参数 | 说明 | 示例 |
---|---|---|
--engine | 指定存储引擎 | --engine=InnoDB |
--debug-info | 输出调试信息(如内存、CPU 使用) | --debug-info |
--only-print | 仅打印测试步骤,不实际执行 | 用于验证测试配置 |
只有流过血的手指,才能弹出世间的绝唱。 ——泰戈尔
🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀
以上,就是本期的全部内容啦,若有错误疏忽希望各位大佬及时指出💐
制作不易,希望能对各位提供微小的帮助,可否留下你免费的赞呢🌸