1. MySQL安装部署概述
MySQL作为最流行的开源关系型数据库之一,其安装部署方式直接影响后续的运维效率和系统稳定性。在实际生产环境中,我们通常会遇到两种典型的部署需求:单实例部署和多实例部署。单实例部署适合中小型业务场景,具有配置简单、资源占用少的特点;而多实例部署则能在单台服务器上实现资源隔离,满足不同业务线的数据库需求,提高硬件利用率。
我管理过多个从零开始的MySQL数据库环境,发现很多团队在初期往往会忽视部署方案的选择,导致后期扩容时面临各种兼容性问题。比如有个电商项目,初期使用单实例部署,后来随着业务增长不得不改为多实例,结果因为配置文件混杂导致频繁出现连接冲突。这让我深刻认识到:部署方案的选择不是简单的技术决策,而是需要结合业务发展规划来制定的架构设计。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 单实例MySQL部署详解
2.1 环境准备与依赖安装
在CentOS 7系统上部署MySQL 5.7时,我习惯先进行系统环境检查。执行cat /etc/redhat-release确认系统版本,运行free -h和df -h查看内存和磁盘空间。建议生产环境至少配置4GB内存和50GB存储空间。
安装依赖包是关键步骤,很多人会漏掉开发工具组:
bash复制yum groupinstall "Development Tools" -y
yum install -y cmake ncurses-devel openssl-devel bison
对于MySQL 5.7,需要特别注意openssl版本兼容性问题。有次在客户现场遇到安装失败,就是因为系统自带的openssl版本过低。解决方案是:
bash复制yum update openssl -y
2.2 二进制包安装实战
从官网下载合适的二进制包后,我习惯将其解压到/usr/local目录:
bash复制tar -zxvf mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
cd /usr/local && ln -s mysql-5.7.38-linux-glibc2.12-x86_64 mysql
创建mysql用户和组时,务必指定非登录shell:
bash复制groupadd mysql
useradd -r -g mysql -s /bin/false mysql
初始化数据库阶段有个关键细节——临时密码获取。执行以下命令后,务必记录最后一行显示的root密码:
bash复制bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
重要提示:如果初始化时出现"error while loading shared libraries"报错,通常是因为libaio库缺失,执行
yum install libaio -y即可解决。
2.3 配置文件优化技巧
my.cnf配置直接影响数据库性能。我总结了几条黄金法则:
- innodb_buffer_pool_size设置为物理内存的50-70%
- 设置innodb_flush_log_at_trx_commit=2可以提升写入性能(但会降低数据安全性)
- 将log-bin和server-id配置放在不同实例的独立配置文件中
一个经过生产验证的基础配置示例:
ini复制[mysqld]
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
symbolic-links=0
innodb_buffer_pool_size=4G
innodb_log_file_size=1G
max_connections=500
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
3. MySQL多实例部署方案
3.1 多实例架构设计
多实例部署的核心在于资源隔离。我通常采用两种方案:
- 端口区分方案:不同实例使用不同端口(如3306,3307)
- 容器化方案:使用Docker容器隔离各实例
端口方案的目录结构示例:
code复制/mysql_data/
├── instance1
│ ├── data
│ ├── my.cnf
│ └── logs
└── instance2
├── data
├── my.cnf
└── logs
3.2 多实例部署步骤
- 为每个实例创建独立目录:
bash复制mkdir -p /mysql_data/instance{1,2}/{data,logs}
- 准备差异化的配置文件。关键参数包括:
- port
- socket
- pid-file
- datadir
- log-bin
- server-id
实例1的my.cnf示例:
ini复制[mysqld]
port=3307
socket=/tmp/mysql3307.sock
pid-file=/mysql_data/instance1/mysql.pid
datadir=/mysql_data/instance1/data
log-bin=/mysql_data/instance1/logs/mysql-bin
server-id=1
- 初始化各实例数据目录:
bash复制mysqld --initialize-insecure --user=mysql \
--datadir=/mysql_data/instance1/data \
--basedir=/usr/local/mysql
3.3 多实例管理技巧
使用mysqld_multi工具可以简化管理:
ini复制[mysqld_multi]
mysqld=/usr/local/mysql/bin/mysqld_safe
mysqladmin=/usr/local/mysql/bin/mysqladmin
user=multi_admin
password=multipass
[mysqld1]
port=3307
# 其他参数...
[mysqld2]
port=3308
# 其他参数...
启动指定实例:
bash复制mysqld_multi start 1
4. 关键问题排查指南
4.1 端口冲突问题
错误现象:
code复制Can't start server: Bind on TCP/IP port: Address already in use
解决方案:
- 检查端口占用:
netstat -tulnp | grep 3306 - 修改冲突实例的端口号
- 重启MySQL服务
4.2 权限问题处理
常见报错:
code复制MySQL ERROR 1045 (28000): Access denied for user...
处理步骤:
- 在my.cnf的[mysqld]段添加
skip-grant-tables - 重启MySQL服务
- 无密码登录后重置密码:
sql复制UPDATE mysql.user SET authentication_string=PASSWORD('newpass') WHERE User='root';
FLUSH PRIVILEGES;
4.3 数据目录权限问题
错误日志提示:
code复制Can't create/write to file '/mysql_data/instance1/data/ibdata1'
解决方法:
bash复制chown -R mysql:mysql /mysql_data/instance1/data
chmod 750 /mysql_data/instance1/data
5. 性能监控与优化建议
5.1 基础监控指标
我习惯部署以下监控项:
- QPS/TPS监控:
sql复制SHOW GLOBAL STATUS LIKE 'Questions';
SHOW GLOBAL STATUS LIKE 'Com_commit';
- 连接数监控:
sql复制SHOW STATUS LIKE 'Threads_connected';
- 缓冲池命中率:
sql复制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;
5.2 多实例资源分配原则
根据我的经验,多实例资源分配应遵循:
- 内存分配公式:
code复制总内存 = (innodb_buffer_pool_size + 其他内存消耗) × 实例数 + 系统保留内存
- 磁盘IO优化:
- 为每个实例的数据目录分配独立的物理磁盘
- 使用ionice调整IO优先级:
bash复制ionice -c2 -n7 -p $(cat /mysql_data/instance1/mysql.pid)
- CPU绑定技术:
bash复制taskset -cp 0,1 $(cat /mysql_data/instance1/mysql.pid)
6. 备份恢复策略
6.1 单实例备份方案
我常用的物理备份命令:
bash复制innobackupex --user=root --password=xxx --socket=/tmp/mysql.sock \
--no-timestamp /backup/full_$(date +%Y%m%d)
增量备份技巧:
bash复制innobackupex --incremental /backup/incr_$(date +%Y%m%d) \
--incremental-basedir=/backup/full_20230501 \
--user=root --password=xxx
6.2 多实例备份注意事项
- 为每个实例配置独立的备份目录
- 错开备份时间避免IO瓶颈
- 使用并行备份工具提高效率:
bash复制mydumper -u root -p xxx -P 3307 -o /backup/instance1
mydumper -u root -p xxx -P 3308 -o /backup/instance2
7. 安全加固措施
7.1 基础安全配置
- 删除测试数据库:
sql复制DROP DATABASE test;
DELETE FROM mysql.user WHERE User='';
- 修改root用户名:
sql复制RENAME USER root@'localhost' TO dba_admin@'localhost';
- 启用审计插件:
ini复制plugin-load=audit_log.so
audit_log_format=JSON
audit_log_file=/var/log/mysql_audit.log
7.2 多实例网络隔离
我通常采用的网络方案:
- 不同实例绑定不同IP地址
- 使用iptables限制访问来源:
bash复制iptables -A INPUT -p tcp --dport 3307 -s 192.168.1.100 -j ACCEPT
iptables -A INPUT -p tcp --dport 3307 -j DROP
- 为每个实例配置独立的SSL证书:
bash复制openssl req -x509 -newkey rsa:4096 -keyout instance1-key.pem \
-out instance1-cert.pem -days 365 -nodes
