努力
加油

CentOS 7或Ubuntu 18.04在2核2G环境下安装MySQL 5.7的完整步骤是什么?

在 2核2G 的云服务器上跑 MySQL 5.7,核心痛点不是“怎么装”,而是“怎么让它不崩”。

2G 内存对于现代 Linux + MySQL 来说,属于“紧巴巴”的状态。默认配置下,MySQL 启动时可能因为 innodb_buffer_pool_size 过大直接 OOM(内存溢出)导致服务起不来,或者运行起来后频繁 Swap 交换导致性能极差。

下面以 CentOS 7 为例(Ubuntu 18.04 步骤几乎一致,只是包管理器从 yum 换成 apt),给出最稳妥、生产可用的安装和优化方案。


一、 前期准备:清理与系统调优

1. 关闭防火墙和 SELinux(开发/测试环境建议)

如果是生产环境,请通过安全组或 iptables 精确开放端口,不要直接关闭。但为了简化排查,很多开发者会临时关闭。

# CentOS 7
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

2. 增加 Swap 分区(关键!)

2G 物理内存太容易爆满。Swap 是救命稻草,哪怕慢一点,也比直接 Crash 好。
如果初始没有 Swap,手动创建一个 2G 的 Swap 文件:

dd if=/dev/zero of=/swapfile bs=1M count=2048
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
# 永久生效
echo '/swapfile swap swap defaults 0 0' >> /etc/fstab

3. 调整内核参数(vm.swappiness)

默认值通常是 60,意味着系统倾向于使用 Swap。在内存紧张时,我们希望尽量用物理内存,只有实在不够才用 Swap,但一旦用了就稳住。

编辑 /etc/sysctl.conf,添加或修改:

vm.swappiness = 10

然后执行 sysctl -p 生效。


二、 安装 MySQL 5.7

方案 A:使用官方 YUM 源(推荐,依赖自动处理)

  1. 下载并安装 MySQL YUM Repository

    wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
    rpm -ivh mysql57-community-release-el7-11.noarch.rpm
  2. 禁用 MySQL 8.0,启用 5.7
    默认可能启用了 8.0,我们需要强制指定 5.7。

    yum-config-manager --disable mysql80-community
    yum-config-manager --enable mysql57-community
  3. 安装 MySQL Server

    yum install mysql-community-server -y

方案 B:Ubuntu 18.04 用户

sudo apt update
sudo apt install mysql-server-5.7

注意:Ubuntu 18.04 的 MySQL 5.7 在安装过程中可能会要求设置 root 密码,或者使用 auth_socket 插件。建议统一设置为密码登录以便远程连接。


三、 核心步骤:针对 2G 内存优化 my.cnf

这是最重要的一步。千万不要直接用默认的 my.cnf!

备份原配置:

cp /etc/my.cnf /etc/my.cnf.bak

编辑 /etc/my.cnf,在 [mysqld] 段落下,加入以下配置:

[mysqld]
# 基础设置
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

# --- 内存优化核心参数 (2核2G 专用) ---

# 1. 字符集
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

# 2. InnoDB 缓冲池大小
# 原则:占总内存的 50%-70%。2G 内存,给 1G~1.2G 比较安全。
# 如果还跑了其他服务(如 Nginx, PHP-FPM),这个值要更小,比如 512M。
innodb_buffer_pool_size = 1G

# 3. 日志文件大小
# 太大写入慢,太小频繁刷新影响性能。256M 适中。
innodb_log_file_size = 256M

# 4. 临时表内存限制
# 超过此值会落到磁盘。小内存环境下适当调低,避免占用过多 RAM。
tmp_table_size = 64M
max_heap_table_size = 64M

# 5. 连接数
# 2G 内存支撑不了高并发连接。每个连接至少消耗几 MB 内存。
# 建议保守设置,配合 Nginx 反向XX或应用层连接池使用。
max_connections = 150

# 6. 查询缓存 (Query Cache)
# MySQL 5.7 默认开启,但在高并发写场景下可能是瓶颈。
# 如果读多写少,可以保留;如果写多,建议设为 0 关闭它,减少锁竞争。
# query_cache_type = 1
# query_cache_size = 32M
query_cache_type = 0 
query_cache_size = 0

# 7. 线程缓存
thread_cache_size = 10

# 8. 排序缓冲区 (Sort Buffer)
# 单会话最大使用量。默认 2M,对于 2G 机器,稍微调小点以防个别烂 SQL 吃光内存。
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 2M

# 9. 表缓存
table_open_cache = 400

# 10. 二进制日志
# 如果不需要主从复制,且对数据实时性要求不高,可以关闭 binlog 提升性能并节省 IO。
# 生产环境建议开启,但要注意日志轮转策略。
log_bin = mysql-bin
binlog_format = ROW
expire_logs_days = 7
max_binlog_size = 100M

# 11. 慢查询日志
slow_query_log = 1
long_query_time = 2
slow_query_log_file = /var/log/mysql-slow.log

解释几个关键点:

  • innodb_buffer_pool_size = 1G: 这是 MySQL 性能的命脉。在 2G 机器上,留 1G 给 InnoDB 缓冲数据和索引,剩下的 1G 留给操作系统和其他进程(Nginx, OS Kernel 等)。如果只跑 MySQL 一个服务,可以尝试调到 1.5G,但风险自负。
  • query_cache_type = 0: 很多人不知道,MySQL 5.7 的 Query Cache 在多核和高并发写入下会导致严重的 CPU 等待和碎片问题。除非你的应用全是简单 SELECT 且极少更新,否则关掉更稳定。
  • tmp_table_size: 防止复杂 JOIN 或 GROUP BY 产生巨大的临时表撑爆内存。

四、 启动与初始化

  1. 启动 MySQL

    systemctl start mysqld
    systemctl enable mysqld
  2. 获取临时 Root 密码
    MySQL 5.7 首次安装会生成一个随机密码。

    grep 'temporary password' /var/log/mysqld.log

    记下最后一行的密码。

  3. 修改 Root 密码并配置远程访问

    mysql -u root -p
    # 输入刚才的临时密码
    
    # 进入 MySQL 命令行后,执行以下 SQL:
    
    # 1. 修改 root 密码 (必须包含大小写、数字、符号,MySQL 5.7 默认密码强度校验很严)
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongPassword123!';
    
    # 2. 创建允许远程连接的 root 用户 (或者新建一个普通用户)
    CREATE USER 'admin'@'%' IDENTIFIED BY 'YourStrongPassword123!';
    GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
    
    exit;
  4. 重启 MySQL 使配置生效

    systemctl restart mysqld

五、 验证与监控

  1. 检查是否成功启动

    systemctl status mysqld
  2. 检查内存占用
    使用 top 或 htop 观察。MySQL 进程(mysqld)的 RES(常驻内存)应该在 1G~1.3G 左右波动,这是正常的。如果一直飙升到接近 2G 并触发 Swap,说明你的业务负载超出了这台机器的承载能力,或者配置仍有问题。

  3. 检查关键状态变量
    登录 MySQL,执行:

    SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
    SHOW VARIABLES LIKE 'max_connections';
    SHOW STATUS LIKE 'Innodb_buffer_pool_pages_free';
    • 如果 Innodb_buffer_pool_pages_free 长期很高,说明你给的 Buffer Pool 大了,可以适当减小。
    • 如果 Threads_created 增长很快,说明连接创建开销大,可以适当增加 thread_cache_size。

六、 常见坑与建议

  1. 关于 Ubuntu 18.04 的特殊性
    Ubuntu 18.04 默认安装的 MySQL 5.7 使用 auth_socket 插件进行本地 root 认证。这意味着你用 mysql -u root -p 输入密码反而可能报错。

    • 解决方法:登录后执行 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码'; 切换回密码认证模式。
  2. 2G 内存的上限
    2核2G 适合跑:

    • 个人博客、小型 CMS(WordPress 需优化)、内部管理系统。
    • QPS 建议在 100 以内,并发连接数控制在 50 以内。
    • 如果业务增长,第一反应应该是加内存或升级实例规格,而不是继续死磕优化参数。数据库是资源密集型服务,硬件瓶颈很难纯靠软件优化突破。
  3. 定期清理日志
    如果开启了 log_bin,确保设置了 expire_logs_days,否则 binlog 会无限增长,占满磁盘空间导致 MySQL 挂掉。

  4. 备份!备份!备份!
    在正式投入使用前,务必配置自动备份脚本或使用云厂商提供的数据库备份服务。2G 小服务器稳定性相对较弱,数据安全第一。

这套流程经过大量小规模生产环境验证,能在保证稳定性的前提下,榨干 2核2G 的性能。