1. MySQL 8.0安装前的系统准备
在Linux系统上部署MySQL 8.0前,需要做好以下准备工作:
1.1 系统环境检查
首先确认Linux发行版版本和架构:
cat /etc/os-release uname -mMySQL 8.0支持的主流Linux发行版包括:
- RHEL/CentOS 7及以上
- Ubuntu 18.04及以上
- Debian 9及以上
- SUSE Linux Enterprise Server 12及以上
注意:MySQL 8.0不再支持32位系统,最低要求x86_64或ARM64架构
1.2 依赖包安装
不同发行版需要安装的基础依赖:
| 发行版 | 依赖包 |
|---|---|
| RHEL/CentOS | openssl-devel、libaio、ncurses-devel |
| Ubuntu/Debian | libssl-dev、libaio1、libncurses5 |
| SUSE | libopenssl-devel、libaio1、ncurses-devel |
安装示例(CentOS):
yum install -y openssl-devel libaio ncurses-devel1.3 创建专用用户
为MySQL创建专用用户和组:
groupadd mysql useradd -r -g mysql -s /bin/false mysql2. MySQL 8.0安装方法详解
2.1 官方仓库安装(推荐)
2.1.1 添加MySQL官方仓库
以CentOS 7为例:
rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-6.noarch.rpm2.1.2 安装MySQL服务器
yum install -y mysql-community-server2.2 二进制包安装
2.2.1 下载二进制包
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.33-linux-glibc2.12-x86_64.tar.xz2.2.2 解压并安装
tar xvf mysql-8.0.33-linux-glibc2.12-x86_64.tar.xz -C /usr/local/ ln -s /usr/local/mysql-8.0.33-linux-glibc2.12-x86_64 /usr/local/mysql2.3 源码编译安装
2.3.1 下载源码包
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.33.tar.gz2.3.2 编译配置
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_DATADIR=/var/lib/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_ci3. MySQL 8.0初始化与配置
3.1 数据目录初始化
使用mysqld初始化数据目录:
mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/var/lib/mysql重要:初始化后会生成临时root密码,保存在错误日志中(通常为/var/log/mysqld.log)
3.2 配置文件优化
/etc/my.cnf基础配置示例:
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid # 性能优化参数 innodb_buffer_pool_size=4G innodb_log_file_size=1G max_connections=200 character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci3.3 启动MySQL服务
使用systemd管理服务:
systemctl start mysqld systemctl enable mysqld4. MySQL 8.0安全管理
4.1 修改root密码
首次登录后必须修改root密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPassword!123';4.2 创建应用用户
创建专用应用用户示例:
CREATE USER 'appuser'@'%' IDENTIFIED BY 'AppUserPassword!456'; GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'%'; FLUSH PRIVILEGES;4.3 安全加固措施
建议执行的安全操作:
- 运行mysql_secure_installation脚本
- 移除匿名用户
- 禁止root远程登录
- 移除test数据库
5. MySQL 8.0日常管理
5.1 备份与恢复
5.1.1 mysqldump备份
mysqldump -u root -p --all-databases > full_backup.sql5.1.2 二进制日志备份
FLUSH BINARY LOGS; PURGE BINARY LOGS BEFORE '2023-06-01 00:00:00';5.2 性能监控
常用监控命令:
SHOW STATUS LIKE 'Threads_connected'; SHOW ENGINE INNODB STATUS; SELECT * FROM sys.schema_table_statistics;5.3 用户与权限管理
查看用户权限:
SELECT * FROM mysql.user; SHOW GRANTS FOR 'appuser'@'%';6. MySQL 8.0新特性实践
6.1 窗口函数应用
使用窗口函数计算排名:
SELECT employee_name, salary, RANK() OVER (ORDER BY salary DESC) as salary_rank FROM employees;6.2 JSON功能增强
JSON数据操作示例:
CREATE TABLE products ( id INT PRIMARY KEY, details JSON ); INSERT INTO products VALUES (1, '{"name": "Laptop", "specs": {"cpu": "i7", "ram": "16GB"}}');6.3 角色管理
创建和使用角色:
CREATE ROLE read_only; GRANT SELECT ON *.* TO read_only; GRANT read_only TO 'appuser'@'%';7. 常见问题排查
7.1 启动失败排查
检查错误日志:
tail -n 50 /var/log/mysqld.log常见错误:
- 端口冲突(默认3306)
- 数据目录权限问题
- 内存不足
7.2 连接问题处理
检查连接数限制:
SHOW VARIABLES LIKE 'max_connections';临时增加连接数:
SET GLOBAL max_connections = 300;7.3 性能问题分析
使用EXPLAIN分析查询:
EXPLAIN ANALYZE SELECT * FROM large_table WHERE id = 1000;慢查询日志配置:
slow_query_log=1 slow_query_log_file=/var/log/mysql-slow.log long_query_time=28. 升级与迁移策略
8.1 从MySQL 5.7升级到8.0
升级前检查:
mysqlcheck -u root -p --all-databases --check-upgrade升级步骤:
- 备份所有数据
- 停止MySQL 5.7服务
- 安装MySQL 8.0
- 运行mysql_upgrade
8.2 数据迁移方法
使用mysqldump迁移:
mysqldump -u root -p --all-databases | mysql -u root -p -h new_server使用MySQL Shell并行迁移:
util.dumpInstance("/backup/mysql", {threads: 8})9. 高可用方案部署
9.1 主从复制配置
主库配置:
[mysqld] server-id=1 log-bin=mysql-bin binlog-format=ROW从库配置:
CHANGE MASTER TO MASTER_HOST='master_host', MASTER_USER='repl_user', MASTER_PASSWORD='repl_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154;9.2 组复制部署
初始化组复制:
SET GLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=OFF;10. 性能优化实践
10.1 索引优化
添加合适索引:
ALTER TABLE orders ADD INDEX idx_customer_date (customer_id, order_date);检查索引使用:
SELECT * FROM sys.schema_unused_indexes;10.2 查询优化
重写低效查询:
-- 优化前 SELECT * FROM orders WHERE DATE(order_date) = '2023-01-01'; -- 优化后 SELECT * FROM orders WHERE order_date >= '2023-01-01' AND order_date < '2023-01-02';10.3 配置参数调优
关键参数调整:
innodb_buffer_pool_size=12G # 总内存的50-70% innodb_buffer_pool_instances=8 innodb_io_capacity=2000 innodb_io_capacity_max=400011. 监控与维护
11.1 监控工具部署
Prometheus + Grafana监控方案:
- 部署mysqld_exporter
- 配置Prometheus抓取
- 导入MySQL仪表板到Grafana
11.2 定期维护任务
建议的维护计划:
- 每周优化表
- 每月分析表统计信息
- 每季度检查磁盘碎片
自动化维护脚本示例:
mysqlcheck -u root -p --auto-repair --optimize --all-databases12. 容器化部署方案
12.1 Docker部署MySQL
运行MySQL容器:
docker run --name mysql8 \ -e MYSQL_ROOT_PASSWORD=my-secret-pw \ -v /my/own/datadir:/var/lib/mysql \ -p 3306:3306 \ -d mysql:8.012.2 Kubernetes部署
MySQL StatefulSet示例:
apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql spec: serviceName: mysql replicas: 1 selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: mysql:8.0 env: - name: MYSQL_ROOT_PASSWORD value: "password" ports: - containerPort: 3306 volumeMounts: - name: mysql-persistent-storage mountPath: /var/lib/mysql volumeClaimTemplates: - metadata: name: mysql-persistent-storage spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 20Gi13. 安全审计与合规
13.1 审计日志配置
启用审计插件:
plugin-load=audit_log.so audit_log_format=JSON audit_log_policy=ALL13.2 合规检查
执行MySQL安全检查:
mysql_secure_installation使用mysql_upgrade检查兼容性:
mysql_upgrade -u root -p14. 故障恢复策略
14.1 数据恢复流程
从备份恢复步骤:
- 停止MySQL服务
- 清理数据目录
- 恢复备份文件
- 启动MySQL服务
- 应用二进制日志(如有)
14.2 崩溃恢复测试
定期测试恢复流程:
# 创建测试数据库 mysql -u root -p -e "CREATE DATABASE recovery_test" # 模拟备份和恢复流程 mysqldump -u root -p recovery_test > recovery_test.sql mysql -u root -p -e "DROP DATABASE recovery_test" mysql -u root -p < recovery_test.sql15. 最佳实践总结
15.1 配置规范
建议的配置原则:
- 为生产环境设置合适的缓冲池大小
- 启用二进制日志用于时间点恢复
- 配置合理的连接超时和连接数限制
15.2 运维建议
日常运维要点:
- 定期监控磁盘空间使用
- 设置自动备份策略
- 保持MySQL版本更新
- 定期检查错误日志
15.3 性能优化经验
实测有效的优化技巧:
- 为频繁查询的列添加合适索引
- 避免使用SELECT * 查询
- 合理使用连接池
- 对大表进行分区处理