
MySQL 是使用最广的开源关系型数据库,几乎所有 Web 应用都依赖它。本文完成在云服务器上安装 MySQL 8.0 的全过程,包含安装、初始化安全设置、账号与权限管理、远程连接配置、字符集与参数调优、备份恢复,并客观对比自建数据库与云数据库的适用场景,帮助判断哪种方式更适合当前项目。
动手安装前先想清楚这个问题,选错会在后期付出额外成本。
自建 MySQL 指在自己的云服务器上安装和维护数据库。优势是成本较低,只需为服务器付费;配置完全可控,可以自由调整参数、安装插件、选择版本。代价是所有运维工作都要自己承担:高可用架构、主从复制、定期备份、故障恢复、版本升级、性能调优、监控告警。
云数据库 MySQL 是托管服务。腾讯云的云数据库 MySQL 默认采用主备架构,提供数据自动备份和无损恢复机制,支持跨可用区部署、数据库代理、CPU 弹性扩容和异地备份容灾,控制台提供覆盖连接访问、数据库负载等七十余项监控指标,还可配合数据库自治服务做智能运维。它把上面那些运维工作交给平台承担。
选择建议:
场景 | 建议 |
|---|---|
学习、开发、测试环境 | 自建,成本低且便于反复调整 |
个人项目、小型站点,能接受偶发中断 | 自建可行,但备份必须做到位 |
生产业务,数据不能丢、服务不能长时间中断 | 云数据库,主备高可用和自动备份是刚需 |
团队缺少专职数据库运维 | 云数据库,省下的运维时间通常超过成本差 |
一个常被低估的点是:自建的成本不只是服务器费用,还包括你为它投入的时间,以及数据出问题时的损失。数据库是最不该省事的一环。
本文讲自建流程。如果判断项目更适合托管服务,可以直接使用云数据库并跳过安装步骤,后面的账号权限、字符集和连接排查部分仍然适用。
项目 | 最低配置 | 建议配置 |
|---|---|---|
CPU | 1 核 | 2 核及以上 |
内存 | 1 GB | 4 GB 及以上 |
磁盘 | 40 GB | 按数据量规划,预留增长空间 |
操作系统 | Ubuntu 22.04 / 24.04、Debian 12 | 同左 |
内存直接决定数据库性能。MySQL 的缓冲池用于缓存数据和索引,内存充足时大部分查询可以在内存中完成,不必读磁盘。1 GB 只够跑通流程,实际使用建议 4 GB 起。
磁盘方面,数据库对读写性能敏感,建议使用性能较好的云硬盘类型。数据量增长较快时,可以为数据目录单独挂载云硬盘,后续扩容不必迁移整台服务器。
Ubuntu 与 Debian 使用系统仓库安装:
sudo apt update
sudo apt install -y mysql-server安装完成后服务会自动启动:
sudo systemctl status mysql --no-pager
mysql --version如果需要特定版本,可以添加 MySQL 官方软件源后安装,具体地址以官方文档为准。
设置开机自启:
sudo systemctl enable mysql刚安装完的 MySQL 存在若干不安全的默认配置,必须先处理。
运行安全配置向导:
sudo mysql_secure_installation会依次询问以下问题,建议这样回答:
询问项 | 建议 |
|---|---|
是否启用密码强度校验 | 是,选择中等或强级别 |
设置 root 密码 | 设置 12 位以上混合字符密码 |
是否移除匿名用户 | 是 |
是否禁止 root 远程登录 | 是 |
是否删除 test 数据库 | 是 |
是否立即重载权限表 | 是 |
禁止 root 远程登录这一项务必选是。root 账号拥有全部权限,允许它从公网登录等于把数据库完全暴露。需要远程访问时应创建专用账号并限定权限,后面会讲。
登录验证:
sudo mysql -u root -p输入密码后进入命令行,说明安装和初始化都正常。
不要让应用直接用 root 连数据库。为每个应用创建独立的库和账号,权限只给必需的部分。
登录后执行:
-- 创建数据库,使用支持完整 Unicode 的字符集
CREATE DATABASE myapp
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- 创建只能从本机连接的账号
CREATE USER 'myapp'@'localhost' IDENTIFIED BY '强密码';
-- 只授予该库的必要权限
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX, REFERENCES
ON myapp.* TO 'myapp'@'localhost';
FLUSH PRIVILEGES;关于字符集:必须使用 utf8mb4 而不是 utf8。 MySQL 中的 utf8 实际只支持三字节字符,存不了 emoji 和部分生僻字,写入时会报错或截断。这是个历史遗留问题,新建库一律用 utf8mb4。
关于权限:上面的授权没有包含 DROP 和 GRANT。应用日常运行不需要删库和授权能力,不给这些权限可以降低误操作和注入攻击的破坏范围。如果应用的数据库迁移功能需要删表,再按需补充 DROP。
验证账号可用:
mysql -u myapp -p myapp -e "SELECT DATABASE(), USER();"能返回库名和用户名说明账号配置正确。
如果应用和数据库在同一台服务器上,跳过这一节,保持只监听本机是最安全的。
需要跨机器访问时,按以下步骤操作。
第一步,修改监听地址
编辑配置文件:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf找到 bind-address 并修改:
bind-address = 0.0.0.0重启服务:
sudo systemctl restart mysql第二步,创建允许远程连接的账号
不要放开已有的本机账号,单独创建并限定来源 IP:
CREATE USER 'myapp'@'10.0.1.100' IDENTIFIED BY '强密码';
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp.* TO 'myapp'@'10.0.1.100';
FLUSH PRIVILEGES;这里的 10.0.1.100 是应用服务器的内网 IP。用具体 IP 而不是 %——% 表示允许从任意地址连接,一旦密码泄露就无从防范。
第三步,控制台放通端口
轻量应用服务器在实例详情页的「防火墙」页签点击「添加规则」,协议选 TCP、端口填 3306;云服务器 CVM 在安全组的「入站规则」中添加。
这一步的来源设置至关重要。 来源必须填写应用服务器的具体 IP 或所在内网网段,绝对不要填 0.0.0.0/0。数据库端口对公网开放会立刻遭到持续的爆破扫描,这是自建数据库最常见的失守方式。
更稳妥的做法是根本不放通公网访问:让应用服务器和数据库服务器处于同一私有网络,通过内网 IP 通信,公网完全访问不到 3306。这样既安全又没有公网流量费用。
第四步,验证连接
在应用服务器上测试:
mysql -h 数据库服务器内网IP -u myapp -p -e "SELECT 1;"连接失败时按顺序排查:目标机器的 MySQL 是否监听在 0.0.0.0、控制台防火墙规则是否放通、账号的来源 IP 限制是否匹配、密码是否正确。
默认配置比较保守,按机器规格调整能明显改善性能。
编辑配置文件,在 [mysqld] 段添加:
[mysqld]
# 字符集
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 缓冲池,最重要的一项
innodb_buffer_pool_size = 2G
# 日志文件大小
innodb_log_file_size = 512M
# 事务提交刷盘策略
innodb_flush_log_at_trx_commit = 1
# 最大连接数
max_connections = 200
# 单条语句允许的最大数据包
max_allowed_packet = 64M
# 慢查询日志
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2几项关键参数的说明:
innodb_buffer_pool_size 是影响最大的单项。它决定能缓存多少数据和索引在内存中。经验值是设为可用内存的 50%~70%。4 GB 内存的机器设 2G 比较合适。设太大会导致系统内存不足,反而触发换页拖慢整体。
innodb_flush_log_at_trx_commit 控制事务安全性与性能的平衡。设为 1 表示每次提交都刷盘,最安全但性能开销大;设为 2 性能更好,但机器意外断电时可能丢失最后一秒的事务。生产环境的数据不能丢,应保持 1;开发测试环境可以设 2 换取速度。
slow_query_log 建议开启。它记录执行超过阈值的查询,是后期性能优化的主要依据。没有慢查询日志,优化就只能靠猜。
修改后重启并验证生效:
sudo systemctl restart mysql
mysql -u root -p -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"
mysql -u root -p -e "SHOW VARIABLES LIKE 'character_set_server';"返回值与配置一致说明已加载。参数改错导致服务起不来时,查看错误日志定位:
sudo tail -50 /var/log/mysql/error.log自建数据库的备份必须自己负责,这是相比云数据库最需要投入精力的部分。
逻辑备份
适合中小数据量,生成的 SQL 文件便于跨版本迁移:
mysqldump -u root -p \
--single-transaction \
--routines --triggers --events \
myapp | gzip > ~/myapp-$(date +%Y%m%d).sql.gz--single-transaction 让备份在一个一致性快照中进行,不会长时间锁表,业务可以继续读写。--routines --triggers --events 确保存储过程、触发器和事件也被备份,漏掉它们会导致恢复后功能缺失。
备份所有数据库:
mysqldump -u root -p --all-databases --single-transaction \
| gzip > ~/all-db-$(date +%Y%m%d).sql.gz恢复
gunzip < ~/myapp-20260910.sql.gz | mysql -u root -p myapp自动化备份
写成脚本并加入定时任务,同时把备份文件同步到对象存储:
sudo crontab -e0 3 * * * /usr/local/bin/mysql-backup.sh必须把备份放到服务器之外。 只存在本机的备份,在服务器故障、磁盘损坏或实例被误删时会一起消失,等于没有备份。对象存储提供高持久性,适合作为备份归档目标。
恢复演练不能省
这是备份工作中最容易被跳过、却最关键的一步。备份文件能生成,不代表能成功恢复——可能是备份内容不完整、可能是字符集不匹配、可能是权限缺失。首次配置完成后,务必用备份文件在另一个环境完整还原一次,确认表结构和数据都正确。之后每隔一段时间抽查一次。
用快照做整机保护
在版本升级、参数大调整前给实例创建快照。轻量应用服务器在实例详情页的「快照」页签操作,通常 5 分钟内完成且无需关机。
需要注意,快照捕获的是磁盘状态,而数据库可能有部分数据仍在内存中未落盘,因此快照不能替代数据库层面的逻辑备份。两者是互补关系:快照用于快速恢复整机环境,逻辑备份用于保证数据一致性。回滚快照会把整块系统盘恢复到快照时间点,之后的数据变更会被清除,运行中的实例会自动关机。
忘记 root 密码
需要以跳过权限校验的方式启动 MySQL 后重置密码。具体步骤与版本相关,建议参考对应版本的官方文档操作,过程中数据库处于无认证状态,务必确保此时未对外开放端口。
远程连接被拒绝
按顺序检查:bind-address 是否已改为 0.0.0.0、控制台防火墙是否放通 3306、连接账号的来源 IP 限制是否匹配实际来源、密码是否正确。四项中前两项最常见。
中文或 emoji 写入后变成乱码或问号
字符集问题。确认数据库、表、字段以及应用连接时使用的字符集都是 utf8mb4。任何一环用了三字节的 utf8 都会出问题。查看当前设置:
SHOW VARIABLES LIKE 'character_set%';连接数达到上限
应用报错提示连接过多时,先查看当前连接情况:
SHOW STATUS LIKE 'Threads_connected';
SHOW PROCESSLIST;如果大量连接处于空闲状态,说明应用侧的连接池配置有问题,连接没有被正确释放。单纯调大 max_connections 只是掩盖问题,每个连接都占用内存,调太大会导致内存耗尽。
查询变慢
查看慢查询日志找出具体语句:
sudo tail -50 /var/log/mysql/slow.log用 EXPLAIN 分析执行计划,多数慢查询源于缺少合适的索引,或查询条件导致索引失效。
磁盘空间不足
查看各库占用:
SELECT table_schema,
ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS size_mb
FROM information_schema.tables
GROUP BY table_schema
ORDER BY size_mb DESC;二进制日志也会持续占用空间,需要配置合理的保留期限自动清理。
服务启动失败
查看错误日志:
sudo tail -50 /var/log/mysql/error.log常见原因是参数配置错误(例如缓冲池设置超过物理内存)、磁盘空间不足、数据文件权限异常。
安全方面有几条底线:数据库端口不对公网开放;每个应用使用独立账号并按最小必要授权;root 只允许本机登录;密码定期更换且不与其他系统复用。
数据库跑起来之后,如果需要为它建立更完善的监控告警,或者判断当前业务已经需要主备高可用架构,可以作为下一步的评估方向。
数据可靠性和服务连续性要求较高的生产业务,云数据库 MySQL 默认具备主备架构、自动备份和跨可用区能力,能省去自建高可用的工作;学习验证和开发测试环境,用云服务器 CVM 自建更灵活,配合对象存储 COS 存放备份可以提升数据安全性。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。