我正在尝试在服务器上转储MySQL表,我试图在Zend中执行此操作。我有一个模型/ mapper / dbtable结构用于我所有与表的连接,我将以下代码添加到映射器中:
public function dumpTable()
{
$db = $this->getDbTable()->getAdapter();
$name = $this->getDbTable()->info('name');
$backupFile = APPLICATION_PATH .
'/backup/' . date('U') .
'_' . $name . '.sql';
$query = "SELECT * INTO OUTFILE '$backupFile' FROM $name";
$db->query( $query );
}
我想,这应该很好用,但是
Message: Mysqli prepare error: Access denied for user 'someUser'@'localhost' (using password: YES)
是这导致的结果。
我检查了someUser的用户权限,并且他拥有相关数据库和表的所有权限。一般来说,我一直在这里和网上四处看看,通常打开“全部”用户的权利似乎是解决方案,但不是我的情况(除非我现在用疲惫的眼睛忽略了一些东西+我不想在我的生产服务器上打开“all”。
我在这里做错了什么?或者,是否有人知道在Zend中完成这项工作的更优雅方式?
答案 0 :(得分:2)
虽然我向相关用户提供了“所有权限”,但我是基于每个数据库而不是全局执行此操作。然而,使用outfile所需的权限是FILE,只能设置为GLOBAL权限
答案 1 :(得分:2)
如果您遇到权限问题,则需要设置用户运行mysql以获得访问该文件夹所需的必要权限。例如,您拥有/tmp/filedumps
,拥有者为www-data
且组为www-data
,您需要将mysql用户帐户添加到debian / ubuntu上的群组{{1} }。
这就是我在* nix框中解决问题的方法。
答案 2 :(得分:1)
普通的SELECT有效吗?如果它不是,我会说这是一个错误密码的简单情况。如果普通的SELECT有效,请确保将OUTFILE权限授予确切的用户
'someUser'@'localhost'
而不是例如
'someUser'@'%'
如果我没记错的话,这两个帐户将被区别对待并具有单独的权限设置。
答案 3 :(得分:1)
>$ echo "select count(predicate),subject from TableA group by subject" | mysql -u yourusername -p yourdatabasename > ~/XYZ/outputfile.txt
从这篇帖子中获取了解决方法,其中包含未授予FILE权限的变通方法: Query output to a file gives access denied error