深入解析 CentOS 7 上 MySQL 8.0 的最佳实践20241112

深入解析 CentOS 7 上 MySQL 8.0 的最佳实践

随着现代数据库应用需求的快速增长,MySQL 8.0 成为许多企业和开发者的首选数据库管理系统。其性能改进、增强的安全特性以及强大的兼容性,使其在现代架构中占据重要地位。本篇博客将基于实践经验,深入解析如何在 CentOS 7 上高效地安装、配置和优化 MySQL 8.0,并附带完整的脚本化流程和常见问题的解决方案。

为什么选择 MySQL 8.0?

在开始操作之前,让我们简要了解为何选择 MySQL 8.0:

  • 性能提升:相比 MySQL 5.x,8.0 提供了更高效的查询优化器和更好的并发处理能力。
  • 增强的 JSON 支持:简化了 NoSQL 风格的数据存储。
  • 安全性改进:默认使用 caching_sha2_password 提升了安全性,内置密码策略更严格。
  • 开发者友好:支持窗口函数、CTE(公共表表达式)和事务支持的 DDL。

安装与配置:从入门到精通

1. 系统准备

首先,更新系统并安装必要的工具:

bash 复制代码
sudo yum update -y
sudo yum install -y epel-release
sudo yum groupinstall -y 'Development Tools'
  • 最佳实践提示:始终保持系统更新,并确保开发工具组安装完备以便后续依赖处理。

2. 添加 MySQL 8.0 仓库

通过官方仓库获取最新的 MySQL 版本:

bash 复制代码
sudo yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
sudo yum clean all
sudo yum makecache
常见问题:
  • 如果遇到 GPG 签名验证失败,请执行以下命令导入密钥:
bash 复制代码
sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023

3. 安装 MySQL 8.0

安装并启动 MySQL:

bash 复制代码
sudo yum install -y mysql-community-server
sudo systemctl start mysqld
sudo systemctl enable mysqld

获取安装时生成的临时密码:

bash 复制代码
sudo grep 'temporary password' /var/log/mysqld.log

注意:确保记录此密码,用于后续初次登录。

4. 配置 MySQL 安全性

运行 mysql_secure_installation 进行安全配置:

bash 复制代码
sudo mysql_secure_installation

安全优化建议:

  • 删除匿名用户:防止未授权访问。
  • 禁用 root 远程登录:限制高权限用户的风险。
  • 删除测试数据库:清除不必要的默认资源。

5. 创建用户与权限管理

创建新用户并授予权限:

sql 复制代码
CREATE USER 'mysqluser'@'%' IDENTIFIED BY 'StrongPassword@123';
GRANT ALL PRIVILEGES ON *.* TO 'mysqluser'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

兼容性设置:为支持旧客户端,将认证插件更改为 mysql_native_password:

sql 复制代码
ALTER USER 'mysqluser'@'%' IDENTIFIED WITH mysql_native_password BY 'StrongPassword@123';

6. 配置远程访问

编辑 /etc/my.cnf,添加以下内容:

bash 复制代码
[mysqld]
port=3306
bind-address=0.0.0.0

重启服务并开放防火墙端口:

bash 复制代码
sudo systemctl restart mysqld
sudo firewall-cmd --permanent --zone=public --add-port=3306/tcp
sudo firewall-cmd --reload

SELinux 注意事项:

  • 如果 SELinux 启用,确保开放 MySQL 端口:
bash 复制代码
sudo semanage port -a -t mysqld_port_t -p tcp 3306

生产环境优化建议

1. 优化 MySQL 配置

根据服务器的资源分配,优化以下参数:

ini 复制代码
[mysqld]
max_connections = 200
innodb_buffer_pool_size = 2G
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
slow_query_log = 1

最佳实践:通过分析查询性能(EXPLAIN 和 slow query log),持续优化数据库结构。

2. 定期备份

使用 mysqldump 创建自动备份脚本:

bash 复制代码
mysqldump -u root -p --all-databases > /backup/mysql_$(date +%F).sql
  • 增强方案:在大规模部署中,推荐使用 Percona XtraBackup 提高备份效率。

3. 监控与日志分析

启用查询日志并定期分析:

sql 复制代码
SET GLOBAL general_log = 'ON';
SET GLOBAL log_output = 'FILE';

结合 Prometheus 和 Grafana 实现实时监控,可快速发现性能瓶颈。

常见问题与解决方案

1. 登录失败:旧客户端不支持

修改用户认证插件:

sql 复制代码
ALTER USER 'mysqluser'@'%' IDENTIFIED WITH mysql_native_password BY 'StrongPassword@123';

2. 防火墙阻止连接

确认端口是否被正确开放:

bash 复制代码
sudo firewall-cmd --list-ports
sudo ss -tuln | grep 3306

3. 忘记 root 密码

通过跳过授权表重置密码:

bash 复制代码
sudo systemctl stop mysqld
sudo mysqld --skip-grant-tables &
mysql -u root
sql 复制代码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword@123';

自动化脚本:从零到完成

以下脚本可一键完成上述配置:

bash 复制代码
#!/bin/bash

sudo yum update -y
sudo yum install -y epel-release
sudo yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
sudo yum install -y mysql-community-server
sudo systemctl start mysqld
sudo systemctl enable mysqld

TEMP_PASSWORD=$(sudo grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}')
echo "Temporary MySQL root password: $TEMP_PASSWORD"

sudo mysql_secure_installation

sudo firewall-cmd --permanent --zone=public --add-port=3306/tcp
sudo firewall-cmd --reload

echo "MySQL 安装和配置完成!"

为远程用户 remote_user 开通访问权限

为了让外部应用或开发者能够远程访问 MySQL 数据库,需要配置一个远程用户,并确保其拥有访问权限和必要的网络配置支持。以下是完整的配置流程:

1. 创建远程用户

登录 MySQL 后,执行以下命令创建一个远程用户:

sql 复制代码
CREATE USER 'remote_user'@'%' IDENTIFIED BY 'StrongPassword@123';

说明:

  • remote_user 是远程用户的用户名,可以根据需要修改。
  • % 允许从任意 IP 地址连接。如果希望限制为特定 IP,例如 192.168.1.100,可将 % 替换为具体的 IP 地址。
  • StrongPassword@123 是远程用户的密码,建议设置为强密码,包含大小写字母、数字和特殊字符。

2. 授予远程访问权限

为用户授予所需的权限。例如,授予对所有数据库的全部权限:

bash 复制代码
GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%';
FLUSH PRIVILEGES;

说明:

  • ON . 表示授予用户对所有数据库和表的权限。如果希望限制权限范围,可以指定具体的数据库和表,例如 ON my_database.*。
  • 执行 FLUSH PRIVILEGES 以确保权限生效。

3. 验证远程用户配置

登录 MySQL,检查用户的主机字段是否正确:

sql 复制代码
SELECT Host, User FROM mysql.user WHERE User = 'remote_user';

输出示例:

plaintext 复制代码
+-----------+-------------+
| Host      | User        |
+-----------+-------------+
| %         | remote_user |
+-----------+-------------+

说明:

  • 如果 Host 字段不是 %,可以通过以下命令更新:
sql 复制代码
UPDATE mysql.user SET Host='%' WHERE User='remote_user';
FLUSH PRIVILEGES;

4. 配置 MySQL 服务允许远程访问

编辑 MySQL 的配置文件 /etc/my.cnf,确保以下设置:

ini 复制代码
[mysqld]
bind-address=0.0.0.0
port=3306

说明:

  • bind-address=0.0.0.0 允许 MySQL 监听所有网络接口。如果仅允许特定接口访问,可替换为具体 IP。
  • 确认端口是否正确(默认是 3306),如有需要可以自定义端口。

保存文件后,重启 MySQL 服务以应用更改:

bash 复制代码
sudo systemctl restart mysqld

5. 配置防火墙规则

为远程用户打开 MySQL 的服务端口:

bash 复制代码
sudo firewall-cmd --permanent --zone=public --add-port=3306/tcp
sudo firewall-cmd --reload

注意:

  • 如果只允许特定 IP 地址访问,可以指定来源地址:
bash 复制代码
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="3306" accept'
sudo firewall-cmd --reload

6. SELinux 相关配置

在启用 SELinux 的系统中,确保为 MySQL 配置正确的 SELinux 规则:

bash 复制代码
sudo semanage port -a -t mysqld_port_t -p tcp 3306

如果 semanage 未安装,可以通过以下命令安装:

bash 复制代码
sudo yum install -y policycoreutils-python

7. 测试远程连接

在远程机器上,通过 MySQL 客户端测试连接:

bash 复制代码
mysql -u remote_user -p -h <your_server_ip>

示例命令解析:

  • -u remote_user:使用创建的远程用户登录。
  • -p:提示输入用户密码。
  • -h <your_server_ip>:指定 MySQL 服务器的 IP 地址或域名。

如果 MySQL 服务使用非默认端口(例如 3307),则需要指定端口:

bash 复制代码
mysql -u remote_user -p -h <your_server_ip> -P 3307

8. 安全性注意事项

  • 限制主机访问范围:尽量避免使用 %,改为特定 IP 地址。
  • 启用 SSL 连接:为提高安全性,可配置 MySQL 使用 SSL 加密通信。
  • 最小权限原则:为用户授予尽可能少的权限,例如仅授予 SELECT 权限:
sql 复制代码
GRANT SELECT ON my_database.* TO 'remote_user'@'192.168.1.100';
FLUSH PRIVILEGES;

远程用户配置的自动化脚本

以下是将上述远程用户配置步骤自动化的脚本:

bash 复制代码
#!/bin/bash

REMOTE_USER="remote_user"
REMOTE_PASSWORD="StrongPassword@123"
REMOTE_HOST="%"
MYSQL_PORT=3306

echo "Configuring remote user access for MySQL..."

# 登录 MySQL 并配置用户
mysql -u root -p <<EOF
CREATE USER '${REMOTE_USER}'@'${REMOTE_HOST}' IDENTIFIED BY '${REMOTE_PASSWORD}';
GRANT ALL PRIVILEGES ON *.* TO '${REMOTE_USER}'@'${REMOTE_HOST}';
FLUSH PRIVILEGES;
EOF

# 配置 MySQL 监听所有地址
sudo sed -i 's/^bind-address.*/bind-address = 0.0.0.0/' /etc/my.cnf
sudo systemctl restart mysqld

# 配置防火墙
sudo firewall-cmd --permanent --zone=public --add-port=${MYSQL_PORT}/tcp
sudo firewall-cmd --reload

echo "Remote user configuration complete!"

通过上述步骤,我们为远程用户 remote_user 成功开通了安全的远程访问权限,同时确保服务的安全性和性能最佳化。

结语

通过本篇博客,您将能够在 CentOS 7 上成功部署和优化 MySQL 8.0。无论是安全配置、用户管理还是性能优化,这些实践都旨在帮助您构建一个高效、稳定的数据库系统。无论是在开发环境还是生产环境,这种配置都能满足现代应用的需求。如果您对 MySQL 配置还有其他问题,欢迎留言讨论!

相关推荐
草莓熊Lotso6 小时前
【Redis 初阶】Set 类型深度解析:去重集合的运算能力与实战场景
linux·网络·数据库·windows·redis·tcp/ip·缓存
张文君6 小时前
ubuntu26.04坏道坏块分区隔离急速版260831-V0.12
linux·python
九皇叔叔15 小时前
《MySQL 体系架构详解:Server 层、SQL 执行流程与 InnoDB、MyISAM、MEMORY 存储引擎》
sql·mysql·架构
贝锐15 小时前
从国产化信创设备到商用安卓终端,向日葵如何帮助企业实现统一运维管理?
linux·运维·远程控制
Julien200416 小时前
调查和解决 SELinux 问题
linux·运维·服务器·网络·学习方法
愤怒的苹果ext17 小时前
MySQL Shell备份恢复数据库
数据库·mysql·备份恢复·mysqlsh
小张同学a.18 小时前
Docker 容器实战 1—— docker 基础与镜像构建
linux·运维·docker·容器
超兔一体云20 小时前
MySQL索引优化实战——从慢查询到索引调优
后端·mysql
Best-Wishes21 小时前
BurpSuite Pro教育版在linux系统中配置
linux·运维·服务器·网络安全·burpsuite
wuminyu21 小时前
深入剖析 Panama Off-heap 的性能损耗与开销
java·linux·c语言·jvm·c++