一、MySQL部署方案
1. 安装方式选择
Linux系统推荐安装方式:
官方二进制包安装**(推荐):
# 下载(以MySQL 8.0为例)
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.xx-linux-glibc2.12-x86_64.tar.xz
# 解压并安装
tar -xvf mysql-8.0.xx-linux-glibc2.12-x86_64.tar.xz
mv mysql-8.0.xx-linux-glibc2.12-x86_64 /usr/local/mysql
# 初始化
cd /usr/local/mysql
bin/mysqld --initialize --user=mysql
bin/mysql_ssl_rsa_setup
YUM/APT仓库安装:
# CentOS/RHEL
sudo yum install mysql-server
# Ubuntu/Debian
sudo apt install mysql-server
2. 目录结构规划
推荐生产环境目录结构:
/data/mysql/ # MySQL根目录
├── data/ # 数据文件目录
├── logs/ # 日志目录
│ ├── error.log # 错误日志
│ ├── slow.log # 慢查询日志
│ └── binlog/ # 二进制日志
├── tmp/ # 临时文件
└── conf/ # 配置文件目录
└── my.cnf # 主配置文件
二、核心配置参数优化
1. 内存相关参数
# 缓冲池大小(通常为物理内存的50-70%)
innodb_buffer_pool_size = 12G# 缓冲池实例数(建议每1GB缓冲池配1个实例)
innodb_buffer_pool_instances = 12# 日志缓冲区大小
innodb_log_buffer_size = 64M# 排序缓冲区
sort_buffer_size = 4M
join_buffer_size = 4M
read_buffer_size = 4M
read_rnd_buffer_size = 8M
2. I/O相关参数
# 日志文件大小和数量(每个建议256M-2G)
innodb_log_file_size = 1G
innodb_log_files_in_group = 3# I/O线程数
innodb_read_io_threads = 8
innodb_write_io_threads = 8# 刷盘策略(平衡性能与安全)
innodb_flush_method = O_DIRECT
innodb_flush_neighbors = 1
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000
3. 连接与会话参数
# 最大连接数(根据应用需求调整)
max_connections = 500# 连接超时设置
wait_timeout = 300
interactive_timeout = 300# 临时表设置
tmp_table_size = 64M
max_heap_table_size = 64M
4. 复制参数(主从配置)
# 主库配置
server-id = 1
log_bin = /data/mysql/logs/binlog/mysql-bin
binlog_format = ROW
binlog_row_image = FULL
sync_binlog = 1
expire_logs_days = 7# 从库配置
server-id = 2
relay_log = /data/mysql/logs/relaylog/relay-bin
log_slave_updates = 1
read_only = 1
三、性能优化技巧
1. 索引优化原则
- 遵循最左前缀原则
- 避免过度索引(每个表索引不超过5-6个)
- 使用覆盖索引减少回表
- 定期分析慢查询优化索引
2. 查询优化建议
- 避免SELECT *,只查询需要的列
- 使用EXPLAIN分析查询执行计划
- 合理使用JOIN,确保关联字段有索引
- 大数据量查询使用分页(LIMIT配合WHERE条件)
3. 表结构设计
- 使用合适的数据类型(如INT代替VARCHAR存储数字)
- 大字段(如TEXT/BLOB)分离到单独表
- 遵循范式但适当反范式化提高查询性能
四、常见问题解决方案
1. 连接数过多
-- 查看当前连接
SHOW PROCESSLIST;
-- 临时增加连接数
SET GLOBAL max_connections = 1000;
-- 长期解决方案
1. 优化应用连接池配置
2. 实现连接复用
3. 检查是否有连接泄漏
2. 主从复制延迟
排查方法:
SHOW SLAVE STATUS\G
解决方案:
- 增加从库服务器资源
- 调整以下参数:
slave_parallel_workers = 8
slave_parallel_type = LOGICAL_CLOCK
- 考虑使用GTID复制
- 对大事务进行拆分
3. 磁盘空间不足
常见原因:
- 二进制日志过多
- 大表未分区
- 临时文件过多清理方案:
-- 清理二进制日志
PURGE BINARY LOGS BEFORE '2023-01-01 00:00:00';
-- 优化表空间
OPTIMIZE TABLE large_table;
-- 清理旧数据(按条件删除)
DELETE FROM log_table WHERE create_time < DATE_SUB(NOW(), INTERVAL 90 DAY);
4. 性能突然下降
排查步骤:
1. 检查MySQL错误日志
2. 查看当前运行进程:
SHOW FULL PROCESSLIST;
3. 检查锁情况:
SELECT * FROM performance_schema.events_waits_current;
4. 检查系统资源(CPU、内存、磁盘I/O)
常见原因:
- 锁竞争激烈
- 磁盘I/O瓶颈
- 内存不足导致频繁交换
- 长时间运行的事务
五、监控与维护
1. 关键监控指标
- QPS/TPS:查询/事务吞吐量
- 连接数:Threads_connected
- 缓存命中率:
SELECT (1 - (SELECT variable_value FROM performance_schema.global_status WHERE variable_name = 'Innodb_buffer_pool_reads') /
(SELECT variable_value FROM performance_schema.global_status WHERE variable_name = 'Innodb_buffer_pool_read_requests')) * 100
AS buffer_pool_hit_ratio;
- 复制延迟:Seconds_Behind_Master
2. 定期维护任务
1. 每日检查:
- 错误日志监控
- 磁盘空间检查
- 备份验证
2. 每周维护:
- 慢查询分析优化
- 索引碎片整理
ANALYZE TABLE important_table;
3. **每月维护**:
- 统计信息更新
- 配置参数复审
- 版本升级评估
六、备份与恢复策略
1. 备份方案
物理备份(推荐生产环境使用):
# 使用Percona XtraBackup
xtrabackup --backup --target-dir=/backups/mysql/full --user=backup --password=xxx
逻辑备份:
# 全库备份
mysqldump -uroot -p --single-transaction --master-data=2 --routines --triggers --events --all-databases > full_backup.sql
# 单表备份
mysqldump -uroot -p db_name table_name > table_backup.sql
2. 恢复测试
# 物理备份恢复
xtrabackup --copy-back --target-dir=/backups/mysql/full
# 逻辑备份恢复
mysql -uroot -p < full_backup.sql
3. 备份策略建议
- 全量备份 + 增量备份组合
- 备份文件异地存储
- 定期恢复测试验证备份有效性
- 重要数据考虑多副本存储
七、安全配置建议
1. 基础安全措施:
-- 删除匿名账户
DROP USER ''@'localhost';
-- 修改root用户名
RENAME USER 'root'@'localhost' TO 'admin'@'localhost';
-- 最小权限原则
GRANT SELECT, INSERT, UPDATE ON db_name.* TO 'app_user'@'192.168.1.%';
2. 网络安全:
- 限制MySQL端口(3306)访问IP
- 考虑使用SSL连接
- 避免公网直接暴露数据库
3. 审计日志:
-- 删除匿名账户
DROP USER ''@'localhost';
-- 修改root用户名
RENAME USER 'root'@'localhost' TO 'admin'@'localhost';
-- 最小权限原则
GRANT SELECT, INSERT, UPDATE ON db_name.* TO 'app_user'@'192.168.1.%';