navicat导出的.sh脚本仅是调用mysql导入外部sql文件的包装器,不包含实际数据;需确保backup.sql存在、路径正确、权限可读、mysql客户端已安装,并注意密码安全、字符集匹配及连接参数(host/port/插件/socket)一致性。

Navicat 导出的 .sh 脚本通常不是可直接执行的备份脚本
Navicat 在“导出向导”中选择“SQL 文件”并勾选“导出为 Shell 脚本”时,实际生成的是一个带 #!/bin/bash 头、内嵌 mysql 命令调用的包装脚本,**它本身不包含数据库数据,只负责调用 mysql 导入外部 SQL 文件**。常见结构如下:
#!/bin/bash # Generated by Navicat ... MYSQL_CMD="mysql -h127.0.0.1 -P3306 -uroot -p'xxx' database_name" $MYSQL_CMD <p>这意味着你必须同时拥有:<code>backup.sql</code> 文件 + 该 <code>.sh</code> 脚本 + 目标 MySQL 实例可访问。</p>
- 脚本中的密码明文写在命令行里(
-p'xxx'),Linux 下可能被ps aux窃取,生产环境务必改用~/.my.cnf - 路径如
/path/to/backup.sql是 Windows 路径(例如C:Users...ackup.sql),直接运行会报错No such file or directory -
mysql客户端必须已安装且在$PATH中(Ubuntu/Debian 需装mysql-client或default-mysql-client)
修复路径和权限后才能执行 .sh 脚本
先确认脚本是否具备可执行权限,并修正 SQL 文件路径:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 用
chmod +x navicat_backup.sh添加执行权限 - 用
sed -i 's/C:\\Users\\.*\\//home/youruser/backups//g' navicat_backup.sh批量替换 Windows 路径(或手动编辑,把改成 <code>) - 确保
backup.sql文件真实存在且可读:ls -l /home/you/backups/backup.sql - 若 MySQL 运行在 Docker 中(如
docker run --name mysql8 -p3306:3306 ...),则脚本里的-h127.0.0.1应改为-h host.docker.internal(macOS/Windows)或宿主机 IP(Linux),或直接改用-h172.17.0.1(Docker 默认网关)
更安全可靠的替代做法:跳过 .sh,直接用 mysql 导入
Navicat 导出的真正有效内容是那个 .sql 文件。与其折腾 shell 脚本,不如绕过它:
- 检查 SQL 文件编码:
file -i backup.sql,若为charset=iso-8859-1,导入前转 UTF-8:iconv -f ISO-8859-1 -t UTF-8 backup.sql > backup_utf8.sql - 使用配置文件避免密码暴露:
echo "[client] user = root password = yourpass host = 127.0.0.1 port = 3306" > ~/.my.cnf && chmod 600 ~/.my.cnf - 执行导入:
mysql database_name (注意:库需提前创建,<code>CREATE DATABASE IF NOT EXISTS database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;) - 大文件导入时加
--force防止单条语句失败中断:mysql --force database_name
遇到 ERROR 1045 (28000): Access denied 怎么办
这不是 Navicat 脚本特有,而是 MySQL 认证失败。重点查三处:
-
mysql命令里写的用户名密码是否与目标实例匹配?尤其注意:MySQL 8 默认认证插件是caching_sha2_password,而老客户端可能不支持 —— 可临时降级用户插件:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'xxx'; - 脚本中
-h指定的地址是否能连通?用nc -zv 127.0.0.1 3306测试端口 - 如果用的是 socket 连接(
-S /var/run/mysqld/mysqld.sock),但脚本硬写了 TCP 参数(-h+-P),就会因跳过 socket 而触发权限策略差异
Navicat 生成的 shell 脚本只是个快捷入口,真正关键的是 SQL 内容、MySQL 连接上下文和字符集一致性。路径、密码、插件、socket/TCP 模式这四点任一出错,脚本就卡住 —— 不如拆开看,逐项验证。










