将MySQL数据移动到另一个目录

我试图将MySQL安装的数据文件移动到另一个地方,但它不会工作。

当试图启动mysqld,我得到这在/var/log/mysql/error.log

 110922 7:27:40 [Note] Plugin 'FEDERATED' is disabled. /usr/sbin/mysqld: Can't find file: './mysql/plugin.frm' (errno: 13) 110922 7:27:40 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it. 110922 7:27:40 InnoDB: Initializing buffer pool, size = 512.0M 110922 7:27:40 InnoDB: Completed initialization of buffer pool 110922 7:27:40 InnoDB: Operating system error number 13 in a file operation. InnoDB: The error means mysqld does not have the access rights to InnoDB: the directory. InnoDB: File name ./ibdata1 InnoDB: File operation call: 'open'. InnoDB: Cannot continue operation. 

即使我尝试一些无辜的事情,也会发生上述情况:

 sudo cp -a /var/lib/mysql /var/lib/mysql2 

…并将/etc/mysql/my.cnfdatadir设置更改为/var/lib/mysql2

(如果我离开my.cnf ,就会得到相同的结果,并创build一个名为mysql2的符号链接指向mysql。)

这有点令人困惑。 复制的数据目录中的文件权限完全相同 。 显然,我正在停止/启动守护进程之前做这些更改( sudo service mysql stop等) 任何想法我做错了什么?

这是Amazon EC2上的Ubuntu 11.04(64位m1.large实例)。

(实际上,我想将MySQL数据移动到另一个EBS卷,到/mnt/data/mysql/data/mysql类的path,但上面的最小情况足以重现此问题。)

您正在运行AppArmor规则,该规则禁止MySQL在您放置文件的位置打开文件。 如果你检查你的系统日志文件,你会发现一个神秘的错误消息来达到这个效果。

解决scheme包括

  1. 禁用AppArmor(不推荐)

  2. 编辑AppArmor规则(复杂)

  3. 使用mount bind来让MySQL认为你的数据文件在EBS卷上的时候是在原来的位置。 将您的更改恢复到datadir

我为亚马逊写了一篇文章,描述了您正在尝试做什么的社区最佳实践,包括挂载绑定示例:

在Amazon EC2上使用EBS运行MySQL
http://ec2ebs-mysql.notlong.com

请注意,文章中的AMI id是旧的。 使用现代的Ubuntu AMI,您需要用/ dev / sdhreplacemkfs.xfs和/ etc / fstab(而不是ec2工具命令行)中的/ dev / xdh。

InnoDB:错误意味着mysqld没有对目录的访问权限。

 sudo chown -R mysql:mysql /var/lib/mysql2/ 

尝试编辑你的/etc/apparmor.d/local/usr.sbin.mysqld文件,并把这些行:

 /var/lib/mysql2/ r, /var/lib/mysql2/** rwk, 

并重新启动服务( /etc/init.d/mysql restart