外观
MySQL 二进制包安装指南
安装前准备
1. 检查系统环境
检查操作系统版本:
bash# CentOS/RHEL cat /etc/redhat-release # Ubuntu/Debian lsb_release -a检查CPU和内存:
bash# 检查CPU核心数 nproc # 检查内存大小 free -h检查磁盘空间:
bashdf -h
2. 安装依赖库
CentOS/RHEL:
bashyum install -y libaio libnuma-devel numactl libncurses5 wgetUbuntu/Debian:
bashapt-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 mysql4. 准备安装目录
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 --version3. 初始化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: XXXXXXXXMySQL 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
EOF2. 配置文件说明
- 基础配置:basedir、datadir、socket、port等基本路径和端口配置
- 字符集配置:设置默认字符集为utf8mb4,支持emoji表情
- 安全配置:设置默认认证插件,MySQL 8.0默认使用caching_sha2_password
- 性能配置:根据服务器配置调整innodb_buffer_pool_size、max_connections等参数
启动MySQL服务
1. 创建系统服务文件
CentOS 7+/RHEL 7+:
bashcat > /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 EOFUbuntu 16.04+/Debian 9+:
bashcat > /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 mysqld3. 手动启动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 33063. 验证数据库连接
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_installationMySQL 8.0:
bash# MySQL 8.0可以直接使用SQL命令进行安全配置 # 主要包括修改密码、删除匿名用户、禁用root远程登录等
防火墙配置
1. 开放MySQL端口
CentOS/RHEL 7+:
bash# 开放3306端口 firewall-cmd --permanent --add-port=3306/tcp # 重新加载防火墙规则 firewall-cmd --reloadUbuntu/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 3306MySQL升级
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 mysqld3. 升级注意事项
- 版本跳跃:不建议跨多个主版本升级,如从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服务。在实际部署中,应根据服务器硬件、业务需求和安全要求进行适当调整。