如何移动MySQL数据目录?

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

我遇到的问题是我已经尝试了一切,在我修改my.cnf中的datadir位置后,mysql将无法重新启动。

我得到的只是:

 start: Job failed to start 

忘了app盔甲。

对于任何有兴趣的人,我做了以下移动文件夹。

停止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和套接字的所有提及更改为新位置

我成了:

 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了解新的datadir:

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

重新加载apparmor配置文件

 sudo /etc/init.d/apparmor reload 

然后启动mysql:

 start mysql 

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

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

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

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

然后我编辑了datadir中的datadir行:

 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

意识到。

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

‘表’databaseName.tableName’不存在’

错误。

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

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

我只是尝试了另一种方式,有些人可能觉得有用:

复制权限完整:

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

备份(如果出现问题):

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

创建一个新的空目录来代替旧目录:

 mkdir /var/lib/mysql 

bind将新位置挂载到旧位置:

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

希望能帮到某人,因为符号化对我来说不起作用,这是最简单的方法

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

我将我的datadir移动到硬盘驱动器上,安装在Ubuntu中:

 /media/*user*/Data/ 

我的datadir是数据库

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

 sudo chmod 771 *DIR* 

如果这不起作用,另一种让mysql工作的方法是将/etc/mysql/my.cnf中的用户更改为root; 虽然毫无疑问从安全角度来看这样做有些问题。

我更喜欢使用mount with bind选项,所以我避免在Apparmor和Mysql配置中进行任何进一步的更改。


例如:

假设我想在/var/www移动所有内容。 让我们说这个dir是我的开发环境,它安装在不同的分区中

  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挂载到我们的空dir /var/lib/mysql
    这里的bind选项很神奇,它将使用/var/www/mysql的内容填充/var/lib/mysql ,因此对于mysql和apparmor,它就像没有任何改变。

  5. 现在我们做mount:

     sudo mount -a 

    并重启mysql。

你会意识到,如果你从接受的答案中逐字逐句地遵循这些命令,它将会失败吗?

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美分。