原文地址:《Ubuntu下迁移MySQL数据库文件目录(亲测成功方法)》
原文地址:《Ubuntu下迁移MySQL数据库文件目录(亲测成功方法)》
以下根据自己的情况,手把手亲测并改写了部分
需求:
将数据库mysql的库文件,转移到大容量的硬盘上
为以后维护和扩容积累些许经验
背景:
1、台机安装了ubuntu,有三块硬盘m2.nvme + SSD + 机械硬盘
2、Ubuntu系统中已安装了mysql,请参看《Ubuntu18.04下安装MySQL,删除卸载MySQL,及四个重要文件夹介绍,Win下安装Navicat》
3、计划把mysql的库文件转移到机械硬盘上
4、当前mysql Ver 14.14 Distrib 5.7.33
其它:ubuntu下挂载硬盘的方法,请参看《随笔:Ubuntu挂载新硬盘》
其它:postgresql的迁移,请参看《手把手:ubuntu下将postgresql数据库从默认存储位置 迁移到 其它指定的位置》
大致步骤:
一)、确定mysql数据库文件存放目录
二)、迁移数据库文件到新的目录下
三)、修改配置文件
四)、重启数据库
五)、其它:权限问题
若要查询mysql的版本,可直接在终端对话框中,输入:sudo mysql --version
一)、先查询mysql库文件的安装位置
这有2个方法,一种方法是通过mysql的show命令列出datadir的值,另一种是通过mysql配置文件中datadir的值来确定位置。注意:不同版本的mysql的配置文件名可能会不同。
方法一:通过mysql的show命令列出datadir的值
1.1.1)终端窗口中,依次执行(文档是后补的,datadir已被修改过了):
mysql -u root -p
show variables like 'datadir';
quit;
方法二:通过mysql配置文件中datadir的值来确定位置
1.2.1)先查询mysql的安装路径(一般情况是在/etc/mysql中),在终端中执行:
sudo find / -name mysql
1.2.2)访问/etc/mysql并列出文件
cd /etc/mysql && ls -l
my.cnf是软链接文件至其他处,一路查下来,最终还是回到了文件/etc/mysql/mysql.conf.d/mysqld.cnf
1.2.3)查看mysql.cnf文件
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
大约在36行,可见:datadir = /var/lib/mysql,这是当前库文件存放地址(等会更改)。
二)、迁移mysql库文件到新目录下
2.1)停止MySQL服务
sudo service mysql status
sudo service mysql stop
sudo service mysql status
2.2)查询下原库文件所在目录的权限,留着备用。防止万一碰到权限问题,会回头对比。(不一定用的到)
sudo ls -al /var/lib/mysql
2.3)迁移mysql库文件
有两种方法,分别是mv和cp。
2.3.1)方法一:sudo mv
sudo mv /var/lib/mysql /mnt/Disk320/mysql/
mv命令将原数据库目录文件移动到新的目录,不会修改原数据库文件的权限,以及用户和用户组归属。缺点是库文件过大的话,在移动过程中发生点意外,可以跑路了。
2.3.2)方法二:sudo cp -a
sudo cp -a /var/lib/mysql /mnt/Disk320/mysql/
cp -a是防止万一迁移失败,恢复工作很简单;等迁移成功后,将旧位置的库文件删除。参数-a是为了保留复制过来数据库目录文件权限和用户用户组归属问题(mysql数据库创建的mysql用户和mysql用户组)。
三)、修改配置文件
注意:在这步中,不同的mysql版本,修改的内容不同。低版本的,一般只要修改my.cnf即可;高版本的要修改多个文件。
3.1)修改mysqld.cnf
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
大约在36行,将datadir = /var/lib/mysql,修改为你需要的地址,例如:datadir = /mnt/Disk320/mysql
保存,退出
3.2)修改usr.bin.mysqld
由于Ubuntu使用了apparmor安全模块,就是类似于沙盒运行的一种机制,它可以限制软件在运行时的一些行为,比如对哪些目录和文件可以读写加锁等等。
由于修改了数据库文件路径,所以要修改mysql数据库的apparmor配置文件,在其中将新数据库文件目录和文件的读写及加锁权限添加上去,同时可以删除或者注释掉原先/var/lib/mysql数据库文件目录的权限。
sudo vim /etc/apparmor.d/usr.sbin.mysqld
找到下面的2行(旧库文件位置),大约在56、57行
/var/lib/mysql/ r,
/var/lib/mysql/** rwk,
将这两行加上#注释掉。写入新路径的权限声明:
/mnt/Disk320/mysql/ r,
/mnt/Disk320/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 service mysql start
sudo service mysql status
五)、其它:权限问题(我没遇到这个问题,因为我曾执行过chmod)
sudo chmod 755 /mnt/Disk320
下面是详细判断过程,转载来自原博客(我没遇到该问题)。若经上诉步骤之后,你有可能数据库无法启动。忽略、继续登录数据库后出现下面类似的关于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/Disk320/mysql所属的用户和用户组都还是mysql。
因此可以肯定mysql用户具备读写/mnt/Disk320/mysql的权限,但是这并没有保证上级目录/mnt/Disk320和上上级目录/mnt也具备让mysql用户读取的权限。如果mysql用户不具备上级目录/mnt/Disk320和上上 级目录/mnt的读取权限,mysql用户一样读写不了自己的/mnt/Disk320/mysql目录,因此就会出现上面的问题。
sudo ls -al /var/lib/mysql可以过头来看看原本数据库文件目录/var/lib/mysql的结构:
可以看出原本数据库文件目录/var/lib/mysql的上级目录/var/lib属于虽然属于root用户,但是它为同组用户和其它组用户都开放了’r'和‘x'权限,所以即使上级目录不属于mysql用户,mysql用户同样也能正常进入并访问到自己的数据库文件。你可以查下新库文件所在的目录权限,例如:sudo ls -al /mnt/Disk320,与原权限对比下。
解决这个问题的方法说起来就是这么简单,只要保证mysql用户具备最终数据库文件目录的所有上级目录的'r'和‘x'权限就可以了。
例如,使用下面命令修改本文中/mnt/Disk320的权限:
sudo chmod 755 /mnt/Disk320
再上级目录/mnt是系统目录,归属于root用户,root用户默认的目录的权限都是755,所以不用修改。
权限修改后再次启动数据库,即可
sudo service mysql start
原文地址:《Ubuntu下迁移MySQL数据库文件目录(亲测成功方法)》
以上根据自己的情况,手把手亲测并改写了部分