前言为什么选择 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 密码强烈建议ALTERUSERrootlocalhostIDENTIFIEDWITHmysql_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-serverutf8mb4 collation-serverutf8mb4_unicode_ci重启生效sudoservicemysql restart⚠️深度解析为什么用utf8mb4而不是utf8MySQL 的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.1bind-address控制传统 TCP 连接mysqlx-bind-address控制 X Plugin文档存储连接。3.2 创建远程访问用户不要直接用 root 远程登录这是安全大忌。应该创建专用用户-- 创建用户% 表示任意 IP 可连接CREATEUSERremote_user%IDENTIFIEDBY强密码;-- 授予权限GRANTALLPRIVILEGESON*.*TOremote_user%WITHGRANTOPTION;-- 刷新权限FLUSHPRIVILEGES;如果只想让特定 IP 访问更安全CREATEUSERremote_user192.168.2.7IDENTIFIEDBY强密码;GRANTALLPRIVILEGESON*.*TOremote_user192.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_empLIKEla%;4.3 系统状态监控-- 查看所有系统变量SHOWVARIABLES;-- 查看 auto 开头的变量SHOWVARIABLESLIKEauto%;-- 临时设置变量仅当前会话有效SETcharacter_set_servergbk;-- 查看服务器运行状态SHOWSTATUS;-- 查看当前运行的线程SHOW[FULL]PROCESSLIST;-- 查看当前用户权限SHOWGRANTSFORrootlocalhost;常用状态变量含义状态变量含义Aborted_clients客户端未正确关闭的连接数Connections试图连接服务器的次数Slow_queries超过慢查询时间阈值的查询数Threads_connected当前打开的连接数Uptime服务器运行秒数五、建表实战篇数据类型与案例5.1 整数类型选择指南类型大小有符号范围无符号范围适用场景TINYINT1 字节-128 ~ 1270 ~ 255状态码、布尔值SMALLINT2 字节-32768 ~ 327670 ~ 65535小型计数MEDIUMINT3 字节-8388608 ~ 83886070 ~ 16777215中等范围 IDINT4 字节-21亿 ~ 21亿0 ~ 43亿主键、自增 IDBIGINT8 字节极大范围极大范围分布式 ID、大数据重要提示MySQL 8.0 不再推荐为 INT 指定显示宽度如INT(11)。INT(1)和INT(20)存储范围完全相同括号里的数字只是显示宽度不影响存储5.2 实战建表案例案例 1基础学生表CREATETABLEstudent(idINT,nameVARCHAR(20)COMMENT姓名,ageINTCOMMENT年龄,phoneVARCHAR(11)COMMENT手机号)ENGINEInnoDBDEFAULTCHARSETutf8mb4;案例 2带约束的用户表CREATETABLEuser(idINTPRIMARYKEYAUTO_INCREMENTCOMMENT编号,nameVARCHAR(20)NOTNULLCOMMENT名字,ageINTDEFAULT3COMMENT年龄,genderCHAR(1)COMMENT性别,created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP);案例 3从现有表创建新表复制数据-- 复制结构和数据CREATETABLEempASSELECTid,first_name,salaryFROMs_emp;-- 只复制结构不复制数据WHERE 12 永远为假CREATETABLEuser4ASSELECTid,last_nameASname,salaryFROMs_empWHERE12;案例 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。案例 5JSON 类型MySQL 5.7 支持CREATETABLEuser2(person_data JSON);-- 插入 JSON 数据INSERTINTOuser2VALUES({id:1,name:lisi,age:30,addr:{province:jiangsu,city:kunshan}});-- 查询 JSON 字段SELECTperson_data-$.idASid,person_data-$.nameASname,person_data-$.addr.provinceASprovinceFROMuser2;-返回 JSON 格式-返回纯文本。六、表结构修改篇ALTER TABLE 的艺术6.1 添加列-- 末尾添加ALTERTABLEuser3ADDnameVARCHAR(20);-- 第一列添加ALTERTABLEuser3ADDCOLUMNuidINTFIRST;-- 指定位置添加ALTERTABLEuser3ADDCOLUMNageINTAFTERid;6.2 修改列-- 修改类型和默认值MODIFY 不能改列名ALTERTABLEuser3MODIFYCOLUMNuidVARCHAR(32)DEFAULT1;-- 修改列名CHANGE 可以改列名ALTERTABLEuser3 CHANGECOLUMNname usernameTEXT;6.3 删除列ALTERTABLEuser3DROPCOLUMNage;6.4 修改存储引擎ALTERTABLEtest_intENGINEMyISAM;⚠️注意修改存储引擎会锁表大表请谨慎操作七、存储引擎深度解析选对的不选贵的7.1 各引擎特性对比特性InnoDBMyISAMMemoryArchive事务支持✅❌❌❌行级锁✅❌表锁❌表锁❌行锁外键✅❌❌❌崩溃恢复✅❌❌❌全文索引✅ (5.6)✅❌❌适用场景通用、事务读多写少临时数据归档日志7.2 为什么 InnoDB 是默认选择事务安全支持 ACID数据不丢行级锁并发写入性能高MVCC多版本并发控制读写不阻塞崩溃恢复通过 redo log 自动恢复7.3 查看和设置引擎-- 查看支持的引擎SHOWENGINES;-- 查看当前默认引擎SHOWVARIABLESLIKEdefault_storage_engine;-- 建表时指定引擎CREATETABLEt1(idINT)ENGINEInnoDB;-- 修改已有表的引擎ALTERTABLEt1ENGINEMyISAM;八、SQL 规范与最佳实践8.1 大小写规范Linux 下 MySQL 大小写敏感对象大小写敏感数据库名✅ 敏感表名✅ 敏感表别名✅ 敏感字段名❌ 不敏感关键字❌ 不敏感建议规范数据库名、表名、字段名全部小写用下划线分隔SQL 关键字大写如SELECT,WHERE示例user_order_detail而不是UserOrderDetail8.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