无法更改MySQL数据库的权限

时间:2015-09-27 01:02:54

标签: php mysql

我希望备份一个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。

1 个答案:

答案 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,我将研究以下内容:

  • 文件正在写出来,你只是不知道在哪里。
  • 文件失败但您不知道,因为之后没有错误检查 mysql_query(如一般的mysql错误,没有选择db, 随你)。
  • 由于o / s用户伪装成PHP而导致信用问题 mysql并且是o / s文件系统级别所需要的 档案i / o。

对于错误1221错误,如注释中所述并链接到该部分,您不能在单个数据库上使用GRANT FILE。该答案类型已提供here