我希望备份一个MySQL数据库。在命令行中输入以下命令时,它可以工作:
SELECT * INTO OUTFILE 'backup.txt' FROM table_name;
创建文件 backup.txt 。一切都很好。
当通过MySQL文件中的MySQL查询提交上述命令时:
mysql_query("SELECT * INTO OUTFILE 'backup.txt' FROM table_name");
它不起作用。 backup.txt 文件未创建。
接下来,查看权限并使用命令行输入以下命令:
GRANT FILE ON *.* TO 'root'@'localhost';
此命令已被接受,但MySQL查询仍无效。
完整的php文件如下所示:
// connect to db host
//mysql_connect(DATABASE_HOST, DATABASE_USERNAME, DATABASE_PASSWORD)
$connection = mysql_connect("localhost", "mysql -u root", "")
or die('Could not connect: ' . mysql_error($connection));
// select db
$db = mysql_select_db("test", $connection);
// change privileges
mysql_query("GRANT FILE ON *.* TO 'root'@'localhost'");
// create query
$query = "SELECT * INTO OUTFILE 'backup.txt' FROM table_name";
//perform query
mysql_query($query);
// close mysql connection
mysql_close($connection);
任何人都可以解释这里发生了什么,以及如何让MySQL查询工作并创建outfile backup.txt 。
正在使用Windows机器上的WampServer。
答案 0 :(得分:1)
目前我运行mysql命令行( MCL ),我是一个拥有权利的用户(让我们称之为信用的凭据)在某个级别到所有o / s目录。让我们说在这段代码尝试期间,信用卡不会发生变化,无法想象它们会这样做。重点是,我是那些有信誉的用户。
如果没有路径,完整或相对路径,MCL会在outfile调用中写入架构的数据目录。因此,例如在我的系统上,那将是
C:\Users\All Users\MySQL\MySQL Server 5.6\data\so_gibberish
其中so_gibberish是我将使用use so_gibberish
命令获得的模式/ db名称,或者作为在使用开关运行mysql命令行时使用的db提供的名称。或者它将是一些相当于linux的路径。
通过MCL,我会进入db(use
),而不是没有use
的MCL连接。这意味着我不会在进入数据库沙箱之前发出outfile命令,很可能(我稍后会提到与错误1046相关的问题)。你的命令会在我的系统上转储.txt文件(上面的路径)。它在我的测试中做到了。
现在开始使用PHP。
如果您正在运行连接但未使用mysql_select_db
功能的PHP脚本,则
只有当你运行如下代码来检查错误时,错误1046:未选择数据库
才会返回:
<?php
//error_reporting(E_ALL);
//ini_set('display_errors', 1);
...
... (load credential variables used below)
...
$link = mysql_connect($dbhost, $dbuser, $dbpass) or die("Unable to Connect to '$dbhost'");
//mysql_select_db($dbname) or die("Could not open the db '$dbname'");
echo "I made it here<br/>";
$test_query = "SELECT * INTO OUTFILE 'file456.txt' FROM mytable";
$result = mysql_query($test_query);
echo mysql_errno($link) . ": " . mysql_error($link) . "<br>";
mysql_close($link);
并非人们倾向于检查错误。我打赌你不在这个电话里。他们只是认为一切都很好。
请注意,error_reporting对此没有影响。在mysql_query
之后是否检查错误会对您产生什么影响。你可以像我一样去除或清除rems并测试这个理论。所以你可能会得到1046错误并且不知道它。
现在存在o / s用户的情况,因此php到mysql进程伪装成的信誉。这是由原始设置驱动的。现在为什么这很重要?因为那些用户/那些信用卡很可能与在o / s提示符下使用的用户不同,所以你使用MCL做了第一部分。
文件可能是通过php创建的,但由于你没有使用文件的完整路径,只是文件名,它可能会在你不知道的情况下坐在系统的某个地方,如果你要检查因为错误而没有到达。要测试这个理论,请在没有完整路径的mysql_user之后包含上面的错误检查,并进行目录扫描以找到它。
所以在我的测试中,在MCL中我写出了file123.txt,在php中我写出了file456.txt(或其他)。除了任何错误消息,我扫描文件系统以查看它们出现的位置。
你不会是第一个认为OUTFILE失败的人,只是稍后,也许几个月后,在某个目录中找到残留文件并有一个尤里卡时刻:哦是的,我记得那些文件,他们在这做什么?
由于PHP的信用问题,调用可能会失败,与用户或群组世界或其他一些设置chmod问题有关。
通过PHP,如果o / s用户伪装具有cred,则完全路径到outfile文件(例如/full/path/here/out123.txt)可以有一个很好的解决方案。但是,在托管环境中,您不能简单地将其设为/tmp/out123.txt,因为您将失败并拥有权限。所以没有广泛的画笔笔触&#34;插入这个答案&#34;如果你没有一点点体面的修补过程,那将会解决它。
总而言之,对于PHP,我将研究以下内容:
对于错误1221错误,如注释中所述并链接到该部分,您不能在单个数据库上使用GRANT FILE。该答案类型已提供here