暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

这个MySQL性能瓶颈问题你遇见过吗?

有一客户生产环境的业务数据的增长速度远远超过了最初的预期。随着用户数量的不断增加以及业务规模的扩大,数据库服务器逐渐面临了性能瓶颈。用户查询的响应时间变得较长,同时数据库处理复杂查询和大量事务时的效率下降,SQL优化后,数据库性能并未达到预期效果。经过诊断最终发现当前使用的磁盘无法提供足够的I/O,成为数据库系统性能的主要瓶颈。为了解决这一问题,客户决定提供一个停机窗口,迁移MySQL的数据文件到一块全新的高性能的SSD磁盘上,这里不得不说长江存储YYDS,相比前几年,国产SSD直接打成了白菜价。

当然,除了上述场景,存储空间不足、合规性要求等需求也可参考该文章方式进行MySQL数据文件的迁移。

image.png

作者:
公众号:霸王龙的日常
墨天伦:https://www.modb.pro/u/368448
CSDN: https://blog.csdn.net/xust_Hankey

环境概要

项目 配置描述
操作系统 CentOS 7.9 x86_64
数据库 MySQL 8 +

操作开始

1 上架新磁盘到服务器

1.1 查看系统是否检测到了新磁盘

fdisk -l
复制

通常,新磁盘设备名称会以 /dev/sdX 的形式显示,其中X是字母。

这里新加的磁盘是/dev/sdc

1.2 分区

fdisk /dev/sdc
复制
  • 输入 n 创建一个新分区。
  • 选择主分区(输入 p)或扩展分区(输入 e)。
  • 提示你选择分区号,如果只有一个分区,通常是 1
  • 输入起始扇区,如果你不确定,直接按 Enter 接受默认值。
  • 输入结束扇区,也可以直接按 Enter 接受默认值,表示使用整个磁盘空间。
  • 查看新分区:** 再次输入 p 查看新分区是否已经创建。

保存分区表:** 输入 w 保存分区表的更改。

重新读取分区表:

为了确保内核识别到新的分区,可以重新读取分区表:

partprobe /dev/sdc
复制

或者,你也可以重启系统。

1.3 格式化的分区并挂载目录

mkfs.xfs /dev/sdc1
复制

创建一个目录,作为新磁盘的挂载点:

mkdir /newdata
复制

使用 mount 命令将磁盘挂载到指定目录:

mount /dev/sdc1 /newdata
复制

1.4 配置自动挂载

vi /etc/fstab
复制

追加如下一行(假设是xfs文件系统):

/dev/sdc1   /newdata   xfs   defaults   0   2
复制

设置完成后,开机会自动挂载磁盘

2 查看配置文件

cat /etc/my.cnf
复制

例如,当前环境和路径相关的配置如下

datadir=/mysqldata/data socket=/mysqldata/mysql.sock pid-file=/mysqldata/mysqld.pid log-error=/mysqldata/log/mysqld.log log_bin = /mysqldata/binlog/mysql-binlog [client] socket=/mysqldata/mysql.sock
复制

3 查看数据目录的路径

mysql> show variables like 'datadir'; +---------------+-------------------+ | Variable_name | Value | +---------------+-------------------+ | datadir | /mysqldata/data/ | +---------------+-------------------+ 1 row in set (0.04 sec)
复制

4 备份数据库

在执行迁移操作之前,务必进行数据备份以防止意外数据丢失

备份全库

mysqldump -uroot -p -P3306 -A --source-data=2 --single-transaction --flush-logs -R > /bak/db_all.sql
复制

其中/bak/为备份文件存放目录,请根据实际情况进行替换。

你可以根据实际需要选择其他合适的备份方式。

5 停止MySQL服务

在进行任何文件迁移之前,首先停止MySQL服务

systemctl stop mysqld
复制

6 移动数据文件

6.1确定新的磁盘路径

确保您已经挂载了新的磁盘,并记住新磁盘的挂载路径,例如/data

6.2 移动数据文件

使用rsync命令将MySQL数据文件复制到新的磁盘:

rsync -av /mysqldata/ /newdata/
复制

这将在新的磁盘上创建与原始数据相同的目录结构。

6.3 设置权限

查看权限

[root@trexdb1 ~]# ll /newdata/ total 4 drwxr-xr-x 2 mysql mysql 59 Jan 23 15:59 binlog drwxr-xr-x 8 mysql mysql 4096 Jan 23 16:11 data drwxr-xr-x 2 mysql mysql 24 Nov 15 21:16 log
复制

如果新磁盘的权限不正确,确保更新权限

chown -R mysql:mysql /newdata
复制

7 更新MySQL配置文件

7.1 打开MySQL配置文件

vi /etc/my.cnf
复制

7.2 更新以下配置项,将数据文件路径指向新磁盘路径

datadir=/newdata/data socket=/newdata/mysql.sock pid-file=/newdata/mysqld.pid log-error=/newdata/log/mysqld.log log_bin = /newdata/binlog/mysql-binlog [client] socket=/newdata/mysql.sock
复制

请根据你的实际环境进行修改,确保路径是正确的,并且 mysql 用户对新路径有适当的权限。

8 启动MySQL服务

然后启动MySQL服务:

systemctl start mysqld
复制

9 验证

9.1 检查MySQL的错误日志

tail -200f /newdata/log/mysqld.log
复制

确保没有启动错误

9.2 通过MySQL客户端连接到数据库

mysql -u root -p
复制

查看数据目录的路径

mysql> show variables like 'datadir'; +---------------+-------------+ | Variable_name | Value | +---------------+-------------+ | datadir | /newdata/data/ | +---------------+-------------+ 1 row in set (0.04 sec)
复制

9.3 删除旧的数据目录

业务测试确认正常后,可以删除旧的 mysql 数据目录

rm -rf /mysqldata/
复制

10 总结

通过这次迁移,新磁盘的部署使得数据库性能获得了显著的提升。成功地解决了磁盘IO性能瓶颈而导致的业务问题。

image.png

END

最后修改时间:2024-02-06 09:57:33
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论

TA的专栏
MySQL
收录4篇内容
openGuass
收录33篇内容
海量数据库vastbase
收录5篇内容
目录
  • 环境概要
  • 操作开始
    • 1 上架新磁盘到服务器
      • 1.1 查看系统是否检测到了新磁盘
      • 1.2 分区
      • 1.3 格式化的分区并挂载目录
      • 1.4 配置自动挂载
    • 2 查看配置文件
    • 3 查看数据目录的路径
    • 4 备份数据库
    • 5 停止MySQL服务
    • 6 移动数据文件
      • 6.1确定新的磁盘路径
      • 6.2 移动数据文件
      • 6.3 设置权限
    • 7 更新MySQL配置文件
      • 7.1 打开MySQL配置文件
      • 7.2 更新以下配置项,将数据文件路径指向新磁盘路径
    • 8 启动MySQL服务
    • 9 验证
      • 9.1 检查MySQL的错误日志
      • 9.2 通过MySQL客户端连接到数据库
      • 9.3 删除旧的数据目录
    • 10 总结
  • END