如何移动MySQL数据目录?


57

我试图将MySQL数据库的数据目录移动到作为挂载点的第二个磁盘阵列中/array2/

我遇到的问题是我已经尝试了所有方法,并且修改了my.cnf中datadir的位置后,mysql无法再次启动。

我得到的是:

start: Job failed to start

Answers:


62

忘记了应用程序防护。

对于感兴趣的任何人,我都执行了以下操作来移动文件夹。

停止mysql服务器:

stop mysql

创建新目录:

mkdir /array2/mysql

仅复制数据库文件夹:

cp -R /var/lib/mysql /array2/mysql
cp -R /var/lib/mysql/users /array2/mysql

备份my.cnf文件:

cp /etc/mysql/my.cnf /root/my.cnf.backup

编辑my.cnf文件:

nano /etc/mysql/my.cnf

将所有对旧数据目录和套接字的提及更改为新位置

我的成为:

datadir=/array2/mysql
socket=/array2/mysql/mysql.sock

更新目录权限:

chown -R mysql:mysql /array2/mysql

重命名旧目录:

mv /var/lib/mysql /var/lib/mysql-old

创建一个符号链接,以防万一:

ln -s /array2/mysql /var/lib/mysql 

让AppArmor知道新的数据目录:

echo "alias /var/lib/mysql/ -> /your/new/datadir/," >> /etc/apparmor.d/tunables/alias

重新加载apparmor配置文件

sudo /etc/init.d/apparmor reload

然后启动mysql:

start mysql

这是一个很好的答案,但是您可能还需要一个步骤来允许客户端连接到mysql。在其下添加一行新的组... [clients] socket = / array2 / mysql / mysql.sock,其中socket =部分指向mysql.sock文件的新位置。
猫头鹰

1
如果你不想被人打扰要合并的/etc/apparmor.d/usr.sbin.mysqld每一个MySQL的接收的更新时间,你可以添加/array2/mysql/** rwk,/etc/apparmor.d/local/usr.sbin.mysqld代替。Mysql仍然可以访问旧数据目录,但这可能不是问题。
drevicko

sed -i "s,datadir.*=.*,datadir=$new_dir,g" /etc/mysql/my.cnf。为什么只使用数据库文件夹?
2014年

对于任何人将他们的datadir到ZFS(像我一样),请确保您还添加:innodb_use_native_aio=0[mysqld]你的部分my.cnf文件,因为在Linux上ZFS不支持AIO。dev.mysql.com/doc/refman/5.5/en/...
安德鲁Ensley先生

23

通过检查syslog,我发现AppArmor是罪魁祸首,并且mysql通过执行此过程能够成功更改数据位置。

请注意,在下面编辑的文件中,+添加了以开头的行,-并删除了以开头的行。+在向这些文件添加行时,您实际上不应键入/粘贴符号。

我将mysql目录克隆到新位置:

sudo rsync -av /var/lib/mysql /new_dir

然后我在中编辑了这一datadir/etc/mysql/my.cnf

sudo vi /etc/mysql/my.cnf
-datadir     = /var/lib/mysql
+datadir     = /new_dir/mysql

然后我编辑/etc/apparmor.d/usr.sbin.mysqld

sudo vi /etc/apparmor.d/usr.sbin.mysqld
-  /var/lib/mysql/ r,
-  /var/lib/mysql/** rwk,
+  /new_dir/mysql/ r,
+  /new_dir/mysql/** rwk,

然后我重新启动mysql


13

意识到。

如果您有InnoDB表,则必须复制ibdata*ib_logfile*文件,否则将无法使用这些表。你会得到:

'表'databaseName.tableName'不存在'

错误。

运行此复制命令以复制ibdata*ib_logfile*文件。

sudo cp -p /var/lib/mysql/ib* /array2/mysql/

这应该是评论,不是一个完整的答案
Postadelmaga

4

我只是尝试了另一种方法,所以有些方法可能会有用:

复制并保留完整权限:

rsync -avzh /var/lib/mysql /path/to/new/place

备份(以防万一)

mv /var/lib/mysql /var/lib/_mysql

在旧位置创建一个新的空目录:

mkdir /var/lib/mysql

绑定将新位置安装到旧位置:

mount -B /path/to/new/place /var/lib/mysql

希望对别人有帮助,因为符号链接对我不起作用,这是最简单的方法


3

如果移动数据目录,则不仅需要赋予新的数据目录权限,还需要确保所有父目录都具有权限。

我将datadir移到了一个安装在Ubuntu中的硬盘驱动器上,如下所示:

/media/*user*/Data/

而我的datadir是Databases

我必须将每个媒体,用户和数据目录的权限设置为771 :

sudo chmod 771 *DIR*

如果这不起作用,则使mysql工作的另一种方法是将/etc/mysql/my.cnf中的用户更改为root。尽管从安全的角度来看这样做无疑存在一些问题。


2

我更喜欢将mount与bind选项一起使用,这样可以避免Apparmor和Mysql配置中的任何进一步更改。


例如:

假设我想将所有内容移入/var/www。可以说这个目录是我的开发环境,它挂载在另一个分区中

  1. 首先,我们需要停止mysql

    sudo systemctl stop mysql.service
    
  2. 我们移动文件(保留权限)

    sudo rsync -av /var/lib/mysql /var/www
    

    这将生成一个/var/www/mysql/包含所有内容的目录。

  3. 我们删除旧目录中的所有内容:

    sudo rm -r /var/lib/mysql/*
    
  4. 我们在旧目录中安装带有bind选项的新目录。
    编辑/etc/fstab并添加以下行:

    /var/www/mysql /var/lib/mysql  none  bind 0 0
    

    这将挂载到/var/www/mysql我们空的目录中/var/lib/mysql
    bind这里的选项很神奇,它将填充mysql和apparmor /var/lib/mysql的内容,/var/www/mysql就像什么都没有改变一样。

  5. 现在我们进行安装:

    sudo mount -a
    

    并重启mysql。


0

您意识到,如果从接受的答案中逐字遵循命令,它将失败吗?

cp -R / var / lib / mysql / array2 / mysql

将/ var / lib / mysql复制到/ array2 / mysql / mysql。

设置配置文件时,最好将/ array2 / mysql / mysql作为目录放置,否则mysqld将无法启动。

更好的复制命令是:

cp -R / var / lib / mysql / array2 / cp -R / var / lib / mysql / users / array2 / mysql

只值我的2美分。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.