一、MySQL 常用 SQL 语句的语法规范清单
| 操作类型 | 语法示例 | 规范说明 |
|---|---|---|
| 数据库操作 | CREATE DATABASE IF NOT EXISTS test_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; |
1. 关键字大写(可读性更佳);2. 建议指定字符集 / 排序规则;3. 用IF NOT EXISTS避免重复创建 |
DROP DATABASE IF EXISTS test_db; |
删库前加IF EXISTS,避免不存在时报错 |
|
USE test_db; |
切换数据库,语句结尾必须加分号 | |
| 表操作 | CREATE TABLE IF NOT EXISTS user (``id INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键',``name VARCHAR(50) NOT NULL COMMENT '姓名',``age TINYINT UNSIGNED DEFAULT 0 COMMENT '年龄'``) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; |
1. 指定存储引擎(InnoDB 为默认);2. 字段加注释;3. 数值类型合理选择(如 age 用 TINYINT);4. 主键建议自增 |
ALTER TABLE user ADD COLUMN phone VARCHAR(11) AFTER name; |
新增字段指定位置,避免默认加在最后 | |
DROP TABLE IF EXISTS user; |
删表前加IF EXISTS |
|
| 数据操作 | INSERT INTO user (name, age) VALUES ('张三', 20), ('李四', 25); |
1. 显式指定字段列;2. 批量插入用逗号分隔;3. 字符串值用单引号 |
SELECT id, name FROM user WHERE age > 18 ORDER BY age DESC LIMIT 10; |
1. 避免SELECT *,只查需要的字段;2. WHERE 条件加索引字段;3. 排序 / 分页明确 |
|
UPDATE user SET age = 21 WHERE id = 1; |
1. 必须加 WHERE 条件(否则全表更新);2. 优先用主键作为更新条件 | |
DELETE FROM user WHERE id = 1; |
1. 必须加 WHERE 条件;2. 批量删除慎用,建议先查询验证 | |
| 权限操作 | GRANT SELECT, INSERT ON test_db.* TO 'test_user'@'%' IDENTIFIED BY 'TestPass@123'; |
1. 权限最小化(只授需要的权限);2. 限制访问主机(% 为所有主机,建议指定 IP);3. 密码符合复杂度 |
FLUSH PRIVILEGES; |
权限修改后需刷新生效 |
二、MySQL 命令行操作的常用指令清单
| 指令分类 | 指令示例 | 说明 |
|---|---|---|
| 登录退出 | mysql -uroot -p |
本地登录,-p 后回车输入密码(避免明文) |
mysql -uroot -p123456 -h192.168.1.100 -P3307 |
远程登录,指定主机 (-h)、端口 (-P) | |
exit; / quit; |
退出 MySQL 命令行 | |
| 基础查询 | SHOW DATABASES; |
查看所有数据库 |
SHOW TABLES; |
查看当前数据库下的表 | |
DESC user; / DESCRIBE user; |
查看表结构 | |
SHOW CREATE TABLE user; |
查看表的创建语句(含索引、引擎等) | |
SELECT VERSION(); |
查看 MySQL 版本 | |
SELECT NOW(); |
查看当前时间 | |
| 权限 / 用户 | SELECT USER(), CURRENT_USER(); |
查看当前登录用户 |
SHOW GRANTS FOR 'root'@'localhost'; |
查看用户权限 | |
DROP USER IF EXISTS 'test_user'@'%'; |
删除用户 | |
| 数据库管理 | SOURCE D:/sql/init.sql; |
执行外部 SQL 文件 |
SET NAMES utf8mb4; |
设置客户端字符集 |
三、MySQL 命令行操作的常见错误及解决清单
| 错误类型 | 错误提示 | 解决方法 | |
|---|---|---|---|
| 登录错误 | ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) |
1. 核对密码是否正确;2. 密码含特殊字符时确保输入准确;3. 重置 root 密码 | |
ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061) |
1. 检查 MySQL 服务是否启动;2. 验证 3306 端口是否被占用;3. 关闭防火墙 / 安全软件 | ||
| SQL 语法错误 | ERROR 1064 (42000): You have an error in your SQL syntax; check the manual... |
1. 检查语句结尾是否加分号;2. 关键字拼写错误(如ALTER写成ALTERR);3. 引号 / 括号配对错误;4. 字段 / 表名含特殊字符时加反引号(`) |
|
| 权限错误 | ERROR 1142 (42000): SELECT command denied to user 'test'@'localhost' for table 'user' |
1. 给用户授予对应权限(GRANT SELECT ON test_db.user TO 'test'@'localhost');2. 刷新权限(FLUSH PRIVILEGES) |
|
| 表 / 库不存在 | ERROR 1049 (42000): Unknown database 'test_db' |
1. 检查数据库名称拼写;2. 先执行USE切换到正确数据库;3. 确认数据库已创建 |
|
ERROR 1146 (42S02): Table 'test_db.user' doesn't exist |
1. 检查表名拼写;2. 确认表在当前数据库下 | ||
| 端口占用 | ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061) |
1. 执行 `netstat -ano |
四、MySQL 8.4.7 的标准 my.ini 配置模板
bash
[mysqld]
# 基础配置
port = 3306 # 端口
basedir = F:\mysql-8.4.7-winx64 # MySQL安装目录(替换为实际路径)
datadir = F:\mysql-8.4.7-winx64\data # 数据目录(需为空文件夹)
socket = F:\mysql-8.4.7-winx64\mysql.sock # 套接字文件(Windows可忽略)
pid-file = F:\mysql-8.4.7-winx64\mysql.pid # PID文件
# 字符集配置
character-set-server = utf8mb4 # 服务器字符集(兼容emoji)
collation-server = utf8mb4_general_ci # 排序规则
lc-messages-dir = F:\mysql-8.4.7-winx64\share # 错误信息文件目录
lc-messages = en_US # 错误信息语言
# 连接配置
max_connections = 200 # 最大连接数
connect_timeout = 10 # 连接超时时间(秒)
wait_timeout = 28800 # 非交互连接超时时间
interactive_timeout = 28800 # 交互连接超时时间
# 存储引擎配置
default-storage-engine = InnoDB # 默认存储引擎
innodb_buffer_pool_size = 512M # InnoDB缓冲池大小(建议为内存的50%-70%)
innodb_log_file_size = 128M # 日志文件大小
innodb_log_buffer_size = 32M # 日志缓冲区大小
innodb_flush_log_at_trx_commit = 1 # 事务提交时刷新日志(1为最安全)
# 安全配置
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION # 严格模式
validate_password.policy = MEDIUM # 密码复杂度策略(LOW/MEDIUM/STRONG)
validate_password.length = 8 # 密码最小长度
[mysql]
# 客户端配置
default-character-set = utf8mb4 # 客户端字符集
prompt = \\u@\\h [\\d] >_ # 命令行提示符(显示用户@主机 [数据库])
[client]
port = 3306
default-character-set = utf8mb4
user = root # 可选,避免每次登录输入用户名
五、MySQL 服务管理与密码重置的常用指令清单
| 操作类型 | 指令示例 | 说明 |
|---|---|---|
| 服务管理(Windows) | net start mysql |
启动 MySQL 服务 |
net stop mysql |
停止 MySQL 服务 | |
sc query mysql |
查看服务状态 | |
mysqld --install |
安装服务(默认名 mysql) | |
mysqld --install MySQL84 |
安装服务并指定服务名(如 MySQL84) | |
mysqld --remove |
删除服务 | |
| 服务管理(Linux) | systemctl start mysqld |
启动服务 |
systemctl stop mysqld |
停止服务 | |
systemctl restart mysqld |
重启服务 | |
systemctl enable mysqld |
设置开机自启 | |
systemctl status mysqld |
查看服务状态 | |
| 密码重置(通用) | mysqld --console --skip-grant-tables --shared-memory |
Windows 无权限启动 MySQL(跳过密码验证) |
mysqld_safe --skip-grant-tables & |
Linux 无权限启动 MySQL | |
mysql -uroot |
无密码登录 | |
FLUSH PRIVILEGES; |
刷新权限 | |
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass@123'; |
修改 root 密码 |
六、MySQL 服务启动失败的日志分析指南
1. 日志位置
- Windows:
datadir目录下的主机名.err文件(如DESKTOP-XXXX.err); - Linux:
/var/log/mysqld.log; - 若未找到,在
my.ini/my.cnf中配置:log_error = F:\mysql-8.4.7-winx64\data\mysql_error.log。
2. 核心错误关键词及解决
| 日志关键词 | 错误原因 | 解决方法 |
|---|---|---|
Can't find error-message file |
错误信息文件路径错误 | 配置lc-messages-dir指向当前版本的share目录 |
initialize specified but the data directory has files in it |
数据目录非空 | 清空datadir目录后重新初始化 |
InnoDB: The innodb_system data file 'ibdata1' must be writable |
数据目录权限不足 | Windows:给目录添加当前用户 "完全控制" 权限;Linux:chown -R mysql:mysql /var/lib/mysql |
Port 3306 is in use by another process |
端口被占用 | 结束占用进程或修改 MySQL 端口 |
my.ini: unknown variable 'xxx' |
配置文件参数错误 | 检查参数拼写 / 版本兼容性(如 MySQL8.0 移除query_cache_size) |
System error 1067 |
配置错误 / 数据目录损坏 | 1. 核对basedir/datadir路径;2. 重新初始化数据目录 |
3. 分析步骤
- 打开错误日志文件,定位
[ERROR]/[CRITICAL]标记的行; - 提取错误关键词,匹配上表解决;
- 若日志无明确错误,尝试重新初始化(清空
datadir→mysqld --initialize --console),查看控制台输出。
七、MySQL 首次使用的基础操作清单
| 操作步骤 | 操作指令 / 说明 |
|---|---|
| 1. 验证安装 | mysql -uroot -p → 输入密码登录;SELECT VERSION(); → 查看版本 |
| 2. 修改初始密码 | ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass@123'; |
| 3. 创建数据库 | CREATE DATABASE test_db DEFAULT CHARSET utf8mb4; |
| 4. 切换数据库 | USE test_db; |
| 5. 创建测试表 | CREATE TABLE user (``id INT PRIMARY KEY AUTO_INCREMENT,``name VARCHAR(50) NOT NULL,``age TINYINT UNSIGNED``) ENGINE=InnoDB; |
| 6. 插入测试数据 | INSERT INTO user (name, age) VALUES ('张三', 20), ('李四', 25); |
| 7. 查询数据 | SELECT * FROM user WHERE age > 18; |
| 8. 修改数据 | UPDATE user SET age = 21 WHERE id = 1; |
| 9. 删除数据 | DELETE FROM user WHERE id = 2; |
| 10. 创建普通用户 | CREATE USER 'test_user'@'%' IDENTIFIED BY 'TestPass@123'; |
| 11. 授予权限 | GRANT SELECT, INSERT ON test_db.* TO 'test_user'@'%'; |
| 12. 刷新权限 | FLUSH PRIVILEGES; |
八、MySQL root 密码重置的详细操作手册(Windows 版)
步骤 1:停止 MySQL 服务
cmd
net stop mysql
步骤 2:以无权限验证模式启动 MySQL
-
以管理员身份打开 CMD,进入 MySQL 的
bin目录:cmd
F: cd mysql-8.4.7-winx64\bin -
执行无权限启动命令: cmd
mysqld --console --skip-grant-tables --shared-memory✅ 提示:该窗口需保持打开,不可关闭。
步骤 3:无密码登录 MySQL
-
新开一个 CMD 窗口,进入
bin目录,执行:cmd
mysql -uroot -
成功进入 MySQL 交互界面(无密码验证)。
步骤 4:修改 root 密码
-
刷新权限(必须执行): sql
FLUSH PRIVILEGES; -
修改密码(符合复杂度要求): sql
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass@123'; -
再次刷新权限: sql
FLUSH PRIVILEGES; -
退出 MySQL: sql
exit;
步骤 5:重启 MySQL 服务
-
关闭无权限启动的 CMD 窗口(步骤 2 的窗口);
-
停止并重启服务:
cmd
net stop mysql net start mysql
步骤 6:验证登录
cmd
mysql -uroot -p
# 输入新密码NewPass@123,登录成功即重置完成
九、MySQL 本地连接故障的排查流程图

十、MySQL 服务状态管理的常用命令清单
| 系统 | 命令 | 功能 | |
|---|---|---|---|
| Windows | sc query mysql |
查看服务详细状态(运行 / 停止 / 启动类型) | |
net start mysql |
启动服务 | ||
net stop mysql |
停止服务 | ||
net restart mysql |
重启服务(部分系统不支持,需先 stop 再 start) | ||
sc config mysql start= auto |
设置服务开机自启 | ||
sc config mysql start= manual |
设置服务手动启动 | ||
| `tasklist | findstr mysqld` | 查看 MySQL 进程是否运行 | |
| Linux | systemctl status mysqld |
查看服务状态(含最近日志) | |
systemctl start mysqld |
启动服务 | ||
systemctl stop mysqld |
停止服务 | ||
systemctl restart mysqld |
重启服务 | ||
systemctl enable mysqld |
开机自启 | ||
systemctl disable mysqld |
关闭开机自启 | ||
| `ps -ef | grep mysqld` | 查看 MySQL 进程 | |
| `netstat -tulpn | grep 3306` | 查看 3306 端口监听状态 |