十四,Mysql客户端常用工具指令

159 阅读10分钟

一,mysql

mysql 是 MySQL 数据库的官方命令行客户端工具,用于连接到 MySQL 服务器并执行 SQL 语句、管理数据库和表等操作。以下是它的核心功能和使用方法:

1.1 基本语法

mysql [选项] [数据库名]

1.2 核心功能

  1. 连接 MySQL 服务器:通过命令行登录数据库。
  2. 执行 SQL 语句:交互式输入 SQL 或执行外部 SQL 文件。
  3. 管理数据:查询、插入、更新、删除数据,管理表结构等。
  4. 脚本自动化:结合 Shell 脚本批量处理数据库任务。

1.3 常用选项

选项说明
-u <用户名>指定登录用户名(默认 root)。
-p提示输入密码(推荐使用,避免在命令行明文输入密码)。
-h <主机地址>连接远程 MySQL 服务器(默认 localhost)。
-P <端口号>指定 MySQL 服务端口(默认 3306)。
-D <数据库名>直接连接到指定数据库(等同 USE 数据库名;)。
-e "<SQL语句>"执行单条 SQL 语句后退出(非交互模式)。
--execute=<文件>执行外部 SQL 文件(等同 source 文件.sql)。
--verbose显示详细执行过程(调试用)。
--safe-updates启用安全模式(禁止无 WHEREUPDATEDELETE)。

1.4 使用示例

  1. 登录 MySQL 服务器

    # 本地登录(默认用户 root,端口 3306)
    mysql -u root -p
    
    # 远程登录(主机 192.168.1.100,用户 admin,端口 3307)
    mysql -u admin -h 192.168.1.100 -P 3307 -p
    
    
  2. 直接连接到指定数据库

    # 登录并选择 mydb 数据库
    mysql -u root -p -D mydb
    
    
  3. 执行单条 SQL 命令(非交互模式)

    # 查询所有数据库(执行后退出)
    mysql -u root -p -e "SHOW DATABASES;"
    
    
  4. 执行外部 SQL 文件

    # 执行备份文件恢复数据
    mysql -u root -p mydb < backup.sql
    
    # 或登录后使用 source 命令
    mysql> source /path/to/backup.sql;
    
    
  5. 启用安全模式

    # 防止误删数据(必须带 WHERE 条件)
    mysql -u root -p --safe-updates
    

1.5 高级用法

  1. 结合管道处理数据

    # 导出 CSV 数据(需权限)
    echo "SELECT * FROM users INTO OUTFILE '/tmp/users.csv';" | mysql -u root -p mydb
    
    
  2. 自动化脚本

    # 批量执行 SQL 语句
    mysql -u root -p -e "
      CREATE DATABASE test;
      USE test;
      CREATE TABLE logs (id INT, message TEXT);
    "
    

二,mysqladmin

mysqladmin 是 MySQL 提供的命令行管理工具,用于执行数据库服务器的管理操作,例如监控状态、创建/删除数据库、关闭服务器等。

2.1 基本语法

mysqladmin [选项] 命令 [命令参数]

2.2 常用命令与示例

命令作用示例
ping检查MySQL服务是否运行mysqladmin -u root -p ping (返回 mysqld is alive 表示服务正常)
status查看服务器简要状态mysqladmin -u root -p status (显示运行时间、线程数、查询数等)
processlist查看当前活动线程(连接)mysqladmin -u root -p processlist (类似 SHOW PROCESSLIST;
create 数据库名创建新数据库mysqladmin -u root -p create mydb
drop 数据库名删除数据库mysqladmin -u root -p drop mydb (会提示确认)
shutdown关闭MySQL服务器mysqladmin -u root -p shutdown (需权限,谨慎使用!)
flush-hosts清除被阻塞的主机连接mysqladmin -u root -p flush-hosts (解决“Too many connections”错误)
flush-privileges重新加载权限表(等同FLUSH PRIVILEGESmysqladmin -u root -p flush-privileges
variables查看服务器系统变量mysqladmin -u root -p variables (显示所有变量,可搭配 grep 过滤)
version查看MySQL版本信息mysqladmin -u root -p version

2.3 常用选项

选项说明
-u 用户名指定登录用户(默认 root
-p提示输入密码(推荐使用,避免明文密码)
-h 主机地址连接远程MySQL服务器(默认 localhost
-P 端口号指定端口(默认 3306
--socket=SOCKET指定Unix Socket文件路径

2.4 典型使用场景

  1. 快速检查服务状态

    mysqladmin -u root -p ping
    # 输出:mysqld is alive
    
  2. 监控服务器负载

    mysqladmin -u root -p status
    # 输出:
    # Uptime: 1000  Threads: 3  Questions: 100  Slow queries: 0  Opens: 200  Flush tables: 1 ...
    
  3. 批量执行命令

    mysqladmin -u root -p flush-hosts flush-privileges
    # 同时刷新主机缓存和权限表
    

2.5 注意事项

  1. 密码安全

    • 避免在命令行中直接写密码(如 -p123456),使用 -p 交互输入更安全。

    • 推荐使用 ~/.my.cnf 配置文件存储账号密码:

      [mysqladmin]
      user=root
      password=your_password
      
  2. 权限要求

    • 执行 shutdowncreate/drop database 等操作需要高权限(如 SHUTDOWNCREATE 权限)。
  3. 远程管理

    • 若连接远程服务器,确保用户有远程访问权限(如 'root'@'%')。

三,mysqlbinlog

mysqlbinlog 是 MySQL 提供的命令行工具,用于解析、查看和管理二进制日志(Binary Log)。二进制日志记录了数据库的所有数据变更操作(如增删改)及结构变更,是数据恢复、主从复制的核心组件。

3.1 核心功能

  1. 查看二进制日志内容:将二进制日志转换为可读的文本或 SQL 语句。
  2. 数据恢复:从日志中提取特定操作,恢复误删或误改的数据。
  3. 主从复制分析:解析主库的二进制日志,排查复制问题。
  4. 日志过滤:按时间、位置、数据库等条件筛选操作记录。

3.2 基本语法

mysqlbinlog [选项] binlog文件名

3.3 常用选项与示例

  1. 查看日志内容

    • 默认输出(BINLOG格式,含原始字节):

      mysqlbinlog mysql-bin.000001
      
    • 转换为SQL语句(便于阅读):

      mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.000001
      
      
  2. 按时间范围过滤

    mysqlbinlog \
      --start-datetime="2023-10-01 00:00:00" \
      --stop-datetime="2023-10-02 23:59:59" \
      mysql-bin.000001
    
    
  3. 按位置点过滤

    mysqlbinlog \
      --start-position=12345 \
      --stop-position=67890 \
      mysql-bin.000001
    
    
  4. 仅输出特定数据库的操作

    mysqlbinlog --database=mydb mysql-bin.000001
    
    
  5. 导出为SQL文件(用于恢复)

    mysqlbinlog mysql-bin.000001 > backup.sql
    
    
  6. 直接应用到数据库

    mysqlbinlog mysql-bin.000001 | mysql -u root -p
    
    
  7. 远程解析日志

    mysqlbinlog \
      --read-from-remote-server \
      --host=192.168.1.100 \
      --user=repl_user \
      --password \
      mysql-bin.000001
    

3.4 关键使用场景

  1. 误操作恢复

    # 1. 查找误操作的时间或位置点
    mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.000001
    
    # 2. 导出误操作前的日志到SQL文件(假设误操作在位置50000之后)
    mysqlbinlog --stop-position=50000 mysql-bin.000001 > restore.sql
    
    # 3. 执行恢复
    mysql -u root -p < restore.sql
    
  2. 分析主从复制问题

    # 查看主库的二进制日志事件
    mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.000001
    
    # 对比从库的relay log是否同步
    
  3. 监控数据库变更

    # 实时解析最新日志(需开启GTID或指定位置)
    mysqlbinlog --read-from-remote-server -u root -p --host=localhost \
      --start-position=$(cat last_pos.txt) \
      --to-last-log \
      mysql-bin.000001
    

3.5 注意事项

  1. 二进制日志需启用
    • my.cnf 中配置 log-bin=mysql-bin
  2. 权限要求
    • 本地解析需文件读取权限,远程解析需 REPLICATION CLIENT 权限。
  3. ROW格式日志处理
    • 若二进制日志格式为 ROW,需添加 -v--verbose 选项解码。
  4. GTID模式
    • 使用 --skip-gtids 可忽略GTID信息,避免重复执行冲突。

3.6 常用选项速查表

选项作用
--base64-output=DECODE-ROWS解码ROW格式的日志内容
-v--verbose显示更详细的信息(如完整SQL语句)
--start-datetime按开始时间过滤日志事件
--stop-datetime按结束时间过滤日志事件
--start-position按起始位置点过滤日志
--stop-position按结束位置点过滤日志
--database仅显示指定数据库的操作
--read-from-remote-server从远程服务器读取日志文件
--result-file将输出保存到指定文件

四,mysqlshow

mysqlshow 是 MySQL 提供的命令行工具,用于快速查看数据库、表、列的结构信息,类似于在 MySQL 客户端中执行 SHOW DATABASESSHOW TABLES 等命令,但无需进入交互式界面。它特别适合快速检查元数据或编写脚本时使用。

4.1 基本语法

mysqlshow [选项] [数据库名 [表名 [列名]]]

4.2 常用功能与示例

  1. 查看所有数据库

    mysqlshow -u root -p
    

    输出

    +--------------------+
    |     Databases      |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | mydb               |
    +--------------------+
    
    
  2. 查看某个数据库的表

    mysqlshow -u root -p mydb
    

    输出

    Database: mydb
    +------------+
    |   Tables   |
    +------------+
    | users      |
    | orders     |
    | products   |
    +------------+
    
  3. 查看表的列结构

 ```bash
 mysqlshow -u root -p mydb users
 ```

 **输出**

 ```
 Database: mydb  Table: users
 +-------------+--------------+------+-----+---------+----------------+
 | Field       | Type         | Null | Key | Default | Extra          |
 +-------------+--------------+------+-----+---------+----------------+
 | id          | int(11)      | NO   | PRI | NULL    | auto_increment |
 | name        | varchar(50)  | YES  |     | NULL    |                |
 | email       | varchar(100) | YES  | UNI | NULL    |                |
 +-------------+--------------+------+-----+---------+----------------+

4. 显示表的统计信息(行数、引擎等)

 ```bash
 mysqlshow -u root -p --count mydb users
 ```

 **输出**

 ```
 Database: mydb  Table: users  Rows: 100
 +-------------+--------------+------+-----+---------+----------------+
 | Field       | Type         | Null | Key | Default | Extra          |
 +-------------+--------------+------+-----+---------+----------------+
 | ...(列结构同上)...                        |
 +-------------+--------------+------+-----+---------+----------------+

5. 使用通配符过滤表或列

 ```bash
 # 查看以 "user" 开头的表
 mysqlshow -u root -p mydb "user%"
 
 # 查看表中以 "name" 结尾的列
 mysqlshow -u root -p mydb users "%name"

4.3 常用选项

选项作用
-u 用户名指定登录用户(默认 root
-p提示输入密码
-h 主机地址连接远程服务器(默认 localhost
-P 端口指定端口(默认 3306
--count显示表的行数
--keys显示表的索引信息
--status显示表的详细状态(存储引擎、行数、创建时间等)
-i--info显示表和列的注释信息

4.4 典型使用场景

  1. 快速检查数据库结构

    # 查看所有数据库
    mysqlshow -u root -p
    
    # 查看某个数据库的所有表
    mysqlshow -u root -p mydb
    
    # 查看表的列信息
    mysqlshow -u root -p mydb users
    
  2. 统计表数据量

    mysqlshow -u root -p --count mydb orders
    

    输出

    Database: mydb  Table: orders  Rows: 5000
    
  3. 检查表的存储引擎和状态

    mysqlshow -u root -p --status mydb products
    

    输出

    Database: mydb  Table: products
        Rows: 200
        Create_time: 2023-10-01 12:34:56
        Update_time: NULL
        Engine: InnoDB
        Collation: utf8mb4_general_ci
    

4.5 注意事项

  1. 权限要求
    • 需要 SELECT 权限查看表结构,SHOW DATABASES 权限查看数据库列表。
  2. 输出格式化
    • 默认输出为表格格式,若需脚本处理,可结合 grepawk 过滤。
  3. 与 SQL 命令对比
    • 功能等价于 SHOW DATABASESSHOW TABLES 等,但更轻量快捷。

五,mysqldump

mysqldump 是 MySQL 提供的命令行工具,用于逻辑备份数据库或表,生成包含 SQL 语句的文本文件(如 CREATE TABLEINSERT),可通过该文件恢复数据。它是 MySQL 数据备份与迁移的核心工具之一。

5.1 核心功能

  1. 全库备份:导出整个数据库或所有数据库。
  2. 部分备份:导出指定表、符合条件的数据。
  3. 结构备份:仅导出表结构(不含数据)。
  4. 数据迁移:跨服务器、跨版本迁移数据。
  5. 避免锁表:通过事务或快照实现无锁备份(InnoDB)。

5.2 基本语法

mysqldump [选项] 数据库名 [表名] > 备份文件.sql

5.3 常用选项与示例

  1. 全库备份

    # 备份所有数据库(含系统库)
    mysqldump -u root -p --all-databases > full_backup.sql
    
    # 备份指定数据库
    mysqldump -u root -p mydb > mydb_backup.sql
    
    
  2. 仅备份表结构

    mysqldump -u root -p --no-data mydb > mydb_schema.sql
    
    
  3. 仅备份数据

    mysqldump -u root -p --no-create-info mydb > mydb_data.sql
    
    
  4. 备份指定表

    mysqldump -u root -p mydb users orders > mydb_tables.sql
    
    
  5. 条件备份(导出部分数据)

    # 导出 users 表中 id < 100 的记录
    mysqldump -u root -p --where="id < 100" mydb users > users_filtered.sql
    
    
  6. 无锁备份(InnoDB)

    mysqldump -u root -p --single-transaction mydb > mydb_no_lock.sql
    
    
  7. 压缩备份

    mysqldump -u root -p mydb | gzip > mydb.sql.gz
    
    
  8. 远程备份

    mysqldump -h 192.168.1.100 -P 3306 -u remote_user -p mydb > remote_backup.sql
    

5.4 关键选项详解

选项作用
--all-databases备份所有数据库
--no-data仅导出表结构,不导出数据
--no-create-info仅导出数据,不包含 CREATE TABLE 语句
--single-transaction对 InnoDB 表启用事务快照,实现无锁备份(需事务隔离级别为 REPEATABLE READ)
--lock-tables备份时锁定所有表(默认 MyISAM 表会启用,InnoDB 建议用 --single-transaction
--where="条件"按条件导出数据(仅限单表)
--ignore-table=db.tbl忽略指定表(可重复多次)
--skip-comments不生成注释(减小备份文件体积)
--hex-blob以十六进制导出 BLOB 类型数据(避免编码问题)
--result-file=文件名指定输出文件路径(Windows 需使用此选项避免换行符问题)

5.5 数据恢复

  1. 命令行恢复

    mysql -u root -p mydb < mydb_backup.sql
    
    
  2. 恢复全库备份

 ```bash
 mysql -u root -p < full_backup.sql

3. 恢复压缩备份

 ```bash
 gunzip < mydb.sql.gz | mysql -u root -p mydb
 ```

5.6 注意事项

  1. 备份一致性

    • MyISAM 表需用 --lock-tables 锁表,可能阻塞写入。
    • InnoDB 表优先使用 --single-transaction 实现无锁备份。
  2. 大表备份优化

    • 结合 --quick(逐行导出)减少内存占用。
    • 分库分表备份,降低单文件体积。
  3. 版本兼容性

    • 高版本 MySQL 导出的备份可能不兼容低版本(如默认字符集差异)。
    • 使用 --skip-dump-date 避免备份文件中的时间注释影响差异对比。
  4. 安全建议

    • 备份文件需加密或限制访问权限(含敏感数据)。
    • 定期验证备份文件可恢复性。

5.7 典型场景

  1. 每日全量备份

    mysqldump -u root -p --single-transaction --all-databases | gzip > /backup/full_$(date +%F).sql.gz
    
    
  2. 仅备份新增数据(配合 binlog)

    # 1. 全量备份
    mysqldump -u root -p --single-transaction --flush-logs --all-databases > full.sql
    
    # 2. 后续通过 binlog 增量恢复
    mysqlbinlog mysql-bin.000001 | mysql -u root -p
    
    
  3. 导出表结构用于版本控制

    mysqldump -u root -p --no-data --skip-comments mydb > schema.sql
    

六,mysqlimoort

mysqlimoort用于快速将文本文件(如 CSV、TXT)批量导入到数据库表中。

6.1 核心功能

  • 批量导入数据:将文本文件内容高效导入到指定表。
  • 自动匹配字段:根据文件列顺序与表结构匹配(需文件列与表字段顺序一致)。
  • 替代 SQL 语句:相当于 LOAD DATA INFILE 命令的封装,但更简洁。

6.2 基本语法

mysqlimport [选项] 数据库名 文件名

注意

  • 文件名需与表名一致(例如文件 users.txt 默认导入到 users 表)。
  • 文件路径需绝对路径或相对路径(需权限)。

6.3 常用选项与示例

  1. 基本导入

    # 将 users.csv 导入到 mydb 数据库的 users 表
    mysqlimport -u root -p --fields-terminated-by=',' mydb /path/users.csv
    
    
  2. 指定分隔符

    # 字段以逗号分隔,行以换行符结束
    mysqlimport -u root -p \
      --fields-terminated-by=',' \
      --lines-terminated-by='\n' \
      mydb /path/users.txt
    
    
  3. 忽略指定行

    # 跳过文件前1行(如标题行)
    mysqlimport -u root -p --ignore-lines=1 mydb /path/users.csv
    
    
  4. 覆盖重复数据

    # 若唯一键冲突,替换旧数据
    mysqlimport -u root -p --replace mydb /path/users.csv
    
    
  5. 仅导入指定列

 ```bash
 # 文件只包含 name 和 email 列(需文件列顺序与表字段一致)
 mysqlimport -u root -p --columns=name,email mydb /path/users.csv

6. 压缩文件导入

 ```bash
 gunzip < users.csv.gz | mysqlimport -u root -p mydb -

6.4 关键选项详解

选项作用
--fields-terminated-by字段分隔符(默认 \t
--fields-enclosed-by字段包围符(如 "
--lines-terminated-by行结束符(默认 \n
--ignore-lines=N跳过文件前 N 行(如标题行)
--replace冲突时替换旧数据
--ignore冲突时跳过新数据
--columns=列名列表指定导入的列(需与文件列顺序一致)
--local从客户端本地读取文件(默认需服务器权限)
--verbose显示详细执行过程

6.5 使用场景

  1. 快速导入 CSV 数据

    mysqlimport -u root -p \
      --fields-terminated-by=',' \
      --fields-optionally-enclosed-by='"' \
      mydb /data/products.csv
    
    
  2. 从日志文件批量导入

    # 日志字段以竖线分隔
    mysqlimport -u root -p \
      --fields-terminated-by='|' \
      --ignore-lines=1 \
      mydb /logs/access.log
    
    
  3. 定时导入增量数据

    # 每天导入新增数据(结合 crontab)
    0 2 * * * mysqlimport -u root -p密码 --local mydb /daily_data/$(date +\%F).csv
    

6.6 注意事项

  1. 文件权限

    • 若使用 --local,需确保 MySQL 客户端有权限读取文件。
    • 默认情况下,MySQL 服务器需有权限访问文件路径(安全风险较高,建议用 --local)。
  2. 数据一致性

    • 导入前备份数据,避免误覆盖。
    • 若需事务支持,建议改用 LOAD DATA INFILE 或分批次导入。
  3. 性能优化

    • 大文件导入时,关闭索引(导入前 ALTER TABLE ... DISABLE KEYS,完成后重建)。
    • 使用 --local 可减少网络传输开销。
  4. 编码问题

    • 文件编码需与表字符集一致(如 UTF-8),否则可能乱码。

6.7 与 LOAD DATA INFILE 对比

特性mysqlimportLOAD DATA INFILE(SQL 语句)
使用方式命令行工具需在 MySQL 客户端中执行
灵活性依赖文件名与表名匹配可指定任意文件路径和表名
适用场景快速脚本调用需要复杂条件或程序集成时使用
性能相同(底层实现一致)相同

七,source

MySQL 的 source 命令(或在 MySQL 客户端中简写为 \.)用于在 MySQL 命令行界面中执行外部 SQL 文件,类似于脚本的批量运行。它可以帮助你快速导入数据、执行复杂的 SQL 脚本或恢复数据库备份。

7.1 基本语法

-- 在 MySQL 命令行中执行:
mysql> source /path/to/file.sql;
-- 或简写为:
mysql> \. /path/to/file.sql;

7.2 核心功能

  1. 批量执行 SQL 语句:运行包含 CREATEINSERTUPDATE 等操作的 SQL 文件。
  2. 数据恢复:导入备份的 .sql 文件(如通过 mysqldump 生成的备份)。
  3. 初始化数据库:执行建表、插入初始化数据的脚本。

7.3 使用步骤与示例

  1. 登录 MySQL 客户端

    mysql -u root -p
    
    
  2. 选择目标数据库

    USE mydb;
    
  3. 执行 SQL 文件

    source /home/user/backup.sql;
    

输出示例

Query OK, 0 rows affected (0.00 sec)
Query OK, 10 rows affected (0.01 sec)
...

7.4 注意事项

  1. 文件路径问题
    • 绝对路径:推荐使用完整路径(如 /home/user/file.sql),避免相对路径歧义。
    • 权限问题:确保 MySQL 用户有权限读取该文件(尤其是 Linux 系统下的文件权限)。
  2. 文件编码
    • SQL 文件需与 MySQL 客户端的字符集一致(如 UTF-8),否则可能出现乱码错误。
  3. 大文件处理
    • 性能问题source 是逐行解析执行,大文件(如 GB 级)可能耗时较长。
    • 替代方案:在 Shell 中使用 mysql < file.sql 更高效。

7.5 典型使用场景

  1. 恢复数据库备份
    mysql> source /backup/mydb_20231001.sql;
    
  2. 执行初始化脚本
    mysql> source /init/schema_and_data.sql;
    
  3. 批量更新数据
    mysql> source /update/price_adjust.sql;