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
相关推荐
代码中介商6 小时前
Linux多线程编程完全指南(续):条件变量、读写锁与线程安全函数
linux·开发语言
计算机安禾7 小时前
【Linux从入门到精通】第42篇:深入理解Linux内存管理
android·linux·运维
艾莉丝努力练剑7 小时前
【Linux网络】Linux 网络编程入门:UDP Socket 编程(上)
linux·运维·服务器·网络·c++·udp
代码中介商7 小时前
Linux多线程编程完全指南:线程同步、互斥锁与生产者消费者模型
linux·运维·服务器
计算机安禾7 小时前
【Linux从入门到精通】第43篇:I/O调度算法与磁盘性能优化
linux·算法·性能优化
计算机安禾7 小时前
【Linux从入门到精通】第44篇:Linux网络协议栈与TCP参数调优
linux·网络协议·tcp/ip
rleS IONS7 小时前
Linux系统离线部署MySQL详细教程(带每步骤图文教程)
linux·mysql·adb
学不会pwn不改名7 小时前
【ArchLinux】如何制服国产免驱网卡
linux·运维·网络
可视化运维管理爱好者7 小时前
rg完整中文操作指南
linux·运维·服务器·ai