我(作为初学者)缺少的另一点是,我在两个数据库之间有一个备份脚本,作为最后一步,我应该优化真实的数据库以减少开销。我有一个代码,当我只使用一个数据库时可以工作,但我需要使用两个:
$actconn = mysql_connect($dbhost, $actdbuser, $actdbpass) or die ('act Error connecting to mysql');
$bckconn = mysql_connect($dbhost, $bckdbuser, $bckdbpass) or die (' back Error connecting to mysql');
$ressql="SHOW TABLE STATUS FROM $actdbname WHERE Data_free / Data_length > 0.1 AND Data_free > 102400";
-这应该说明bckuser被忽略了,我相信
$res = mysql_query( $ressql, $actconn);
echo mysql_error();
while($optrow = mysql_fetch_assoc($res)) {
mysql_query('OPTIMIZE TABLE ' . $optrow['Name'], $actconn);
}
actconn值:资源id#1
bckconn值:资源id#2
mysql_error说:
拒绝向用户"bckuser"@"localhost"执行表"实际表"的SELECT命令
知道我做错了什么吗?
更新:bckuser不应该对它做任何事情,因为actdbuser是该数据库的根,但由于某种原因,SHOW TABLE无法识别$actconn。。。
更新2:我再次尝试了opt,唯一改变的是$actdbname='db-name';工作时,$actdbname='db-name
'带有spec撇号;
请注意,这是在sharedhost上,所以我不能更改数据库名称。
谢谢@Corbin有趣的想法,我试过了,但没有成功,但我怎么能调试它呢?由于某种原因,我甚至无法正确调试它。。。
您需要向用户'bckuser'@'localhost'授予执行SHOW TABLE STATUS
查询的适当权限。
不幸的是,在MySQL 5.5中,此操作没有单独的授予选项。或者,您可以将ALL
授予此用户或使用root
用户登录来执行此操作。请参阅拨款手册