我正在尝试将 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 打开您放置的文件。如果您检查系统日志文件,您会发现一条神秘的错误消息。
解决方案包括:
禁用 AppArmor(不推荐)
编辑 AppArmor 规则(复杂)
使用 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 重启)