前言:为什么选择 Linux + MySQL?
在数据库领域,Linux + MySQL 是互联网公司的标配组合。根据 DB-Engines 排名,MySQL 长期稳居关系型数据库前二。而在 Linux 环境下,MySQL 的性能、稳定性和可定制性都远超 Windows。
本文将带你从安装 → 配置 → 实战 → 调优四个维度,深度掌握 Linux 下 MySQL 的使用。
一、安装篇:两种姿势,各取所需
1.1 姿势一:apt 一键安装(适合快速上手)
Ubuntu/Debian 系统自带 MySQL 软件包,一条命令搞定:
sudoapt-getinstallmysql-server-8.0安装过程中会提示确认,输入Y回车即可。这种方式简单快捷,但版本可能不是最新的。
1.2 姿势二:官网 APT 仓库安装(推荐,版本最新)
想要体验 MySQL 最新特性?建议从官网 APT 仓库安装:
Step 1:下载 APT 配置包
访问 MySQL 官网 → Downloads → MySQL Community (GPL) Downloads → MySQL APT Repository,下载.deb包。
Step 2:上传到服务器
scpmysql-apt-config_0.8.23-1_all.deb 你的用户名@服务器IP:~Step 3:安装配置包
sudodpkg-imysql-apt-config_0.8.23-1_all.deb此时会弹出交互界面:
- 选择MySQL 8.0
- 选择MySQL Server & Cluster
- 选择Ok确认
Step 4:更新并安装
sudoapt-getupdatesudoapt-getinstallmysql-serverStep 5:设置 root 密码
安装过程中会弹出密码设置界面:
- 输入 root 密码
- 确认密码
- 选择Use Strong Password Encryption (RECOMMENDED)(推荐强密码加密)
💡小贴士:MySQL 8.0 默认使用
caching_sha2_password认证插件,比旧版的mysql_native_password更安全。如果老客户端连不上,可以改回旧版认证方式。
二、初始化配置篇:安全与效率并重
2.1 首次登录与密码修改
安装完成后,先查看自动生成的临时密码:
sudocat/etc/mysql/debian.cnf输出类似:
[client] host = localhost user = debian-sys-maint password = yx93Fnww085tUNxM socket = /var/run/mysqld/mysqld.sock用临时账号登录:
mysql -udebian-sys-maint-pyx93Fnww085tUNxM修改 root 密码(强烈建议):
ALTERUSER'root'@'localhost'IDENTIFIEDWITHmysql_native_passwordBY'你的强密码';FLUSHPRIVILEGES;退出后重新用 root 登录:
mysql-uroot-p2.2 字符集配置:避免中文乱码的坑
这是很多小白最容易踩的坑!MySQL 8.0 默认已经是utf8mb4,但建议检查确认:
SHOWVARIABLESLIKE'%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,修改配置文件:
sudovi/etc/mysql/mysql.conf.d/mysqld.cnf在[mysqld]段添加:
[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci重启生效:
sudoservicemysql restart⚠️深度解析:为什么用
utf8mb4而不是utf8?
- MySQL 的
utf8实际上是utf8mb3,只支持 3 字节 UTF-8 编码utf8mb4支持 4 字节,可以存储 emoji 表情和生僻字- 从 MySQL 8.0 开始,默认就是
utf8mb4,这是最佳实践
三、远程访问配置:安全地开放连接
3.1 修改绑定地址
默认 MySQL 只监听127.0.0.1(本地),需要修改配置文件:
sudovi/etc/mysql/mysql.conf.d/mysqld.cnf找到并注释掉这行:
# bind-address = 127.0.0.1 # mysqlx-bind-address = 127.0.0.1💡
bind-address控制传统 TCP 连接,mysqlx-bind-address控制 X Plugin(文档存储)连接。
3.2 创建远程访问用户
不要直接用 root 远程登录!这是安全大忌。应该创建专用用户:
-- 创建用户(% 表示任意 IP 可连接)CREATEUSER'remote_user'@'%'IDENTIFIEDBY'强密码';-- 授予权限GRANTALLPRIVILEGESON*.*TO'remote_user'@'%'WITHGRANTOPTION;-- 刷新权限FLUSHPRIVILEGES;如果只想让特定 IP 访问(更安全):
CREATEUSER'remote_user'@'192.168.2.7'IDENTIFIEDBY'强密码';GRANTALLPRIVILEGESON*.*TO'remote_user'@'192.168.2.7';FLUSHPRIVILEGES;3.3 防火墙放行
# Ubuntu 使用 ufwsudoufw allow3306/tcp# 或者使用 iptablessudoiptables-AINPUT-ptcp--dport3306-jACCEPT🔒安全建议:生产环境建议通过 SSH 隧道或 VPN 访问数据库,不要直接暴露 3306 端口到公网。
四、核心操作篇:SQL 命令速查
4.1 数据库操作
-- 查看所有数据库SHOWDATABASES;-- 创建数据库(指定字符集,好习惯)CREATEDATABASEIFNOTEXISTSmydbCHARACTERSETutf8mb4;-- 选择数据库USEmydb;-- 查看当前所在数据库SELECTDATABASE();-- 查看数据库创建语句SHOWCREATEDATABASEmydb;-- 修改数据库字符集ALTERDATABASEmydbCHARACTERSETgbk;-- 删除数据库(⚠️ 危险操作!)DROPDATABASEmydb;4.2 表操作
-- 查看当前库所有表SHOWTABLES;-- 查看表结构DESCs_emp;-- 或DESCRIBEs_emp;-- 查看建表语句SHOWCREATETABLEs_emp;-- 查看表索引SHOWINDEXFROMs_emp;-- 查看列信息(支持模糊查询)SHOWCOLUMNSFROMs_empLIKE'la%';4.3 系统状态监控
-- 查看所有系统变量SHOWVARIABLES;-- 查看 auto 开头的变量SHOWVARIABLESLIKE'auto%';-- 临时设置变量(仅当前会话有效)SETcharacter_set_server=gbk;-- 查看服务器运行状态SHOWSTATUS;-- 查看当前运行的线程SHOW[FULL]PROCESSLIST;-- 查看当前用户权限SHOWGRANTSFORroot@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:基础学生表
CREATETABLEstudent(idINT,nameVARCHAR(20)COMMENT'姓名',ageINTCOMMENT'年龄',phoneVARCHAR(11)COMMENT'手机号')ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;案例 2:带约束的用户表
CREATETABLEuser(idINTPRIMARYKEYAUTO_INCREMENTCOMMENT'编号',nameVARCHAR(20)NOTNULLCOMMENT'名字',ageINTDEFAULT3COMMENT'年龄',genderCHAR(1)COMMENT'性别',created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP);案例 3:从现有表创建新表(复制数据)
-- 复制结构和数据CREATETABLEempASSELECTid,first_name,salaryFROMs_emp;-- 只复制结构,不复制数据(WHERE 1=2 永远为假)CREATETABLEuser4ASSELECTid,last_nameASname,salaryFROMs_empWHERE1=2;案例 4:枚举与集合类型
CREATETABLEuser1(idINTPRIMARYKEYAUTO_INCREMENTCOMMENT'编号',nameVARCHAR(20)NOTNULLCOMMENT'名字',genderENUM('男','女')COMMENT'性别',hobbySET('Football','Basketball','rugby','volleyball')COMMENT'爱好');-- 插入数据INSERTINTOuser1VALUES(1,'lisi','男','Football,Basketball,rugby');💡
ENUM适合单选场景,SET适合多选场景。但要注意:ENUM/SET 修改值列表需要 ALTER TABLE,不够灵活,现代开发更推荐使用关联表或 JSON。
案例 5:JSON 类型(MySQL 5.7+ 支持)
CREATETABLEuser2(person_data JSON);-- 插入 JSON 数据INSERTINTOuser2VALUES('{"id":1,"name":"lisi","age":30,"addr":{"province":"jiangsu","city":"kunshan"}}');-- 查询 JSON 字段SELECTperson_data->'$.id'ASid,person_data->'$.name'ASname,person_data->'$.addr.province'ASprovinceFROMuser2;->返回 JSON 格式,->>返回纯文本。
六、表结构修改篇:ALTER TABLE 的艺术
6.1 添加列
-- 末尾添加ALTERTABLEuser3ADDnameVARCHAR(20);-- 第一列添加ALTERTABLEuser3ADDCOLUMNuidINTFIRST;-- 指定位置添加ALTERTABLEuser3ADDCOLUMNageINTAFTERid;6.2 修改列
-- 修改类型和默认值(MODIFY 不能改列名)ALTERTABLEuser3MODIFYCOLUMNuidVARCHAR(32)DEFAULT'1';-- 修改列名(CHANGE 可以改列名)ALTERTABLEuser3 CHANGECOLUMNname usernameTEXT;6.3 删除列
ALTERTABLEuser3DROPCOLUMNage;6.4 修改存储引擎
ALTERTABLEtest_intENGINE=MyISAM;⚠️注意:修改存储引擎会锁表,大表请谨慎操作!
七、存储引擎深度解析:选对的,不选贵的
7.1 各引擎特性对比
| 特性 | InnoDB | MyISAM | Memory | Archive |
|---|---|---|---|---|
| 事务支持 | ✅ | ❌ | ❌ | ❌ |
| 行级锁 | ✅ | ❌(表锁) | ❌(表锁) | ❌(行锁) |
| 外键 | ✅ | ❌ | ❌ | ❌ |
| 崩溃恢复 | ✅ | ❌ | ❌ | ❌ |
| 全文索引 | ✅ (5.6+) | ✅ | ❌ | ❌ |
| 适用场景 | 通用、事务 | 读多写少 | 临时数据 | 归档日志 |
7.2 为什么 InnoDB 是默认选择?
- 事务安全:支持 ACID,数据不丢
- 行级锁:并发写入性能高
- MVCC:多版本并发控制,读写不阻塞
- 崩溃恢复:通过 redo log 自动恢复
7.3 查看和设置引擎
-- 查看支持的引擎SHOWENGINES;-- 查看当前默认引擎SHOWVARIABLESLIKE'default_storage_engine';-- 建表时指定引擎CREATETABLEt1(idINT)ENGINE=InnoDB;-- 修改已有表的引擎ALTERTABLEt1ENGINE=MyISAM;八、SQL 规范与最佳实践
8.1 大小写规范
Linux 下 MySQL 大小写敏感!
| 对象 | 大小写敏感? |
|---|---|
| 数据库名 | ✅ 敏感 |
| 表名 | ✅ 敏感 |
| 表别名 | ✅ 敏感 |
| 字段名 | ❌ 不敏感 |
| 关键字 | ❌ 不敏感 |
建议规范:
- 数据库名、表名、字段名:全部小写,用下划线分隔
- SQL 关键字:大写(如
SELECT,WHERE) - 示例:
user_order_detail而不是UserOrderDetail
8.2 注释规范
-- 单行注释(MySQL 特有)# 这也是单行注释-- 标准单行注释(注意 -- 后要有空格)-- 这是注释/* 多行注释 可以写很多行 */8.3 标识符命名规则
- 由字母、数字、下划线、
@、#、$组成 - 不能以数字或
$开头 - 不能是 MySQL 关键字
- 长度小于 128 位
- 不允许空格和特殊字符
九、日常运维命令
9.1 服务管理
# 启动sudoservicemysql start# 停止sudoservicemysql stop# 重启sudoservicemysql restart# 查看状态sudoservicemysql status9.2 执行 SQL 脚本
-- 在 MySQL 命令行中执行SOURCE/home/master/briup_create.sql;SOURCE/home/master/briup_populate.sql;9.3 数据库初始化(重置)
mysqld--initialize⚠️ 这会重新初始化数据目录,所有数据会丢失!
十、卸载 MySQL(彻底清理)
如果需要重装或清理环境:
# 1. 查看 MySQL 相关包dpkg--list|grepmysql# 2. 卸载主程序sudoapt-getremove mysql-commonsudoapt-getautoremove--purgemysql-server-8.0# 3. 清除残留配置dpkg-l|grep^rc|awk'{print $2}'|sudoxargsdpkg-P# 4. 再次检查dpkg--list|grepmysql# 5. 清理 APT 配置sudoapt-getautoremove--purgemysql-apt-config