Magento实例指向错误的数据库

时间:2010-12-22 22:27:57

标签: php mysql zend-framework configuration magento

有没有人遇到这个问题? local.xml已被修改。 core_config_data表已针对不安全和安全的URL以及cookie域进行了修改。缓存dirs已被擦除干净,会话值已被清除,日志表已被截断。

它受版本控制与subversion。 还运行find来找到它可能获得生产数据库IP的位置。

find ~/path/to/application -type f -print0 | xargs -0 grep -l "IP Of incorrect DB"

但仍然在DB

上抛出错误
SQLSTATE[HY000] [2003] Can't connect to MySQL server on 'IP of incorrect DB' (4)

非常困惑,无法为我的生活找到可能获得生产数据库IP的地方

local.xml指向开发地址。

6 个答案:

答案 0 :(得分:4)

您可能希望检查magento / var /目录以及所有子目录是否可由Web服务器写入。如果这些目录不可写,Magento使用/ tmp /会导致奇怪的效果甚至与其他Magento站点发生冲突。

答案 1 :(得分:3)

确保您正在编辑您认为正在编辑的配置文件。看一下下面的代码

#File: app/code/core/Mage/Core/Model/Config.php

public function loadBase()
{
    $etcDir = $this->getOptions()->getEtcDir();
    $files = glob($etcDir.DS.'*.xml');
    $this->loadFile(current($files));
    while ($file = next($files)) {
        $merge = clone $this->_prototype;
        $merge->loadFile($file);
        $this->extend($merge);
    }
    if (in_array($etcDir.DS.'local.xml', $files)) {
        $this->_isLocalConfigLoaded = true;
    }
    return $this;
}

这是将local.xml文件合并到配置树的代码。添加一些调试代码

public function loadBase()
{
    var_dump('Called ' . __METHOD__);   //ensure we're being called    
    $etcDir = $this->getOptions()->getEtcDir();
    $files = glob($etcDir.DS.'*.xml');
    $this->loadFile(current($files));
    while ($file = next($files)) {
        var_dump($file);                    //dump the file path being loaded to the browser
        $merge = clone $this->_prototype;
        $merge->loadFile($file);
        $this->extend($merge);
    }
    if (in_array($etcDir.DS.'local.xml', $files)) {
        $this->_isLocalConfigLoaded = true;
    }
    exit;                                   //bail out early
    return $this;
}

在浏览器中加载您的站点,并观察通过var_dump输出的路径。确保正在加载的文件是您认为正在加载的文件。请记住,貌似来自etc文件夹的每个 XML文件都已加载并合并。

如果路径符合您的预期,接下来添加一些调试代码以输出正在加载的XML文件的内容。

public function loadBase()
{
    var_dump('Called ' . __METHOD__ . '');  //ensure we're being called    
    $etcDir = $this->getOptions()->getEtcDir();
    $files = glob($etcDir.DS.'*.xml');
    $this->loadFile(current($files));
    while ($file = next($files)) {
        header('Content-Type: text/plain'); //so the browser renders it as plain text
        echo file_get_contents($file);      //dump the contents of the file being loaded to the browser
        $merge = clone $this->_prototype;
        $merge->loadFile($file);
        $this->extend($merge);
    }
    if (in_array($etcDir.DS.'local.xml', $files)) {
        $this->_isLocalConfigLoaded = true;
    }
    exit;                                   //bail out early
    return $this;
}

如果这些文件中的数据库信息正确,那么您的系统已经以某种方式进行了自定义和/或黑客攻击,即代码呼叫另一个数据库服务器。

如果是这种情况,你需要安装类似xDebug的东西来获得一些不错的错误报告。这将让您找到抛出错误的确切代码,此时您可以将其追溯到获取其连接信息的位置。

祝你好运。

答案 2 :(得分:3)

当我遇到类似的问题时,就碰到了这个问题。遵循Alan Storm建议转储配置文件名并发现问题。在从另一个实例复制db和config文件之前,我已经完成了全新安装,并将现有的local.xml重命名为localorig.xml。这是在local.xml之后加载并将db配置字段设置回错误的值。

道德:如果您要备份同一文件夹中的任何配置文件,请更改扩展名。

感谢Alan。

答案 3 :(得分:1)

尝试安装Alan Storm的Configviewer并检查生成的XML以确认连接详细信息指向local.xml规范。其中一个模块可能正在使用非默认资源或其他一些奇怪的资源。

您可以在问题中发布一些堆栈跟踪(如果需要,可以进行模糊处理)以显示哪个模块正在调用错误的数据库吗?

答案 4 :(得分:1)

我刚才有类似的问题。我仔细检查了local.xml文件,但这绝对是正确的。 Magento仍在使用旧用户访问数据库。

问题立即得到解决rm -rf var/cache/* - 一旦完成,网站就出现了。

看来Magento正在缓存缓存区域中local.xml的内容。没那么有帮助。

显然,还建议仔细检查local.xml文件,但在这种情况下,它是100%正确的。

答案 5 :(得分:0)

只是想尽力帮忙。你能检查你的apache配置吗?像“apache2 -S”这样的东西可以看到使用了哪些虚拟主机(特别注意第一个默认主机)。 您可以测试所有虚拟主机(如果使用虚拟主机)使用正确的documentRoot。你的开发服务器上没有其他源的副本吗?

我的意思是你确定你在你在浏览器上使用的网址上运行了正确的magento实例吗?以同样的方式确定安装中使用的缓存目录 - 您是否看到自清除以来这些目录中的任何更改?