MySQL Shell 需手动配置 PATH 才能执行 mysqlsh;导出单表须用 util.exportTable() 而非 --sql;CSV 乱码需指定 utf8mb4 编码及转义规则;自动化脚本应检查版本兼容性并避免内存溢出。

MySQL Shell 安装后无法执行 mysqlsh 命令
说明:MySQL Shell 是独立安装的工具,不随 MySQL Server 自动部署,mysqlsh 命令未被系统识别,通常是因为 PATH 未包含其安装路径。
实操建议:
- Linux/macOS 下检查是否已将二进制目录(如
/usr/local/mysql-shell/bin或解压后的mysql-shell-8.4.0-macos-x86-64bit/bin)加入$PATH;可用echo $PATH验证 - RPM 安装方式(CentOS/RHEL)一般会自动注册命令,但需确认是否启用仓库源:
yum list installed | grep mysql-shell - 若用 tar.gz 解压安装,必须手动添加路径,例如:
export PATH="/opt/mysql-shell/bin:$PATH",并写入~/.bashrc持久化 - Windows 用户注意:安装时勾选「Add MySQL Shell to PATH」选项,否则需手动配置系统环境变量
mysqlsh --sql 导出单表数据失败,报错 Unknown option: --sql
说明:MySQL Shell 的 --sql 是语言模式开关,不能和导出操作混用;它本身不提供类似 mysqldump 的原生导出能力,必须切换到 SQL 模式后调用内置函数或配合 util.exportTable()。
实操建议:
- 导出单表推荐使用
util.exportTable(),它支持 JSON/CSV/TSV 格式且可并行,例如:util.exportTable("mydb.mytable", {fieldsTerminatedBy: ",", fileName: "/tmp/mytable.csv"}) - 必须先在交互式 shell 中进入 SQL 模式:
\sql,再运行SELECT ... INTO OUTFILE(但该语句受secure_file_priv限制,且只写服务端) - 若想导出到本地客户端机器,只能用
util.exportTable(),且目标路径是客户端本地路径(不是数据库服务器路径) - 注意权限:执行
util.exportTable()需要账户具备SELECT权限,且 MySQL Shell 连接时必须指定完整 host/port/user(不能仅靠 socket)
导出 CSV 时中文乱码或字段被截断
说明:util.exportTable() 默认使用 UTF-8 编码,但若终端 locale 不匹配、或字段含换行符/引号,会导致解析异常;同时 MySQL Server 的 character_set_client 和 collation_connection 也会影响字段内容读取。
实操建议:
- 导出前确保连接时显式指定字符集:
mysqlsh --uri mysql://user:pass@host:3306 --sql后执行SET NAMES utf8mb4; - 导出命令中强制指定编码与转义规则:
util.exportTable("db.t1", {fieldsTerminatedBy: ",", fieldsEnclosedBy: '"', linesTerminatedBy: "\n", dialect: "csv", characterSet: "utf8mb4"}) - 避免字段内含换行符导致 CSV 错位:可在 SQL 查询中预处理,如
REPLACE(col, '\n', ' ') AS col - 导出大表时加
threads: 4提速,但注意并发线程数不能超过 MySQL 的max_connections限制
用 Shell 脚本自动化安装 MySQL Shell 并导出数据
说明:Shell 脚本可封装安装 + 连接 + 导出全过程,但要注意版本兼容性(MySQL Shell 8.0+ 才支持 util.exportTable)、依赖缺失(如 libssl.so.1.1 在新版系统上可能不存在)及权限隔离问题。
实操建议:
- 下载官方二进制包比包管理器更可控,例如:
wget https://dev.mysql.com/get/Downloads/MySQL-Shell/mysql-shell-8.4.0-linux-glibc2.12-x86-64bit.tar.gz - 解压后直接调用绝对路径执行,规避 PATH 问题:
/opt/mysql-shell/bin/mysqlsh --uri "mysql://u:p@h:3306" --js -e "util.exportTable('db.t', {fileName:'/tmp/t.csv'})" - 脚本中务必检查
mysqlsh --version输出,防止低版本误用高版本 API(如 8.0.19 以下不支持dialect: "csv") - 导出失败时别只看 stdout,加
--log-level=DEBUG查日志,常见卡点是 SSL 握手失败或认证插件不兼容(如caching_sha2_password需要 MySQL Shell ≥ 8.0.16)
真正容易被忽略的是:MySQL Shell 的导出行为完全发生在客户端进程内,所有数据经网络拉取后再本地序列化——这意味着导出大表时内存占用陡增,而 mysqldump 是服务端流式生成。别拿它当 mysqldump 替代品去 dump 整库。


















