问题:为什么我在使用 tab 选项的 mysqldump 的第二个文件(文本文件)上收到拒绝访问错误?

我正在尝试使用--tab选项在 Ubuntu 上备份 mysql 数据库,使用以下命令:

mysqldump -umy_user my_database -p --tab=/path/to/backup/dir

我输入密码,然后收到以下错误:

mysqldump:出现错误:1045:执行“SELECT INTO OUTFILE”时用户“my_user”@“localhost”的访问被拒绝(使用密码:YES)

密码没问题,File在用户show privileges的列表中。此外,看起来我可以生成 .sql 文件,但它在第一个 .txt 文件上死掉了。一个简单的 .sql 文件的 mysqldump 也可以工作。

运行命令并看到错误后,如果我 ls 备份目录,我会看到一个结构看起来正确的 sql 文件,但在尝试编写表内容的第一个 txt 文件时似乎已经死了。

我提前为转储创建了一个空目录。我尝试将其更改为 777,在此之前我尝试将其更改为mysql:mysql

解答

看起来apparmor是造成这种情况的原因。

由于 mysql 用户具有正确的权限,并且您尝试设置文件权限和所有者,所以剩下的就是 mysql 或文件权限以外的东西。在 Ubuntu 上,这将是 apparmor。

要验证 mysqld 是否生效,请尝试:

> sudo aa-status

...
2 processes are in enforce mode.
/usr/sbin/mysqld (1182)
...

一旦验证,您必须告诉 apparmor 允许 mysqld 写入您的备份目录。权限存放在:/etc/apparmor.d/usr.sbin.mysqld

...
/usr/sbin/mysqld {
    ....
    /run/mysqld/mysqld.sock w,
    /path/to/backup/dir/** w,
}

您可以将写入权限添加到要备份的目录,如上例所示。

仅供参考,这里是除了 apparmor 更改之外所需的目录所有权:

chown -R mysql:mysql /path/to/backup/dir

最后一点说明了为什么第一个文件被写入然后出错,转储文件的所有权并不统一。无论出于何种原因,sql文件归运行命令的shell用户所有,而txt文件归mysql所有:

> ls -al /path/to/backup/dir
...
-rw-r--r-- 1 my_user my_user  1596 Feb  2 01:24 wp_terms.sql
-rw-rw-rw- 1 mysql   mysql    5117 Feb  2 01:24 wp_terms.txt
...
Logo

华为、百度、京东云现已入驻,来创建你的专属开发者社区吧!

更多推荐