前言:为什么选择 Linux + MySQL?
在数据库领域,Linux + MySQL 是互联网公司的标配组合。根据 DB-Engines 排名,MySQL 长期稳居关系型数据库前二。而在 Linux 环境下,MySQL 的性能、稳定性和可定制性都远超 Windows。
本文将带你从 安装 → 配置 → 实战 → 调优 四个维度,深度掌握 Linux 下 MySQL 的使用。
一、安装篇:两种姿势,各取所需
1.1 姿势一:apt 一键安装(适合快速上手)
Ubuntu/Debian 系统自带 MySQL 软件包,一条命令搞定:
bash
sudo apt-get install mysql-server-8.0
安装过程中会提示确认,输入 Y 回车即可。这种方式简单快捷,但版本可能不是最新的。
1.2 姿势二:官网 APT 仓库安装(推荐,版本最新)
想要体验 MySQL 最新特性?建议从官网 APT 仓库安装:
Step 1:下载 APT 配置包
访问 MySQL 官网 → Downloads → MySQL Community (GPL) Downloads → MySQL APT Repository,下载 .deb 包。
Step 2:上传到服务器
bash
scp mysql-apt-config_0.8.23-1_all.deb 你的用户名@服务器IP:~
Step 3:安装配置包
bash
sudo dpkg -i mysql-apt-config_0.8.23-1_all.deb
此时会弹出交互界面:
- 选择 MySQL 8.0
- 选择 MySQL Server & Cluster
- 选择 Ok 确认
Step 4:更新并安装
bash
sudo apt-get update
sudo apt-get install mysql-server
Step 5:设置 root 密码
安装过程中会弹出密码设置界面:
- 输入 root 密码
- 确认密码
- 选择 Use Strong Password Encryption (RECOMMENDED)(推荐强密码加密)
💡 小贴士 :MySQL 8.0 默认使用
caching_sha2_password认证插件,比旧版的mysql_native_password更安全。如果老客户端连不上,可以改回旧版认证方式。
二、初始化配置篇:安全与效率并重
2.1 首次登录与密码修改
安装完成后,先查看自动生成的临时密码:
bash
sudo cat /etc/mysql/debian.cnf
输出类似:
ini
[client]
host = localhost
user = debian-sys-maint
password = yx93Fnww085tUNxM
socket = /var/run/mysqld/mysqld.sock
用临时账号登录:
bash
mysql -udebian-sys-maint -pyx93Fnww085tUNxM
修改 root 密码(强烈建议):
sql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的强密码';
FLUSH PRIVILEGES;
退出后重新用 root 登录:
bash
mysql -uroot -p
2.2 字符集配置:避免中文乱码的坑
这是很多小白最容易踩的坑!MySQL 8.0 默认已经是 utf8mb4,但建议检查确认:
sql
SHOW VARIABLES LIKE '%char%';
理想输出:
+--------------------------+--------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
+--------------------------+--------------------------------+
如果不是 utf8mb4,修改配置文件:
bash
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
在 [mysqld] 段添加:
ini
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
重启生效:
bash
sudo service mysql restart
⚠️ 深度解析 :为什么用
utf8mb4而不是utf8?
- MySQL 的
utf8实际上是 utf8mb3,只支持 3 字节 UTF-8 编码utf8mb4支持 4 字节,可以存储 emoji 表情和生僻字- 从 MySQL 8.0 开始,默认就是
utf8mb4,这是最佳实践
三、远程访问配置:安全地开放连接
3.1 修改绑定地址
默认 MySQL 只监听 127.0.0.1(本地),需要修改配置文件:
bash
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
找到并注释掉这行:
ini
# bind-address = 127.0.0.1
# mysqlx-bind-address = 127.0.0.1
💡
bind-address控制传统 TCP 连接,mysqlx-bind-address控制 X Plugin(文档存储)连接。
3.2 创建远程访问用户
不要直接用 root 远程登录! 这是安全大忌。应该创建专用用户:
sql
-- 创建用户(% 表示任意 IP 可连接)
CREATE USER 'remote_user'@'%' IDENTIFIED BY '强密码';
-- 授予权限
GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%' WITH GRANT OPTION;
-- 刷新权限
FLUSH PRIVILEGES;
如果只想让特定 IP 访问(更安全):
sql
CREATE USER 'remote_user'@'192.168.2.7' IDENTIFIED BY '强密码';
GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'192.168.2.7';
FLUSH PRIVILEGES;
3.3 防火墙放行
bash
# Ubuntu 使用 ufw
sudo ufw allow 3306/tcp
# 或者使用 iptables
sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
🔒 安全建议:生产环境建议通过 SSH 隧道或 VPN 访问数据库,不要直接暴露 3306 端口到公网。
四、核心操作篇:SQL 命令速查
4.1 数据库操作
sql
-- 查看所有数据库
SHOW DATABASES;
-- 创建数据库(指定字符集,好习惯)
CREATE DATABASE IF NOT EXISTS mydb CHARACTER SET utf8mb4;
-- 选择数据库
USE mydb;
-- 查看当前所在数据库
SELECT DATABASE();
-- 查看数据库创建语句
SHOW CREATE DATABASE mydb;
-- 修改数据库字符集
ALTER DATABASE mydb CHARACTER SET gbk;
-- 删除数据库(⚠️ 危险操作!)
DROP DATABASE mydb;
4.2 表操作
sql
-- 查看当前库所有表
SHOW TABLES;
-- 查看表结构
DESC s_emp;
-- 或
DESCRIBE s_emp;
-- 查看建表语句
SHOW CREATE TABLE s_emp;
-- 查看表索引
SHOW INDEX FROM s_emp;
-- 查看列信息(支持模糊查询)
SHOW COLUMNS FROM s_emp LIKE 'la%';
4.3 系统状态监控
sql
-- 查看所有系统变量
SHOW VARIABLES;
-- 查看 auto 开头的变量
SHOW VARIABLES LIKE 'auto%';
-- 临时设置变量(仅当前会话有效)
SET character_set_server = gbk;
-- 查看服务器运行状态
SHOW STATUS;
-- 查看当前运行的线程
SHOW [FULL] PROCESSLIST;
-- 查看当前用户权限
SHOW GRANTS FOR root@localhost;
常用状态变量含义:
| 状态变量 | 含义 |
|---|---|
Aborted_clients |
客户端未正确关闭的连接数 |
Connections |
试图连接服务器的次数 |
Slow_queries |
超过慢查询时间阈值的查询数 |
Threads_connected |
当前打开的连接数 |
Uptime |
服务器运行秒数 |
五、建表实战篇:数据类型与案例
5.1 整数类型选择指南
| 类型 | 大小 | 有符号范围 | 无符号范围 | 适用场景 |
|---|---|---|---|---|
TINYINT |
1 字节 | -128 ~ 127 | 0 ~ 255 | 状态码、布尔值 |
SMALLINT |
2 字节 | -32768 ~ 32767 | 0 ~ 65535 | 小型计数 |
MEDIUMINT |
3 字节 | -8388608 ~ 8388607 | 0 ~ 16777215 | 中等范围 ID |
INT |
4 字节 | -21亿 ~ 21亿 | 0 ~ 43亿 | 主键、自增 ID |
BIGINT |
8 字节 | 极大范围 | 极大范围 | 分布式 ID、大数据 |
💡 重要提示 :MySQL 8.0 不再推荐为 INT 指定显示宽度(如
INT(11))。INT(1)和INT(20)存储范围完全相同,括号里的数字只是显示宽度,不影响存储!
5.2 实战建表案例
案例 1:基础学生表
sql
CREATE TABLE student (
id INT,
name VARCHAR(20) COMMENT '姓名',
age INT COMMENT '年龄',
phone VARCHAR(11) COMMENT '手机号'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
案例 2:带约束的用户表
sql
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '编号',
name VARCHAR(20) NOT NULL COMMENT '名字',
age INT DEFAULT 3 COMMENT '年龄',
gender CHAR(1) COMMENT '性别',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
案例 3:从现有表创建新表(复制数据)
sql
-- 复制结构和数据
CREATE TABLE emp AS
SELECT id, first_name, salary FROM s_emp;
-- 只复制结构,不复制数据(WHERE 1=2 永远为假)
CREATE TABLE user4 AS
SELECT id, last_name AS name, salary
FROM s_emp
WHERE 1=2;
案例 4:枚举与集合类型
sql
CREATE TABLE user1(
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '编号',
name VARCHAR(20) NOT NULL COMMENT '名字',
gender ENUM('男','女') COMMENT '性别',
hobby SET('Football','Basketball','rugby','volleyball') COMMENT '爱好'
);
-- 插入数据
INSERT INTO user1 VALUES(1, 'lisi', '男', 'Football,Basketball,rugby');
💡
ENUM适合单选场景,SET适合多选场景。但要注意:ENUM/SET 修改值列表需要 ALTER TABLE,不够灵活,现代开发更推荐使用关联表或 JSON。
案例 5:JSON 类型(MySQL 5.7+ 支持)
sql
CREATE TABLE user2(
person_data JSON
);
-- 插入 JSON 数据
INSERT INTO user2 VALUES('{"id":1,"name":"lisi","age":30,"addr":{"province":"jiangsu","city":"kunshan"}}');
-- 查询 JSON 字段
SELECT
person_data->'$.id' AS id,
person_data->'$.name' AS name,
person_data->'$.addr.province' AS province
FROM user2;
-> 返回 JSON 格式,->> 返回纯文本。
六、表结构修改篇:ALTER TABLE 的艺术
6.1 添加列
sql
-- 末尾添加
ALTER TABLE user3 ADD name VARCHAR(20);
-- 第一列添加
ALTER TABLE user3 ADD COLUMN uid INT FIRST;
-- 指定位置添加
ALTER TABLE user3 ADD COLUMN age INT AFTER id;
6.2 修改列
sql
-- 修改类型和默认值(MODIFY 不能改列名)
ALTER TABLE user3 MODIFY COLUMN uid VARCHAR(32) DEFAULT '1';
-- 修改列名(CHANGE 可以改列名)
ALTER TABLE user3 CHANGE COLUMN name username TEXT;
6.3 删除列
sql
ALTER TABLE user3 DROP COLUMN age;
6.4 修改存储引擎
sql
ALTER TABLE test_int ENGINE=MyISAM;
⚠️ 注意:修改存储引擎会锁表,大表请谨慎操作!
七、存储引擎深度解析:选对的,不选贵的
7.1 各引擎特性对比
| 特性 | InnoDB | MyISAM | Memory | Archive |
|---|---|---|---|---|
| 事务支持 | ✅ | ❌ | ❌ | ❌ |
| 行级锁 | ✅ | ❌(表锁) | ❌(表锁) | ❌(行锁) |
| 外键 | ✅ | ❌ | ❌ | ❌ |
| 崩溃恢复 | ✅ | ❌ | ❌ | ❌ |
| 全文索引 | ✅ (5.6+) | ✅ | ❌ | ❌ |
| 适用场景 | 通用、事务 | 读多写少 | 临时数据 | 归档日志 |
7.2 为什么 InnoDB 是默认选择?
- 事务安全:支持 ACID,数据不丢
- 行级锁:并发写入性能高
- MVCC:多版本并发控制,读写不阻塞
- 崩溃恢复:通过 redo log 自动恢复
7.3 查看和设置引擎
sql
-- 查看支持的引擎
SHOW ENGINES;
-- 查看当前默认引擎
SHOW VARIABLES LIKE 'default_storage_engine';
-- 建表时指定引擎
CREATE TABLE t1 (id INT) ENGINE=InnoDB;
-- 修改已有表的引擎
ALTER TABLE t1 ENGINE=MyISAM;
八、SQL 规范与最佳实践
8.1 大小写规范
Linux 下 MySQL 大小写敏感!
| 对象 | 大小写敏感? |
|---|---|
| 数据库名 | ✅ 敏感 |
| 表名 | ✅ 敏感 |
| 表别名 | ✅ 敏感 |
| 字段名 | ❌ 不敏感 |
| 关键字 | ❌ 不敏感 |
建议规范:
- 数据库名、表名、字段名:全部小写,用下划线分隔
- SQL 关键字:大写(如
SELECT,WHERE) - 示例:
user_order_detail而不是UserOrderDetail
8.2 注释规范
sql
-- 单行注释(MySQL 特有)
# 这也是单行注释
-- 标准单行注释(注意 -- 后要有空格)
-- 这是注释
/*
多行注释
可以写很多行
*/
8.3 标识符命名规则
- 由字母、数字、下划线、
@、#、$组成 - 不能以数字或
$开头 - 不能是 MySQL 关键字
- 长度小于 128 位
- 不允许空格和特殊字符
九、日常运维命令
9.1 服务管理
bash
# 启动
sudo service mysql start
# 停止
sudo service mysql stop
# 重启
sudo service mysql restart
# 查看状态
sudo service mysql status
9.2 执行 SQL 脚本
sql
-- 在 MySQL 命令行中执行
SOURCE /home/master/briup_create.sql;
SOURCE /home/master/briup_populate.sql;
9.3 数据库初始化(重置)
bash
mysqld --initialize
⚠️ 这会重新初始化数据目录,所有数据会丢失!
十、卸载 MySQL(彻底清理)
如果需要重装或清理环境:
bash
# 1. 查看 MySQL 相关包
dpkg --list | grep mysql
# 2. 卸载主程序
sudo apt-get remove mysql-common
sudo apt-get autoremove --purge mysql-server-8.0
# 3. 清除残留配置
dpkg -l | grep ^rc | awk '{print $2}' | sudo xargs dpkg -P
# 4. 再次检查
dpkg --list | grep mysql
# 5. 清理 APT 配置
sudo apt-get autoremove --purge mysql-apt-config