用Ubuntu的apt包管理工具安装的mysql数据库,默认将数据库文件保存在/var/lib/mysql目录下,时间久了数据库愈来愈大,因此准备挂载个新的硬盘专门存放mysql数据库。mysql
一、肯定mysql数据库文件存放目录sql
通常默认是在/var/lib/mysql目录下。先登陆本身的mysql数据库,好比我用root帐户登陆,而后使用下面查询语句查询:数据库
show variables like '%dir%';vim
获得数据库文件配置信息:安全
能够看到其中datadir的值为/var/lib/mysql/即为当前数据库文件存放目录。app
另一个basedir参数表示mysql数据库的安装位置,迁移数据库文件位置不须要改动这个参数。socket
二、迁移数据库文件到新的目录下编辑器
先使用下面命令将mysql数据库服务中止:工具
sudo /etc/init.d/mysql stoprest
我新的数据盘挂载在/mnt/data目录下,所以要将数据库迁移到/mnt/data。
2.1 可使用mv命令将原数据库目录文件移动到新的目录,好处是不会简单,不会修改原数据库文件的权限,以及用户和用户组归属:
sudo mv /var/lib/mysql /mnt/data/
2.2 也可使用cp复制命令将原数据库目录文件复制到新的目录,好处是。。万一迁移失败,恢复工做相对简单一点,等确认迁移成功再来删掉原数据库目录文件也不迟。为了避免影响复制过来数据库目录文件权限和用户用户组归属问题,使用cp命令时要加上-a参数:
sudo cp -a /var/lib/mysql /mnt/data/
注:因为/var/lib/mysql目录归属于mysql数据库建立的mysql用户和mysql用户组,因此迁移文件的时候须要使用root权限,命令要使用sudo
迁移成功后,能够看到/mnt/data/目录下已经将mysql数据库文件迁移过来了,而且目录文件的用户用户组归属仍是mysql,没有变化:
三、修改配置文件
一共有三个配置文件须要修改:
3.1 my.cnf文件
mysql数据库会按顺序优先级从/etc/my.cnf、/etc/mysql/my.cnf、/usr/etc/my.cnf、~/.my.cnf四个位置找my.cnf配置文件,一旦找到就再也不继续往下找。Ubuntu默认将my.cnf配置文件放在/etc/mysql/my.cnf位置,因此在/etc/my.cnf位置没有找到这个配置文件。
选择本身使用的文本编辑器编辑my.cnf配置文件,我用vim,因此sudo vim /etc/mysql/my.cnf。同样须要sudo,使用root权限编辑。将其中[mysqld]标签下的datadir属性值改成新数据库目录路径/mnt/data/mysql,如图:
修改后保存并退出。
3.2 usr.bin.mysqld文件
因为Ubuntu使用了apparmor安全模块,就是相似于沙盒运行的一种机制,它能够限制软件在运行时的一些行为,好比对哪些目录和文件能够读写加锁等等。
因为修改了数据库文件路径,因此要修改mysql数据库的apparmor配置文件,在其中将新数据库文件目录和文件的读写及加锁权限添加上去,同时能够删除或者注释掉原先/var/lib/mysql数据库文件目录的权限。mysql数据库的apparmor配置文件路径在/etc/apparmor.d/usr.sbin.mysqld。使用下面命令编辑这个配置文件:
sudo vim /etc/apparmor.d/usr.sbin.mysqld
找到其中的
/var/lib/mysql/ r,
/var/lib/mysql/** rwk,
两行权限声明,能够在前面加上#好注释掉。而后对照格式,加入新路径的权限声明:
/mnt/data/mysql/ r,
/mnt/data/mysql/** rwk,
结果如图:
保存并关闭。
3.3 abstractions/mysql文件
因为usr.bin.mysqld文件中引用了abstractions/mysql文件,也就是会将abstractions/mysql文件中的权限声明导入进来。所以,也修改下这个文件:
sudo vim /etc/apparmor.d/abstractions/mysql
一样也是将新数据库文件路径中的socket文件权限添加进去,同时能够删除或者注释掉全路径中申请的权限,效果如图:
保存后退出。
四、重启数据库
配置文件修改为功后就能够重启数据库,重启数据库以前须要先从新载入apparmor配置文件,使用下面命令从新载入:
sudo /etc/init.d/apparmor restart
重载成功就可使用下面命令启动数据库:
sudo /etc/init.d/mysql start
五、权限问题
通过上诉步骤以后,你有可能数据库没法启动。忽略继续登陆数据库出现下面关于sock的错误:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
查看数据库的启动错误日志,sudo vim /var/log/mysql/error.log,还能看到Table 'plugin' is read only这样的错误:
出现这种状况的缘由仍是在于新数据库文件目录的权限。
mysql数据库启动的时候须要以mysql用户的身份执行,因此mysql用户须要具有能读写数据库文件目录的权限。虽然上面迁移数据库文件的时候不管是使用mv仍是cp -a命令都没有更改mysql目录的用户和用户组,上面也看到了/mnt/data/mysql所属的用户和用户组都仍是mysql。所以能够确定mysql用户具有读写/mnt/data/mysql的权限,可是这并无保证上级目录/mnt/data和上上级目录/mnt也具有让mysql用户读取的权限。若是mysql用户不具有上级目录/mnt/data和上上级目录/mnt的读取权限,mysql用户同样读写不了本身的/mnt/data/mysql目录,所以就会出现上面的问题。
能够过头来看看本来数据库文件目录/var/lib/mysql的结构:
能够看出本来数据库文件目录/var/lib/mysql的上级目录/var/lib属于虽然属于root用户,可是它为同组用户和其它组用户都开放了’r'和‘x'权限,因此即便上级目录不属于mysql用户,mysql用户一样也能正常进入并访问到本身的数据库文件。
解决这个问题的方法提及来就是这么简单,只要保证mysql用户具有最终数据库文件目录的全部上级目录的'r'和‘x'权限就能够了。
例如,使用下面命令修改本文中/mnt/data的权限:
sudo chmod 755 /mnt/data
再上级目录/mnt是系统目录,归属于root用户,root用户默认的目录的权限都是755,因此不用修改。
权限修改后再次启动数据库sudo /etc/init.d/mysql start,应该就能成功启动了。
进入数据库,查看当前路径配置信息:
数据库已经正常启动, 而且数据库文件路径也已经替换到/mnt/data/mysql目标路径,数据库文件迁移成功。