error 1044 是因当前用户对目标数据库缺乏操作权限所致,本质是权限不足而非连接失败;需先执行 select user(), database(); 确认登录用户与已选库,再用 show grants for current_user; 检查是否具备对应库的 create/insert 等权限,最后按需授权并执行 flush privileges。

ERROR 1044 (42000): Access denied for user ... to database
这是 source 执行时最典型的权限报错,本质不是「不能执行 source 命令」,而是当前用户对目标数据库没有操作权限——哪怕你已成功登录 MySQL,也必须有对应库的 SELECT、INSERT、CREATE 等权限才能完成建表、插数据等动作。
- 先确认当前用户和目标库:在 MySQL 客户端里运行
SELECT USER(), DATABASE();,看是否已用正确用户登录,且已通过USE mydb;显式选中了库 - 检查权限:运行
SHOW GRANTS FOR CURRENT_USER;,重点看输出里是否有类似GRANT ALL PRIVILEGES ON `mydb`.* TO ...的行;如果没有,说明缺权限 - 不要直接给
ALL PRIVILEGES到生产库:开发/测试环境可临时授权,命令是GRANT ALL ON mydb.* TO 'username'@'localhost'; FLUSH PRIVILEGES;;生产环境建议按需授予,比如GRANT CREATE, INSERT, ALTER, DROP ON mydb.* TO 'appuser'@'%'; - 注意 host 匹配:
'username'@'localhost'和'username'@'%'是两个不同账号,授权时 host 必须和实际连接方式一致(例如远程连接却只授了@'localhost'就会失败)
ERROR 1046 (3D000): No database selected
这个错误常被误读为权限问题,其实是前置条件缺失:source 不接受「库名.表名」的跨库写法,它只会把 SQL 文件里的语句原样发给当前默认数据库。如果没提前 USE,所有建表、插入都会因无目标库而报错。
- 必须在
source前执行USE your_database_name;,且这条命令不能写在 SQL 文件里——source是客户端命令,SQL 文件内容由服务端解析,二者作用域不同 - SQL 文件开头带
USE xxx;没用,服务端会忽略(除非你手动执行该文件而非用source) - 如果你反复遇到这个错,说明自动化脚本或团队协作中漏了这步;建议把导入流程固化为三行:
mysql -u user -p USE target_db; SOURCE /path/to/file.sql;
File permission denied 错误(Errcode: 13)
source 是 MySQL 客户端发起的本地文件读取操作,但真正读文件的是 **MySQL 客户端进程**(即你本地或 SSH 终端里运行的 mysql 命令),不是服务端。所以报错「Permission denied」,99% 是客户端所在机器上当前用户对 SQL 文件没读权限,跟 MySQL 用户权限无关。
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
- 检查文件路径是否为绝对路径:相对路径基于你启动
mysql客户端时的当前工作目录,极易出错;统一用SOURCE /home/user/data/init.sql;这类绝对路径 - 确认文件可读:
ls -l /path/to/file.sql,确保输出中包含r(如-rw-r--r--),否则运行chmod 644 /path/to/file.sql - 别把文件放在 root-only 目录下(如
/root/),普通用户启动的mysql进程读不到 - Windows 下注意反斜杠转义问题:用
SOURCE C:/data/file.sql;或双反斜杠C:\data\file.sql,单反斜杠会被当转义符处理
字符集不匹配导致的 unknown command 或语法错
某些编辑器(尤其是 Windows 记事本、旧版 Notepad++)保存 SQL 文件时默认用 GBK 或 UTF-8 with BOM,而 MySQL 客户端若未指定字符集,会按 latin1 解析,结果把中文注释、表名或字段名里的非 ASCII 字符当成非法 token,报 Unknown command '' 或 ERROR 1064。
- 用
file -i your.sql(Linux/macOS)或 VS Code 底部状态栏(Windows)确认文件真实编码,必须是 UTF-8 无 BOM - 连接时强制指定字符集:
mysql -u user -p --default-character-set=utf8mb4,然后USE db; SOURCE file.sql; - 避免在 SQL 文件里写中文注释;如果必须写,确保编辑器保存为 UTF-8 no BOM,并在连接后立即执行
SET NAMES utf8mb4; - 新版本 MySQL(8.0+)默认
utf8mb4,但客户端仍可能降级协商,显式指定最稳妥
真正的难点不在报错本身,而在于区分「是 MySQL 服务端拒绝,还是客户端读不了、连不上、认不出」——每个错误码背后对应的排查层级完全不同。别急着改权限,先用 USER()、file 命令、绝对路径这三样东西快速锚定问题发生在哪一层。










