Linux下MySQL 5.7安装配置与优化全指南
1. Linux环境下MySQL 5.7安装前的系统准备
在开始安装MySQL 5.7之前,我们需要对Linux系统进行必要的准备工作。我通常会选择CentOS 7或Ubuntu 18.04 LTS作为基础系统,这两个版本与MySQL 5.7的兼容性经过长期验证,稳定性有保障。
1.1 系统资源检查
首先检查系统资源是否满足MySQL运行需求:
# 查看内存 free -h # 查看磁盘空间 df -h # 查看CPU信息 lscpu建议生产环境至少配置:
- 内存:4GB以上(MySQL 5.7默认会占用约512MB内存)
- 磁盘:50GB以上可用空间(考虑数据增长)
- CPU:2核以上
注意:如果是在虚拟机环境测试,建议分配至少2GB内存,否则可能遇到性能问题。
1.2 关闭SELinux和防火墙
MySQL需要特定端口通信,建议临时关闭防火墙或配置放行规则:
# CentOS 7 systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config # Ubuntu ufw disable1.3 创建专用用户和组
为MySQL创建专用用户是个好习惯:
groupadd mysql useradd -r -g mysql -s /bin/false mysql2. MySQL 5.7的多种安装方式对比
2.1 官方YUM/APT仓库安装(推荐)
这是最便捷的安装方式,会自动处理依赖关系:
# CentOS/RHEL wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm rpm -ivh mysql57-community-release-el7-11.noarch.rpm yum install mysql-community-server # Ubuntu/Debian wget https://dev.mysql.com/get/mysql-apt-config_0.8.12-1_all.deb dpkg -i mysql-apt-config_0.8.12-1_all.deb apt-get update apt-get install mysql-server2.2 二进制包安装
适合需要自定义安装路径的场景:
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz tar -zxvf mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz -C /usr/local/ mv /usr/local/mysql-5.7.37-linux-glibc2.12-x86_64 /usr/local/mysql2.3 源码编译安装
仅推荐给需要深度定制的高级用户:
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.37.tar.gz tar -zxvf mysql-5.7.37.tar.gz cd mysql-5.7.37 cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_DATADIR=/data/mysql \ -DWITH_BOOST=boost \ -DSYSCONFDIR=/etc \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_PARTITION_STORAGE_ENGINE=1 \ -DWITH_FEDERATED_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITH_MYISAM_STORAGE_ENGINE=1 \ -DENABLED_LOCAL_INFILE=1 \ -DENABLE_DTRACE=0 \ -DDEFAULT_CHARSET=utf8mb4 \ -DDEFAULT_COLLATION=utf8mb4_general_ci \ -DWITH_EMBEDDED_SERVER=1 make && make install3. MySQL 5.7的初始化与安全配置
3.1 数据库初始化
对于YUM/APT安装方式:
mysqld --initialize --user=mysql对于二进制包安装:
cd /usr/local/mysql bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data重要:初始化过程会生成临时root密码,务必记录在安全位置:
grep 'temporary password' /var/log/mysqld.log3.2 启动MySQL服务
# CentOS/RHEL systemctl start mysqld systemctl enable mysqld # Ubuntu/Debian systemctl start mysql systemctl enable mysql3.3 运行安全配置向导
mysql_secure_installation按照提示完成以下安全设置:
- 修改root密码(需满足密码强度要求)
- 移除匿名用户
- 禁止root远程登录
- 移除测试数据库
- 重新加载权限表
4. MySQL 5.7的核心配置优化
4.1 配置文件详解
编辑/etc/my.cnf(或/etc/mysql/my.cnf),添加以下关键参数:
[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 # 字符集配置 character-set-server=utf8mb4 collation-server=utf8mb4_general_ci # 连接配置 max_connections=1000 wait_timeout=300 interactive_timeout=300 # 缓冲池配置(建议为物理内存的50-70%) innodb_buffer_pool_size=4G innodb_buffer_pool_instances=4 # 日志配置 slow_query_log=1 slow_query_log_file=/var/log/mysql-slow.log long_query_time=2 log_queries_not_using_indexes=1 # 其他性能优化 innodb_flush_log_at_trx_commit=1 sync_binlog=1 innodb_file_per_table=1 innodb_log_file_size=512M innodb_log_buffer_size=32M4.2 配置生效与验证
systemctl restart mysqld mysql -uroot -p -e "SHOW VARIABLES LIKE '%buffer_pool%';"5. MySQL 5.7的日常管理与维护
5.1 用户权限管理
创建新用户并授权:
CREATE USER 'appuser'@'%' IDENTIFIED BY 'Complex@Password123'; GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'appuser'@'%'; FLUSH PRIVILEGES;查看用户权限:
SHOW GRANTS FOR 'appuser'@'%';5.2 数据库备份与恢复
使用mysqldump进行逻辑备份:
# 全库备份 mysqldump -uroot -p --all-databases --single-transaction --master-data=2 --flush-logs > full_backup.sql # 单库备份 mysqldump -uroot -p appdb > appdb_backup.sql # 恢复数据库 mysql -uroot -p < full_backup.sql5.3 性能监控与优化
常用监控命令:
-- 查看当前连接 SHOW PROCESSLIST; -- 查看引擎状态 SHOW ENGINE INNODB STATUS; -- 查看表状态 SHOW TABLE STATUS LIKE 'apptable'; -- 查看索引使用情况 SELECT * FROM sys.schema_index_statistics;6. 常见问题排查与解决方案
6.1 启动失败排查
检查错误日志:
tail -100 /var/log/mysqld.log常见错误及解决:
- 端口冲突:确保3306端口未被占用
- 权限问题:确保/var/lib/mysql目录属主为mysql
- 内存不足:调整innodb_buffer_pool_size
6.2 忘记root密码
重置root密码步骤:
systemctl stop mysqld mysqld_safe --skip-grant-tables & mysql -uroot在MySQL客户端执行:
UPDATE mysql.user SET authentication_string=PASSWORD('newpassword') WHERE User='root'; FLUSH PRIVILEGES; exit;然后重启MySQL服务。
6.3 字符集问题处理
查看当前字符集设置:
SHOW VARIABLES LIKE 'character%'; SHOW VARIABLES LIKE 'collation%';修改已有表的字符集:
ALTER TABLE apptable CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;7. MySQL 5.7的高级配置技巧
7.1 主从复制配置
主库配置(/etc/my.cnf):
[mysqld] server-id=1 log-bin=mysql-bin binlog-format=ROW binlog-row-image=FULL从库配置:
[mysqld] server-id=2 relay-log=mysql-relay-bin read-only=1设置复制流程:
-- 在主库创建复制用户 CREATE USER 'repl'@'%' IDENTIFIED BY 'Repl@Password123'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; -- 在从库配置复制 CHANGE MASTER TO MASTER_HOST='master_ip', MASTER_USER='repl', MASTER_PASSWORD='Repl@Password123', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154; START SLAVE;7.2 性能优化建议
- 定期优化表:
OPTIMIZE TABLE apptable;使用pt-index-usage分析索引使用情况
配置监控工具如Percona PMM
定期检查慢查询日志并优化SQL
8. 安全加固措施
8.1 网络安全配置
- 限制访问IP:
GRANT ALL ON *.* TO 'appuser'@'192.168.1.%';- 修改默认端口:
[mysqld] port=3307- 启用SSL连接:
mysql_ssl_rsa_setup --datadir=/var/lib/mysql8.2 审计日志配置
安装审计插件:
INSTALL PLUGIN audit_log SONAME 'audit_log.so';配置审计参数:
[mysqld] plugin-load=audit_log.so audit_log_format=JSON audit_log_file=/var/log/mysql-audit.log audit_log_policy=ALL9. 升级与迁移策略
9.1 从MySQL 5.6升级到5.7
推荐步骤:
- 备份所有数据库
- 停止MySQL服务
- 安装MySQL 5.7 RPM/DEB包
- 启动MySQL服务
- 运行mysql_upgrade
- 重启MySQL服务
9.2 迁移到MySQL 8.0的注意事项
- 字符集变化:默认从latin1变为utf8mb4
- 密码插件变化:默认使用caching_sha2_password
- 保留字增加:如"rank"成为保留字
- 建议先在测试环境验证兼容性
10. 实用工具推荐
- Percona Toolkit:高级管理工具集
- MySQL Workbench:图形化管理工具
- mydumper/myloader:并行备份恢复工具
- pt-query-digest:慢查询分析工具
- ProxySQL:高性能代理中间件
安装Percona Toolkit示例:
# CentOS/RHEL yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm yum install percona-toolkit # Ubuntu/Debian apt-get install percona-toolkit在实际生产环境中,我发现合理配置innodb_buffer_pool_size对性能影响最大。对于内存充足的服务器,建议设置为物理内存的70%左右,但要注意给操作系统和其他应用留出足够内存。另外,定期检查慢查询日志并优化相关SQL语句,往往能解决大部分性能问题。
