首页 / 资讯中心 / 文章详情

MySQL数据库基础:Linux环境下从安装到实战的完整入门指南

MySQL数据库基础:Linux环境下从安装到实战的完整入门指南 ★ FEATURED ARTICLE
想学数据库第一步未必是打开某个图形化工具而是先让 MySQL 在一台能长期稳定运行的 Linux 环境里真正跑起来。MySQL、Linux、数据库这三个词放在一起几乎是后端开发、运维、测试乃至刚转行程序员都绕不开的必修组合。这篇文章我打算按自己当年从零折腾的经历来写从环境为什么选 Linux、怎么把 MySQL 装好到建库建表、把增删改查跑通最后再把备份恢复和几个经典报错一起收编成速查表。目标读者就是刚接触数据库、想在 Linux 上搭一套能动手练习环境的朋友不追求讲 8.0 的底层新特性只求让你从零开始的第一步走稳后面再越走越顺。MySQL数据库基础从零开始的第一步【Linux】1. 为什么选择 MySQL Linux先搞清楚这个组合的价值很多教程一上来就让你敲命令反而把最关键的“为什么”跳过了。我开始学的时候也这样装完跑通还以为自己会了结果换个环境直接傻眼。所以我想先聊几分钟这套组合背后的逻辑你心里有底之后后面每一步都会踏实很多。1.1 数据库是什么MySQL 凭什么流行数据库本质上就是一套有组织、可持久化、能高效查询的数据存放方案。你不可能长期把业务数据写在 Excel 或者文本文件里并发一高、数据一多文件读取和修改就会崩溃。关系型数据库把数据按行和列组织成“表”表与表之间还能通过公共字段建立关联这就是它最核心的关系模型。MySQL 是关系型数据库里最流行的一个开源实现。它流行不是没有理由社区极大遇到问题搜一搜基本都有答案部署简单包管理器一条命令就能装性能在中小规模业务下表现足够好互联网公司大量使用简历上写“熟悉 MySQL”几乎是默认项。另外它支持标准的 SQL 语言你今天学了 MySQL 的增删改查换到 PostgreSQL、Oracle 甚至 SQLite语法逻辑也都是相通的迁移成本很低。对新手来说它是性价比最高的入门选择。当然也不是没有别的选项PostgreSQL 在高级特性上确实更丰富SQLite 则轻量到直接嵌在应用里。但如果你刚开始接触数据库又想在 Linux 服务器上建一套正经可练习的环境MySQL 的生态成熟度、教程数量和学习曲线依然是最友好的。1.2 Linux 环境的优势这套组合适合谁有人会问既然只是学 SQL那我在 Windows 上装个 MySQL或者直接用 Navicat 连远程数据库不就行了当然可以但你迟早要面对一个现实生产环境里绝大多数服务都跑在 Linux 上MySQL 也不例外。如果你只会“双击安装包下一步”到了公司面对一台全新的云服务器你会发现连装 MySQL 的基本功都没有更别说排查服务启动失败、端口监听、防火墙这些运维问题了。在 Linux 上装 MySQL表面看只是“多了一步”实际收获远超这一步你会接触到服务的启动和自启管理比如 systemctl这几乎是所有 Linux 后台服务共同的语言你能通过命令行验证端口、进程、日志逐步建立排查问题的思路你会真正理解“权限”的含义比如 root 用户、操作系统用户、MySQL 账户之间并不是一回事。所以这套组合特别适合四类人刚入行的后端开发、刚接触服务器的运维新人、需要自建环境做测试的 QA、以及正在自学编程准备就业的初学者。我自己就是从“Linux 是什么都搞不清”的状态靠一步步跑通 MySQL 环境才开始理解服务器到底是怎么回事的。如果你也处于这个阶段这篇文章就是按你的节奏写的。2. Linux 上安装 MySQL从环境排查到服务启动装 MySQL 本身不难坑都藏在装之前和装之后。我见过太多人上来就 yum install结果装完发现根本启动不了或者装完不知道临时密码在哪里卡住半小时。所以我强烈建议你按顺序走先查环境再装再配置。2.1 安装前的环境检查与软件源选择动手之前先弄清楚两件事这台机器的系统是什么有没有装过 MySQL。不同发行版的包管理方式完全不一样弄混了容易装出半成品环境。先检查系统信息cat /etc/os-release这行命令会显示发行版名称、版本号等信息比如 CentOS、Rocky Linux、Ubuntu、Debian。确认之后再选安装方式。接着检查是否已有残留的 MySQL 或 MariaDB 相关包# CentOS/RHEL 系列 rpm -qa | grep -E mysql|mariadb # Ubuntu/Debian 系列 dpkg -l | grep -E mysql|mariadb为什么要查这一步因为很多 Linux 发行版默认安装的数据库其实是 MariaDB它是 MySQL 的一个分支虽然大部分命令兼容但如果你练习时看的是 MySQL 教程却被系统里自带的其他包干扰排查起来会很难受。有残留旧包时建议先卸载清理干净再装新的避免服务冲突。软件源的选择也很重要。以 CentOS 系为例默认源里可能没有 mysql-server而是 mariadb-server直接装就装偏了。最稳妥的办法是添加 MySQL 官方仓库。Ubuntu 系的默认源里通常能直接装 mysql-server但版本可能不是最新的。我的建议很简单练习环境无所谓但你要知道自己装的版本号后续教程才有针对性。可以下载官方仓库配置包添加源后再使用包管理器安装这样装出来的一定是 MySQL 官方构建版本不会跑偏到 MariaDB。注意不同版本安装命令不完全一样练习时优先选择当前发行版软件源或官方源支持的稳定版本不建议下载不明来源的二进制包。2.2 用包管理器完成安装环境确认无误后就可以安装了。这里以最常见的两大发行版分支举例。CentOS/RHEL 系列添加官方源# 先到 MySQL 官方下载页找到对应发行版的仓库 rpm 包 yum install mysql80-community-release-el7-*.rpm yum repolist enabled | grep mysql yum install mysql-community-server -yUbuntu/Debian 系列apt update apt install mysql-server -y安装完成后先确认版本mysqld --version这一步能直观确认你装的是 MySQL 8.x、5.7 还是其他版本后续查询临时密码、登录方式都不一样。包管理器会自动装好主程序、客户端、公共库等一整套依赖组件这是它比手动解压编译可靠得多的原因新手不要想着自己编译源码安装完全没必要。如果你是在离线环境或者内网服务器上装没法联网拉取软件源那再用 RPM 包离线安装的方式命令大概是rpm -ivh mysql-community-*.rpm但依赖处理比较麻烦非必要不推荐。绝大多数情况下联网装就够了。2.3 首次启动、临时密码与安全配置装完先启动服务systemctl start mysqld systemctl enable mysqld # 设置开机自启启动后检查端口是否正常监听ss -lntp | grep 3306看到 3306 端口被 mysqld 监听说明服务已经起来了。接下来是最容易卡住的地方第一次登录 MySQL 怎么拿密码。MySQL 5.7 及 8.0 版本在初始化时会给 root 生成一个临时密码记录在日志里grep temporary password /var/log/mysqld.log如果这条命令没输出在 Ubuntu 新版上root 用户默认使用 auth_socket 插件可以直接用系统 root 身份免密进入sudo mysql拿到临时密码或者成功进入后立刻修改 root 密码。MySQL 8.0 默认对密码有复杂度要求至少 8 位且包含大小写字母、数字和特殊字符。首次修改密码登录后执行ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY YourStrongPassword123!;这里我故意用了 mysql_native_password因为很多老版本客户端和图形工具默认还不支持 MySQL 8 的 caching_sha2_password 认证插件先用这个兼容性更好的插件能少踩一个坑。等环境理顺之后再根据实际需要决定是否切换回默认插件。养成好习惯安装完成后跑一遍安全配置交互脚本mysql_secure_installation它会引导你设置密码等级、删除匿名用户、禁止 root 远程登录、删除 test 库等都是很基础的安全项。如果你是练习环境这步可以跳过但我还是建议跑一遍顺便熟悉这些常见安全概念。3. 建库建表与增删改查把核心操作跑一遍环境弄好之后真正要花时间练的就是 SQL 本身了。这一节我会带你建一个简单的学生成绩库把最常见的增删改查全跑一遍。你别小看这几个操作后续连接池、ORM、复杂查询本质都是在这些基础语句上叠起来的。3.1 创建数据库和表先用命令行登录 MySQLmysql -uroot -p然后创建一个练习用的数据库这里叫 shop 不太合适我们就用 student_dbCREATE DATABASE student_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;为什么要专门指定 utf8mb4因为它是 MySQL 上支持完整 Unicode 字符集的方案能存 emoji、中文等各种字符。如果你不指定老版本可能默认用 latin1插入中文直接变乱码或者报错。这一步就属于“新手必踩的坑”。选择数据库并建表USE student_db; CREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(32) NOT NULL, age INT, score DECIMAL(4, 1) DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );解释一下字段选择背后的逻辑id用自增主键保证每行数据唯一而且插入时不用手动赋值是最常用的设计name用 VARCHAR(32)不固定长度节省空间注意加 NOT NULL名字不该为空score用 DECIMAL(4,1)表示最长 4 位数、保留 1 位小数比如 98.5 就能存。千万别用 FLOAT 来存钱或者分数这种对精度敏感的数据这个以后你会感谢我created_at用默认时间戳插入时自动记录时间做排序列非常方便。3.2 增删改查 SQL 实战下面是一组最常用的 SQL 语句建议自己敲一遍-- 插入两条数据 INSERT INTO student(name, age, score) VALUES (小明, 18, 88.5); INSERT INTO student(name, age, score) VALUES (小红, 19, 92.0); -- 查询全部数据 SELECT * FROM student; -- 按条件查询 SELECT id, name, score FROM student WHERE score 90; -- 修改数据 UPDATE student SET score 95.5 WHERE id 2; -- 删除数据 DELETE FROM student WHERE id 1; -- 查看结果 SELECT id, name, age, score FROM student ORDER BY score DESC;这里面有几个细节我要重点说第一INSERT的字段列表和值顺序要一一对应。你可以不写字段列表直接INSERT INTO student VALUES (...)但一旦表结构变了极易出错所以显式写字段名是好习惯。第二UPDATE和DELETE的WHERE条件一定要带上。我见过一次事故有人本想删一条测试数据结果DELETE FROM student没写 WHERE整个表直接清空。这种低级错误在真实环境里是灾难。建议你练习时先SELECT查一遍确认要动的是哪些行再执行更新或删除。第三SQL 字符串值必须加单引号数字可以不加。这个规则不复杂但写多了你就会发现报错大多出在引号不匹配上。3.3 排序、分页与聚合查询增删改查只是基础实际工作中你翻来覆去用到的还有排序、分页和统计。继续用刚才的表练习。按分数从高到低排序SELECT name, score FROM student ORDER BY score DESC;如果想要查看成绩排名前两名SELECT name, score FROM student ORDER BY score DESC LIMIT 2;分页查询是后台管理系统最常见的功能之一。第 1 页显示 10 条记录写法是SELECT * FROM student ORDER BY id LIMIT 10 OFFSET 0;第 2 页则是OFFSET 10意思是从第 11 条开始取。这里的LIMIT 10 OFFSET 0等价于LIMIT 0, 10两种写法都常见但要认识它们。聚合统计也是很实用的能力。比如算全班平均分、最高分SELECT AVG(score) AS avg_score, MAX(score) AS max_score, COUNT(*) AS total FROM student;再比如按年龄分组统计每个年龄段的人数SELECT age, COUNT(*) AS num FROM student GROUP BY age;这类GROUP BY查询会在很多“报表”需求里反复出现你要养成一个习惯先想清楚要展示哪些字段哪些字段需要聚合函数哪些字段放不进GROUP BY。不然它报错的时候你会一头雾水。我先给一个提示SELECT里的非聚合字段必须出现在GROUP BY后面否则在严格模式下直接报错这个 MySQL 的 ONLY_FULL_GROUP_BY 设置挡过不少新人。4. 备份恢复与常见问题排查装好、会跑只是开始数据安全才是数据库真正让人敬畏的地方。这一节我会把备份恢复提上来讲再集中处理几个我实测踩过、也被身边同事反复问过的问题希望能帮你提前避开。4.1 用 mysqldump 做好备份恢复在 Linux 上备份 MySQL最常用也最可靠的工具就是 mysqldump它是随 MySQL 一起安装的命令行工具。备份一个库mysqldump -uroot -p --single-transaction student_db student_db.sql--single-transaction是 InnoDB 表的推荐参数它可以在备份时不影响正在执行的写入操作保证一致性视图。不加这个参数备份过程中如果有数据写入得到的备份文件可能是不完整的。恢复数据也很简单mysql -uroot -p student_db student_db.sql但恢复前要注意这个操作默认不会自动创建数据库。如果student_db不存在你需要先CREATE DATABASE student_db DEFAULT CHARACTER SET utf8mb4;再执行恢复命令。如果你备份时还想把建库语句也包含进去可以加--databases参数mysqldump -uroot -p --single-transaction --databases student_db student_db_with_db.sql这样恢复时就不用手动建库了。对于正式业务建议配合 crontab 做定时备份比如每天凌晨 2 点备份一次。我自己的习惯是先备份到本地磁盘再同步一份到其他存储位置双保险。这一步在初学阶段容易被忽略但养成了这个习惯以后哪怕手滑删错数据也能救命。4.2 新手最容易踩的坑速查表把我在学习过程里遇到的、以及身边同学同事问得最多的几个问题整理成了表格每一个都是真实场景。问题描述常见原因解决办法mysql 命令报 Access denied for user rootlocalhost密码错误或首次登录没改临时密码用日志里的临时密码登录后立刻 ALTER USER 改密码或按 4.2.2 的紧急重置方式处理安装后启动失败systemctl status mysqld 报错数据目录权限不对或端口被占用检查 /var/lib/mysql 权限检查 3306 端口占用ss -lntp远程连接数据库连接不上root 默认只能本机登录或防火墙没放行创建远程专用账号或检查 bind-address、skip-networking 配置放行 3306 端口图形化工具连 MySQL 8 报认证插件错误默认 caching_sha2_password 老客户端不支持创建用户时指定 mysql_native_password或用支持新认证的客户端版本mysql -uroot -p 输入密码后直接闪退密码中有特殊字符被 shell 转义密码用单引号括起来或写成 mysql -uroot --password密码执行 SQL 报 ERROR 1064 (42000)SQL 语法错误最常见是关键字没加反引号使用保留字作为表名/字段名时用反引号包裹比如 CREATE TABLEorder忘记 root 密码学习环境经常改完密码就忘见下方紧急重置步骤再单独说一下忘记 root 密码怎么救。首先停止服务systemctl stop mysqld然后跳过授权表启动mysqld_safe --skip-grant-tables 或者在新版 MySQL 8 上systemctl set-environment MYSQLD_OPTS--skip-grant-tables systemctl start mysqld这样启动后可以用无密码方式进 mysql接着FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY NewPassword123!;完成后重启服务用新密码登录。这个操作在练习环境救急没问题生产环境必须谨慎因为跳过授权表等于临时放开所有认证必须确认没有其他人在同时访问。4.3 我踩过几次坑之后的个人建议说点没人写在文档里的体会。第一学 MySQL 一定要亲手敲 SQL别只看教程。我一开始也喜欢复制粘贴命令当时觉得省事结果过两周连INSERT的语法都记不完整。后来强制自己每个语句手敲一遍哪怕慢但敲的时候你会去思考每个关键字的作用记忆效率完全不一样。第二给自己准备一个“命令笔记”。我在 Linux 上用history查命令太乱了后来改成把常用命令分门别类整理到一个 Markdown 文件里比如安装、备份、用户权限、查询技巧每一类都记上。遇到问题先翻自己的笔记实在找不到再去搜索效率会高很多。第三别做危险操作前不备份。这句话我反复提醒自己也提醒你。尤其是带DELETE、UPDATE、DROP的语句在正式环境上执行前一定先确认当前数据是否可以恢复。哪怕只是练习环境也该养成这个安全意识。等以后你真的负责业务数据库这种习惯就是职业底线。最后说一个小技巧MySQL 错误日志是你最好的排查老师遇到莫名其妙的问题别急着百度先看日志。tail -f /var/log/mysqld.log很多人忽略了这个动作其实日志里经常会直接写明问题原因比如密码过期、插件不支持、权限不够一眼就能定位。把这个习惯早点养成遇到报错心不慌很多 Linux 和数据库问题都会迎刃而解。
阅读完成 · 觉得有帮助?
咨询建站