MySQL 8.0 在 Linux 下的深度配置与实战指南

前言:为什么选择 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 是默认选择?

  1. 事务安全:支持 ACID,数据不丢
  2. 行级锁:并发写入性能高
  3. MVCC:多版本并发控制,读写不阻塞
  4. 崩溃恢复:通过 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
相关推荐
FoldWinCard4 小时前
D5 Linux 网络及端口命令
linux·运维·服务器
零涂毕业设计6 小时前
毕业设计模块开发-OLED显示屏(IIC协议0.96寸)STM32 ESP32 FPGA Linux驱动免费分享
linux·stm32·单片机·嵌入式·esp32·fpga·oled
tedcloud1236 小时前
OmniRoute怎么部署?开源AI模型路由平台Linux部署教程
linux·服务器·人工智能·开源·音视频
霸道流氓气质6 小时前
KMS 密钥管理服务(Key Management Service)原理与实践
linux·服务器·数据库
SakitamaX6 小时前
LVS(Linux Virtual Server)概念详解
linux·运维·lvs
小张同学a.6 小时前
Linux系统管理
linux·运维
阿龙的工作记录7 小时前
深入理解Linux设备驱动模型
linux·嵌入式硬件·工作记录
代码村新手7 小时前
Linux的基本指令
linux·运维·服务器
hkj88088 小时前
Ubuntu 切换java版本
java·linux·ubuntu
瞬间&永恒~8 小时前
【MySQL】4-6:在同一个主机上使用 systemd 运行多个 MySQL服务器
服务器·数据库·mysql