资讯动态

MySQL与MariaDB入门指南:从安装配置到权限备份的完整实操

发布时间:2026/9/11 12:55:10 来源:尧图企业网站定制
开头的写法搞技术这些年身边总有人问我数据库到底该怎么入门。说实话数据库这个东西你把它想得太复杂了反而学不进去它就是一套用来存数据、取数据的系统跟你在 Excel 里填表格本质没区别只是它更擅长处理海量数据、多用户并发读写和数据安全。而现在市面上一提到开源数据库绕不开的两个名字就是 MySQL 和 MariaDB它们俩的关系像极了同一个家族里走出来的两位后辈一个有商业公司鼎力支持一个有社区信仰在背后撑着。这篇内容就是给刚接触服务搭建的读者准备的我会从选型、安装、初始化、建库建表、增删改查到用户权限和定时备份完整走一遍 MySQL / MariaDB 的实操链路。不管你是准备做课程设计、搭个人博客、写一个小型 Web 服务还是公司里负责基础环境运维只要你想把数据库这东西“真正跑起来并会日常操作”这篇文章都适合你。我会尽量用大白话讲清楚每一步在干什么、为什么这么干而不是扔给你一串不明所以的命令行。我自己也是从大学实验室里懵懵懂懂装第一个 MySQL 起步的踩过字符集乱码、端口被占用、root 密码丢失、备份恢复失败等等一堆坑。所以这篇内容不只讲“怎么装”更会把我后来工作中常用的排查思路和避坑经验一并写出来希望能帮你省点时间。1. 先想清楚到底该装 MySQL 还是 MariaDB1.1 两个数据库的“血缘关系”与核心差异先说个背景MariaDB 是 MySQL 的作者 Michael Widenius 在 MySQL 被 Oracle 收购后基于早期 MySQL 代码分支出来的一个开源版本所以它们的 SQL 语法、存储引擎、连接方式高度兼容。换句话说你学会了 MySQLMariaDB 基本等同于无痛上手。但两者在维护方和更新节奏上有明显区别。MySQL 目前由 Oracle 主导社区版和企业版并行社区版虽然也能用于生产但部分高级功能放在企业版里而且社区版发版节奏偏稳、偏慢内核更新比较谨慎。MariaDB 则完全由开源基金会和社区驱动迭代更激进新增功能往往更快落地而且它对 Oracle 的某些闭源模块做了替换或重写默认情况下存储引擎 Aria、ColumnStore 这些是社区自己搞的东西。还有一个用户比较关心的点版本号演进策略不一样。MySQL 8.0 是目前的主力版本而 MariaDB 的版本号是从 10.x 一路往后走的比如 10.5、10.6、10.11 LTS 这些。单看版本号容易让人混淆很多人以为 MariaDB 10.x 比 MySQL 5.7 高一代其实它们只是历史分叉导致的两个独立版本线并不存在严格的对应关系。1.2 我给你们的选择建议什么时候选哪个如果你是在 Windows 上做课程设计、写作业或者公司的技术栈明确要求 MySQL那就直接装 MySQL 8.0 社区版资料多、踩坑的帖子也多你遇到问题基本一搜一个准。如果你的服务器是 Linux希望更贴合 Debian/Ubuntu 系的系统包管理生态或者你单纯反感 Oracle 的商业策略、倾向于纯社区维护的软件那 MariaDB 会是更顺手的选项。很多 Linux 发行版默认仓库里带的“mysql”包实际指向的就是 MariaDB这一点你在 apt 安装时会看得非常清楚。我在实际项目中两种都用过。MySQL 8.0 给我印象最深的是窗口函数、CTE 这些新特性确实好用权限体系也比老版本完善很多。MariaDB 则在兼容性和某些查询优化器行为上表现得更“放飞”一些在老 MySQL 里跑得奇慢的查询搬到 MariaDB 上反而会快不少。不过我想提醒一点选型最好在项目一开始就定下来别中途切换。虽然两者 SQL 语法高度兼容但部分存储引擎名、系统表结构、备份恢复工具的具体参数仍有差异中途换库的成本绝对比你想象的高。2. 安装前的准备环境选择与版本策略2.1 Windows 下安装前要确认的几件事很多新手拿到安装包就一路点“下一步”结果中途不是缺 Visual C 运行库就是端口被占要么到最后连服务都起不来。安装前最好花两分钟做三件事。第一确认操作系统版本。MySQL 8.0 官方支持 Windows Server 2012 以上的系统普通 Win10/Win11 没问题但如果你还在用 Win7老版本 MySQL 5.7 会稳妥一些。第二检查 3306 端口是否被占。默认 MySQL 监听 3306 端口这个端口很常用一些 ERP、游戏、其他数据库工具也会占用。安装前在命令行里执行netstat -ano | findstr :3306如果没有任何输出说明端口空闲可以直接用默认端口如果有结果就说明被占用了要么关掉占用进程要么安装时换一个端口。第三卸载旧版本残留。如果你之前装过 MySQL建议先彻底卸干净包括删除 C 盘 Program Files 下的 MySQL 目录、隐藏的 ProgramData 下的 MySQL 目录以及注册表中残留的服务项否则新版本装到一半经常会报“service already exists”之类的错误。Linux 下安装前要做的准备相对简单但也不建议什么都不做就直接敲安装命令。Debian/Ubuntu 系列先执行sudo apt update把软件源刷新一遍CentOS/RHEL 系列则要考虑是否已经配置了官方或第三方仓库。很多云服务器默认的源里 MySQL 版本偏旧直接yum install mysql-server可能装出来一个 5.7而不见得是 8.0。你如果对版本没有硬性要求其实默认源里的 MariaDB 反而是最省事的选择它和系统环境兼容性最好安全补丁也会跟着系统一起更新。2.2 版本选择到底装 5.7 还是 8.0这一小节单独拎出来说因为太多人卡在这个问题上。我的建议很简单没有历史包袱就 8.0有老项目约束就 5.7。MySQL 5.7 确实经典很多公司老系统跑了好几年都稳定网上教程也最多。但 5.7 已经停止官方更新了新装环境没必要再选它除非你是为了复现某个老项目的运行环境。MySQL 8.0 在性能、安全性、SQL 功能上都有明显提升唯一让你不习惯的是认证插件变了默认使用 caching_sha2_password很多老客户端连接时会报认证失败需要手动改认证方式或者升级客户端驱动。MariaDB 这边就简单多了你只要选择 LTS 版本比如 10.6 或 10.11长期维护、bug 修复稳定没必要追最新版本号毕竟你自己用的话稳定压倒一切。3. 实操Windows 安装 MySQL 8.0 完整流程3.1 下载安装包与安装向导配置先说下载渠道。你可以去 MySQL 官网社区版下载页面选 MySQL Community Server也可以直接用国内的镜像源速度会快很多。我这里以 mysql-installer-community-8.0.x.msi 为例这个带安装向导对新手最友好。运行安装包的时候如果系统提示需要 .NET Framework 或 Visual C 运行库直接按提示装完再继续。进入安装向导后安装类型我建议选“Developer Default”以外的 Server only因为这毕竟是服务搭建不需要 Workbench、Connectors 等一堆配套组件减少后续维护烦恼。当然如果你同时需要图形化管理那可以勾选 MySQL Workbench这个我们后面会提到。下一步是检查环境依赖向导会自动检测系统还缺什么你只要点击 Execute 让它自动安装即可。这个过程可能出现网络下载失败遇到这种情况多半是网络问题重试或者切换网络环境。3.2 初始化配置端口、root 密码与字符集安装完成后进入配置阶段这里有几项非常关键我做开发这些年经常遇到新手在配置阶段出错这里拆开讲。第一项Type and Networking。默认端口 3306 一般不用改但要注意 Connectivity 这一栏里有 TCP/IP 和 X Protocol 两个选项。X Protocol 端口是 33060用不上可以关掉减少暴露面。第二项Authentication Method。这里强烈建议选第一个“Use Strong Password Encryption”也就是 caching_sha2_password。虽然它兼容性上有一些老客户端问题但安全性更好新项目选它没错。选第二个 Legacy Authentication 会影响后续新特性没必要为老旧的代码妥协。第三项设置 root 密码。root 是数据库最高权限账号密码一定要复杂一点至少 8 位以上且包含大小写字母、数字、特殊字符。同时勾选“Create Root User”时我建议顺带在 Accounts and Roles 页面里新建一个普通用户账号日常开发用普通账号root 只留作管理操作。第四项Windows Service。把“Configure MySQL Server as a Windows Service”打开这样开机自动启动省得每次手动起服务。这里顺手把服务名字记下来默认一般是 MySQL80后面排查服务状态要用到。第五项字符集。在 Server Configuration 里默认字符集是 utf8mb4这个一定要确认不要改动。很多老教程会让大家选 utf8mb3但 utf8mb4 是完整支持 emoji 和更多文字的编码方案mysql 8.0 默认也是它。如果你不在这里设置后续建库时很容易出现中文乱码问题。配置全部完成之后向导会让你输入 root 密码执行配置应用看到 Configuration Steps 每一行都打勾就说明成功了。3.3 验证安装是否成功安装完成先别急着写代码做两个验证。第一个确认服务在跑。打开命令行执行net start | findstr mysql能看到 MySQL80 之类的服务名就说明服务已启动。或者图形界面下 WinR 输入 services.msc 打开服务管理器也能看到。第二个用命令行连接验证。打开一个新的 cmd执行mysql -uroot -p并输入密码如果能看到 mysql 提示符恭喜你数据库已经可以用了。再执行一句SELECT VERSION();能返回版本号说明整个安装链路没问题。这个环节我遇到最多的问题是“mysql 不是内部或外部命令”原因很简单配置环境变量缺了。安装目录下的 bin 文件夹没有加到 PATH解决方法是右键我的电脑——属性——高级系统设置——环境变量把 MySQL 安装目录下的 bin 路径追加到 Path 变量里。比如默认在 C:\Program Files\MySQL\MySQL Server 8.0\bin。4. 实操Linux 下用包管理器安装 MariaDB4.1 apt/yum/dnf 安装命令与初始化Linux 下装 MariaDB 比装 MySQL 省事得多因为各大发行版默认软件源里基本都带了 MariaDB。无论 Ubuntu 还是 Debian安装命令都是sudo apt install mariadb-serverCentOS 7 用yum install mariadb-serverCentOS 8 及以上或者 Fedora 用dnf install mariadb-server。系统会自动把依赖处理掉不需要你手动去官网下载二进制包或者折腾安装源。装完之后第一件事先别急着用执行sudo systemctl start mariadb启动服务然后再执行sudo systemctl enable mariadb设置开机自启。有的发行版安装完成后服务会自动启动但 enable 这一步还是要手动做一次以防重启后失联。Ubuntu 18.04 之后的版本有个小细节安装时可能会提示是否自动用 unix_socket 认证插件这个稍后再讲权限部分。先用sudo mysql进入数据库检查一下是否安装成功如果成功会出现 MariaDB [(none)] 提示符。4.2 安全初始化脚本详解这是 Linux 安装 MariaDB 最关键的一步。MariaDB 初始状态下 root 用户的认证方式和权限很宽松甚至允许本地用户无密码登录所以官方专门提供了一个安全初始化脚本命令是sudo mysql_secure_installation。执行这个脚本之后会有一系列问答。第一个问题一般是 Enter current password for root如果你没有设置过密码就直接回车。第二个问题问你是否要切换到 unix_socket 认证建议选 n因为选了之后 root 只能通过系统 root 用户登数据库后续写程序连接会非常麻烦。然后是设置 root 密码、移除匿名用户、禁止 root 远程登录、移除 test 测试数据库、重新加载权限表这些一律选 y。这里面最容易被忽略的是“禁止 root 远程登录”这个选项。对于本地开发来说你只管选 y安全。但如果你之后需要从其他机器连接数据库那你要做的事是另建一个远程用户并授权而不是把 root 的远程访问打开。永远不要用 root 对公网开放连接这是我给所有环境定的铁律。安全脚本全部通过之后重新用mysql -uroot -p测试登录能进就说明此时权限体系已经收紧到正常状态。4.3 配置远程访问与开机自启如果你需要在另一台电脑上连接这台服务器的数据库比如用 Navicat 或 DbVisualizer还需要做两处调整。第一处修改监听地址。默认 MariaDB 只监听 127.0.0.1也就是只允许本机连接。打开 /etc/mysql/mariadb.conf.d/50-server.cnf不同发行版路径略有区别找到 bind-address 这一行把 127.0.0.1 改成 0.0.0.0意思就是允许其他地址访问。改完重启服务sudo systemctl restart mariadb。第二处在数据库内部创建远程登录用户。命令行登录 MariaDB 后执行CREATE USER appuser% IDENTIFIED BY YourPassword; GRANT ALL PRIVILEGES ON *.* TO appuser%; FLUSH PRIVILEGES;这里%表示任意主机实际生产环境建议换成固定 IP比如appuser192.168.1.100这样能极大减少外部攻击面。还有一点需要注意如果你的服务器有防火墙比如 firewalld 或者 ufw要放行 3306 端口否则外部永远连不上排查半天发现是防火墙拦截的大有人在。5. 核心基本操作连接、建库、建表、增删改查5.1 连接数据库的几种方式装好数据库只是开始日常打交道靠的是连接和操作。命令行连接是最基础的Windows 和 Linux 通用格式是mysql -h 主机地址 -P 端口 -u 用户名 -p比如连接本机就是mysql -uroot -p连接远程就是mysql -h192.168.1.100 -P3306 -uappuser -p。图形化工具方面MySQL Workbench 是官方出品的功能全、免费适合从命令行过渡阶段的人用。Navicat 界面友好、功能强但需要付费网上很多需要破解的版本都不建议用省心省事又合规的做法是选择 DBeaver 或 DataGripDBeaver 社区版免费且功能足够。另外很多开发场景是把数据库嵌到项目代码里比如 Java 的 JDBC、Python 的 pymysql、Node 的 mysql2这些本质上都是先建立一个连接然后发送 SQL 语句再处理返回结果。理解命令行操作能帮你在代码出问题时快速定位是语法问题还是连接问题。5.2 数据库与数据表的创建进入数据库之后第一件事是建库。官方语法是CREATE DATABASE IF NOT EXISTS shop DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;这里IF NOT EXISTS是防止重复建库报错引号里DEFAULT CHARACTER SET utf8mb4就是指定字符集COLLATE指定排序规则。中文业务库强烈建议用 utf8mb4_unicode_ci因为它对中文排序和 Unicode 字符的支持最完整。建完库要使用它执行USE shop;切换到当前库然后才能建表。假如要做一张用户表基本结构包括自增主键、用户昵称、手机号、创建时间SQL 大概是CREATE TABLE user ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, phone CHAR(11), created_at DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;这里面有几个点值得解释。主键用 AUTO_INCREMENT 自增整数是最常见也最简单的单表主键方案适合大多数业务场景。username 加 UNIQUE 约束防止重复用户名。created_at 用 DEFAULT CURRENT_TIMESTAMP 可以让数据库自动记录插入时间省得应用层额外传值。存储引擎选 InnoDB这是 MySQL 和 MariaDB 默认引擎支持事务和外键比老旧的 MyISAM 可靠得多。5.3 增删改查操作与常用命令建完表和往里面塞数据就是老生常谈的 CRUD。插入数据INSERT INTO user (username, phone) VALUES (张三, 13800001234);查询数据SELECT * FROM user; SELECT id, username FROM user WHERE phone LIKE 138% ORDER BY id DESC LIMIT 10;第一条是查全表第二条展示了条件过滤、模糊匹配、排序和限制条数这四种最常见的组合方式开发里查列表基本就是这种套路。更新数据UPDATE user SET phone 13900001234 WHERE username 张三;删除数据DELETE FROM user WHERE id 1;注意一个最容易被新手问的问题UPDATE 和 DELETE 语句忘了加 WHERE会更新或删除整张表的数据。这个失误在开发环境还能救在线上数据回滚不了就是事故。我见过的处理办法有二一是操作前先 SELECT 查一遍确认影响行数二是利用事务机制操作前开启事务执行完先查询验证没问题再 COMMIT有问题直接 ROLLBACK 回滚。常用命令这块我整理过一张速查表方便有需要的读者照着敲SHOW DATABASES; -- 查看所有数据库 SHOW TABLES; -- 查看当前库的所有表 DESC user; -- 查看表结构 SHOW CREATE TABLE user; -- 查看建表语句 SHOW VARIABLES LIKE character_set%; -- 查看字符集配置 SELECT DATABASE(); -- 查看当前所在库6. 用户与权限管理容易被忽视的必修课6.1 创建用户与授权很多人把权限管理看作是 DBA 的事自己开发阶段始终用 root这是隐患。万一密码泄露攻击者拿到的是最高权限全库数据瞬间就裸奔了。创建用户的标准流程分两步。第一步创建用户并设置密码CREATE USER devlocalhost IDENTIFIED BY StrongPass123!;localhost表示该用户只能从本机登录如果想允许局域网访问把 localhost 换成%或指定 IP 段。第二步授予权限GRANT SELECT, INSERT, UPDATE, DELETE ON shop.* TO devlocalhost;这条只给 dev 用户操作 shop 库的增删改查权限不给建表、删库等管理权限符合最小权限原则。如果开发同学确实需要修改表结构的权限可以再加上 ALTER、INDEX颗粒度自己控制。授权完一定要执行FLUSH PRIVILEGES;让权限立即生效。查看当前用户权限用SHOW GRANTS FOR devlocalhost;撤权用REVOKE SELECT ON shop.* FROM devlocalhost;删除用户用DROP USER devlocalhost;。6.2 忘记 root 密码的应急处理忘 root 密码这事十个人里至少有五个遇到过尤其是那些好久没动的老服务器。处理方法在不同版本下略有区别但核心思路是一样的跳过权限验证启动数据库然后进去重置密码。MySQL 8.0 的处理路径是先停止 MySQL 服务然后在命令行用mysqld --skip-grant-tables的方式启动这时可以无密码进入数据库。登录后先执行FLUSH PRIVILEGES;让权限表加载然后修改密码ALTER USER rootlocalhost IDENTIFIED BY NewPassword;改完之后退出用正常方式重新启动数据库服务即可。MariaDB 的处理类似只是启动参数可能略有不同。整个过程唯一的难点是 Windows 下以 skip-grant-tables 方式启动时会占用终端窗口不要关闭它重新开一个终端再执行 mysql 命令连接。这个方法也提醒我们一个经验数据库安装完成后第一时间把 root 密码写进团队的密码保险箱或者本地密码管理器千万别记在微信收藏或者在线文档里忘了密码处理起来虽然可行但在生产环境这种操作风险不小。7. 备份与恢复基础中的重点7.1 mysqldump 逻辑备份备份这件事新手往往觉得不急直到发生误删或者服务器硬盘损坏才后悔。刚开始接触数据库的人我的要求只有一个学会 mysqldump 就够了。最简单的备份命令mysqldump -uroot -p shop /backup/shop_$(date %F).sql这会把 shop 库的逻辑数据和建表语句全部导出到一个 SQL 文件里这个 SQL 文件就是你的备份。配合 crontab 或者 Windows 的任务计划程序可以实现定期备份。恢复的时候先创建一个空的数据库然后把这个 SQL 文件再导回去mysql -uroot -p -e CREATE DATABASE shop; mysql -uroot -p shop /backup/shop_2024-06-01.sqlmysqldump 的常用参数也一并列一下方便有需要的人查阅--single-transaction # InnoDB 表备份时保证一致性不影响线上读写 --routines # 连同存储过程、函数一起导出 --triggers # 连同触发器一起导出 --events # 连同事件调度器一起导出 --set-gtid-purgedOFF # 恢复时不生成 GTID 相关语句适合单机环境 --quick # 边查边写避免大库导出时内存占用过高7.2 定时备份与最容易被忽视的恢复演练光有备份文件不算完定时执行才有意义。Linux 下用 crontab 实现执行crontab -e添加一行0 2 * * * mysqldump -uroot -pYourPassword shop /backup/shop_$(date \%F).sql意思就是每天早上两点整执行一次备份。Windows 下可以写成 .bat 脚本再用任务计划程序设置每日执行。但这里要强调一个经验备份文件本身也是风险点建议定时把备份文件同步到另一台机器或云存储防止服务器磁盘损坏时备份也跟着没。比定时备份更重要的是定期做恢复演练。我见过太多人备份脚本写了一堆结果真到恢复的时候发现备份文件损坏或者 SQL 文件里有语法问题根本导不回去。每隔一段时间手动走一遍恢复流程逻辑备份能不能用、磁盘空间够不够、恢复需要多少时间这些问题只有实际演练才能暴露。8. 常见问题与排查技巧实录8.1 安装与启动失败排查安装阶段最典型的问题Windows 下是服务起不来。你安装时勾选了 Windows Service但服务状态是停止或者启动后立即停止这种情况百分之八十的原因是数据目录初始化失败或者端口被占用。解决思路是先去查看 MySQL 的错误日志Windows 默认在 C:\ProgramData\MySQL\MySQL Server 8.0\Data\ 目录下用记事本打开 .err 结尾的文件里面写着具体原因。很多人在这一步就卡住了其实学会看日志是排查任何服务类问题最基本的能力。Linux 下启动失败可以先systemctl status mariadb看状态再用journalctl -u mariadb看日志。常见的原因包括数据目录权限不对、配置文件语法错误、磁盘空间不足这些在日志里都有明明白白的报错。有个小技巧改完配置无法判断语法对不对时可以先执行mysqld --validate-config不会启动服务只检查配置项是否合法。8.2 连接失败排查“Access denied for user”是命令行连接时最常见的报错。原因无非三种密码输错、用户不存在、用户的 host 匹配不上。比如你创建了devlocalhost却用远程方式连接那必然被拒。解决方法是确认你登录时的来源 IP 是否在授权 host 范围内必要的话DROP USER重建或者用GRANT重新授权。“Cant connect to MySQL server on x.x.x.x”是远程连接的另一类高频报错。原因排查顺序很重要我按出现频率排序如下对方服务器没开放 3306 端口检查服务是否在监听netstat -tlnp | grep 3306云服务器安全组没有放行端口需要去云控制台配置本机防火墙或者 iptables 拦截用 telnet 或者 nc 测试端口连通性bind-address 还停留在 127.0.0.1只允许本机连接8.3 我踩过的坑和心得先说一个字符集有关的坑。旧项目从 MySQL 5.7 迁移到 8.0数据库里的中文字符全变成问号排查下来发现是老库的默认字符集是 latin1导出导入过程中编码没有对齐导致中文字节被错误解析。解决办法是迁移前统一库、表、字段的字符集使用ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;这条语法。再分享一个性能调优的坑。刚开始管理数据库的人遇到查询慢就条件反射地加索引其实索引不是越多越好写多读少的表索引多了反而拖慢插入和更新性能。我习惯是先用EXPLAIN SELECT ...看执行计划确认全表扫描确实发生了再考虑建索引。有时候问题不在索引而是查询写得太烂比如在 WHERE 条件中对索引列做函数运算、用%开头的模糊查询、字段类型隐式转换这些才是慢查询的真凶。最后说一个和工具相关的坑。很多人问为什么 Navicat 连不上 MySQL 8.0而命令行能连上这是认证插件兼容性问题。MySQL 8.0 默认 caching_sha2_password而旧版本的 Navicat 不支持连接时会报认证失败。解决办法是最新客户端或者把用户改成 mysql_native_password 认证方式但后者会降低安全性建议还是升级客户端到新版本让 DBeaver、DataGrip 这类频繁更新的工具去解决兼容。还有一个我自己特别想强调的习惯任何时候要在生产环境执行 UPDATE 和 DELETE 之前先加一个BEGIN;开启事务执行完用 SELECT 确认影响的行数和数据内容确认无误再COMMIT;有异常直接ROLLBACK;。这在命令行操作中真的能救命。我有个同事就是没养成这个习惯一条 DELETE 忘加 WHERE 把整张配置表删空了还好有前一天晚上的备份最终恢复花了两个小时那阵子团队的提测节奏全乱了。数据库这种东西你越了解它越觉得它像一把双刃剑。用得好它是你所有应用最坚实的底座用不好各种诡异问题会陪你加班到深夜。但好在它是一门实践性极强的技术装一次、用一次、踩一次坑能力自然就上来。希望这一篇内容能帮你把最开始的这一段路走得顺一点。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价