SHO酱的Blog

SHO酱的Blog

记一次 MySQL 服务硬盘扩容

2023-12-08
记一次 MySQL 服务硬盘扩容

版本说明

  • 操作系统:CentOS 7.9

  • MySQL:8.0.35

背景介绍

MySQL 8 数据库所在的服务器磁盘已经被数据文件和binlog文件撑爆了,云服务器通过添加磁盘的方式给服务器扩容,详细记录磁盘扩容的整个过程。

操作步骤

磁盘挂载

  • 查看新磁盘名称

$> lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0  100G  0 disk 
├─sda1   8:1    0  300M  0 part /boot
├─sda2   8:2    0    2G  0 part [SWAP]
└─sda3   8:3    0 97.7G  0 part /
sdb      8:16   0    1G  0 disk    		< 这里是新添加的磁盘
sr0     11:0    1 1024M  0 rom  
  • 新建分区

$> fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x6865ddf7.

Command (m for help): n					< 输入n新建分区
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p					< 输入p建立主分区
Partition number (1-4, default 1): 		< 其余默认就好 ...
First sector (2048-2097151, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-2097151, default 2097151): 
Using default value 2097151
Partition 1 of type Linux and of size 1023 MiB is set

Command (m for help): w					< 输入w保存
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
  • 再次输入 lsblk 查看

$> lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0  100G  0 disk 
├─sda1   8:1    0  300M  0 part /boot
├─sda2   8:2    0    2G  0 part [SWAP]
└─sda3   8:3    0 97.7G  0 part /
sdb      8:16   0    1G  0 disk
└─sdb1   8:17   0 1023M  0 part 		< 新分好的磁盘区在这里
sr0     11:0    1 1024M  0 rom  
  • 格式化分区

$> mkfs.ext4 /dev/sdb1
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 261888 blocks
13094 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
  • 挂载分区

$> mkdir /test
$> mount /dev/sdb1 /test
$> lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0  100G  0 disk 
├─sda1   8:1    0  300M  0 part /boot
├─sda2   8:2    0    2G  0 part [SWAP]
└─sda3   8:3    0 97.7G  0 part /
sdb      8:16   0    1G  0 disk 
└─sdb1   8:17   0 1023M  0 part /test		< 已经挂载好啦
sr0     11:0    1 1024M  0 rom  
  • 自动挂载磁盘,通过UUID挂载

$> blkid /dev/sdb1
/dev/sdb1: UUID="72668e39-d36a-4ca7-9318-ff609b79c4ac" TYPE="ext4"
$> vi /etc/fstab
---------
UUID=72668e39-d36a-4ca7-9318-ff609b79c4ac /test       ext4    defaults        0 0	< 添加并保存

两套方案

方案一:通过文件夹软链接替换数据目录

  • 停止 MySQL 服务

/etc/init.d/mysql stop
# 或
systemctl stop mysqld
  • 拷贝 MySQL 的数据目录到新的位置

cp -R /usr/local/mysql/data/ /data/mysql/
  • 将原有的数据目录修改名称

mv /usr/local/mysql/data/ /usr/local/mysql/data_bak/
  • 因为当前使用 root 用户操作,所以拷贝后的数据目录为 root 用户和用户组所有,此处修改目录的所有者权限,赋给 mysql 用户和用户组

chown -R mysql.mysql /data/mysql/data
  • 通过链接命令在 MySQL原有数据目录位置创建目录软链接

ln -s /data/mysql/data/ /usr/local/mysql/data
  • 启动 MySQL 服务

/etc/init.d/mysql start
# 或
systemctl start mysqld

方案二:重新配置 MySQL

  • 停止 MySQL 服务

/etc/init.d/mysql stop
# 或
systemctl stop mysqld
  • 拷贝整个 MySQL 目录到新的位置

cp -R /usr/local/mysql /data/mysql/
  • 修改目录的所有者权限,赋给 mysql 用户和用户组

chown -R mysql.mysql /data/mysql/
  • 修改 MySQL 配置文件 my.cnf,将文件中的`/usr/local/mysql`替换为新的位置`/data/mysql/`

cp /etc/my.cnf /etc/my.cnf.bak

vi /etc/my.cnf
  • 修改 MySQL 启动脚本文件,同样将文件中的`/usr/local/mysql`替换为新的位置`/data/mysql/`

cp /etc/init.d/mysqld /etc/init.d/mysqld.bak

vi /etc/init.d/mysqld
  • 启动 MySQL 服务

/etc/init.d/mysql start
# 或
systemctl daemon-reload
systemctl start mysqld

参考

Linux下查看用户列表

Linux挂载新磁盘详细教程

如何正确的删除软连接

Linux下通过软链接转移mysql目录,解决分区空间不足

MySQL更换磁盘位置