首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Ubuntu Server迎娶MySQL 8.4.6:一场完美的"数据婚姻"配置指南

Ubuntu Server迎娶MySQL 8.4.6:一场完美的"数据婚姻"配置指南

原创
作者头像
徐关山
发布2025-10-17 11:14:07
发布2025-10-17 11:14:07
5390
举报

第一章 缘起:为什么选择Ubuntu Server与MySQL 8.4.6

在当今数据驱动的时代,选择合适的数据库管理系统与操作系统组合,对于任何应用的成功都至关重要。Ubuntu Server与MySQL 8.4.6的结合,宛如一场精心安排的美满婚姻——双方各具优势,相辅相成,共同构建稳定、高效的数据管理环境。本章将深入探讨这一组合的技术优势,并为后续的实战安装奠定理论基础。

1.1 Ubuntu Server:企业级应用的坚实基石

Ubuntu Server是基于Debian架构的Linux发行版,以其稳定性、安全性和丰富的软件生态而闻名。根据2025年的统计数据,Ubuntu Server在全球云服务器市场中占有约38%的份额,这充分证明了其在企业环境中的可靠性。相较于其他Linux发行版,Ubuntu Server具有以下显著优势:

  • 强大的社区支持:Ubuntu拥有庞大的开发者社区,这意味着用户在遇到问题时能够快速找到解决方案和专业技术支持。
  • 定期的安全更新:Canonical为Ubuntu Server提供长达五年的长期支持(LTS)版本,确保系统持续获得安全补丁和关键更新。
  • 卓越的硬件兼容性:Ubuntu Server支持各种硬件架构,包括x86-64、ARM64等,使其能够在从传统服务器到最新云环境的多种平台上运行。
  • 简化的系统管理:通过内置的Snap包管理器和APT工具,系统管理员可以轻松地部署、更新和维护软件包。

1.2 MySQL 8.4.6:数据库领域的老牌劲旅

MySQL作为最流行的开源关系数据库管理系统之一,在全球数据库市场中占据重要地位。MySQL 8.4.6是MySQL 8.0系列的重要更新版本,带来了多项性能改进和安全增强。与前辈版本相比,MySQL 8.4.6引入了以下关键特性:

  • 增强的JSON功能:提供了更强大的JSON文档查询和处理能力,使MySQL在NoSQL场景下也能发挥出色性能。
  • 改进的窗口函数:支持更复杂的分析查询,满足现代数据分析需求。
  • 更好的并行查询执行:显著提升复杂查询的性能,特别是在大规模数据集上。
  • 增强的安全功能:包括多因子认证、权限角色管理等,帮助企业满足严格的数据安全合规要求。
  • 改进的InnoDB存储引擎:提供更好的并发性能和资源利用率。

1.3 完美组合:强强联合的技术优势

当Ubuntu Server与MySQL 8.4.6结合时,它们创造了一个协同效应显著的技术栈:

  • 优化资源利用:Ubuntu Server的高效内核调度与MySQL 8.4.6的改进资源管理相结合,确保数据库系统能够充分利用可用硬件资源。
  • 增强安全态势:Ubuntu Server的AppArmor安全模块与MySQL 8.4.6的多层安全功能相结合,提供了纵深防御机制。
  • 简化运维管理:通过Ubuntu的APT包管理系统,MySQL的安装和更新变得简单且可靠,降低了运维复杂度。
  • 卓越的性能表现:测试表明,在相同硬件配置下,Ubuntu Server上运行的MySQL 8.4.6比在其他Linux发行版上的性能提升可达15-20%,这归功于Ubuntu内核的优化和MySQL对Linux环境的深度适配。

在接下来的章节中,我们将深入探讨如何将这两个优秀的技术组件完美结合,打造一个高性能、高可用的数据库服务器环境。从系统准备到安装配置,从安全加固到性能优化,本文将为您提供一份全面且详细的技术指南。

第二章 婚前准备:系统环境审视与规划

在开始安装MySQL 8.4.6之前,必须对Ubuntu Server系统进行全面的环境审视与规划。这一步骤犹如婚姻前的必要了解,能够确保后续安装过程顺利进行,避免不必要的冲突和问题。本章将详细讲解如何评估系统环境、处理可能存在的软件冲突,以及为MySQL数据库规划合适的运行环境。

2.1 系统架构与版本检查

在安装任何软件之前,了解系统的详细配置是至关重要的第一步。通过以下命令可以全面掌握系统信息:

代码语言:bash
复制
# 查看系统架构
uname -a

# 查看Ubuntu版本信息
lsb_release -a

# 查看系统内核版本
cat /proc/version

# 查看系统内存和存储空间
free -h
df -h

这些命令将输出系统的关键信息,包括系统架构(x86_64或ARM64)、Ubuntu具体版本号、可用内存和磁盘空间等。根据MySQL官方文档,MySQL 8.4.6至少需要2GB内存和10GB磁盘空间才能流畅运行,但对于生产环境,建议配置更高的资源。

系统架构选择考量

  • x86_64架构:这是最常见的服务器架构,拥有最广泛的软件兼容性和社区支持。
  • ARM64架构:在节能和特定工作负载方面具有优势,特别适合云环境和边缘计算场景。

根据统计,2025年约有72%的企业服务器采用x86_64架构,28%采用ARM架构。确保下载的MySQL版本与系统架构匹配,是成功安装的前提。

2.2 处理现有MySQL或MariaDB实例

如果系统中已经存在MySQL或其他数据库软件,需要谨慎处理,避免版本冲突。以下是检测和解决冲突的步骤:

代码语言:bash
复制
# 检查是否已安装MySQL
systemctl status mysql
systemctl status mysqld

# 检查是否已安装MariaDB
systemctl status mariadb

# 使用包管理器检查安装的数据库软件
dpkg -l | grep -E '(mysql|mariadb)'

# 检查数据库相关进程
ps aux | grep -E '(mysql|mariadb)'

如果发现现有MySQL或MariaDB实例,应根据实际情况选择以下处理方式之一:

方案一:保留现有实例

如果现有数据库包含重要数据且需要保留,应当先进行完整备份,然后考虑安装新版本到不同目录或端口。

代码语言:bash
复制
# 备份现有数据库
mysqldump -u root -p --all-databases > all_databases_backup.sql

方案二:移除现有实例

如果不需要现有数据库实例,可以彻底移除它们:

代码语言:bash
复制
# 停止数据库服务
sudo systemctl stop mysql
sudo systemctl stop mysqld
sudo systemctl stop mariadb

# 彻底移除MySQL及相关配置文件
sudo apt remove --purge mysql-server mysql-client mysql-common
sudo apt remove --purge mariadb-server mariadb-client

# 自动移除不再需要的依赖包
sudo apt autoremove

# 删除残留的数据库文件和目录
sudo rm -rf /var/lib/mysql
sudo rm -rf /etc/mysql
sudo rm -rf /var/log/mysql

# 清理配置文件
sudo dpkg -l | grep -i mysql | awk '{print $2}' | xargs sudo dpkg --purge

完成清理后,建议重启系统确保所有数据库相关进程已完全停止。

2.3 系统更新与依赖安装

在安装MySQL之前,确保系统处于最新状态并安装必要的依赖软件:

代码语言:bash
复制
# 更新软件包列表
sudo apt update

# 升级现有软件包
sudo apt upgrade -y

# 安装MySQL所需的依赖库
sudo apt install -y wget curl gnupg lsb-release

# 安装系统工具
sudo apt install -y software-properties-common apt-transport-https ca-certificates

依赖软件说明

  • wget/curl:用于从网络下载MySQL安装包和密钥。
  • gnupg:用于验证软件包的数字签名,确保安全性。
  • lsb-release:提供标准的系统版本信息,便于配置脚本正确识别环境。
  • ca-certificates:确保HTTPS连接的安全性,特别是在下载MySQL软件包时。

2.4 防火墙与SELinux配置

为确保MySQL服务能够正常通信,需要正确配置防火墙规则:

代码语言:bash
复制
# 检查防火墙状态
sudo ufw status

# 启用MySQL默认端口(3306)
sudo ufw allow 3306/tcp

# 如使用MySQL组复制或其他高级功能,可能需要额外端口
sudo ufw allow 33061/tcp

# 应用防火墙规则
sudo ufw reload

对于使用SELinux的系统(虽然Ubuntu默认使用AppArmor),也需要考虑相应配置:

代码语言:bash
复制
# 检查SELinux状态(如适用)
sestatus

# 临时设置SELinux模式为permissive
setenforce 0

# 永久修改SELinux配置
sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config

2.5 系统资源优化配置

为确保MySQL能够获得最佳性能,需要对系统资源进行适当调整:

代码语言:bash
复制
# 查看当前文件句柄限制
ulimit -n

# 查看用户进程限制
ulimit -u

# 修改系统限制配置文件
sudo tee -a /etc/security/limits.conf << EOF
mysql soft nofile 65536
mysql hard nofile 65536
mysql soft nproc 16384
mysql hard nproc 16384
EOF

此外,还需要调整系统虚拟内存参数,以优化数据库性能:

代码语言:bash
复制
# 修改sysctl配置以优化数据库性能
sudo tee -a /etc/sysctl.conf << EOF
# 减少TCP连接中的TIME-WAIT sockets等待时间
net.ipv4.tcp_fin_timeout = 30
# 允许系统重用TIME-WAIT sockets
net.ipv4.tcp_tw_reuse = 1
# 增加最大连接数
net.core.somaxconn = 65536
# 增加内存 Overcommit 比例
vm.overcommit_memory = 1
# 调整虚拟内存参数
vm.swappiness = 10
# 调整脏页写回阈值
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
EOF

# 重新加载sysctl配置
sudo sysctl -p

通过以上系统审视和规划步骤,我们为MySQL 8.4.6的安装奠定了坚实的基础。在下一章中,我们将进入实际的安装过程,详细讲解两种主要的安装方法及其适用场景。

第三章 明媒正娶:通过官方仓库安装MySQL 8.4.6

使用Ubuntu官方仓库安装MySQL是最简单、最直接的方法,适合大多数用户场景。这种方法犹如传统的"明媒正娶",遵循标准流程,确保系统各组件间的兼容性和稳定性。本章将详细讲解通过APT包管理器安装MySQL 8.4.6的完整过程,包括仓库配置、软件安装和基础配置。

3.1 配置MySQL官方APT仓库

虽然Ubuntu自带的软件仓库包含MySQL,但版本可能不是最新的。要获取最新的MySQL 8.4.6,我们需要添加MySQL官方APT仓库:

代码语言:bash
复制
# 下载并安装MySQL官方APT仓库配置包
cd /tmp
wget https://dev.mysql.com/get/mysql-apt-config_0.8.28-1_all.deb

# 安装仓库配置包
sudo dpkg -i mysql-apt-config_0.8.28-1_all.deb

在安装配置包过程中,系统会显示一个配置界面,提供以下选项:

  1. MySQL Server & Cluster:选择mysql-8.4
  2. MySQL Tools & Connectors:选择Enabled
  3. MySQL Preview Packages:选择Disabled

使用方向键选择"Ok"并按回车确认。完成后,更新APT包列表:

代码语言:bash
复制
# 更新包列表以包含MySQL仓库中的软件
sudo apt update

验证仓库配置

代码语言:bash
复制
# 检查MySQL仓库是否成功添加
apt-cache policy mysql-server

命令输出应显示来自MySQL官方仓库的mysql-server包信息,包括版本8.4.6。

3.2 安装MySQL服务器

配置好仓库后,可以开始安装MySQL服务器:

代码语言:bash
复制
# 安装MySQL服务器
sudo apt install -y mysql-server mysql-client

安装过程会自动完成以下任务:

  • 创建mysql系统用户和用户组
  • 初始化MySQL系统数据库
  • 设置MySQL服务配置文件
  • 配置Systemd服务单元
  • 启动MySQL服务

安装组件说明

  • mysql-server:MySQL服务器核心组件,包含数据库引擎和管理工具。
  • mysql-client:MySQL客户端工具,用于连接和管理MySQL服务器。

安装完成后,验证MySQL服务状态:

代码语言:bash
复制
# 检查MySQL服务状态
sudo systemctl status mysql

# 设置MySQL服务开机自启
sudo systemctl enable mysql

正常运行的MySQL服务应该显示"active (running)"状态。

3.3 初始安全配置

MySQL安装完成后,必须进行安全加固。MySQL提供了一个安全配置脚本,帮助完成基本的安全设置:

代码语言:bash
复制
# 运行MySQL安全配置脚本
sudo mysql_secure_installation

该脚本会引导完成以下安全配置步骤:

  1. 验证密码组件:询问是否配置验证密码插件,用于强制密码策略。
  2. 设置root密码:为MySQL root用户设置强密码。
  3. 移除匿名用户:删除默认安装中存在的匿名测试用户。
  4. 禁止远程root登录:限制root用户只能从本地连接。
  5. 移除测试数据库:删除安装时创建的测试数据库。
  6. 重新加载权限表:使所有权限更改立即生效。

对于生产环境,建议对所有问题回答"是"(按Y键),以确保最大程度的安全性。

3.4 验证安装结果

安装和基础配置完成后,需要验证MySQL是否正常工作:

代码语言:bash
复制
# 使用root用户登录MySQL
mysql -u root -p

# 在MySQL命令行中执行基本信息查询
SELECT VERSION();
SHOW DATABASES;
STATUS;

预期输出应包含

  • MySQL版本号:8.4.6
  • 系统数据库:information_schema, mysql, performance_schema, sys
  • 服务器运行状态信息

退出MySQL命令行:

代码语言:bash
复制
EXIT;

3.5 理解安装的文件结构

通过APT方式安装的MySQL,其文件按照Linux标准分布在系统目录中:

代码语言:bash
复制
# 查看MySQL相关文件和目录
sudo find / -name "*mysql*" -type d 2>/dev/null

关键目录说明

  • /etc/mysql:MySQL配置文件目录
    • /etc/mysql/mysql.conf.d/mysqld.cnf:主服务器配置文件
    • /etc/mysql/debian.cnf:Debian/Ubuntu特定配置
  • /var/lib/mysql:数据库数据文件目录
  • /var/log/mysql:MySQL日志文件目录
  • /usr/bin/mysql:MySQL客户端程序
  • /usr/sbin/mysqld:MySQL服务器守护进程

3.6 配置MySQL系统服务

MySQL作为系统服务运行,通过systemd进行管理。了解服务管理命令很重要:

代码语言:bash
复制
# 启动MySQL服务
sudo systemctl start mysql

# 停止MySQL服务
sudo systemctl stop mysql

# 重启MySQL服务
sudo systemctl restart mysql

# 重新加载配置文件(不重启服务)
sudo systemctl reload mysql

# 查看服务状态
sudo systemctl status mysql

# 查看服务日志
sudo journalctl -u mysql -f

3.7 处理常见安装问题

即使在标准安装过程中,也可能遇到一些问题。以下是常见问题及解决方法:

问题一:安装过程中出现GPG密钥错误

代码语言:bash
复制
# 如果遇到GPG密钥错误,可以重新导入密钥
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 467B942D3A79BD29
sudo apt update

问题二:端口冲突

代码语言:bash
复制
# 检查3306端口是否被占用
sudo netstat -tulpn | grep 3306

# 如果被其他程序占用,可以修改MySQL端口或停止冲突程序

问题三:权限问题

代码语言:bash
复制
# 如果遇到文件权限问题,重置MySQL数据目录权限
sudo chown -R mysql:mysql /var/lib/mysql
sudo chmod -R 755 /var/lib/mysql

通过以上步骤,我们完成了通过官方仓库安装MySQL 8.4.6的完整过程。这种方法简单可靠,适合大多数应用场景。在下一章中,我们将探讨另一种安装方法——手动编译安装,这种方法虽然复杂,但提供了更高的灵活性和控制力。

第四章 自由恋爱:手动编译安装与深度定制

对于需要极致性能或特定功能的高级用户,手动编译安装MySQL提供了无与伦比的灵活性和控制力。这种方法犹如选择"自由恋爱",允许我们根据具体需求深度定制数据库系统的每一个方面。本章将详细讲解MySQL 8.4.6的手动编译安装过程,包括源码准备、依赖解决、编译配置、优化参数调整等高级主题。

4.1 源码获取与验证

首先,我们需要从MySQL官方网站获取源码并验证其完整性:

代码语言:bash
复制
# 创建编译工作目录
sudo mkdir -p /usr/local/src/mysql_build
cd /usr/local/src/mysql_build

# 下载MySQL 8.4.6源码包
sudo wget https://dev.mysql.com/get/Downloads/MySQL-8.4/mysql-8.4.6.tar.gz

# 下载对应的校验文件
sudo wget https://dev.mysql.com/get/Downloads/MySQL-8.4/mysql-8.4.6.tar.gz.sha256

# 验证源码完整性
sudo sha256sum -c mysql-8.4.6.tar.gz.sha256

# 如果系统没有sha256sum,可以使用以下命令
echo "$(cat mysql-8.4.6.tar.gz.sha256) mysql-8.4.6.tar.gz" | sha256sum --check

验证通过后,解压源码包:

代码语言:bash
复制
# 解压源码包
sudo tar -xzvf mysql-8.4.6.tar.gz

# 进入源码目录
cd mysql-8.4.6

4.2 构建环境与依赖准备

编译MySQL需要安装必要的开发工具和库文件:

代码语言:bash
复制
# 安装编译工具
sudo apt install -y build-essential cmake ninja-build

# 安装必需的开发库
sudo apt install -y libncurses5-dev libssl-dev libreadline-dev
sudo apt install -y zlib1g-dev libsystemd-dev pkg-config
sudo apt install -y libaio-dev libwrap0-dev libjson-c-dev

# 安装可选功能所需的库
sudo apt install -y libldap2-dev libsasl2-dev libbz2-dev
sudo apt install -y liblz4-dev liblzma-dev libsnappy-dev
sudo apt install -y libprotobuf-dev protobuf-compiler

关键依赖说明

  • build-essential:提供GCC编译器和其他基本构建工具。
  • cmake:MySQL使用CMake作为构建系统。
  • libssl-dev:提供SSL/TLS加密支持。
  • libaio-dev:提供异步I/O支持,对数据库性能至关重要。
  • libncurses5-dev:提供终端处理功能。

4.3 CMake配置与编译选项

MySQL使用CMake作为构建系统,我们可以通过配置各种选项来定制编译过程:

代码语言:bash
复制
# 创建构建目录并进入
sudo mkdir build
cd build

# 配置CMake选项
sudo cmake .. \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DSYSCONFDIR=/etc \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_LIBWRAP=0 \
-DWITH_READLINE=1 \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_0900_ai_ci \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_BOOST=../boost \
-DWITH_SYSTEMD=1 \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_CONFIG=mysql_release

重要CMake选项解析

  • CMAKE_INSTALL_PREFIX:指定MySQL安装目录,设置为/usr/local/mysql符合Linux标准。
  • MYSQL_DATADIR:设置数据库数据文件存储路径。
  • WITH_INNOBASE_STORAGE_ENGINE:启用InnoDB存储引擎,这是MySQL的默认事务引擎。
  • WITH_SSL:使用系统SSL库提供安全连接支持。
  • DEFAULT_CHARSET和DEFAULT_COLLATION:设置默认字符集和排序规则,utf8mb4支持所有Unicode字符。
  • WITH_SYSTEMD:启用systemd支持,便于服务管理。
  • CMAKE_BUILD_TYPE=Release:构建优化版本,提供最佳性能。

配置完成后,开始编译:

代码语言:bash
复制
# 开始编译,使用所有可用的CPU核心
sudo make -j$(nproc)

# 编译完成后进行安装
sudo make install

编译过程可能需要较长时间,具体取决于系统性能。在8核CPU和16GB内存的服务器上,通常需要30-60分钟。

4.4 系统配置与数据库初始化

安装完成后,需要进行系统配置和数据库初始化:

代码语言:bash
复制
# 创建mysql用户和用户组(如不存在)
sudo groupadd mysql
sudo useradd -r -g mysql -s /bin/false mysql

# 创建必要的目录并设置权限
sudo mkdir -p /usr/local/mysql/data
sudo mkdir -p /var/log/mysql
sudo mkdir -p /var/run/mysql

# 设置目录所有权
sudo chown -R mysql:mysql /usr/local/mysql
sudo chown -R mysql:mysql /var/log/mysql
sudo chown -R mysql:mysql /var/run/mysql

# 设置目录权限
sudo chmod -R 755 /usr/local/mysql
sudo chmod -R 755 /var/log/mysql
sudo chmod -R 755 /var/run/mysql

初始化MySQL系统数据库:

代码语言:bash
复制
# 切换到MySQL安装目录
cd /usr/local/mysql

# 初始化数据库
sudo bin/mysqld --initialize --user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data

初始化过程会生成一个临时的root密码,务必保存此密码:

代码语言:bash
复制
2025-XX-XXT00:00:00.000000Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: XXXXXXXXXXX

4.5 创建配置文件和服务单元

创建自定义MySQL配置文件:

代码语言:bash
复制
# 创建配置文件目录
sudo mkdir -p /usr/local/mysql/configFile

# 创建配置文件
sudo tee /usr/local/mysql/configFile/my.cnf << EOF
[client]
port = 3306
socket = /tmp/mysql.sock
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
# 基础设置
user = mysql
port = 3306
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
socket = /tmp/mysql.sock

# 字符集设置
character-set-server = utf8mb4
collation-server = utf8mb4_0900_ai_ci
init_connect = 'SET NAMES utf8mb4'

# 连接设置
max_connections = 1000
max_connect_errors = 100000
bind-address = 0.0.0.0

# 表名大小写敏感设置
lower_case_table_names = 0

# 内存和缓冲设置
key_buffer_size = 256M
sort_buffer_size = 4M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 16
query_cache_size = 128M
query_cache_type = 1

# 日志设置
log_error = /var/log/mysql/error.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
log_queries_not_using_indexes = 1

# InnoDB设置
innodb_buffer_pool_size = 2G
innodb_log_file_size = 256M
innodb_log_buffer_size = 16M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 120
innodb_file_per_table = 1

# 复制和二进制日志设置(可选)
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 14
max_binlog_size = 256M

# 其他设置
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
explicit_defaults_for_timestamp = true

[mysqld_safe]
log-error = /var/log/mysql/error.log
pid-file = /var/run/mysql/mysql.pid
EOF

创建systemd服务单元文件:

代码语言:bash
复制
# 创建systemd服务文件
sudo tee /etc/systemd/system/mysqld.service << EOF
[Unit]
Description=MySQL Server 8.4.6
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql
Type=notify
TimeoutSec=0
PermissionsStartOnly=true
ExecStartPre=/usr/bin/mkdir -p /var/run/mysql
ExecStartPre=/usr/bin/chown mysql:mysql /var/run/mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/configFile/my.cnf
LimitNOFILE=65536
Restart=on-failure
RestartPreventExitStatus=1
PrivateTmp=false
EOF

4.6 启动服务与初始配置

启用并启动MySQL服务:

代码语言:bash
复制
# 重新加载systemd配置
sudo systemctl daemon-reload

# 启用MySQL开机自启
sudo systemctl enable mysqld

# 启动MySQL服务
sudo systemctl start mysqld

# 检查服务状态
sudo systemctl status mysqld

使用初始化时生成的临时密码登录并修改root密码:

代码语言:bash
复制
# 使用临时密码登录
/usr/local/mysql/bin/mysql -u root -p

# 在MySQL命令行中修改root密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewStrongPassword123!';

# 刷新权限
FLUSH PRIVILEGES;

# 执行基本安全配置
DELETE FROM mysql.user WHERE User='';
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
FLUSH PRIVILEGES;

4.7 环境变量与路径配置

为了方便使用MySQL命令,需要设置环境变量:

代码语言:bash
复制
# 编辑bashrc文件
sudo tee -a /etc/bash.bashrc << 'EOF'

# MySQL Environment Variables
export MYSQL_HOME=/usr/local/mysql
export PATH=$MYSQL_HOME/bin:$PATH
export LD_LIBRARY_PATH=$MYSQL_HOME/lib:$LD_LIBRARY_PATH
EOF

# 重新加载bashrc
source /etc/bash.bashrc

# 创建符号链接到标准路径
sudo ln -sf /usr/local/mysql/bin/mysql /usr/local/bin/mysql
sudo ln -sf /usr/local/mysql/bin/mysqldump /usr/local/bin/mysqldump
sudo ln -sf /usr/local/mysql/bin/mysqladmin /usr/local/bin/mysqladmin

4.8 验证手动安装结果

全面验证手动安装的MySQL实例:

代码语言:bash
复制
# 检查MySQL版本
mysql -u root -p -e "SELECT @@version;"

# 检查安装组件
mysql -u root -p -e "SHOW VARIABLES LIKE '%version%';"

# 检查存储引擎
mysql -u root -p -e "SHOW ENGINES;"

# 检查字符集设置
mysql -u root -p -e "SHOW VARIABLES LIKE 'character_set%';"

# 检查关键配置参数
mysql -u root -p -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"

通过手动编译安装,我们获得了完全定制的MySQL实例,能够根据具体工作负载和硬件配置进行深度优化。虽然过程较为复杂,但这种方法提供了最佳的性能和灵活性,特别适合对性能有严格要求的生产环境。

在下一章中,我们将深入探讨MySQL 8.4.6的配置优化,包括内存调整、存储优化和查询性能调优等高级主题。

第五章 婚后生活:MySQL 8.4.6配置与优化指南

成功安装MySQL 8.4.6后,就像开始了婚姻生活,需要精心维护和持续优化才能确保长久稳定的运行。本章将深入探讨MySQL 8.4.6的配置优化技巧,涵盖内存调整、存储优化、查询性能调优以及监控策略,帮助您充分发挥数据库系统的潜力。

5.1 配置文件深度解析

MySQL的配置文件是数据库性能调优的核心。理解每个配置项的含义对于优化至关重要。让我们深入分析关键配置参数:

代码语言:bash
复制
# 查看当前MySQL配置
mysql -u root -p -e "SHOW VARIABLES;"

# 或者查看特定配置项
mysql -u root -p -e "SHOW VARIABLES LIKE '%buffer%';"
5.1.1 内存相关配置优化

内存配置对数据库性能影响最大。以下是根据系统内存大小推荐的配置:

代码语言:ini
复制
[mysqld]
# InnoDB缓冲池大小 - 通常是系统内存的50%-80%
# 对于8GB内存系统
innodb_buffer_pool_size = 4G

# 对于16GB内存系统  
# innodb_buffer_pool_size = 12G

# 对于32GB内存系统
# innodb_buffer_pool_size = 24G

# 设置InnoDB缓冲池实例数(建议每GB缓冲池配置1个实例)
innodb_buffer_pool_instances = 4

# 查询缓存大小(MySQL 8.4中已弃用,建议设置为0)
query_cache_size = 0
query_cache_type = 0

# 排序缓冲区和读取缓冲区大小
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 4M
join_buffer_size = 4M

# 临时表大小
tmp_table_size = 64M
max_heap_table_size = 64M
5.1.2 连接和线程配置
代码语言:ini
复制
[mysqld]
# 最大连接数 - 根据应用需求调整
max_connections = 500

# 连接超时设置
connect_timeout = 10
wait_timeout = 28800
interactive_timeout = 28800

# 线程缓存
thread_cache_size = 16
thread_stack = 256K

# 反向域名解析,建议关闭提升性能
skip_name_resolve = 1

5.2 InnoDB存储引擎优化

InnoDB是MySQL最常用的存储引擎,其配置对数据库性能至关重要:

代码语言:ini
复制
[mysqld]
# InnoDB通用配置
innodb_data_file_path = ibdata1:1G:autoextend
innodb_autoextend_increment = 128M
innodb_file_per_table = 1
innodb_flush_method = O_DIRECT

# InnoDB日志配置
innodb_log_file_size = 2G
innodb_log_buffer_size = 64M
innodb_flush_log_at_trx_commit = 1

# InnoDB I/O配置
innodb_read_io_threads = 8
innodb_write_io_threads = 4
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000

# InnoDB锁和并发配置
innodb_lock_wait_timeout = 50
innodb_rollback_on_timeout = 1
innodb_locks_unsafe_for_binlog = 0

关键参数说明

  • innodb_buffer_pool_size:InnoDB缓冲池大小,是影响性能最重要的参数。它决定了数据库可以在内存中缓存多少数据和索引。
  • innodb_log_file_size:重做日志文件大小,较大的日志文件可以减少磁盘I/O,但会增加崩溃恢复时间。
  • innodb_flush_log_at_trx_commit:控制事务持久性级别。设置为1确保完全ACID合规,但会影响性能;设置为0或2可提升性能但牺牲一定的持久性。

5.3 查询性能优化

优化查询性能需要从多个层面入手:

5.3.1 启用慢查询日志
代码语言:ini
复制
[mysqld]
# 慢查询日志配置
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
log_queries_not_using_indexes = 1
log_throttle_queries_not_using_indexes = 60
min_examined_row_limit = 100
5.3.2 索引和查询优化配置
代码语言:ini
复制
[mysqld]
# 优化器配置
optimizer_switch = 'index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on'

# 临时表和文件排序优化
tmp_table_size = 128M
max_heap_table_size = 128M
max_length_for_sort_data = 4096
sort_buffer_size = 4M

5.4 监控与诊断配置

建立完善的监控体系是维护数据库健康的关键:

代码语言:sql
复制
-- 启用性能 schema
SELECT * FROM performance_schema.setup_instruments 
WHERE NAME LIKE 'statement/sql/%' LIMIT 10;

-- 配置性能 schema 监控
UPDATE performance_schema.setup_instruments 
SET ENABLED = 'YES', TIMED = 'YES'
WHERE NAME LIKE 'statement/%';

UPDATE performance_schema.setup_consumers 
SET ENABLED = 'YES'
WHERE NAME LIKE '%events_statements%';

创建自定义监控视图:

代码语言:sql
复制
-- 创建数据库性能概览视图
CREATE VIEW db_performance_overview AS
SELECT 
    TABLE_SCHEMA,
    COUNT(*) as table_count,
    SUM(DATA_LENGTH) as data_size,
    SUM(INDEX_LENGTH) as index_size,
    SUM(DATA_LENGTH + INDEX_LENGTH) as total_size
FROM information_schema.TABLES 
WHERE TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema')
GROUP BY TABLE_SCHEMA
ORDER BY total_size DESC;

5.5 备份与恢复配置

确保数据安全是数据库管理的首要任务:

代码语言:ini
复制
[mysqld]
# 二进制日志配置(确保点-in-time恢复)
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 14
max_binlog_size = 256M
binlog_format = ROW
sync_binlog = 1

# 服务器ID(在主从复制中必需)
server-id = 1

创建自动化备份脚本:

代码语言:bash
复制
#!/bin/bash
# MySQL备份脚本

BACKUP_DIR="/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=7

# 创建备份目录
mkdir -p $BACKUP_DIR/$DATE

# 执行全量备份
mysqldump -u root -p$MYSQL_ROOT_PASSWORD --all-databases \
--single-transaction \
--master-data=2 \
--routines \
--events > $BACKUP_DIR/$DATE/full_backup.sql

# 备份二进制日志
mysql -u root -p$MYSQL_ROOT_PASSWORD -e "FLUSH BINARY LOGS;"
cp /var/log/mysql/mysql-bin.* $BACKUP_DIR/$DATE/

# 清理旧备份
find $BACKUP_DIR -type d -mtime +$RETENTION_DAYS -exec rm -rf {} \;

5.6 安全配置加固

加强数据库安全防护:

代码语言:ini
复制
[mysqld]
# 安全相关配置
local_infile = 0
symbolic_links = 0
skip_symbolic_links = 1

# 密码策略
validate_password.policy = MEDIUM
validate_password.length = 8
validate_password.mixed_case_count = 1
validate_password.number_count = 1
validate_password.special_char_count = 1

# 审计日志(如安装审计插件)
# audit_log = FORCE_PLUS_PERMANENT
# audit_log_format = JSON
# audit_log_policy = ALL

执行安全加固脚本:

代码语言:sql
复制
-- 安全加固脚本
-- 移除匿名用户
DELETE FROM mysql.user WHERE User = '';

-- 确保root用户只能本地登录
DELETE FROM mysql.user WHERE User = 'root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');

-- 移除测试数据库
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db = 'test' OR Db = 'test\\_%';

-- 创建监控用户
CREATE USER 'monitor'@'localhost' IDENTIFIED BY 'StrongPassword123!';
GRANT SELECT, PROCESS, REPLICATION CLIENT ON *.* TO 'monitor'@'localhost';

-- 刷新权限
FLUSH PRIVILEGES;

5.7 性能监控与调优工具

使用专业工具监控数据库性能:

代码语言:bash
复制
# 安装和使用MySQL自带的性能分析工具
# 1. mysqlslap - 负载模拟工具
mysqlslap --user=root --password --host=localhost \
--concurrency=100 --iterations=10 \
--number-int-cols=5 --number-char-cols=20 \
--auto-generate-sql --auto-generate-sql-add-autoincrement \
--auto-generate-sql-load-type=mixed --engine=innodb

# 2. mysqladmin - 管理工具
mysqladmin -u root -p extended-status
mysqladmin -u root -p processlist

# 3. 使用pt-query-digest分析慢查询日志
pt-query-digest /var/log/mysql/slow.log

通过以上全面的配置和优化,您的MySQL 8.4.6实例将能够以最佳状态运行,满足各种工作负载需求。记住,数据库优化是一个持续的过程,需要定期监控和调整。在下一章中,我们将探讨MySQL的安全加固和远程访问配置。

第六章 开门迎客:配置远程访问与权限管理

数据库安装配置完成后,下一步就是允许授权用户从远程连接访问,同时确保系统的安全性。本章将全面探讨MySQL 8.4.6的远程访问配置、用户权限管理和网络安全设置,帮助您在便利性和安全性之间找到最佳平衡点。

6.1 网络配置与连接设置

MySQL的网络配置是远程访问的基础,需要仔细规划和配置:

6.1.1 修改MySQL绑定地址

首先,需要修改MySQL的绑定地址以允许远程连接:

代码语言:bash
复制
# 编辑MySQL配置文件
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
# 或者对于手动安装
sudo nano /usr/local/mysql/configFile/my.cnf

找到[mysqld]部分,修改或添加以下配置:

代码语言:ini
复制
[mysqld]
# 绑定地址 - 允许所有IP连接
bind-address = 0.0.0.0

# 或者指定特定IP
# bind-address = 192.168.1.100

# MySQL服务端口
port = 3306

# 跳过名称解析,提升连接性能
skip_name_resolve = 1

# 最大连接数
max_connections = 500

# 连接超时设置
connect_timeout = 10
wait_timeout = 28800
interactive_timeout = 28800

配置说明

  • bind-address=0.0.0.0:允许从任何IP地址连接MySQL,生产环境建议使用特定IP或结合防火墙规则限制。
  • skip_name_resolve=1:禁用DNS反向解析,可以显著提升连接建立速度。
  • wait_timeout和interactive_timeout:控制非交互式和交互式连接的超时时间。

重启MySQL服务使配置生效:

代码语言:bash
复制
# 重启MySQL服务
sudo systemctl restart mysql

# 或者对于手动安装
sudo systemctl restart mysqld
6.1.2 验证网络配置

检查MySQL是否在指定端口监听:

代码语言:bash
复制
# 检查MySQL端口监听状态
sudo netstat -tulpn | grep 3306
# 或者使用ss命令
sudo ss -tulpn | grep 3306

# 预期输出应该显示MySQL正在0.0.0.0:3306或指定IP:3306监听

从本地测试连接:

代码语言:bash
复制
# 从本地测试MySQL连接
mysql -u root -p -h 127.0.0.1 -P 3306

# 测试本地主机名连接
mysql -u root -p -h localhost -P 3306

6.2 用户权限管理

MySQL 8.4.6引入了新的身份验证插件和权限管理机制,需要特别注意。

6.2.1 创建远程访问用户

为远程访问创建专用用户,避免使用root账户:

代码语言:sql
复制
-- 登录MySQL
mysql -u root -p

-- 创建远程管理用户(推荐使用特定IP限制)
CREATE USER 'remote_admin'@'192.168.1.%' 
IDENTIFIED WITH caching_sha2_password BY 'StrongPassword123!';

-- 授予适当权限
GRANT ALL PRIVILEGES ON *.* TO 'remote_admin'@'192.168.1.%' 
WITH GRANT OPTION;

-- 创建应用数据库用户
CREATE USER 'app_user'@'10.0.0.50' 
IDENTIFIED WITH caching_sha2_password BY 'AppPassword456!';

-- 授予应用所需权限
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp.* TO 'app_user'@'10.0.0.50';

-- 创建监控用户
CREATE USER 'monitor'@'192.168.1.100' 
IDENTIFIED WITH caching_sha2_password BY 'MonitorPass789!';

-- 授予监控权限
GRANT SELECT, PROCESS, REPLICATION CLIENT, SHOW DATABASES 
ON *.* TO 'monitor'@'192.168.1.100';

-- 立即刷新权限
FLUSH PRIVILEGES;
6.2.2 MySQL 8.4认证插件说明

MySQL 8.4默认使用caching_sha2_password认证插件,提供更好的安全性:

代码语言:sql
复制
-- 查看用户认证信息
SELECT user, host, plugin, authentication_string 
FROM mysql.user 
WHERE user NOT LIKE 'mysql.%';

-- 如果客户端不支持新认证插件,可以降级(不推荐)
ALTER USER 'username'@'host' 
IDENTIFIED WITH mysql_native_password BY 'password';

认证插件比较

  • caching_sha2_password:MySQL 8.0+默认,更安全,性能更好。
  • mysql_native_password:旧版兼容插件,安全性较低。
6.2.3 权限细化管理

实施最小权限原则,精确控制用户访问:

代码语言:sql
复制
-- 创建只读用户
CREATE USER 'readonly_user'@'%' 
IDENTIFIED WITH caching_sha2_password BY 'ReadOnlyPass123!';

-- 授予只读权限
GRANT SELECT ON myapp.* TO 'readonly_user'@'%';

-- 创建特定数据库用户
CREATE USER 'db_admin'@'192.168.1.200' 
IDENTIFIED WITH caching_sha2_password BY 'DbAdminPass456!';

-- 授予特定数据库管理权限
GRANT ALL PRIVILEGES ON specific_db.* TO 'db_admin'@'192.168.1.200';

-- 创建备份用户
CREATE USER 'backup_user'@'localhost' 
IDENTIFIED WITH caching_sha2_password BY 'BackupPass789!';

-- 授予备份权限
GRANT SELECT, RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT 
ON *.* TO 'backup_user'@'localhost';

-- 刷新权限
FLUSH PRIVILEGES;

6.3 防火墙配置

配置系统防火墙以限制对MySQL端口的访问:

6.3.1 UFW防火墙配置(Ubuntu)
代码语言:bash
复制
# 检查UFW状态
sudo ufw status

# 允许特定IP访问MySQL端口
sudo ufw allow from 192.168.1.0/24 to any port 3306

# 或者允许单个IP
sudo ufw allow from 192.168.1.100 to any port 3306

# 启用防火墙
sudo ufw enable

# 验证规则
sudo ufw status numbered
6.3.2 iptables防火墙配置
代码语言:bash
复制
# 允许特定网段访问
sudo iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 3306 -j ACCEPT

# 允许特定IP访问
sudo iptables -A INPUT -s 192.168.1.100 -p tcp --dport 3306 -j ACCEPT

# 拒绝其他所有到3306端口的连接
sudo iptables -A INPUT -p tcp --dport 3306 -j DROP

# 保存iptables规则
sudo iptables-save > /etc/iptables/rules.v4

6.4 SSL/TLS加密配置

为远程连接配置SSL加密,提升数据传输安全性:

6.4.1 检查SSL状态
代码语言:sql
复制
-- 检查MySQL SSL支持
SHOW VARIABLES LIKE '%ssl%';

-- 查看当前连接是否使用SSL
\s
STATUS;
6.4.2 配置强制SSL连接
代码语言:sql
复制
-- 要求特定用户使用SSL连接
ALTER USER 'remote_admin'@'192.168.1.%' 
REQUIRE SSL;

-- 要求所有远程用户使用SSL
ALTER USER 'app_user'@'10.0.0.50' REQUIRE SSL;

-- 验证用户SSL要求
SELECT user, host, ssl_type 
FROM mysql.user 
WHERE ssl_type != '';

6.5 连接池和负载均衡配置

对于高并发场景,配置连接池和负载均衡:

6.5.1 应用层连接池配置

示例Node.js连接池配置:

代码语言:javascript
复制
const mysql = require('mysql2');

const pool = mysql.createPool({
  host: '192.168.1.100',
  user: 'app_user',
  password: 'AppPassword456!',
  database: 'myapp',
  waitForConnections: true,
  connectionLimit: 50,
  queueLimit: 0,
  acquireTimeout: 60000,
  timeout: 60000,
  ssl: {
    rejectUnauthorized: true
  }
});
6.5.2 使用代理中间件

配置MySQL Router或ProxySQL:

代码语言:bash
复制
# 安装ProxySQL
sudo apt update
sudo apt install proxysql

# 配置ProxySQL管理界面
mysql -u admin -p -h 127.0.0.1 -P 6032

6.6 监控和审计远程连接

建立远程连接监控机制:

6.6.1 启用连接审计
代码语言:sql
复制
-- 创建连接监控表
CREATE DATABASE IF NOT EXISTS monitoring;

USE monitoring;

CREATE TABLE connection_audit (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    user_host VARCHAR(255),
    connection_time DATETIME,
    client_ip VARCHAR(45),
    connection_success BOOLEAN
);

-- 创建连接审计触发器(简化示例)
DELIMITER //
CREATE TRIGGER after_user_connect 
AFTER CONNECT ON *.* 
FOR EACH ROW
BEGIN
    INSERT INTO monitoring.connection_audit 
    (user_host, connection_time, client_ip, connection_success)
    VALUES (CURRENT_USER(), NOW(), SUBSTRING_INDEX(USER(), '@', -1), TRUE);
END//
DELIMITER ;
6.6.2 实时连接监控
代码语言:sql
复制
-- 查看当前连接
SELECT * FROM information_schema.processlist 
WHERE COMMAND != 'Sleep';

-- 查看连接统计
SELECT USER, HOST, COUNT(*) as connections 
FROM information_schema.processlist 
GROUP BY USER, HOST 
ORDER BY connections DESC;

-- 查看最大连接数使用情况
SHOW STATUS LIKE 'Max_used_connections';
SHOW VARIABLES LIKE 'max_connections';

6.7 故障排除和性能优化

远程连接常见问题排查:

6.7.1 连接问题诊断
代码语言:bash
复制
# 测试网络连通性
telnet mysql_server_ip 3306

# 检查防火墙规则
sudo iptables -L -n | grep 3306

# 检查MySQL错误日志
sudo tail -f /var/log/mysql/error.log
6.7.2 连接性能优化
代码语言:ini
复制
[mysqld]
# 连接相关性能优化
thread_cache_size = 16
back_log = 500
max_connect_errors = 100000
skip_name_resolve = 1

# 网络缓冲區优化
net_buffer_length = 16K
max_allowed_packet = 64M

通过以上全面的远程访问配置和权限管理,您可以在确保安全性的前提下,为授权用户提供稳定可靠的数据库远程访问服务。记住,安全是一个持续的过程,需要定期审计和更新安全策略。

第七章 长治久安:数据库备份、恢复与监控策略

构建稳定的MySQL数据库环境后,必须建立完善的备份恢复体系和实时监控系统,确保数据安全性和服务可用性。本章将深入探讨MySQL 8.4.6的备份策略、恢复技术和监控实施方案,为您的数据库系统提供全方位保障。

7.1 全面备份策略设计

有效的备份策略应该包含多种备份类型,满足不同的恢复需求。

7.1.1 备份类型规划

物理备份与逻辑备份结合

代码语言:bash
复制
#!/bin/bash
# 混合备份脚本示例

BACKUP_BASE="/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
FULL_BACKUP_DIR="$BACKUP_BASE/full_$DATE"
INC_BACKUP_DIR="$BACKUP_BASE/inc_$DATE"
LOG_FILE="$BACKUP_BASE/backup_$DATE.log"

# 创建备份目录
mkdir -p $FULL_BACKUP_DIR $INC_BACKUP_DIR

log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> $LOG_FILE
}

# 全量物理备份(周日执行)
full_physical_backup() {
    log "开始全量物理备份"
    
    # 使用MySQL企业备份或Percona XtraBackup
    innobackupex --user=root --password=$MYSQL_ROOT_PASSWORD \
    --no-timestamp $FULL_BACKUP_DIR >> $LOG_FILE 2>&1
    
    # 应用日志
    innobackupex --apply-log $FULL_BACKUP_DIR >> $LOG_FILE 2>&1
    
    log "全量物理备份完成"
}

# 增量物理备份(周一到周六)
incremental_backup() {
    log "开始增量备份"
    
    # 基于上次全量备份进行增量
    LATEST_FULL=$(ls -td $BACKUP_BASE/full_* | head -1)
    innobackupex --user=root --password=$MYSQL_ROOT_PASSWORD \
    --no-timestamp --incremental $INC_BACKUP_DIR \
    --incremental-basedir=$LATEST_FULL >> $LOG_FILE 2>&1
    
    log "增量备份完成"
}

# 逻辑备份(每天)
logical_backup() {
    log "开始逻辑备份"
    
    # 使用mysqldump备份所有数据库
    mysqldump --user=root --password=$MYSQL_ROOT_PASSWORD \
    --all-databases --single-transaction --routines \
    --events --master-data=2 > $FULL_BACKUP_DIR/full_backup.sql
    
    log "逻辑备份完成"
}

# 根据日期选择备份类型
DAY_OF_WEEK=$(date +%u)

if [ $DAY_OF_WEEK -eq 7 ]; then
    # 周日执行全量备份
    full_physical_backup
    logical_backup
else
    # 周一到周六执行增量备份
    incremental_backup
fi

# 清理30天前的备份
find $BACKUP_BASE -name "full_*" -type d -mtime +30 -exec rm -rf {} \;
find $BACKUP_BASE -name "inc_*" -type d -mtime +7 -exec rm -rf {} \;

log "备份流程完成"
7.1.2 二进制日志管理

确保二进制日志的完整保存,支持时间点恢复:

代码语言:sql
复制
-- 在MySQL中配置二进制日志
SET GLOBAL expire_logs_days = 14;
SET GLOBAL max_binlog_size = 268435456; -- 256MB
SET GLOBAL binlog_format = 'ROW';

-- 定期清理旧二进制日志
PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 14 DAY);

-- 查看二进制日志状态
SHOW BINARY LOGS;
SHOW MASTER STATUS;

7.2 数据恢复技术

掌握各种恢复场景的技术实现,确保在紧急情况下能够快速恢复数据。

7.2.1 逻辑备份恢复
代码语言:bash
复制
#!/bin/bash
# 逻辑备份恢复脚本

restore_logical_backup() {
    local BACKUP_FILE=$1
    local RESTORE_DIR="/tmp/restore_$(date +%Y%m%d_%H%M%S)"
    
    mkdir -p $RESTORE_DIR
    cd $RESTORE_DIR
    
    log "开始逻辑备份恢复: $BACKUP_FILE"
    
    # 停止应用程序连接(可选)
    mysql -u root -p$MYSQL_ROOT_PASSWORD -e "FLUSH TABLES WITH READ LOCK;"
    
    # 恢复数据
    mysql -u root -p$MYSQL_ROOT_PASSWORD < $BACKUP_FILE
    
    # 解除锁表
    mysql -u root -p$MYSQL_ROOT_PASSWORD -e "UNLOCK TABLES;"
    
    log "逻辑备份恢复完成"
}

# 恢复到指定时间点
point_in_time_recovery() {
    local TARGET_DATETIME=$1
    local BACKUP_FILE=$2
    
    log "开始时间点恢复到: $TARGET_DATETIME"
    
    # 恢复全量备份
    mysql -u root -p$MYSQL_ROOT_PASSWORD < $BACKUP_FILE
    
    # 应用二进制日志
    mysqlbinlog --stop-datetime="$TARGET_DATETIME" \
    /var/log/mysql/mysql-bin.[0-9]* | mysql -u root -p$MYSQL_ROOT_PASSWORD
    
    log "时间点恢复完成"
}
7.2.2 物理备份恢复
代码语言:bash
复制
#!/bin/bash
# 物理备份恢复脚本

restore_physical_backup() {
    local BACKUP_DIR=$1
    
    log "开始物理备份恢复: $BACKUP_DIR"
    
    # 停止MySQL服务
    sudo systemctl stop mysql
    
    # 备份当前数据目录
    sudo mv /var/lib/mysql /var/lib/mysql_backup_$(date +%Y%m%d_%H%M%S)
    
    # 准备备份
    innobackupex --apply-log $BACKUP_DIR
    
    # 恢复数据
    innobackupex --copy-back $BACKUP_DIR
    
    # 设置权限
    sudo chown -R mysql:mysql /var/lib/mysql
    
    # 启动MySQL服务
    sudo systemctl start mysql
    
    log "物理备份恢复完成"
}

7.3 实时监控体系

建立全面的监控体系,实时掌握数据库健康状况。

7.3.1 性能监控配置
代码语言:sql
复制
-- 启用性能Schema监控
UPDATE performance_schema.setup_instruments 
SET ENABLED = 'YES', TIMED = 'YES';

UPDATE performance_schema.setup_consumers 
SET ENABLED = 'YES';

-- 创建监控视图
CREATE VIEW database_performance_view AS
SELECT 
    OBJECT_TYPE,
    OBJECT_SCHEMA,
    OBJECT_NAME,
    COUNT_READ,
    COUNT_WRITE,
    COUNT_FETCH,
    SUM_TIMER_WAIT/1000000000 as total_wait_seconds
FROM performance_schema.table_io_waits_summary_by_table 
ORDER BY total_wait_seconds DESC;

-- 查询缓存命中率监控
SELECT 
    VARIABLE_VALUE as query_cache_size
FROM information_schema.GLOBAL_VARIABLES 
WHERE VARIABLE_NAME = 'query_cache_size';

SELECT 
    VARIABLE_VALUE as qcache_hits
FROM information_schema.GLOBAL_STATUS 
WHERE VARIABLE_NAME = 'qcache_hits';
7.3.2 使用Prometheus和Grafana监控

创建MySQL监控exporter配置:

代码语言:yaml
复制
# mysql_exporter.yml
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'mysql'
    static_configs:
      - targets: ['localhost:9104']
    metrics_path: /metrics
    params:
      collect[]:
        - global_status
        - global_variables
        - slave_status
        - innodb_metrics
        - performance_schema

创建Grafana监控看板:

代码语言:sql
复制
-- 常用监控指标查询
-- 连接数监控
SELECT 
    VARIABLE_VALUE as max_connections,
    (SELECT VARIABLE_VALUE FROM information_schema.GLOBAL_STATUS 
     WHERE VARIABLE_NAME = 'Threads_connected') as current_connections,
    ROUND((SELECT VARIABLE_VALUE FROM information_schema.GLOBAL_STATUS 
           WHERE VARIABLE_NAME = 'Threads_connected') / 
          VARIABLE_VALUE * 100, 2) as connection_usage_percent
FROM information_schema.GLOBAL_VARIABLES 
WHERE VARIABLE_NAME = 'max_connections';

-- InnoDB缓冲池效率
SELECT 
    VARIABLE_VALUE as innodb_buffer_pool_size,
    (SELECT VARIABLE_VALUE FROM information_schema.GLOBAL_STATUS 
     WHERE VARIABLE_NAME = 'Innodb_buffer_pool_reads') as physical_reads,
    (SELECT VARIABLE_VALUE FROM information_schema.GLOBAL_STATUS 
     WHERE VARIABLE_NAME = 'Innodb_buffer_pool_read_requests') as logical_reads,
    ROUND(100 - (SELECT VARIABLE_VALUE FROM information_schema.GLOBAL_STATUS 
                 WHERE VARIABLE_NAME = 'Innodb_buffer_pool_reads') / 
                 (SELECT VARIABLE_VALUE FROM information_schema.GLOBAL_STATUS 
                  WHERE VARIABLE_NAME = 'Innodb_buffer_pool_read_requests') * 100, 2) as hit_rate
FROM information_schema.GLOBAL_VARIABLES 
WHERE VARIABLE_NAME = 'innodb_buffer_pool_size';

7.4 警报系统配置

建立智能警报机制,及时发现和响应问题。

7.4.1 数据库警报规则
代码语言:sql
复制
-- 创建监控存储过程
DELIMITER //

CREATE PROCEDURE monitor_database_health()
BEGIN
    DECLARE connection_usage DECIMAL(5,2);
    DECLARE buffer_pool_hit_rate DECIMAL(5,2);
    DECLARE slow_queries_count INT;
    
    -- 检查连接数使用率
    SELECT ROUND(
        (SELECT VARIABLE_VALUE FROM information_schema.GLOBAL_STATUS 
         WHERE VARIABLE_NAME = 'Threads_connected') / 
        (SELECT VARIABLE_VALUE FROM information_schema.GLOBAL_VARIABLES 
         WHERE VARIABLE_NAME = 'max_connections') * 100, 2)
    INTO connection_usage;
    
    -- 检查缓冲池命中率
    SELECT ROUND(100 - 
        (SELECT VARIABLE_VALUE FROM information_schema.GLOBAL_STATUS 
         WHERE VARIABLE_NAME = 'Innodb_buffer_pool_reads') / 
        (SELECT VARIABLE_VALUE FROM information_schema.GLOBAL_STATUS 
         WHERE VARIABLE_NAME = 'Innodb_buffer_pool_read_requests') * 100, 2)
    INTO buffer_pool_hit_rate;
    
    -- 检查慢查询数量
    SELECT VARIABLE_VALUE INTO slow_queries_count
    FROM information_schema.GLOBAL_STATUS 
    WHERE VARIABLE_NAME = 'Slow_queries';
    
    -- 记录警报条件
    IF connection_usage > 80 THEN
        INSERT INTO monitoring.alerts (alert_type, alert_message, severity)
        VALUES ('high_connections', 
                CONCAT('连接数使用率过高: ', connection_usage, '%'), 
                'warning');
    END IF;
    
    IF buffer_pool_hit_rate < 95 THEN
        INSERT INTO monitoring.alerts (alert_type, alert_message, severity)
        VALUES ('low_buffer_pool_hit_rate', 
                CONCAT('缓冲池命中率低: ', buffer_pool_hit_rate, '%'), 
                'critical');
    END IF;
    
    IF slow_queries_count > 100 THEN
        INSERT INTO monitoring.alerts (alert_type, alert_message, severity)
        VALUES ('high_slow_queries', 
                CONCAT('慢查询数量过多: ', slow_queries_count), 
                'warning');
    END IF;
    
END//

DELIMITER ;

-- 创建事件调度,定期执行监控
CREATE EVENT IF NOT EXISTS monitor_database_event
ON SCHEDULE EVERY 1 MINUTE
DO CALL monitor_database_health();

7.5 容灾和高可用配置

构建数据库高可用架构,确保业务连续性。

7.5.1 主从复制配置
代码语言:sql
复制
-- 在主服务器上执行
-- 创建复制用户
CREATE USER 'repl'@'%' IDENTIFIED WITH caching_sha2_password BY 'ReplicationPass123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

-- 查看主服务器状态
SHOW MASTER STATUS;

-- 在从服务器上执行
CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='repl',
MASTER_PASSWORD='ReplicationPass123!',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=107;

-- 启动复制
START SLAVE;

-- 检查复制状态
SHOW SLAVE STATUS\G
7.5.2 自动故障转移
代码语言:bash
复制
#!/bin/bash
# 简单的故障转移脚本

check_replication_health() {
    local SLAVE_STATUS=$(mysql -u root -p$MYSQL_ROOT_PASSWORD -e "SHOW SLAVE STATUS\G")
    
    if echo "$SLAVE_STATUS" | grep -q "Slave_IO_Running: Yes" && \
       echo "$SLAVE_STATUS" | grep -q "Slave_SQL_Running: Yes"; then
        return 0
    else
        return 1
    fi
}

promote_slave_to_master() {
    log "开始提升从库为主库"
    
    # 停止复制
    mysql -u root -p$MYSQL_ROOT_PASSWORD -e "STOP SLAVE;"
    mysql -u root -p$MYSQL_ROOT_PASSWORD -e "RESET SLAVE ALL;"
    
    # 启用写操作
    mysql -u root -p$MYSQL_ROOT_PASSWORD -e "SET GLOBAL read_only = OFF;"
    
    # 通知应用切换
    # 这里可以添加应用通知逻辑
    
    log "从库已成功提升为主库"
}

# 主监控循环
while true; do
    if ! check_replication_health; then
        log "复制状态异常,开始故障转移"
        promote_slave_to_master
        break
    fi
    sleep 30
done

通过实施完整的备份恢复策略和全面的监控体系,您的MySQL数据库将具备企业级的可靠性和可维护性。记住,预防胜于治疗,在问题发生前发现并解决它们是确保数据库长期稳定运行的关键。

第八章 和谐共处:MySQL与系统资源优化

数据库的性能不仅取决于自身的配置,还与操作系统资源的合理分配和优化密切相关。本章将深入探讨如何优化Ubuntu Server系统资源,使MySQL 8.4.6能够充分发挥其性能潜力,确保数据库与操作系统和谐共处。

8.1 内存优化配置

内存是数据库性能最重要的影响因素,合理的配置可以显著提升性能。

8.1.1 系统内存分配策略
代码语言:bash
复制
#!/bin/bash
# 系统内存优化脚本

# 查看当前内存使用情况
echo "=== 当前内存使用情况 ==="
free -h
echo ""

# 查看内存详细信息
echo "=== 内存详细信息 ==="
cat /proc/meminfo | grep -E "(MemTotal|MemFree|MemAvailable|SwapTotal|SwapFree)"
echo ""

# 配置系统内存参数
configure_system_memory() {
    # 修改swappiness,减少换出倾向
    echo 'vm.swappiness=10' >> /etc/sysctl.conf
    
    # 调整脏页写回策略
    echo 'vm.dirty_ratio = 15' >> /etc/sysctl.conf
    echo 'vm.dirty_background_ratio = 5' >> /etc/sysctl.conf
    
    # 调整文件系统缓存压力
    echo 'vm.vfs_cache_pressure=50' >> /etc/sysctl.conf
    
    # 应用配置
    sysctl -p
}

# 配置大页支持(可选,针对大内存系统)
configure_hugepages() {
    local MYSQL_MEMORY_GB=16
    local HUGEPAGES_COUNT=$((($MYSQL_MEMORY_GB * 1024) / 2))
    
    echo "vm.nr_hugepages = $HUGEPAGES_COUNT" >> /etc/sysctl.conf
    sysctl -p
    
    # 为MySQL用户配置大页权限
    echo 'mysql soft memlock unlimited' >> /etc/security/limits.conf
    echo 'mysql hard memlock unlimited' >> /etc/security/limits.conf
}
8.1.2 MySQL内存配置优化

根据系统总内存动态计算MySQL内存参数:

代码语言:sql
复制
-- 计算和建议内存配置
SET @total_memory := (SELECT VARIABLE_VALUE FROM information_schema.GLOBAL_VARIABLES 
                     WHERE VARIABLE_NAME = 'innodb_buffer_pool_size');
SET @system_memory := (SELECT @@GLOBAL.total_memory FROM 
                      (SELECT SUM(VARIABLE_VALUE) as total_memory 
                       FROM information_schema.GLOBAL_VARIABLES 
                       WHERE VARIABLE_NAME IN 
                       ('key_buffer_size', 'query_cache_size', 'innodb_buffer_pool_size', 
                        'innodb_log_buffer_size', 'max_connections * (@@sort_buffer_size + @@read_buffer_size + @@read_rnd_buffer_size + @@join_buffer_size + @@thread_stack)')) as t);

-- 生成优化建议
SELECT 
    CONCAT('当前InnoDB缓冲池: ', ROUND(@total_memory/1024/1024/1024, 2), 'GB') as current_setting,
    CONCAT('建议InnoDB缓冲池: ', ROUND(@system_memory * 0.75/1024/1024/1024, 2), 'GB') as recommended,
    CONCAT('系统总内存: ', ROUND(@system_memory/1024/1024/1024, 2), 'GB') as total_memory;

基于建议值更新配置:

代码语言:ini
复制
[mysqld]
# 内存配置 - 根据系统内存调整
# 假设系统有16GB内存

# InnoDB缓冲池 - 系统内存的50-75%
innodb_buffer_pool_size = 8G

# InnoDB缓冲池实例数
innodb_buffer_pool_instances = 8

# 每个实例至少1GB
# innodb_buffer_pool_size / innodb_buffer_pool_instances >= 1G

# 其他内存缓冲区
key_buffer_size = 64M
query_cache_size = 0

# 每个连接的内存分配
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 4M
join_buffer_size = 4M
thread_stack = 256K

# 临时表内存大小
tmp_table_size = 128M
max_heap_table_size = 128M

8.2 存储系统优化

存储I/O性能直接影响数据库的响应速度。

8.2.1 文件系统选择与配置
代码语言:bash
复制
#!/bin/bash
# 存储优化配置

# 查看当前文件系统
df -T
lsblk -f

# 优化ext4文件系统配置(如果使用ext4)
tune_ext4() {
    local MOUNT_POINT=$1
    
    # 禁用访问时间更新,提升性能
    mount -o remount,noatime,nodiratime $MOUNT_POINT
    
    # 更新fstab配置永久生效
    sed -i "s|$MOUNT_POINT.*defaults|$MOUNT_POINT defaults,noatime,nodiratime|" /etc/fstab
    
    # 调整文件系统参数
    echo 'vm.dirty_writeback_centisecs = 600' >> /etc/sysctl.conf
    echo 'vm.dirty_expire_centisecs = 3000' >> /etc/sysctl.conf
}

# 为XFS文件系统优化(推荐用于数据库)
tune_xfs() {
    local MOUNT_POINT=$1
    local DEVICE=$2
    
    # 重新挂载并优化参数
    umount $MOUNT_POINT
    mount -t xfs -o noatime,nodiratime,logbufs=8,logbsize=256k,largeio,inode64 $DEVICE $MOUNT_POINT
    
    # 更新fstab
    sed -i "s|$DEVICE.*defaults|$DEVICE defaults,noatime,nodiratime,logbufs=8,logbsize=256k,largeio,inode64|" /etc/fstab
}

# I/O调度器优化
tune_io_scheduler() {
    # 查看当前调度器
    cat /sys/block/*/queue/scheduler
    
    # 为SSD设置noop或none调度器
    for disk in /sys/block/sd*; do
        if [ -f "$disk/queue/rotational" ] && [ $(cat "$disk/queue/rotational") -eq 0 ]; then
            echo noop > "$disk/queue/scheduler"
            echo 0 > "$disk/queue/rotational"
            echo 256 > "$disk/queue/nr_requests"
        fi
    done
}
8.2.2 MySQL存储配置优化
代码语言:ini
复制
[mysqld]
# InnoDB I/O配置
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit = 1
innodb_support_xa = 1

# I/O容量设置(根据存储性能调整)
# 对于SATA SSD
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000

# 对于NVMe SSD
# innodb_io_capacity = 10000
# innodb_io_capacity_max = 20000

# 日志文件配置
innodb_log_file_size = 2G
innodb_log_files_in_group = 3
innodb_log_buffer_size = 64M

# 并行查询配置
innodb_parallel_read_threads = 4
innodb_dedicated_server = 1

8.3 CPU和进程调度优化

合理利用CPU资源可以显著提升数据库并发处理能力。

8.3.1 CPU亲和性配置
代码语言:bash
复制
#!/bin/bash
# CPU优化配置

# 查看CPU信息
lscpu
cat /proc/cpuinfo | grep -E "(processor|core id|cpu cores)"

# 设置MySQL进程CPU亲和性(可选)
set_mysql_cpu_affinity() {
    local MYSQL_PID=$(pgrep mysqld)
    local CPU_COUNT=$(nproc)
    
    # 为MySQL分配专用的CPU核心(排除最后2个核心给系统使用)
    local MYSQL_CPUS=$((CPU_COUNT - 2))
    
    # 设置CPU亲和性
    taskset -cp 0-$MYSQL_CPUS $MYSQL_PID
    
    echo "MySQL进程 $MYSQL_PID 已绑定到CPU 0-$MYSQL_CPUS"
}

# 优化系统调度器
tune_cpu_scheduler() {
    # 设置CPU调度策略
    echo 'kernel.sched_migration_cost_ns = 5000000' >> /etc/sysctl.conf
    echo 'kernel.sched_min_granularity_ns = 10000000' >> /etc/sysctl.conf
    echo 'kernel.sched_wakeup_granularity_ns = 15000000' >> /etc/sysctl.conf
    
    # 禁用NUMA平衡(如果NUMA优化)
    echo 'kernel.numa_balancing = 0' >> /etc/sysctl.conf
    
    sysctl -p
}
8.3.2 MySQL并发配置
代码语言:ini
复制
[mysqld]
# 并发连接和线程配置
max_connections = 500
thread_cache_size = 50
back_log = 500

# InnoDB并发配置
innodb_thread_concurrency = 0
innodb_read_io_threads = 8
innodb_write_io_threads = 8

# 并行复制配置(如果使用复制)
slave_parallel_workers = 4
slave_parallel_type = LOGICAL_CLOCK

# 查询优化器配置
optimizer_search_depth = 0
eq_range_index_dive_limit = 200

8.4 网络性能优化

数据库的网络配置对远程连接性能和复制效率有重要影响。

8.4.1 系统网络优化
代码语言:bash
复制
#!/bin/bash
# 网络优化配置

tune_network() {
    # 优化TCP协议栈
    echo 'net.core.somaxconn = 65536' >> /etc/sysctl.conf
    echo 'net.core.netdev_max_backlog = 65536' >> /etc/sysctl.conf
    echo 'net.ipv4.tcp_max_syn_backlog = 65536' >> /etc/sysctl.conf
    
    # TCP缓冲区优化
    echo 'net.core.rmem_max = 16777216' >> /etc/sysctl.conf
    echo 'net.core.wmem_max = 16777216' >> /etc/sysctl.conf
    echo 'net.ipv4.tcp_rmem = 4096 87380 16777216' >> /etc/sysctl.conf
    echo 'net.ipv4.tcp_wmem = 4096 16384 16777216' >> /etc/sysctl.conf
    
    # TCP连接重用
    echo 'net.ipv4.tcp_tw_reuse = 1' >> /etc/sysctl.conf
    echo 'net.ipv4.tcp_fin_timeout = 30' >> /etc/sysctl.conf
    
    # 减少TCP keepalive时间
    echo 'net.ipv4.tcp_keepalive_time = 300' >> /etc/sysctl.conf
    echo 'net.ipv4.tcp_keepalive_probes = 3' >> /etc/sysctl.conf
    echo 'net.ipv4.tcp_keepalive_intvl = 30' >> /etc/sysctl.conf
    
    sysctl -p
}

# 优化网络接口(如果有多个接口)
tune_network_interface() {
    local INTERFACE=$1
    
    # 启用多队列(如果网卡支持)
    ethtool -L $INTERFACE combined 4
    
    # 调整环缓冲区大小
    ethtool -G $INTERFACE rx 4096 tx 4096
    
    # 启用RSS(接收端扩展)
    ethtool -X $INTERFACE equal 4
}
8.4.2 MySQL网络配置
代码语言:ini
复制
[mysqld]
# 网络相关配置
port = 3306
bind-address = 0.0.0.0

# 连接超时设置
connect_timeout = 10
wait_timeout = 28800
interactive_timeout = 28800

# 网络缓冲区
net_buffer_length = 16K
max_allowed_packet = 64M

# 跳过域名解析
skip_name_resolve = 1

8.5 资源监控和限制

实施资源监控和限制,防止资源耗尽。

8.5.1 使用cgroups限制资源
代码语言:bash
复制
#!/bin/bash
# 配置cgroups限制MySQL资源

setup_mysql_cgroup() {
    # 安装cgroup工具
    apt install -y cgroup-tools
    
    # 创建MySQL cgroup
    cgcreate -g cpu,memory,blkio:/mysql
    
    # 设置CPU限制(最多80%的CPU)
    cgset -r cpu.cfs_quota_us=80000 /mysql
    cgset -r cpu.cfs_period_us=100000 /mysql
    
    # 设置内存限制
    cgset -r memory.limit_in_bytes=12G /mysql
    cgset -r memory.memsw.limit_in_bytes=14G /mysql
    
    # 设置I/O限制
    cgset -r blkio.weight=500 /mysql
    
    # 将MySQL进程添加到cgroup
    cgclassify -g cpu,memory,blkio:mysql $(pgrep mysqld)
    
    # 创建systemd服务确保重启后生效
    cat > /etc/systemd/system/mysql-cgroup.service << EOF
[Unit]
Description=MySQL CGroup Limits
After=mysql.service

[Service]
Type=oneshot
ExecStart=/bin/bash /usr/local/bin/setup_mysql_cgroup.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF
    
    systemctl enable mysql-cgroup
}
8.5.2 资源监控脚本
代码语言:bash
复制
#!/bin/bash
# 资源监控脚本

monitor_system_resources() {
    while true; do
        TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
        
        # CPU使用率
        CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
        
        # 内存使用率
        MEM_USAGE=$(free | awk 'NR==2{printf "%.2f", $3*100/$2}')
        
        # I/O统计
        IO_STATS=$(iostat -dx 1 1 | awk 'NR>=4 && NR<=6 {print $1 ": " $14 "

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第一章 缘起:为什么选择Ubuntu Server与MySQL 8.4.6
    • 1.1 Ubuntu Server:企业级应用的坚实基石
    • 1.2 MySQL 8.4.6:数据库领域的老牌劲旅
    • 1.3 完美组合:强强联合的技术优势
  • 第二章 婚前准备:系统环境审视与规划
    • 2.1 系统架构与版本检查
    • 2.2 处理现有MySQL或MariaDB实例
    • 2.3 系统更新与依赖安装
    • 2.4 防火墙与SELinux配置
    • 2.5 系统资源优化配置
  • 第三章 明媒正娶:通过官方仓库安装MySQL 8.4.6
    • 3.1 配置MySQL官方APT仓库
    • 3.2 安装MySQL服务器
    • 3.3 初始安全配置
    • 3.4 验证安装结果
    • 3.5 理解安装的文件结构
    • 3.6 配置MySQL系统服务
    • 3.7 处理常见安装问题
  • 第四章 自由恋爱:手动编译安装与深度定制
    • 4.1 源码获取与验证
    • 4.2 构建环境与依赖准备
    • 4.3 CMake配置与编译选项
    • 4.4 系统配置与数据库初始化
    • 4.5 创建配置文件和服务单元
    • 4.6 启动服务与初始配置
    • 4.7 环境变量与路径配置
    • 4.8 验证手动安装结果
  • 第五章 婚后生活:MySQL 8.4.6配置与优化指南
    • 5.1 配置文件深度解析
      • 5.1.1 内存相关配置优化
      • 5.1.2 连接和线程配置
    • 5.2 InnoDB存储引擎优化
    • 5.3 查询性能优化
      • 5.3.1 启用慢查询日志
      • 5.3.2 索引和查询优化配置
    • 5.4 监控与诊断配置
    • 5.5 备份与恢复配置
    • 5.6 安全配置加固
    • 5.7 性能监控与调优工具
  • 第六章 开门迎客:配置远程访问与权限管理
    • 6.1 网络配置与连接设置
      • 6.1.1 修改MySQL绑定地址
      • 6.1.2 验证网络配置
    • 6.2 用户权限管理
      • 6.2.1 创建远程访问用户
      • 6.2.2 MySQL 8.4认证插件说明
      • 6.2.3 权限细化管理
    • 6.3 防火墙配置
      • 6.3.1 UFW防火墙配置(Ubuntu)
      • 6.3.2 iptables防火墙配置
    • 6.4 SSL/TLS加密配置
      • 6.4.1 检查SSL状态
      • 6.4.2 配置强制SSL连接
    • 6.5 连接池和负载均衡配置
      • 6.5.1 应用层连接池配置
      • 6.5.2 使用代理中间件
    • 6.6 监控和审计远程连接
      • 6.6.1 启用连接审计
      • 6.6.2 实时连接监控
    • 6.7 故障排除和性能优化
      • 6.7.1 连接问题诊断
      • 6.7.2 连接性能优化
  • 第七章 长治久安:数据库备份、恢复与监控策略
    • 7.1 全面备份策略设计
      • 7.1.1 备份类型规划
      • 7.1.2 二进制日志管理
    • 7.2 数据恢复技术
      • 7.2.1 逻辑备份恢复
      • 7.2.2 物理备份恢复
    • 7.3 实时监控体系
      • 7.3.1 性能监控配置
      • 7.3.2 使用Prometheus和Grafana监控
    • 7.4 警报系统配置
      • 7.4.1 数据库警报规则
    • 7.5 容灾和高可用配置
      • 7.5.1 主从复制配置
      • 7.5.2 自动故障转移
  • 第八章 和谐共处:MySQL与系统资源优化
    • 8.1 内存优化配置
      • 8.1.1 系统内存分配策略
      • 8.1.2 MySQL内存配置优化
    • 8.2 存储系统优化
      • 8.2.1 文件系统选择与配置
      • 8.2.2 MySQL存储配置优化
    • 8.3 CPU和进程调度优化
      • 8.3.1 CPU亲和性配置
      • 8.3.2 MySQL并发配置
    • 8.4 网络性能优化
      • 8.4.1 系统网络优化
      • 8.4.2 MySQL网络配置
    • 8.5 资源监控和限制
      • 8.5.1 使用cgroups限制资源
      • 8.5.2 资源监控脚本
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档