深入解析 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.rhkb.cn/news/472734.html

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

相关文章

【大数据学习 | HBASE高级】hbase-phoenix 与二次索引应用

1. hbase-phoenix的应用 1.1 概述&#xff1a; 上面我们学会了hbase的操作和原理&#xff0c;以及外部集成的mr的计算方式&#xff0c;但是我们在使用hbase的时候&#xff0c;有的时候我们要直接操作hbase做部分数据的查询和插入&#xff0c;这种原生的方式操作在工作过程中还…

Redis在高性能缓存中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 Redis在高性能缓存中的应用 Redis在高性能缓存中的应用 Redis在高性能缓存中的应用 引言 Redis 概述 定义与原理 发展历程 Redi…

MySQL初学之旅(3)约束

目录 1.前言 2.正文 2.1约束类型 2.2NULL约束 2.3UNIQUE约束 2.4DEFAULT约束 2.5PRIMARY KEY主键约束 2.6FOREIGN KEY外键约束 2.7CHECK约束 3.小结 1.前言 哈喽大家好啊&#xff0c;今儿来继续给大家分享最近学习的MySQL和约束相关的知识点&#xff0c;希望大家一起…

RHCE的学习(20)

变量5种赋值方式 shell中变量赋值5种方式&#xff0c;其中采用name10的方法称A 直接赋值 nameB read命令 read v1C 使用命令行参数 &#xff08;$1 $2 $3 ..&#xff09; name$1D 使用命令的输入 username$(whoami)E 从文件读取 #cut -d : -f1 /etc/passwd > /user.listfor…

Java项目实战II基于微信小程序的电子商城购物平台(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着互联网…

Godot的开发框架应当是什么样子的?

目录 前言 全局协程还是实例协程&#xff1f; 存档&#xff01; 全局管理类&#xff1f; UI框架&#xff1f; Godot中的异步&#xff08;多线程&#xff09;加载 Godot中的ScriptableObject 游戏流程思考 结语 前言 这是一篇杂谈&#xff0c;主要内容是对我…

【C++】深入理解 C++ 优先级队列、容器适配器与 deque:实现与应用解析

个人主页: 起名字真南的CSDN博客 个人专栏: 【数据结构初阶】 &#x1f4d8; 基础数据结构【C语言】 &#x1f4bb; C语言编程技巧【C】 &#x1f680; 进阶C【OJ题解】 &#x1f4dd; 题解精讲 目录 前言&#x1f4cc; 1. 优先级队列、容器适配器和 deque 概述✨1.1 什么是优…

SpringMVC学习笔记(一)

一、SpringMVC的基本概念 &#xff08;一&#xff09;三层架构和MVC 1、三层架构概述 我们的开发架构一般都是基于两种形式&#xff0c;一种是 C/S 架构&#xff0c;也就是客户端/服务器&#xff0c;另一种是 B/S 架构&#xff0c;也就是浏览器服务器。在 JavaEE 开发中&…

Jav项目实战II基于微信小程序的助农扶贫的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在当前社会…

Ubuntu安装ollama,并运行ollama和通义千问,使用gradio做界面

Ubuntu安装ollama&#xff0c;并运行ollama和通义千问 安装ollama方式一&#xff1a;方式二 下载安装模型运行大模型运行ollama服务前端的实现python环境安装修改pip国内源前端页面搭建测试前后端联通设计完整的ui 安装ollama 方式一&#xff1a; 访问网站连接&#xff0c;选…

对接阿里云实人认证

对接阿里云实人认证-身份二要素核验接口整理 目录 应用场景 接口文档 接口信息 请求参数 响应参数 调试 阿里云openApi平台调试 查看调用结果 查看SDK示例 下载SDK 遇到问题 本地调试 总结 应用场景 项目有一个提现的场景&#xff0c;需要用户真实的身份信息。 …

C++ 的发展

目录 C 的发展总结&#xff1a;​编辑 1. C 的早期发展&#xff08;1979-1985&#xff09; 2. C 标准化过程&#xff08;1985-1998&#xff09; 3. C 标准演化&#xff08;2003-2011&#xff09; 4. C11&#xff08;2011年&#xff09; 5. C14&#xff08;2014年&#xf…

蓝桥杯——数组

1、移动数组元素 package day3;import java.util.Arrays;public class Demo1 {public static void main(String[] args) {int[] arr {1,2,3,4,5,6};int k 2;int[] arr_new f(arr,k);for (int i : arr_new) {System.out.print(i",");}//或System.out.println();St…

六自由度双足机器人运动控制

最近迷上了研究机器人&#xff0c;花了很多时间研究机器人的控制和交互。先后开发出来了四足四自自由度&#xff0c;四足八自由度&#xff0c;两足四自由度&#xff0c;两足六自由度机器人&#xff0c;并为他们开发了相应的大模型语音交互。通过努力&#xff0c;既锻炼了动手组…

超好用shell脚本NuShell mac安装

利用管道控制任意系统 Nu 可以在 Linux、macOS 和 Windows 上运行。一次学习&#xff0c;处处可用。 一切皆数据 Nu 管道使用结构化数据&#xff0c;你可以用同样的方式安全地选择&#xff0c;过滤和排序。停止解析字符串&#xff0c;开始解决问题。 强大的插件系统 具备强…

第9章 DIV+CSS布局作业

html代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>服务中心</title><link type"text/css" href"../css/322-1.css" rel"stylesheet"/></head><body><di…

nginx源码安装配置ssl域名

nginx源码安装 下载 wget http://nginx.org/download/nginx-1.24.0.tar.gz 解压 tar -zxvf nginx-1.24.0.tar.gz 下载openssl apt install openssl 安装nginx cd nginx-1.24.0 sudo apt-get install libpcre3 libpcre3-dev ./configure --prefix=/home/nginx24 --with-http_ss…

【Linux:IO多路复用(select、poll函数)

目录 什么是IO多路复用&#xff1f; select: 参数介绍&#xff1a; select函数返回值&#xff1a; fd_set类型&#xff1a; 内核如何更新集合中的标志位 处理并发问题 处理流程的步骤&#xff1a; poll: poll的函数原型&#xff1a; 参数介绍&#xff1a; select与p…

容器内的Jenkins使用docker部署服务,服务数据文件挂载问题

问题 docker 容器运行服务更推荐是那种无状态的服务&#xff0c;这样可以做到 “ 开箱即用 ”&#xff0c;需要持久化存储的话使用存储卷挂载数据库文件即可&#xff0c;这都是基于在宿主机上执行的&#xff1b; 现在Jenkins是在docker容器中运行&#xff0c;并需要使用docker部…

六、volatile

volatile 能保证内存可⻅性 运行下面的例子&#xff1a; package Demo03;import java.util.Scanner;public class demo01 {private static int flag 0;public static void main(String[] args) {Thread t1 new Thread(() -> {while (flag 0) {}System.out.println(&quo…