深入解析 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. 系统准备

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

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

2. 添加 MySQL 8.0 仓库

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

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

3. 安装 MySQL 8.0

安装并启动 MySQL:

sudo yum install -y mysql-community-server
sudo systemctl start mysqld
sudo systemctl enable mysqld

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

sudo grep 'temporary password' /var/log/mysqld.log

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

4. 配置 MySQL 安全性

运行 mysql_secure_installation 进行安全配置:

sudo mysql_secure_installation

安全优化建议:

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

5. 创建用户与权限管理

创建新用户并授予权限:

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

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

ALTER USER 'mysqluser'@'%' IDENTIFIED WITH mysql_native_password BY 'StrongPassword@123';

6. 配置远程访问

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

[mysqld]
port=3306
bind-address=0.0.0.0

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

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

SELinux 注意事项:

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

生产环境优化建议

1. 优化 MySQL 配置

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

[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 创建自动备份脚本:

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

3. 监控与日志分析

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

SET GLOBAL general_log = 'ON';
SET GLOBAL log_output = 'FILE';

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

常见问题与解决方案

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

修改用户认证插件:

ALTER USER 'mysqluser'@'%' IDENTIFIED WITH mysql_native_password BY 'StrongPassword@123';

2. 防火墙阻止连接

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

sudo firewall-cmd --list-ports
sudo ss -tuln | grep 3306

3. 忘记 root 密码

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

sudo systemctl stop mysqld
sudo mysqld --skip-grant-tables &
mysql -u root
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword@123';

自动化脚本:从零到完成

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

#!/bin/bashsudo 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 mysqldTEMP_PASSWORD=$(sudo grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}')
echo "Temporary MySQL root password: $TEMP_PASSWORD"sudo mysql_secure_installationsudo firewall-cmd --permanent --zone=public --add-port=3306/tcp
sudo firewall-cmd --reloadecho "MySQL 安装和配置完成!"

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

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

1. 创建远程用户

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

CREATE USER 'remote_user'@'%' IDENTIFIED BY 'StrongPassword@123';

说明:

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

2. 授予远程访问权限

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

GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%';
FLUSH PRIVILEGES;

说明:

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

3. 验证远程用户配置

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

SELECT Host, User FROM mysql.user WHERE User = 'remote_user';

输出示例:

+-----------+-------------+
| Host      | User        |
+-----------+-------------+
| %         | remote_user |
+-----------+-------------+

说明:

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

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

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

[mysqld]
bind-address=0.0.0.0
port=3306

说明:

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

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

sudo systemctl restart mysqld

5. 配置防火墙规则

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

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

注意:

  • 如果只允许特定 IP 地址访问,可以指定来源地址:
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 规则:

sudo semanage port -a -t mysqld_port_t -p tcp 3306

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

sudo yum install -y policycoreutils-python

7. 测试远程连接

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

mysql -u remote_user -p -h <your_server_ip>

示例命令解析:

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

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

mysql -u remote_user -p -h <your_server_ip> -P 3307

8. 安全性注意事项

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

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

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

#!/bin/bashREMOTE_USER="remote_user"
REMOTE_PASSWORD="StrongPassword@123"
REMOTE_HOST="%"
MYSQL_PORT=3306echo "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 --reloadecho "Remote user configuration complete!"

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

结语

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/60828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AIGC】如何通过ChatGPT提示词Prompt定制个性学习计划

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | 提示词Prompt应用实例 文章目录 &#x1f4af;前言&#x1f4af;提示词&#x1f4af;配置信息使用方法 &#x1f4af;指令/language/plan/start/test/continue/config &#x1f4af;小结 &#x1f4af;前言 在这篇文章中…

RFID被装信息化监控:物联网解决方案深入分析

被装物联网信息化监控构成了一套复杂而高效的处理方案&#xff0c;它巧妙地将物联网技术与被装资源管理的具体需求相结合&#xff0c;实现了对被装资源实时监控、智能化调控和优化分配。以下是对被装物联网信息化监控的详细说明&#xff1a; 一、被装物联网信息化监控的定义 …

C++ 关于类与对象(中篇)一篇详解!(运算符重载)

赋值运算符重载 运算符重载 C 为了 增强代码的可读性 引入了运算符重载 &#xff0c; 运算符重载是具有特殊函数名的函数 &#xff0c;也具有其返回值类型&#xff0c;函数名字以及参数列表&#xff0c;其返回值类型与参数列表与普通的函数类似。 函数名字为&#xff1a;关键…

有效对接礼顿销售单:从数据获取到金蝶云存储

礼顿销售单对接项目&#xff1a;轻松实现数据集成 礼顿销售单对接&#xff08;91-零售业务/5-代销售(供货商发货)&#xff09; 在礼顿销售单对接项目中&#xff0c;我们面临的主要任务是将吉客云奇门的数据集成到金蝶云星空平台。这个过程不仅需要确保数据的准确性和完整性&am…

【C++】—— map 与 set 深入浅出:设计原理与应用对比

不要只因一次失败&#xff0c;就放弃你原来决心想达到的目的。 —— 莎士比亚 目录 1、序列式容器与关联式容器的概述与比较 2、set 与 multiset 2.1 性质分析&#xff1a;唯一性与多重性的差异 2.2 接口解析&#xff1a;功能与操作的全面解读 3、map 与 multimap 3.1 性…

基于微信小程序的平安驾校预约平台的设计与实现(源码+LW++远程调试+代码讲解等)

摘 要 互联网发展至今&#xff0c;广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对高校教师成果信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#xff0c;劳动强度大&#xff0c;费时费力…

SpringBoot+Vue3开发会议管理系统

1 项目介绍 会议管理系统&#xff0c;简化公司内会议方面的流程&#xff0c;提供便捷。实现对会议室的管理、会议的管理、会议预约的管理&#xff0c;三大主流程模块。 系统分为三种角色&#xff0c;分别是员工、管理员和超级管理员。 员工角色功能&#xff1a;查看会议室占…

Docker环境搭建Cloudreve网盘服务(附shell脚本一键搭建)

Docker搭建Cloudreve Cloudreve介绍&#xff1a; Cloudreve 是一个基于 ThinkPHP 框架构建的开源网盘系统&#xff0c;旨在帮助用户以较低的成本快速搭建起既能满足个人也能满足企业需求的网盘服务。Cloudreve 支持多种存储介质&#xff0c;包括但不限于本地存储、阿里云OSS、…

Cadence安装

记录一下安装过程&#xff0c;方便以后安装使用Cadence。 去吴川斌的博客下载安装包&#xff0c;吴川斌博客&#xff1a; https://www.mr-wu.cn/cadence-orcad-allegro-resource-downloads/ 下载阿狸狗破戒大师 我这边下载的是版本V3.2.6&#xff0c;同样在吴川斌的博客下载安装…

系统架构设计师:系统架构设计基础知识

从第一个程序被划分成模块开始&#xff0c;软件系统就有了架构。 现在&#xff0c;有效的软件架构及其明确的描述和设计&#xff0c;已经成为软件工程领域中重要的主题。 由于不同人对Software Architecture (简称SA) 的翻译不尽相同&#xff0c;企业界喜欢叫”软件架构“&am…

Java Web 工程全貌

通过下图&#xff0c;我们可以一览 Java Web 工程的全貌 通过上图&#xff0c;我们能够基本窥探整个 Java Web 工程的面貌&#xff0c;包括前端&#xff0c;后端&#xff0c;甚至是运维。 接下来&#xff0c;我们就结合文字描述&#xff0c;加深理解。 部署Vue前端和Spring…

Linux入门:环境变量与进程地址空间

一. 环境变量 1. 概念 1️⃣基本概念&#xff1a; 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数 如&#xff1a;我们在编写C/C代码的时候&#xff0c;在链接的时候&#xff0c;从来不知道我们的所链接的动态静态库在哪里&#x…

【优选算法 — 滑动窗口】水果成篮 找到字符串中所有字母异位词

水果成篮 水果成篮 题目描述 因为只有两个篮子&#xff0c;每个篮子装的水果种类相同&#xff0c;如果从 0 开始摘&#xff0c;则只能摘 0 和 1 两个种类 &#xff1b; 因为当我们在两个果篮都装有水果的情况下&#xff0c;如果再走到下一颗果树&#xff0c;果树的水果种类…

Java 中使用Mockito 模拟对象的单元测试的快速示例

Mockito是一个流行的Java模拟框架&#xff0c;它允许你在单元测试中创建和配置模拟对象&#xff0c;以便在测试过程中替换那些不容易构造或获取的对象。 Mockito可以与JUnit无缝集成&#xff0c;下面的示例演示 Mockito JUnit实现模拟对象的单元测试。 依赖导入 这里使用Mav…

STM32 创建一个工程文件(寄存器、标准库)

首先到官网下载对应型号的固件包&#xff1a; 像我的STM32F103C8T6的就下载这个&#xff1a; 依次打开&#xff1a; .\STM32F10x_StdPeriph_Lib_V3.5.0\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm 可以看到&#xff1a; 这…

vue-h5:在h5中实现相机拍照加上身份证人相框和国徽框

方案1&#xff1a;排出来照片太糊了&#xff0c;效果不好 1.基础功能 参考&#xff1a; https://blog.csdn.net/weixin_45148022/article/details/135696629 https://juejin.cn/post/7327353533618978842?searchId20241101133433B2BB37A081FD6A02DA60 https://www.freesio…

初识GIS

文章目录 一、什么叫地理信息1、定义2、主要特点3、分类 二、什么叫GIS1、定义2、GIS对空间信息的储存2.1、矢量数据模型2.2、栅格数据模型 3、离散栅格和连续栅格的区别 三、坐标系统1、为什么要存在坐标系统&#xff1f;2、地理坐标系2.1、定义与特点2.2、分类 3、投影坐标系…

Android 开发指南:初学者入门

Android 是全球最受欢迎的移动操作系统之一&#xff0c;为开发者提供了丰富的工具和资源来创建各种类型的应用程序。本文将为你提供一个全面的入门指南&#xff0c;帮助你从零开始学习 Android 开发。 目录 1. 了解 Android 平台[1]2. 设置开发环境[2]3. 学习基础知识[3]4. 创…

【QML】QML多线程应用(WorkerScript)

1. 实现功能 QML项目中&#xff0c;点击一个按键后&#xff0c;运行一段比较耗时的程序&#xff0c;此时ui线程会卡住。如何避免ui线程卡住。 2. 单线程&#xff08;会卡住&#xff09; 2.1 界面 2.2 现象 点击delay btn后&#xff0c;执行耗时函数&#xff08;TestJs.func…

MFC1(note)

引言 在学习SDK后我们发现&#xff0c;写消息好麻烦&#xff0c;处理消息更麻烦 处理消息效率低发送消息效率低 所以把SDK中这些消息全部封装好 MFC封装了windows 的大部分API 这里说一下QT架构跨平台 MFC用得如何取决于你SDK的水平 创建 如果打开没有MFC 一般勾选以下…