2015-02-26 2 views
-3

У меня есть два сервера: один - это веб-сервер под управлением apache и php, а другой - сервер базы данных с MySQL. Первая использует базу данных второго, 24 часа в сутки, 7 дней в неделю.Не удается подключиться к серверу MySQL на «IP (4)

Проблема заключается в том, который в последнее время стали иметь ошибки иногда ежедневно, где 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 всегда доступен, а также связь между двумя серверами.

Содержание файла my.cnf сервера MySQL не является (нет комментариев):

[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 
+0

У вас возникла одна из двух проблем (или, возможно, и то, и другое). Либо ваш сервер базы данных слишком занят, либо сетевое соединение между веб-сервером и сервером базы данных слишком занято. В любом случае, здесь недостаточно данных для диагностики проблемы. Если это можно решить с помощью программирования, здесь нет ничего, что позволило бы нам помочь. Вам необходимо профилировать систему и определить узкие места. Только ты можешь это сделать. –

+0

Вы недавно изменили конфигурацию? или проблема начата без изменений? являются ли серверы той же локальной сетью или у вас есть другие неизвестные переменные, представленные хостинг-провайдерами? Нам нужна дополнительная информация. – DevDonkey

ответ

1

Функция AbreDB является немного подозреваемого, для начала.

IF функция предписывается использовать Mysqli, это делает соединение MySQL первый в любом случае. Там должна быть построена if/else, чтобы каждый раз при вызове функции выполнялось только одно соединение с БД. См. Также предложение «Singleton» ниже.

Учитывая, что эта ошибка присутствует, вы должны также проверить приложение (ы) для разумного использования mysql_close() или его эквивалента --- возможно, что по мере увеличения трафика сервер MySQL поддерживает соединения до таймаута (который обычно не слишком длинный, но может иметь значение). Обычно приложения должны использовать функцию close() после использования базы данных.

В зависимости от характера приложения (ов) вы можете использовать постоянное соединение (mysql_pconnect() была более старой версией). Это указывается, если, например, вызов одного веб-ресурса открывает несколько подключений для завершения страницы, что является распространенной ошибкой во многих программах PHP, которые на самом деле не построены с прицелом на масштабирование. Опять же, см. Предложение Singleton и постарайтесь убедиться, что сценарии/приложения используют общее соединение с БД, а не открывают их.

Все, как говорится, есть некоторые другие вещи, которые вы могли бы сделать, чтобы увидеть, если проблема может быть облегчена:

  • Попробуйте включить медленные-запросы в MySQL войти и посмотреть, если есть запросы , которые должны быть оптимизированная/переписан.

  • Попробуйте увеличить max_connections в my.cnf.

  • Узнайте о шаблоне «Singleton» и используйте его в своих
    классах соединителей базы данных приложений.

Смежные вопросы