如何将 MySQL 数据文件移动到不同的分区?

Ste*_* RC 28 mysql

我的硬盘驱动器分为两个分区,所以我可以轻松地重新安装 Ubuntu 并尝试不同的版本,而不会丢失我的主目录数据。它是这样设置的:

20GB  -> /     (root)
180GB -> /home 
Run Code Online (Sandbox Code Playgroud)

我做了很多开发工作,所以我的/var/www文件夹符号链接到/home/valorin/workspace.

但是我也想用我的 MySQL 数据文件来做这个,因为我很恼火,每次我重新安装我的机器时,我需要做一个完整的 SQLdump,然后在我可以做更多的工作之前恢复所有的数据库。

在不破坏 MySQL 的情况下做到这一点的最佳方法是什么?

and*_*dol 29

嗯,实际上这个问题有一个潜在的 Ubuntu 特定答案。

正如 Gergoes 链接所提到的,这基本上是关于修改/etc/mysql/my.cnf并在[mysqld]部分为datadir =设置一个新值。到目前为止,答案的非特定部分。

假设你正在运行一个有点现代的 Ubuntu 版本,你很可能默认安装了AppArmor,在强制模式下有一个/usr/sbin/mysqld的配置文件。该默认配置文件很可能不接受您的新数据目录。

让我们假设您的新 datadir 将是/home/data/mysql

如果您打开文件/etc/apparmor.d/usr.sbin.mysqld,您将在规则中找到这两行。

/var/lib/mysql/ r,
/var/lib/mysql/** rwk,
Run Code Online (Sandbox Code Playgroud)

假设我们上面的例子,它们将不得不被这两行替换或(可能更可取)补充。

/home/data/mysql/ r,
/home/data/mysql/** rwk,
Run Code Online (Sandbox Code Playgroud)

在我们可以使用新的数据目录启动我们的 MySQL 服务器之前,我们还必须明确地重新加载我们的新 apparmor 配置文件。

$ sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld
Run Code Online (Sandbox Code Playgroud)


nel*_*aro 5

超级用户有关于如何解决此问题的分步说明

这是另一组关于做同样事情的指令 http://www.ubuntugeek.com/how-to-change-the-mysql-data-default-directory.html

这里重新发布一下。如果可以的话,请为超级用户投票。

在对权限进行了一些普遍的困惑之后,我意识到问题不是我没有正确的权限和路径,而是 AppArmor 阻止 mysql 读取和写入新位置。

这是我的解决方案:

首先停止 MySQL,这样当你摆弄时就不会发生任何奇怪的事情:

$ sudo stop mysql
Run Code Online (Sandbox Code Playgroud)

然后将所有数据库目录移动到新目录:

$ sudo mv /var/lib/mysql/<all folders> /new-mysql-dir/
Run Code Online (Sandbox Code Playgroud)

不要移动文件,它们将由mysql生成,只需移动文件夹(即数据库)。

然后礼貌地请求 AppArmor 允许 mysql 使用新文件夹:

$ sudo vim /etc/apparmor.d/usr.sbin.mysqld
Run Code Online (Sandbox Code Playgroud)

添加行:

/new-mysql-dir/ r,
/new-mysql-dir/** rwk,
Run Code Online (Sandbox Code Playgroud)

然后告诉mysql datadir已经移动了:

$ sudo vim /etc/mysql/my.cnf 
Run Code Online (Sandbox Code Playgroud)

更改行:

datadir=/var/lib/mysql
Run Code Online (Sandbox Code Playgroud)

到:

datadir=/my-new-db-dir/
Run Code Online (Sandbox Code Playgroud)

注意:根据您的数据库设置,您可能还需要更改 innodb-data-home-dir 等。

然后重新启动AppArmor以读取新设置:

$ sudo /etc/init.d/apparmor restart
Run Code Online (Sandbox Code Playgroud)

并使用新的 datadir 再次启动 MySQL:

$ sudo start mysql
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!