连接与断开服务器
导学
MySQL 采用客户端/服务器(C/S)架构。你的 SQL 语句并不是直接操作磁盘文件,而是通过网络协议发送给 MySQL 服务器进程,由服务器执行后再返回结果。本节学习如何建立和关闭这个连接,以及连接后的常用状态检查命令。
定义
MySQL 客户端:发送 SQL 请求的程序,可以是命令行工具 mysql、图形化工具(Navicat、DBeaver)、或应用程序中的数据库驱动。
MySQL 服务器:持续运行的后台进程(mysqld),负责解析 SQL、管理数据文件、处理并发请求。
命令行连接
场景一:本地连接(最常用)
在终端执行:
mysql -u root -p
参数说明:
-u root:以root用户身份登录-p:提示输入密码(密码不会回显到屏幕)
执行后提示输入密码,认证成功后将显示 mysql> 提示符:
Enter password: ********
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 5.7.44-log MySQL Community Server (GPL)
mysql>
结果解读:connection id 是当前连接的唯一标识。服务器版本 5.7.44-log 表示这是 MySQL 5.7 社区版,且开启了二进制日志(binlog)。
场景二:连接后验证服务器状态
连接成功后,通过 SQL 命令确认环境信息:
-- 查看服务器版本
SELECT VERSION();
| VERSION() |
|---|
| 5.7.44-log |
-- 查看当前用户
SELECT USER();
| USER() |
|---|
| root@localhost |
-- 查看当前时间
SELECT NOW();
| NOW() |
|---|
| 2024-01-15 14:30:00 |
-- 查看当前数据库
SELECT DATABASE();
| DATABASE() |
|---|
| NULL |
结果解读:刚连接时如果没有指定数据库,DATABASE() 返回 NULL。需要用 USE 选择数据库后才能执行表操作。
场景三:指定主机和端口连接(远程或自定义端口)
mysql -h 192.168.1.100 -P 3307 -u app_user -p
参数说明:
-h:主机地址(host),默认localhost-P:端口号(Port),注意是大写 P,默认3306
⚠️ 易错点:
-p(小写)表示密码提示,-P(大写)表示端口。这是新手最常搞混的参数。
连接后验证连接的主机:
SELECT @@hostname;
| @@hostname |
|---|
| db-server-01 |
场景四:直接在命令行中指定数据库
mysql -u root -p demo_info
连接成功后直接进入 demo_info 数据库,无需再执行 USE demo_info;。
验证:
SELECT DATABASE();
| DATABASE() |
|---|
| demo_info |
完整示例:连接后创建并操作数据库
当前数据状态:刚连接服务器,尚未选择数据库。
SELECT DATABASE();
| DATABASE() |
|---|
| NULL |
操作语句:创建测试数据库并建表
CREATE DATABASE IF NOT EXISTS connection_demo
DEFAULT CHARACTER SET utf8mb4;
USE connection_demo;
CREATE TABLE greetings (
id INT PRIMARY KEY AUTO_INCREMENT,
message VARCHAR(100) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;
INSERT INTO greetings (message) VALUES ('Hello, MySQL 5.7!');
操作后的数据状态
SELECT * FROM greetings;
| id | message | created_at |
|---|---|---|
| 1 | Hello, MySQL 5.7! | 2024-01-15 14:35:00 |
结果解读:从连接服务器到创建数据库、建表、插入数据,整个流程在一条会话中完成。所有操作都在服务器端执行,客户端只负责发送 SQL 和接收结果。
断开连接
在 mysql> 提示符下输入:
QUIT;
-- 或
EXIT;
-- 或快捷键
Ctrl+D (Unix/Mac)
Ctrl+C (Windows)
断开前查看当前连接统计:
SHOW STATUS LIKE 'Threads_connected';
| Variable_name | Value |
|---|---|
| Threads_connected | 3 |
结果解读:Threads_connected 表示当前连接到服务器的客户端数量。断开后该计数会减少。
完整示例:验证连接与会话变量
当前数据状态:已连接到服务器。
操作语句:查看和设置会话变量
-- 查看当前会话的 SQL 模式
SELECT @@sql_mode;
| @@sql_mode |
|---|
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
-- 查看当前时区
SELECT @@time_zone;
| @@time_zone |
|---|
| SYSTEM |
-- 查看自动提交状态(事务相关)
SELECT @@autocommit;
| @@autocommit |
|---|
| 1 |
结果解读:
sql_mode控制 MySQL 的 SQL 语法校验严格程度time_zone = SYSTEM表示使用操作系统时区autocommit = 1表示每条 SQL 自动提交(开启事务时需要关闭)
常见连接错误
| 错误信息 | 原因 | 解决 |
|---|---|---|
ERROR 1045 (28000): Access denied | 用户名或密码错误 | 检查 -u 和 -p 是否正确 |
ERROR 2003 (HY000): Can't connect | 服务器未启动或端口不对 | 检查 mysqld 进程和端口 |
ERROR 1130: Host is not allowed | root 用户不允许远程连接 | 修改用户主机权限为 % |
验证用户主机权限:
-- 在服务器上执行
USE mysql;
SELECT user, host FROM user WHERE user = 'root';
| user | host |
|---|---|
| root | localhost |
| root | 127.0.0.1 |
结果解读:root 默认只允许从 localhost 和 127.0.0.1 连接。如果需要远程连接,需要创建允许 %(任意主机)的用户。
面试考点
Q:mysql 命令的 -p 和 -P 有什么区别?
-p(小写)表示 password,会提示输入密码,也可以紧跟密码(不安全,不推荐);-P(大写)表示 Port,指定连接端口,默认 3306。
Q:为什么生产环境不建议使用 root 直接连接数据库?
root 拥有最高权限(包括删除所有数据库)。生产环境应创建最小权限的专用账号,遵循"最小权限原则"。
创建最小权限账号示例:
CREATE USER 'app_readonly'@'%' IDENTIFIED BY 'SecurePass123!';
GRANT SELECT ON demo_info.* TO 'app_readonly'@'%';
FLUSH PRIVILEGES;
SHOW GRANTS FOR 'app_readonly'@'%';
| Grants for app_readonly@% |
|---|
| GRANT USAGE ON . TO 'app_readonly'@'%' |
GRANT SELECT ON demo_info.* TO 'app_readonly'@'%' |
结果解读:app_readonly 用户只能对 demo_info 库执行 SELECT 查询,无法修改或删除数据。
Q:MySQL 客户端和服务器必须在一台机器上吗?
不需要。MySQL 通过 TCP/IP 协议通信,客户端和服务器可以在同一局域网、甚至跨公网。但公网连接应使用 SSL/TLS 加密。
小结
mysql -u 用户名 -p是最基本的连接方式- 注意区分
-p(密码)和-P(端口)的大小写 - 连接成功后出现
mysql>提示符,表示可以执行 SQL 语句 - 生产环境务必使用受限账号,而非 root
- 连接后可通过
SELECT VERSION(), USER(), DATABASE()快速确认环境
清理测试数据(可选):
DROP USER IF EXISTS 'app_readonly'@'%';
DROP DATABASE IF EXISTS connection_demo;
下一章引子:连接成功了,接下来我们创建属于自己的第一个数据库。