深入解析 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 配置还有其他问题,欢迎留言讨论!

相关推荐
内核程序员kevin15 分钟前
TCP Listen 队列详解与优化指南
linux·网络·tcp/ip
i道i4 小时前
MySQL win安装 和 pymysql使用示例
数据库·mysql
朝九晚五ฺ5 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
自由的dream5 小时前
Linux的桌面
linux
Oak Zhang5 小时前
sharding-jdbc自定义分片算法,表对应关系存储在mysql中,缓存到redis或者本地
redis·mysql·缓存
xiaozhiwise5 小时前
Makefile 之 自动化变量
linux
久醉不在酒6 小时前
MySQL数据库运维及集群搭建
运维·数据库·mysql
WindFutrue6 小时前
使用Mybatis向Mysql中的插入Point类型的数据全方位解析
数据库·mysql·mybatis
谭震鸿7 小时前
Zookeeper集群搭建Centos环境下
分布式·zookeeper·centos