MySQL默认把数据库文件保存到/var/lib/mysql目录,由于磁盘空间耗尽,我需要把数据库文件迁移到外部存储(挂载点/mnt/disk1)。
查看MySQL数据的存储目录:
$ mysql -u root -p
mysql> select @@datadir;
把MySQL数据目录移动到新目录(Ubuntu 16.04)
在移动之前先停止MySQL服务:
$ sudo systemctl stop mysql
复制MySQL数据目录:
$ sudo rsync -av /var/lib/mysql /mnt/disk1
rsync是同步命令,它把/var/lib/mysql目录拷贝到了/mnt/disk1/mysql目录,-a选项指定要保留所有文件和目录的权限。
备份原数据目录:
$ sudo mv /var/lib/mysql /var/lib/mysql_bakup
配置MySQL:
$ sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
把datadir的值改为/mnt/disk1/mysql:
最后,还需要配置AppArmor访问规则。如果不配置AppArmor会出现如下错误:
Job for mysql.service failed because the control process
exited with error code. See "systemctl status mysql.service"
and "journalctl -xe" for details.
配置AppArmor:
$ sudo vim /etc/apparmor.d/tunables/alias
在文件尾添加:
alias /var/lib/mysql/ -> /mnt/disk1/mysql/,
重启AppArmor:
$ sudo systemctl restart apparmor
启动MySQL:
$ sudo mkdir -p /var/lib/mysql/mysql
$ sudo systemctl start mysql
我们需要创建默认的数据目录,因为MySQL在启动时还会检查默认数据目录是否存在。
查看MySQL数据目录:
mysql> select @@datadir;
+--------------------+
| @@datadir |
+--------------------+
| /mnt/disk1/mysql/ |
+--------------------+
1 row in set (0.00 sec)
完成。