【问题标题】:Can't connect to MySQL server on 'IP (4)无法连接到 'IP (4) 上的 MySQL 服务器
【发布时间】:2015-02-26 21:12:02
【问题描述】:

我有两台服务器,一台是运行 apache 和 php 的网络服务器,另一台是使用 MySQL 的数据库服务器。第一个使用第二个的数据库,每天24小时,每周7天。

问题是最近开始有时每天都会出错,PHP 应用程序显示以下消息:

Can't connect to MySQL server on 'IP_DO_BANCO_DE_DADOS' (4)

我们的网络服务器中有一些 PHP 应用程序。这些应用程序之一(旧版)不使用任何框架,并且本机使用 PHP 连接到 MySQL:

function AbreBD($mysqli = false) {

        global $conexao, $selecao, $conexao_mysqli;

        $servidor = '192.168.101.20:3306';
        $usuarioBD = 'user';
        $senhaBD = 'user';

        $conexao = mysql_connect($servidor, $usuarioBD, $senhaBD);
        $selecao = mysql_select_db("bioextratus", $conexao);

        if ($mysqli) {
            $conexao_mysqli = new mysqli($servidor, $usuarioBD, $senhaBD, "bioextratus");
        }
}

请记住,上面的代码是针对遗留应用程序的,并且仍然使用 mysql 驱动程序而不是 mysqli。即使在我们最现代的带有 codeigniter 框架的应用程序中,也会出现这个问题。

我相信问题是 MySQL 配置或网络问题,尽管 MySQL 服务始终可用,以及两台服务器之间的通信。

MySQL服务器的my.cnf文件内容为(无cmets):

[client]
port            = 3306
socket          = /var/run/mysqld/mysqld.sock

[mysqld_safe]
socket          = /var/run/mysqld/mysqld.sock
nice            = 0

[mysqld]
user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
skip-external-locking
explicit_defaults_for_timestamp = false
open_files_limit        =       102400

bind-address            = 0.0.0.0

key_buffer                      = 16M
key_buffer_size                 = 512M
innodb_buffer_pool_size         = 256M
innodb_additional_mem_pool_size = 8M
max_allowed_packet              = 16M
thread_stack                    = 196K
thread_cache_size               = 8
myisam-recover-options          = BACKUP
query_cache_limit               = 64M
query_cache_type                = 1
query_cache_size                = 256M
max_connections                 = 1024
max_user_connections            = 0
sort_buffer_size                = 2M

join_buffer_size                = 1M
tmp_table_size                  = 64M
max_heap_table_size             = 18M

log_error = /var/log/mysql/error.log

expire_logs_days        = 10
max_binlog_size         = 100M

[mysqldump]
quick
quote-names
max_allowed_packet      = 16M

[isamchk]
key_buffer              = 12M

【问题讨论】:

  • 您似乎遇到了两个问题之一(或可能两者都有)。您的数据库服务器太忙,或者您的 Web 服务器和数据库服务器之间的网络连接太忙。无论哪种方式,这里都没有足够的数据来诊断问题。如果这可以通过编程来解决,那么这里没有任何东西可以让我们提供帮助。您需要分析您的系统并确定瓶颈。只有你能做到。
  • 您最近是否更改了配置?还是问题开始时没有变化?服务器是否在同一个局域网中,或者您是否有其他由托管服务提供商引入的未知变量?我们需要更多信息。

标签: php mysql codeigniter mysqli


【解决方案1】:

AbreDB 函数对于初学者来说有点可疑。

IF该函数被指示使用 MySQLI,它无论如何都会先建立一个 MySQL 连接。那里应该有一个 if/else 构造,以确保每次调用该函数时只建立一个 DB 连接。另请参阅下面的“Singleton”建议。

鉴于存在此错误,您还应该检查应用程序是否明智地使用 mysql_close() 或其等效项 --- 这可能是随着流量的增加,MySQL 服务器会保持连接打开直到超时 (这通常不会太长,但可能会有所作为)。应用程序通常应该在使用数据库后调用 close()。

根据应用程序的性质,您可能希望使用永久连接(mysql_pconnect() 是旧版本)。例如,如果对单个 Web 资源的调用打开了多个连接以完成一个页面,这在许多 PHP 程序中是一个常见的错误,这些程序并不是真正考虑扩展的。同样,请参阅 Singleton 建议并尝试确保脚本/应用程序使用公共数据库连接,而不是仓促打开它们。

话虽如此,您还可以做一些其他的事情来看看问题是否可以得到缓解:

  • 尝试启用 MySQL 的慢查询日志,看看是否有查询 应该优化/重写。

  • 尝试增加 my.cnf 中的 max_connections。

  • 了解“单例”模式并在您的
    中强制使用它 应用的数据库连接器类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2012-11-30
    • 2017-01-30
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 2012-02-08
    相关资源
    最近更新 更多