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

将 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

...并将datadir设置更改/etc/mysql/my.cnf/var/lib/mysql2

my.cnf(如果我保持原样并创建一个名为 mysql2 的符号链接指向 mysql,我会得到相同的结果。)

这有点令人困惑。文件权限是确切地在复制的数据目录中也一样。显然,我在进行这些更改之前会停止/启动守护进程(sudo service mysql stop等等)。知道我做错了什么吗?

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

(实际上,我想将 MySQL 数据移动到另一个 EBS 卷,移动到诸如/mnt/data/mysql或 之类的路径/data/mysql,但上述最小场景足以重现该问题。)

答案1

您遇到了 AppArmor 规则,该规则禁止 MySQL 打开您放置的文件。如果您检查系统日志文件,您会发现一条神秘的错误消息。

解决方案包括:

  1. 禁用 AppArmor(不推荐)

  2. 编辑 AppArmor 规则(复杂)

  3. 使用 mount bind 使 MySQL 认为您的数据文件位于原始位置,而实际上它们位于 EBS 卷上。将您的更改还原为datadir

几年前,我为亚马逊写了一篇文章,描述了社区的最佳实践,其中包括挂载绑定示例:

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

请注意,文章中的 AMI id 是旧的。使用现代 Ubuntu AMI,您需要在 mkfs.xfs 和 /etc/fstab 中将 /dev/sdh 替换为 /dev/xvdh(但不要在 ec2 工具命令行中替换)。

答案2

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

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

答案3

尝试编辑你的/etc/apparmor.d/local/usr.sbin.mysqld文件并输入以下几行:

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

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

相关内容