mysql 数据库的符号链接

Joh*_*ohn 6 mysql linux permissions file-permissions

我必须在一个数据库上建立一个符号链接到 MySQL (Debian 6.0) 上的另一个位置。所以/var/lib/mysql/dbname指向/home/user/dbname,但 MySQL 给出

MySQL 错误:1017(找不到文件:'./dbname/tbl201206.frm'(错误号:13))

我已经阅读了一些关于在数据目录或表文件上建立符号链接的手册,但是 mysqld 也可以读取这种链接吗?

Lad*_*ada 5

错误代码(errno: 13)表示权限被拒绝。检查mysql用户是否具有读写权限/home/user/dbname及其下的所有文件。

您可以使用sudo su mysql,然后使用一些访问文件的命令来执行此操作,例如file /home/user/dbname/tbl201206.frm.

要修复它,您可能想要执行chown -R mysql:mysql /home/user/dbname. 您可能还需要chmod +x /home/user.


小智 5

如果您正在运行 Ubuntu(可能还有其他最新的 Linux 版本),那么即使文件权限正确,MySQL 也可能被拒绝访问您的文件位置。这是由AppArmor引起的,这是一个实现基于名称的强制访问控制的 Linux 安全模块。要检查您是否正在运行 AppArmor,请尝试以下命令:

$ sudo apparmor_status
Run Code Online (Sandbox Code Playgroud)

如果这有效并且包括 mysqld,您可能需要更改您的配置。这已在anol 在 AskUbuntu有用帖子中进行了描述,但这只是乍一看才解决了我的问题(为了方便起见,我在下面复制了 andol 的帖子,以防其他页面发生变化)。

移动数据库文件并放置符号链接后,该文件没有进一步增长,而是写入了主 InnoDB 文件(即使我确实使用innodb_file_per_table过单独的 DB 文件)。我现在假设andol(以及网络上的许多其他地方)在帖子中建议的更改实际上是不够的。我最终移动了我的整个 MySQL 数据目录并编辑了 AppArmor 文件/etc/apparmor.d/tunables/alias(而不是其他文件)来进行移动(文档在文件中)。这在 Ubuntu 12.4(精确)上正常工作。


这是andol写的——正如我上面所说,这对我不起作用。

让我们假设您的新 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)