Skip to content

MySQL 数据存储目录迁移

这里首先需要把服务器挂载云盘, 然后对停服, 移库, 重启, 启动服务器

挂载云盘

阿里云 : 挂载云盘

云盘写入 fstab 之后需要测试下是否能够正常挂载, 使用命令 mount -a

阿里云 : 格式化数据盘

服务器启停

这里由于使用的是 Laravel 框架, 需要使用 Laravel 的命令对服务器进行友好一些的启动和停止

$ php artisan down
$ php artisan up

Mysql 的Data 数据迁移

数据库文件随着使用会逐渐变大,有时根据需求,需要更改数据库的默认数据目录。 环境说明 CentOS 7(Minimal Install)

$ cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)

CentOS 7 安装 MySQL,请参考 CentOS 7 安装 nginx,php, mysql, redis,supervisor 套件

本例演示如下

MySQLDirectory描述
old/var/lib/mysql旧的目录
new/storage/mysql新的目录

步骤 1:移动数据文件

准备移动数据文件之前,需要做一些准备工作,先检查一下当前文件目录的位置。登录 MySQL

$ mysql -u root -p

输入 root 的密码,登录 MySQL。之后出现 mysql 的提示符,然后进行查看。

mysql> select @@datadir;
+-----------------+
| @@datadir       |
+-----------------+
| /var/lib/mysql/ |
+-----------------+
1 row in set (0.00 sec)

这表示 MySQL 现在使用的是默认的目录  /var/lib/mysql 。我们需要退出 MySQL

mysql> exit

为了确保移动数据的完整性,我们需要再判断一下服务是否停止。

$ sudo systemctl stop mysqld

之后查看一下状态

$ sudo systemctl status mysqld
. . .
May 10 10:14:10 localhost.localdomain systemd[1]: Stopped MySQL Community Server.

可以看到服务都停止了,我们需要使用  rsync  命令,拷贝数据目录到新的地方,使用  -a  参数保留权限和其他目录的属性,使用  -v 参数跟踪拷贝进度。

注意 确保最后没有斜杠,有时使用 tab 容易带出斜杠

$ sudo mkdir /data
$ sudo rsync -av /var/lib/mysql /storage/mysql

拷贝完成之后,我们将默认目录名进行更改,以防出错可以再次使用,成功之后再删除。

$ sudo mv /var/lib/mysql /var/lib/mysql.bak

这样文件移动完成,接下来开始更改配置

步骤 2:配置

MySQL 默认的目录配置在  /etc/my.cnf  中

$ sudo vi /etc/my.cnf

我们需要更改  [mysqld]  块,更改  datadir  参数和  socket  参数

[mysqld]
. . .
datadir=/storage/mysql
socket=/storage/mysql/mysql.sock
. . .

我们还需要更改  [client]  块的内容,默认是没有  [client]  块的配置的,需要添加上。

[client]
port=3306
socket=/storage/mysql/mysql.sock

这样设置就完成了, :wq  保存并退出,

步骤 3:重启 MySQL 服务

现在我们更改了数据目录的配置,让我们来验证一下。

$ sudo systemctl start mysqld
$ sudo systemctl status mysqld

服务启动没有问题之后,我们登录到 MySQL中

$ mysql -u root -p

输入 root 的密码之后,我们输入如下语句查看:

mysql> select @@datadir;
+----------------------------+
| @@datadir                  |
+----------------------------+
| /data/mysql/               |
+----------------------------+
1 row in set (0.01 sec)

请查看一下数据库,确认一下没有问题之后,可以删除以前的备份。 > 注意 > 如果怕有问题,而且又有空间,可以不删除。

$ sudo rm -Rf /var/lib/mysql.bak

QA

优化数据库数据

mysql> optimize table game_log
mysql> optimize table finance_lock

执行mysql登陆失败

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

解决方案

参考 MySQL 数据存储目录迁移 链接, 设置服务端和客户端的链接方式来解决客户端和服务端链接的问题

bash
[mysqld]
socket=/storage/mysql/mysql.sock

结论

本文演示了 MySQL 更改数据目录,MySQL 还有其他方式更改目录。可以参考: