首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >云服务器安装 MySQL 教程:部署配置与安全连接设置

云服务器安装 MySQL 教程:部署配置与安全连接设置

原创
作者头像
gavin1024
发布2026-09-14 02:53:08
发布2026-09-14 02:53:08
2230
举报

摘要

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 起。

磁盘方面,数据库对读写性能敏感,建议使用性能较好的云硬盘类型。数据量增长较快时,可以为数据目录单独挂载云硬盘,后续扩容不必迁移整台服务器。

三、安装 MySQL

Ubuntu 与 Debian 使用系统仓库安装:

代码语言:bash
复制
sudo apt update
sudo apt install -y mysql-server

安装完成后服务会自动启动:

代码语言:bash
复制
sudo systemctl status mysql --no-pager
mysql --version

如果需要特定版本,可以添加 MySQL 官方软件源后安装,具体地址以官方文档为准。

设置开机自启:

代码语言:bash
复制
sudo systemctl enable mysql

四、初始化安全设置

刚安装完的 MySQL 存在若干不安全的默认配置,必须先处理。

运行安全配置向导:

代码语言:bash
复制
sudo mysql_secure_installation

会依次询问以下问题,建议这样回答:

询问项

建议

是否启用密码强度校验

是,选择中等或强级别

设置 root 密码

设置 12 位以上混合字符密码

是否移除匿名用户

是否禁止 root 远程登录

是否删除 test 数据库

是否立即重载权限表

禁止 root 远程登录这一项务必选是。root 账号拥有全部权限,允许它从公网登录等于把数据库完全暴露。需要远程访问时应创建专用账号并限定权限,后面会讲。

登录验证:

代码语言:bash
复制
sudo mysql -u root -p

输入密码后进入命令行,说明安装和初始化都正常。

五、创建数据库与专用账号

不要让应用直接用 root 连数据库。为每个应用创建独立的库和账号,权限只给必需的部分。

登录后执行:

代码语言:sql
复制
-- 创建数据库,使用支持完整 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

关于权限:上面的授权没有包含 DROPGRANT。应用日常运行不需要删库和授权能力,不给这些权限可以降低误操作和注入攻击的破坏范围。如果应用的数据库迁移功能需要删表,再按需补充 DROP

验证账号可用:

代码语言:bash
复制
mysql -u myapp -p myapp -e "SELECT DATABASE(), USER();"

能返回库名和用户名说明账号配置正确。

六、配置远程连接

如果应用和数据库在同一台服务器上,跳过这一节,保持只监听本机是最安全的。

需要跨机器访问时,按以下步骤操作。

第一步,修改监听地址

编辑配置文件:

代码语言:bash
复制
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

找到 bind-address 并修改:

代码语言:ini
复制
bind-address = 0.0.0.0

重启服务:

代码语言:bash
复制
sudo systemctl restart mysql

第二步,创建允许远程连接的账号

不要放开已有的本机账号,单独创建并限定来源 IP:

代码语言:sql
复制
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。这样既安全又没有公网流量费用。

第四步,验证连接

在应用服务器上测试:

代码语言:bash
复制
mysql -h 数据库服务器内网IP -u myapp -p -e "SELECT 1;"

连接失败时按顺序排查:目标机器的 MySQL 是否监听在 0.0.0.0、控制台防火墙规则是否放通、账号的来源 IP 限制是否匹配、密码是否正确。

七、参数调优

默认配置比较保守,按机器规格调整能明显改善性能。

编辑配置文件,在 [mysqld] 段添加:

代码语言:ini
复制
[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 建议开启。它记录执行超过阈值的查询,是后期性能优化的主要依据。没有慢查询日志,优化就只能靠猜。

修改后重启并验证生效:

代码语言:bash
复制
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';"

返回值与配置一致说明已加载。参数改错导致服务起不来时,查看错误日志定位:

代码语言:bash
复制
sudo tail -50 /var/log/mysql/error.log

八、备份与恢复

自建数据库的备份必须自己负责,这是相比云数据库最需要投入精力的部分。

逻辑备份

适合中小数据量,生成的 SQL 文件便于跨版本迁移:

代码语言:bash
复制
mysqldump -u root -p \
  --single-transaction \
  --routines --triggers --events \
  myapp | gzip > ~/myapp-$(date +%Y%m%d).sql.gz

--single-transaction 让备份在一个一致性快照中进行,不会长时间锁表,业务可以继续读写。--routines --triggers --events 确保存储过程、触发器和事件也被备份,漏掉它们会导致恢复后功能缺失。

备份所有数据库:

代码语言:bash
复制
mysqldump -u root -p --all-databases --single-transaction \
  | gzip > ~/all-db-$(date +%Y%m%d).sql.gz

恢复

代码语言:bash
复制
gunzip < ~/myapp-20260910.sql.gz | mysql -u root -p myapp

自动化备份

写成脚本并加入定时任务,同时把备份文件同步到对象存储:

代码语言:bash
复制
sudo crontab -e
代码语言:txt
复制
0 3 * * * /usr/local/bin/mysql-backup.sh

必须把备份放到服务器之外。 只存在本机的备份,在服务器故障、磁盘损坏或实例被误删时会一起消失,等于没有备份。对象存储提供高持久性,适合作为备份归档目标。

恢复演练不能省

这是备份工作中最容易被跳过、却最关键的一步。备份文件能生成,不代表能成功恢复——可能是备份内容不完整、可能是字符集不匹配、可能是权限缺失。首次配置完成后,务必用备份文件在另一个环境完整还原一次,确认表结构和数据都正确。之后每隔一段时间抽查一次。

用快照做整机保护

在版本升级、参数大调整前给实例创建快照。轻量应用服务器在实例详情页的「快照」页签操作,通常 5 分钟内完成且无需关机。

需要注意,快照捕获的是磁盘状态,而数据库可能有部分数据仍在内存中未落盘,因此快照不能替代数据库层面的逻辑备份。两者是互补关系:快照用于快速恢复整机环境,逻辑备份用于保证数据一致性。回滚快照会把整块系统盘恢复到快照时间点,之后的数据变更会被清除,运行中的实例会自动关机。

九、常见问题与排查

忘记 root 密码

需要以跳过权限校验的方式启动 MySQL 后重置密码。具体步骤与版本相关,建议参考对应版本的官方文档操作,过程中数据库处于无认证状态,务必确保此时未对外开放端口。

远程连接被拒绝

按顺序检查:bind-address 是否已改为 0.0.0.0、控制台防火墙是否放通 3306、连接账号的来源 IP 限制是否匹配实际来源、密码是否正确。四项中前两项最常见。

中文或 emoji 写入后变成乱码或问号

字符集问题。确认数据库、表、字段以及应用连接时使用的字符集都是 utf8mb4。任何一环用了三字节的 utf8 都会出问题。查看当前设置:

代码语言:sql
复制
SHOW VARIABLES LIKE 'character_set%';

连接数达到上限

应用报错提示连接过多时,先查看当前连接情况:

代码语言:sql
复制
SHOW STATUS LIKE 'Threads_connected';
SHOW PROCESSLIST;

如果大量连接处于空闲状态,说明应用侧的连接池配置有问题,连接没有被正确释放。单纯调大 max_connections 只是掩盖问题,每个连接都占用内存,调太大会导致内存耗尽。

查询变慢

查看慢查询日志找出具体语句:

代码语言:bash
复制
sudo tail -50 /var/log/mysql/slow.log

EXPLAIN 分析执行计划,多数慢查询源于缺少合适的索引,或查询条件导致索引失效。

磁盘空间不足

查看各库占用:

代码语言:sql
复制
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;

二进制日志也会持续占用空间,需要配置合理的保留期限自动清理。

服务启动失败

查看错误日志:

代码语言:bash
复制
sudo tail -50 /var/log/mysql/error.log

常见原因是参数配置错误(例如缓冲池设置超过物理内存)、磁盘空间不足、数据文件权限异常。

十、日常维护建议

  • 每周:确认备份任务执行成功;查看慢查询日志中的新增条目;检查磁盘剩余空间。
  • 每月:抽查一次备份恢复;审阅账号列表,清理不再使用的账号;检查连接数和缓冲池命中率。
  • 每季度:做一次完整的恢复演练;评估当前配置是否仍能承载业务量。
  • 变更前:创建快照,并在测试环境先验证参数调整的影响。

安全方面有几条底线:数据库端口不对公网开放;每个应用使用独立账号并按最小必要授权;root 只允许本机登录;密码定期更换且不与其他系统复用。

数据库跑起来之后,如果需要为它建立更完善的监控告警,或者判断当前业务已经需要主备高可用架构,可以作为下一步的评估方向。

数据可靠性和服务连续性要求较高的生产业务,云数据库 MySQL 默认具备主备架构、自动备份和跨可用区能力,能省去自建高可用的工作;学习验证和开发测试环境,用云服务器 CVM 自建更灵活,配合对象存储 COS 存放备份可以提升数据安全性。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 摘要
  • 一、自建还是用云数据库
  • 二、环境准备
  • 三、安装 MySQL
  • 四、初始化安全设置
  • 五、创建数据库与专用账号
  • 六、配置远程连接
  • 七、参数调优
  • 八、备份与恢复
  • 九、常见问题与排查
  • 十、日常维护建议
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档