13

当我尝试通过 putty 恢复 MYSQL 中的数据库时,会发生以下错误。

命令: mysql -u root -p db1<dbname.sql ;

第 7904 行的错误 1 ​​(HY000):无法创建/写入文件 ' ./dbname /db.opt ' (Errcode: 2)

是什么原因?

4

5 回答 5

14

这通常意味着您的转储文件包含一个命令,该命令应针对本地上下文中不存在或当前用户无权访问的数据库运行。打开转储文件并查看错误中提到的行以了解发生了什么。

于 2013-01-16T19:46:50.230 回答
10

当源数据库名称与目标数据库名称不同时,我在工作中遇到了这个错误。我在一台服务器上转储了一个数据库,mysqldump db1 > dumpfile并尝试在另一台服务器上使用mysql db2 < dumpfile.

原来转储文件的ALTER TABLE db1 ...语句在我将数据库命名为 db2 的目标服务器上毫无意义。

可能有比这更优雅的解决方案,但我只是在目标服务器上编辑了转储文件并将 db1 替换为 db2。

于 2016-05-10T16:35:46.937 回答
2

找出是什么Errcode: 2意思

您可以使用该perror实用程序查找错误 2 的含义:

$ perror 2
OS error code   2:  No such file or directory

更多信息在他们评论中提到的链接@Jocelyn:http: //dev.mysql.com/doc/refman/5.5/en/cannot-create.html

找出路径./指向什么

我们现在知道文件不存在(或者它可能无法写入。)错误消息为我们提供了一个相对路径./,这使得它变得棘手......如果它输出一个完全限定的路径会不会有帮助? 是的。

因此,当 MySQL 导入 SQL 文件时,它会在文件系统上创建一些临时文件。该路径通常由 MySQLmy.cnf文件中的“tmpfile”配置选项指定。您可以通过执行 SQL 查询快速找到该值:

$ mysql -h127.0.0.1 -uroot -p
# I assume you're now logged into MySQL
mysql> SHOW VARIABLES LIKE '%tmpdir%';

+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| slave_load_tmpdir | /tmp  |
| tmpdir            | /tmp  |
+-------------------+-------+
2 rows in set (0.00 sec)

确保目录可由mysql用户写入

根据 tmpdir 这意味着 MySQL 试图创建/tmp/dbnamehere/db.opt. 确保此目录存在并且归mysql:mysql. 您可能必须使用sudo将权限提升到足够高才能创建一些目录。

$ chown -R mysql:mysql /tmp/dbnamehere

还是行不通?尝试其他默认 tmpdir 路径

我在我的系统上遇到了问题(Ubuntu 12.04 + Vagrant 1.7.2 + Chef 11.something + opscode mysql cookbook 6.0.6),其中的值tmpdir没有被考虑或没有从我预期的地方拉出来。

MySQL 实际上试图在以下位置之一创建临时文件:

  • /var/lib/mysql/dbname这里
  • /var/lib/mysql-default/dbnamehere

我必须创建这些目录并将所有权更改为 mysql:mysql。

于 2015-01-09T17:11:32.813 回答
2

我从“db1”备份并恢复到“db2”,所以在转储文件中必须使用 sed 将“db1”更改为“db2”。

一切都很好。

于 2020-02-20T07:30:08.600 回答
0

您可以在 MySQL 手册中找到有关此错误的帮助:http: //dev.mysql.com/doc/refman/5.5/en/cannot-create.html

于 2012-06-04T10:28:46.887 回答