原文地址:《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表转移到gaussdb mysql迁移到gaussdb_库文件

方法二:通过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

mysql表转移到gaussdb mysql迁移到gaussdb_数据库_02

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
    保存,退出

mysql表转移到gaussdb mysql迁移到gaussdb_mysql_03

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,
    保存,退出

mysql表转移到gaussdb mysql迁移到gaussdb_mysql_04

3.3)修改abstractions/mysql
    由于usr.bin.mysqld文件中引用了abstractions/mysql文件,也就是会将abstractions/mysql文件中的权限声明导入进来。因此,也修改下这个文件:
    sudo vim /etc/apparmor.d/abstractions/mysql
    同样也是将新数据库文件路径中的socket文件权限添加进去,同时可以删除或者注释掉全路径中申请的权限,效果如图:
    保存,退出

mysql表转移到gaussdb mysql迁移到gaussdb_mysql_05

四)、重启数据库
配置文件修改成功后就可以重启数据库,重启数据库之前需要先重新载入apparmor配置文件,使用下面命令重新载入:

    sudo /etc/init.d/apparmor restart
    sudo service mysql start
    sudo service mysql status

五)、其它:权限问题(我没遇到这个问题,因为我曾执行过chmod)

sudo chmod 755 /mnt/Disk320

    下面是详细判断过程,转载来自原博客(我没遇到该问题)。若经上诉步骤之后,你有可能数据库无法启动。忽略、继续登录数据库后出现下面类似的关于sock的错误:

mysql表转移到gaussdb mysql迁移到gaussdb_数据库_06

    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的结构:

mysql表转移到gaussdb mysql迁移到gaussdb_库文件_07

    可以看出原本数据库文件目录/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数据库文件目录(亲测成功方法)》

以上根据自己的情况,手把手亲测并改写了部分