Skip to content

MySQL 二进制包安装指南

安装前准备

1. 检查系统环境

  • 检查操作系统版本

    bash
    # CentOS/RHEL
    cat /etc/redhat-release
    
    # Ubuntu/Debian
    lsb_release -a
  • 检查CPU和内存

    bash
    # 检查CPU核心数
    nproc
    
    # 检查内存大小
    free -h
  • 检查磁盘空间

    bash
    df -h

2. 安装依赖库

  • CentOS/RHEL

    bash
    yum install -y libaio libnuma-devel numactl libncurses5 wget
  • Ubuntu/Debian

    bash
    apt-get update
    apt-get install -y libaio1 libnuma1 libncurses5-dev wget

3. 创建MySQL用户和组

bash
# 创建mysql组
groupadd mysql

# 创建mysql用户,并加入mysql组
useradd -r -g mysql -s /bin/false mysql

4. 准备安装目录

bash
# 创建MySQL安装目录
mkdir -p /usr/local/mysql

# 创建数据目录
mkdir -p /data/mysql

# 创建日志目录
mkdir -p /var/log/mysql

# 设置目录权限
chown -R mysql:mysql /usr/local/mysql
chown -R mysql:mysql /data/mysql
chown -R mysql:mysql /var/log/mysql

下载MySQL二进制包

1. 选择MySQL版本

  • MySQL官方下载地址https://dev.mysql.com/downloads/mysql/
  • 选择版本:根据业务需求选择稳定版本,推荐使用LTS版本
  • 选择架构:根据服务器CPU架构选择(x86_64、aarch64等)

2. 下载二进制包

  • 使用wget下载

    bash
    # 下载MySQL 8.0.32二进制包(示例)
    wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.32-linux-glibc2.17-x86_64.tar.xz
  • 验证下载完整性

    bash
    # 下载MD5校验文件
    wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.32-linux-glibc2.17-x86_64.tar.xz.md5
    
    # 验证MD5值
    md5sum -c mysql-8.0.32-linux-glibc2.17-x86_64.tar.xz.md5

安装MySQL二进制包

1. 解压二进制包

bash
# 解压tar.xz包
tar -xf mysql-8.0.32-linux-glibc2.17-x86_64.tar.xz

# 移动到安装目录
mv mysql-8.0.32-linux-glibc2.17-x86_64/* /usr/local/mysql/

# 清理临时文件
rm -rf mysql-8.0.32-linux-glibc2.17-x86_64 mysql-8.0.32-linux-glibc2.17-x86_64.tar.xz*

2. 配置环境变量

bash
# 编辑/etc/profile文件
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile

# 使环境变量生效
source /etc/profile

# 验证环境变量
mysql --version

3. 初始化MySQL数据目录

  • MySQL 8.0初始化

    bash
    # 初始化数据目录,生成临时密码
    mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql
    
    # 初始化输出中会包含临时root密码,注意保存
    # 示例:[Server] A temporary password is generated for root@localhost: XXXXXXXX
  • MySQL 5.7初始化

    bash
    # MySQL 5.7使用相同的初始化命令
    mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql
  • 初始化选项说明

    • --initialize:安全初始化,生成临时密码
    • --initialize-insecure:不安全初始化,不生成临时密码(不推荐生产环境)
    • --user:指定MySQL运行用户
    • --basedir:MySQL安装目录
    • --datadir:MySQL数据目录

配置MySQL

1. 创建配置文件

bash
# 创建my.cnf配置文件
cat > /etc/my.cnf << EOF
[mysqld]
basedir = /usr/local/mysql
datadir = /data/mysql
socket = /tmp/mysql.sock
port = 3306
pid-file = /data/mysql/mysqld.pid
log-error = /var/log/mysql/mysqld.log
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

# 安全配置
default_authentication_plugin = caching_sha2_password

# 性能配置
innodb_buffer_pool_size = 2G
innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 2
innodb_file_per_table = 1
max_connections = 1000
EOF

2. 配置文件说明

  • 基础配置:basedir、datadir、socket、port等基本路径和端口配置
  • 字符集配置:设置默认字符集为utf8mb4,支持emoji表情
  • 安全配置:设置默认认证插件,MySQL 8.0默认使用caching_sha2_password
  • 性能配置:根据服务器配置调整innodb_buffer_pool_size、max_connections等参数

启动MySQL服务

1. 创建系统服务文件

  • CentOS 7+/RHEL 7+

    bash
    cat > /usr/lib/systemd/system/mysqld.service << EOF
    [Unit]
    Description=MySQL Server
    Documentation=man:mysqld(8)
    Documentation=https://dev.mysql.com/doc/refman/en/using-systemd.html
    After=network.target
    After=syslog.target
    
    [Install]
    WantedBy=multi-user.target
    
    [Service]
    User=mysql
    Group=mysql
    ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
    LimitNOFILE=5000
    EOF
  • Ubuntu 16.04+/Debian 9+

    bash
    cat > /lib/systemd/system/mysqld.service << EOF
    [Unit]
    Description=MySQL Server
    Documentation=man:mysqld(8)
    Documentation=https://dev.mysql.com/doc/refman/en/using-systemd.html
    After=network.target
    After=syslog.target
    
    [Install]
    WantedBy=multi-user.target
    
    [Service]
    User=mysql
    Group=mysql
    ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
    LimitNOFILE=5000
    EOF

2. 启动MySQL服务

bash
# 重新加载systemd配置
systemctl daemon-reload

# 启动MySQL服务
systemctl start mysqld

# 查看MySQL服务状态
systemctl status mysqld

# 设置MySQL开机自启
systemctl enable mysqld

3. 手动启动MySQL(备用方法)

bash
# 使用mysqld_safe启动
/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql &

# 停止MySQL
/usr/local/mysql/bin/mysqladmin -u root -p shutdown

初始化MySQL配置

1. 修改root密码

bash
# 登录MySQL,使用初始化时生成的临时密码
mysql -u root -p

# 修改root密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';

# 刷新权限
FLUSH PRIVILEGES;

2. 创建远程访问用户

bash
# 创建允许远程访问的root用户
CREATE USER 'root'@'%' IDENTIFIED BY 'password';

# 授予所有权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

# 刷新权限
FLUSH PRIVILEGES;

3. 删除匿名用户

bash
# 删除匿名用户
DELETE FROM mysql.user WHERE User='';

# 刷新权限
FLUSH PRIVILEGES;

4. 删除测试数据库

bash
# 删除test数据库
DROP DATABASE IF EXISTS test;

# 删除test用户权限
DELETE FROM mysql.db WHERE Db='test' OR Db='test\_%';

# 刷新权限
FLUSH PRIVILEGES;

验证MySQL安装

1. 验证MySQL版本

bash
# 查看MySQL版本
mysql --version

# 登录MySQL查看详细版本信息
mysql -u root -p -e "SELECT VERSION();"

2. 验证服务状态

bash
# 查看MySQL进程
ps aux | grep mysqld

# 查看MySQL端口
netstat -tlnp | grep 3306

# 或者使用ss命令
ss -tlnp | grep 3306

3. 验证数据库连接

bash
# 使用mysqladmin验证连接
mysqladmin -u root -p ping

# 查看数据库列表
mysql -u root -p -e "SHOW DATABASES;"

4. 运行安全脚本

  • MySQL 5.7及以下

    bash
    # 运行mysql_secure_installation脚本
    /usr/local/mysql/bin/mysql_secure_installation
  • MySQL 8.0

    bash
    # MySQL 8.0可以直接使用SQL命令进行安全配置
    # 主要包括修改密码、删除匿名用户、禁用root远程登录等

防火墙配置

1. 开放MySQL端口

  • CentOS/RHEL 7+

    bash
    # 开放3306端口
    firewall-cmd --permanent --add-port=3306/tcp
    
    # 重新加载防火墙规则
    firewall-cmd --reload
  • Ubuntu/Debian

    bash
    # 开放3306端口
    ufw allow 3306/tcp
    
    # 启用防火墙
    ufw enable
    
    # 查看防火墙状态
    ufw status

2. 配置SELINUX(如果启用)

bash
# 查看SELINUX状态
getenforce

# 如果SELINUX是enforcing状态,需要配置MySQL端口

# 安装SELinux管理工具
yum install -y policycoreutils-python

# 允许MySQL端口
setsebool -P mysqld_connect_any 1

# 或者添加MySQL端口到SELinux策略
semanage port -a -t mysqld_port_t -p tcp 3306

MySQL升级

1. 升级前准备

  • 备份数据:使用mysqldump或物理备份工具备份所有数据库
  • 备份配置文件:备份/etc/my.cnf和其他配置文件
  • 阅读升级文档:查看官方升级指南,了解版本间的兼容性
  • 测试升级:在测试环境中先进行升级测试

2. 二进制包升级步骤

bash
# 1. 停止MySQL服务
systemctl stop mysqld

# 2. 备份当前安装目录
mv /usr/local/mysql /usr/local/mysql_old

# 3. 解压新版本二进制包
tar -xf mysql-8.0.33-linux-glibc2.17-x86_64.tar.xz
mv mysql-8.0.33-linux-glibc2.17-x86_64/* /usr/local/mysql/

# 4. 复制旧版本的配置文件
cp /etc/my.cnf /etc/my.cnf.bak

# 5. 运行升级检查
test -e /usr/local/mysql/bin/mysql_upgrade && echo "mysql_upgrade exists" || echo "mysql_upgrade not found"

# 6. 启动MySQL服务
systemctl start mysqld

# 7. 运行升级脚本(MySQL 5.7及以下)
/usr/local/mysql/bin/mysql_upgrade -u root -p

# 8. 重启MySQL服务
systemctl restart mysqld

3. 升级注意事项

  • 版本跳跃:不建议跨多个主版本升级,如从5.6直接升级到8.0
  • 配置文件兼容性:新版本可能有新的配置参数或废弃旧参数
  • 认证插件:MySQL 8.0默认使用caching_sha2_password,需要注意客户端兼容性
  • 测试应用兼容性:升级后需要测试应用是否能正常连接和运行

常见问题与解决方案

1. 初始化失败:缺少依赖库

  • 问题:初始化时提示缺少libaio或其他依赖库
  • 解决方案
    bash
    # CentOS/RHEL
    yum install -y libaio libnuma-devel
    
    # Ubuntu/Debian
    apt-get install -y libaio1 libnuma1

2. 启动失败:权限问题

  • 问题:启动时提示权限不足
  • 解决方案
    bash
    # 检查目录权限
    chown -R mysql:mysql /data/mysql
    chown -R mysql:mysql /usr/local/mysql
    chown -R mysql:mysql /var/log/mysql

3. 启动失败:配置文件错误

  • 问题:启动时提示配置文件语法错误
  • 解决方案
    bash
    # 检查配置文件语法
    mysqld --defaults-file=/etc/my.cnf --validate-config

4. 无法远程连接

  • 问题:无法从远程主机连接到MySQL
  • 解决方案
    bash
    # 检查防火墙设置
    firewall-cmd --list-ports
    
    # 检查MySQL用户权限
    SELECT user, host FROM mysql.user;
    
    # 确保用户允许远程访问
    CREATE USER 'root'@'%' IDENTIFIED BY 'password';
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
    FLUSH PRIVILEGES;

5. 密码忘记

  • 问题:忘记root密码
  • 解决方案
    bash
    # 1. 停止MySQL服务

systemctl stop mysqld

2. 以跳过授权表模式启动

/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --skip-grant-tables --skip-networking &

3. 无密码登录MySQL

mysql -u root

4. 修改root密码

USE mysql; UPDATE user SET authentication_string='' WHERE User='root'; FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';

5. 重启MySQL服务

/usr/local/mysql/bin/mysqladmin -u root -p shutdown systemctl start mysqld


## 不同MySQL版本的差异

### MySQL 5.7

- **初始化命令**:使用`mysqld --initialize`
- **默认认证插件**:`mysql_native_password`
- **配置文件**:支持旧版配置参数
- **mysql_upgrade**:需要手动运行升级脚本

### MySQL 8.0

- **初始化命令**:相同,但默认认证插件不同
- **默认认证插件**:`caching_sha2_password`
- **配置文件**:废弃了一些旧参数,增加了新参数
- **mysql_upgrade**:从8.0.16开始,升级过程自动运行,无需手动执行
- **数据字典**:使用InnoDB表存储,不再使用.frm文件

## 常见问题(FAQ)

### Q1: 二进制包安装和RPM/DEB包安装有什么区别?

A1: 主要区别:
- **二进制包**:通用,适合多种系统,目录结构可控,升级灵活
- **RPM/DEB包**:针对特定发行版优化,安装简单,依赖管理方便
- **生产环境**:二进制包更适合生产环境,便于版本控制和升级
- **开发环境**:RPM/DEB包更适合开发环境,安装快捷

### Q2: 如何选择MySQL版本?

A2: 版本选择建议:
- 生产环境:选择LTS版本(如8.0.x),稳定性好,支持周期长
- 开发环境:可以使用最新稳定版,体验新特性
- 兼容性:考虑应用程序对MySQL版本的兼容性
- 支持周期:选择仍在官方支持期内的版本

### Q3: 如何优化MySQL配置?

A3: 配置优化建议:
- 根据服务器硬件调整innodb_buffer_pool_size(推荐为物理内存的50%-70%)
- 调整max_connections,避免连接数过多导致性能下降
- 配置innodb_log_file_size,通常为innodb_buffer_pool_size的25%
- 启用innodb_file_per_table,便于管理和维护
- 根据业务特点调整其他参数,如query_cache_size、tmp_table_size等

### Q4: 如何备份MySQL数据?

A4: 备份方法:
- **逻辑备份**:使用mysqldump或mysqlpump备份为SQL文件
- **物理备份**:使用Percona XtraBackup或MySQL Enterprise Backup
- **二进制日志备份**:启用binlog,用于增量备份和point-in-time recovery
- **定期备份**:制定合理的备份计划,包括全量备份和增量备份

### Q5: 如何监控MySQL性能?

A5: 监控方法:
- **内置工具**:使用SHOW STATUS、SHOW PROCESSLIST等命令
- **Performance Schema**:MySQL 5.7+提供的性能监控架构
- **sys Schema**:基于Performance Schema的高级监控视图
- **第三方工具**:如Prometheus+Grafana、Zabbix、Nagios等
- **日志监控**:监控error log、slow query log、binlog等

### Q6: 如何迁移MySQL数据到新服务器?

A6: 迁移方法:
- **逻辑迁移**:使用mysqldump备份,在新服务器上恢复
- **物理迁移**:直接复制数据文件(需要停止MySQL服务)
- **主从复制**:搭建主从架构,实现在线迁移
- **第三方工具**:如Percona XtraBackup、MySQL Shell的dump/load功能

### Q7: 如何确保MySQL的安全性?

A7: 安全建议:
- 使用强密码,定期更换密码
- 限制root用户的远程访问
- 删除匿名用户和测试数据库
- 启用SSL/TLS加密连接
- 定期更新MySQL版本,修复安全漏洞
- 配置适当的防火墙规则
- 启用审计日志,监控数据库活动

### Q8: 如何处理MySQL性能问题?

A8: 性能问题处理步骤:
1. 分析慢查询日志,找出耗时较长的SQL
2. 使用EXPLAIN分析SQL执行计划
3. 优化索引设计,确保SQL使用正确的索引
4. 调整MySQL配置参数,如innodb_buffer_pool_size、max_connections等
5. 检查服务器资源使用情况,如CPU、内存、磁盘IO等
6. 考虑使用读写分离、分库分表等架构优化

## 安装后建议

### 1. 定期更新

- 关注MySQL官方安全公告
- 定期更新到最新的小版本,修复安全漏洞和bug
- 升级前做好充分的测试和备份

### 2. 监控与维护

- 建立完善的监控体系,监控MySQL的性能和状态
- 定期检查慢查询日志,优化SQL语句
- 定期检查和优化表结构,清理碎片
- 定期备份数据,确保数据安全

### 3. 性能优化

- 根据业务负载调整MySQL配置
- 优化索引设计,提高查询性能
- 考虑使用连接池,减少连接开销
- 对于大数据量,考虑分区表或分库分表

### 4. 高可用性设计

- 搭建主从复制架构,实现读写分离
- 配置自动故障转移,如MySQL MHA、MySQL Orchestrator
- 考虑使用MySQL Group Replication或InnoDB Cluster
- 实现异地备份,确保数据的容灾能力

通过以上步骤,可以完成MySQL二进制包的安装、配置和优化,为生产环境提供稳定、高性能的MySQL服务。在实际部署中,应根据服务器硬件、业务需求和安全要求进行适当调整。