Mysql не работают запросы

Устраняем типичные ошибки в MySQL

MySQL — система управления базами данных (СУБД) с открытым исходным кодом от компании Oracle. Она была разработана и оптимизирована специально для работы веб-приложений. MySQL является неотъемлемой частью таких веб-сервисов, как Facebook, Twitter, Wikipedia, YouTube и многих других.

Эта статья расскажет, как определять, с чем связаны частые ошибки на сервере MySQL, и устранять их.

Не удаётся подключиться к локальному серверу

Одной из распространённых ошибок подключения клиента к серверу является «ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2)».

Эта ошибка означает, что на хосте не запущен сервер MySQL ( mysqld ) или вы указали неправильное имя файла сокета Unix или порт TCP/IP при попытке подключения.

Убедитесь, что сервер работает. Проверьте процесс с именем mysqld на хосте сервера, используя команды ps или grep, как показано ниже.

Если эти команды не показывают выходных данных, то сервер БД не работает. Поэтому клиент не может подключиться к нему. Чтобы запустить сервер, выполните команду systemctl.

Чтобы проверить состояние службы MySQL, используйте следующую команду:

Если в результате выполнения команды произошла ошибка службы MySQL, вы можете попробовать перезапустить службу и ещё раз проверить её состояние.

Если сервер работает (как показано) и вы по-прежнему видите эту ошибку, вам следует проверить, не заблокирован ли порт TCP/IP брандмауэром или любой другой службой блокировки портов.

Автомакон , Удалённо , По итогам собеседования

Для поиска порта, который прослушивается сервером, используйте команду netstat .

Не удаётся подключиться к серверу MySQL

Ещё одна похожая и часто встречающаяся ошибка подключения — «(2003) Can’t connect to MySQL server on ‘server’ (10061)». Это означает, что в сетевом соединении было отказано.

Следует проверить, работает ли в системе сервер MySQL (смотрите выше) и на тот ли порт вы подключаетесь (как найти порт, можно посмотреть выше).

Похожие частые ошибки, с которыми вы можете столкнуться при попытке подключиться к серверу MySQL:

Ошибки запрета доступа в MySQL

В MySQL учётная запись (УЗ) определяется именем пользователя и клиентским хостом, с которого пользователь может подключиться. УЗ может также иметь данные для аутентификации (например, пароль).

Причин для запрета доступа может быть много. Одна из них связана с учётными записями MySQL, которые сервер разрешает использовать клиентским программам при подключении. Это означает, что имя пользователя, указанное в соединении, может не иметь прав доступа к базе данных.

В MySQL есть возможность создавать учётные записи, позволяющие пользователям клиентских программ подключаться к серверу и получать доступ к данным. Поэтому при ошибке доступа проверьте разрешение УЗ на подключение к серверу через клиентскую программу.

Увидеть разрешённые привилегии учётной записи можно, выполнив в консоли команду SHOW GRANTS
Входим в консоль (пример для Unix, для Windows консоль можно найти в стартовом меню):

В консоли вводим команду:

Дать привилегии конкретному пользователю в БД по IP-адресу можно, используя следующие команды:

Ошибки запрещённого доступа могут также возникнуть из-за проблем с подключением к MySQL (см. выше).

Потеря соединения с сервером MySQL

С этой ошибкой можно столкнуться по одной из следующих причин:

  • плохое сетевое соединение;
  • истекло время ожидания соединения;
  • размер BLOB больше, чем max_allowed_packet .

В первом случае убедитесь, что у вас стабильное сетевое подключение (особенно, если подключаетесь удалённо).

Если проблема с тайм-аутом соединения (особенно при первоначальном соединении MySQL с сервером), увеличьте значение параметра connect_timeout .

В случае с размером BLOB нужно установить более высокое значение для max_allowed_packet в файле конфигурации /etc/my.cnf в разделах [mysqld] или [client] как показано ниже.

Если файл конфигурации недоступен, это значение можно установить с помощью следующей команды.

Слишком много подключений

Эта ошибка означает, что все доступные соединения используются клиентскими программами. Количество соединений (по умолчанию 151) контролируется системной переменной max_connections . Устранить проблему можно, увеличив значение переменной в файле конфигурации /etc/my.cnf .

Недостаточно памяти

Если такая ошибка возникла, это может означать, что в MySQL недостаточно памяти для хранения всего результата запроса.

Сначала нужно убедиться, что запрос правильный. Если это так, то нужно выполнить одно из следующих действий:

  • если клиент MySQL используется напрямую, запустите его с ключом —quick switch , чтобы отключить кешированные результаты;
  • если вы используете драйвер MyODBC, пользовательский интерфейс (UI) имеет расширенную вкладку с опциями. Отметьте галочкой «Do not cache result» (не кешировать результат).

Также может помочь MySQL Tuner. Это полезный скрипт, который подключается к работающему серверу MySQL и даёт рекомендации по настройке для более высокой производительности.

MySQL продолжает «падать»

Если такая проблема возникает, необходимо выяснить, заключается она в сервере или в клиенте. Обратите внимание, что многие сбои сервера вызваны повреждёнными файлами данных или индексными файлами.

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

Чтобы узнать время безотказной работы сервера, запустите команду mysqladmin .

Кроме того, можно остановить сервер, сделать отладку MySQL и снова запустить службу. Для отображения статистики процессов MySQL во время выполнения других процессов откройте окно командной строки и введите следующее:

Заключение

Самое важное при диагностике — понять, что именно вызвало ошибку. Следующие шаги помогут вам в этом:

  • Первый и самый важный шаг — просмотреть журналы MySQL, которые хранятся в каталоге /var/log/mysql/ . Вы можете использовать утилиты командной строки вроде tail для чтения файлов журнала.
  • Если служба MySQL не запускается, проверьте её состояние с помощью systemctl . Или используйте команду journalctl (с флагом -xe ) в systemd.
  • Вы также можете проверить файл системного журнала (например, /var/log/messages ) на предмет обнаружения ошибок.
  • Попробуйте использовать такие инструменты, как Mytop, glances, top, ps или htop, чтобы проверить, какая программа использует весь ресурс процессора или блокирует машину. Они также помогут определить нехватку памяти, дискового пространства, файловых дескрипторов или какого-либо другого важного ресурса.
  • Если проблема в каком-либо процессе, можно попытаться его принудительно остановить, а затем запустить (при необходимости).
  • Если вы уверены, что проблемы именно на стороне сервера, можете выполнить команды: mysqladmin -u root ping или mysqladmin -u root processlist , чтобы получить от него ответ.
  • Если при подключении проблема не связана с сервером, проверьте, нормально ли работает клиент. Попробуйте получить какие-либо его выходные данные для устранения неполадок.

Хинт для программистов: если зарегистрируетесь на соревнования Huawei Cup, то бесплатно получите доступ к онлайн-школе для участников. Можно прокачаться по разным навыкам и выиграть призы в самом соревновании.

Перейти к регистрации

Источник

Не работает SQL-запрос

В этой статье речь пойдёт об одной из самых распространённых причин, почему не работает SQL-запрос. Мы сейчас не берём в расчёт «случайные ошибки». Здесь идёт речь о передаче данных их через форму и последующее их использование в SQL-запросах, которые иногда почему-то не работают.

Предположим, что Вы делаете комментирование у себя на сайте. И Вы хотите, чтобы пользователь имел право вводить любые символы, даже кавычки, обратные слеши и прочее. Предложим примерный вид Вашего запроса на вставку новой записи в таблицу комментариев:

INSERT INTO `mysite_comments` (`name`, `comment`) VALUES (‘$name’, ‘$comment’)

Теперь давайте подставим в этот SQL-запрос реальные данные, допустим, name будет Михаил, а comment будет Тестирование.

INSERT INTO `mysite_comments` (`name`, `comment`) VALUES (‘Михаил’, ‘Тестирование’)

Как Вы думаете, сработает такой запрос? Безусловно, он будет прекрасно работать. Но что если кто-нибудь введёт name Михаил, а comment Мой ‘ комментарий:

INSERT INTO `mysite_comments` (`name`, `comment`) VALUES (‘Михаил’, ‘Мой ‘ комментарий’)

Как Вы понимаете, данный SQL-запрос не будет выполнен. И вот теперь расскажу об решении этой проблемы.

Необходимо любые переменные, которые используются в SQL-запросах, пропускать через функции addslashes(). Данные функция занимается экранированием следующих спецсимволов: одинарная кавычка, обратная кавычка, двойная кавычка и обратный слеш.

Таким образом, если мы сделаем так:

$name = addslashes($name);
$comment = addslashes($comment);

То наш SQL-запрос станет таким:

INSERT INTO `mysite_comments` (`name`, `comment`) VALUES (‘Михаил’, ‘Мой \’ комментарий’)

И вот этот SQL-запрос уже выполнится без проблем.

И ещё один момент, о котором часто забывается. Любые входные данные надо обязательно пропускать через функцию htmlspecialchars(), за исключением отдельных случаев. Данная функция избавит Вас от заливки в базу HTML-кода.

Чтобы понять важность функции htmlspecialchars() давайте разберём простой пример, связанный с теми же комментариями. Если пользователь будет иметь право передавать HTML-код (а он это права всегда имеет), который впоследствии не будет никак обработан, то при выводе комментария на страницу этот код будет выполнен. Самый простой пример — это сделать редирект на JavaScript на сайт злоумышленника. Таким образом, любой, кто зайдёт на страницу с этим комментарием, будет мгновенно отправлен на другой сайт.

Подведём небольшой итог. Всегда используйте функцию htmlspecialchars() для всех входящих данных, за исключением самых редких случаев. И всегда используйте функцию addslashes() для каждой переменной, участвующей в SQL-запросах.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 38 ):

    Михаил, помогите пожалуйста. Пишу вот такую функцию. Затем идёт html форма и после пишу код Здесь $_POST[‘send’] это кнопка submit отправки. НО ничего не вставляется в базу! Почему?

    Проверьте что будет если сам запрос ввести напрямую в phpmyadmin. Возможно действительно поля не добавляются, из-за какой-нибудь ошибки.

    «И всегда используйте функцию addslashes() для каждой переменной, участвующей в SQL-запросах.» а mysql_real_escape_string когда использловать?

    Вместо addslashes() можно использовать mysql_real_escape_string(), причём это функция более безопасная, если кодировка не UTF-8.

    Она по-моему экранирует только двойные и одинарные кавычки

    Ещё обратный слэш. Этого достаточно, чтобы захватить все спецсимволы.

    Доброго времени суток,в меня такой вопрос,а что нужно писать в файле где сохраняються нустройки к базе данных редакторо tinyMCE.Дайте мне код

    В меня токай еще вопрос.а Вы не знаете где можно скачать редактор который сможет конвертировать музыку или видео по качеству и по расшерению екрана?

    Есть ffmpeg: http://myrusakov.ru/php-ffmpeg.html Для аудио надо поискать что-то аналогичное.

    Так а как же делать? Имеем: addslashes() и htmlspecialchars() Надо пропускать вводимые пользователем данные через обе эти функции или через одну из них? Если через обе, то имеет ли значение в какой последовательности? Можно чуточку поподробнее об этом? &&& еще и про stripslashes() начитал тут вдобавок 🙂

    Надо через обе, сначала через htmlspecialchars(), потом через addslashes().

    то есть надо просто таким образом обрабатывать данные? $text_comment = $_POST[«text_comment»]; $text_comment = htmlspecialchars($text_comment); $text_comment = addslashes($text_comment); и дальше уже вставлять $text_comment в SQL запрос. и все?

    Михаил, при вводе, например: «GHJDTHRF» в поле для комментариев и отправке на сайт, выводит потом \»GHJDTHRF\» в самиз комментах. А вото так не нужно. Скажи, пожалуйста, как подрихтовать? 🙂

    Если выводить из базы, то такого никогда не будет. Выводите из базы, а не берите откуда-то ещё.

    хм. да в том то и дело, что из базы как раз и вывожу! 🙂 вот так в базе хранится: \»GHJDTHRF\»

    Значит, нарушаете порядок вызова функций. Не может добавляться слэш к & через addslashes(). А у Вас он почему-то находится. И ещё добавьте в .htaccess magic_quotes_qpc off magic_quotes_runtime off magic_quotes_sybase off Возможно, дело в этом.

    добавил и все сломалось совсем 🙂 ошибку 500 выдает! .htaccess стал таким: AddDefaultCharset UTF-8 magic_quotes_qpc off magic_quotes_runtime off magic_quotes_sybase off после каждой строчки не надо добавлять ник4аких разделительных знаков?

    Просто вот так напишите и всё: php_value magic_quotes_gpc 0

    А нужно пропускать через эти функции, например, название фотографии, которую пользователь размещает на сайт. может злоумышленник всунуть каку таким образом? .jpeg

    Михаил, хочу вывести статью в отдельном файле с подставление нужных значений. Есть форма из которой заносятся данные в базу данных под id. Потом выводит нужную часть информации в шаблоне и ссылку на статью, но в статье в ссылку id не подставляется и выводит пустой шаблон. Вот код: function getArticle ($id) < global $mysqli; connectDB(); $result_set = $mysqli->query («SELECT * FROM `action` WHERE `id`= ‘id'»); closeDB(); return $result_set->fetch_assoc (); > function ResultSetToArray ($result_set) < $array = array (); while (($row = $result_set->fetch_assoc ()) != false); $array[] = $row; return $array; > а это в файле для вывода статьи : Буду очень благодарен!!

    честно говоря я уже пытаюсь найти ошибку уже очень долго. и прошу Вас, скажите есть здесь ошибка или нет.

    Я не вижу сразу, но я никак не могу найти ошибку, как бы этого не хотел, надо абсолютно весь код смотреть во всех файлах. Ошибка может быть, где угодно.

    я могу Вам на почту отправить файлы с кодом, если Вы не против.

    Notice: Undefined index: id in Z:\home\site.localhost\www\id.php on line 4 выводит вот такую ошибку. а вот код где ошибка:

    Делайте проверку на существование $_GET[«id»] через isset, а уже потом обращайтесь к этому массиву.

    уже пробовал. ошибки нет, но все равно информация не выводится

    Она не выводится, потому что $_GET[«id»] — не существует в массиве. Возможно, из-за того, что URL с ошибкой.

    Михаил, после isset: if(isset($_GET[‘id’])) < $action = getArticle($_GET['id']); >начало выводить ошибки: Notice: Undefined variable: action in Z:\home\site.localhost\www\id.php on line 6 Notice: Undefined variable: action in Z:\home\site.localhost\www\id.php on line 7 Notice: Undefined variable: action in Z:\home\site.localhost\www\id.php on line 8 Notice: Undefined variable: action in Z:\home\site.localhost\www\id.php on line 9 Notice: Undefined variable: action in Z:\home\site.localhost\www\id.php on line 10 Notice: Undefined variable: action in Z:\home\site.localhost\www\id.php on line 11 Notice: Undefined variable: action in Z:\home\site.localhost\www\id.php on line 12

    Смысл этого замечания (а не ошибки) в том, что Вы используете непроинициализированные переменные.

    а кактм образом мне их проиницизировать?

    Не знаю, в данную ли рубрику я пишу, но проблема у меня в следующем. Есть мониторинг обменных валют. В последние дни при попытке обновить экспортный файл курсов выдает ошибку: WordPress database error: [You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘get, IF (e.start 0, 1.0000, IF (e.startx <> 0, e.sta’ at line 4] INSERT INTO `wp_emetal_calc` SELECT e.*, IF (e.start 0, e.startx / e.start, IF (e.startx <> 0, 1.0000, e.startx)) get, IF (e.start 0, 1.0000, IF (e.startx <> 0, e.start / e.startx, e.start)) give FROM `wp_emetal` e WHERE emetalx <> emetaly AND start <> 0 AND startx <> 0 Писал на хостинг. Вот переписка: Здравствуйте, нужна Ваша помощь, возникла непонятная проблема, мой сайт http://superobmen.org/ который находится на этом аккаунте, ещё сегодня работал всё было нормально, сейчас сам сайт в принципе работает, но что-то странное произошло с базой данных, сайт является мониторингом и регулярно выводит определённые данные на главной странице, сейчас страница пустая, ни каких данных не выдает, что произошло не могу понять, внутри в админке пишет такую ошибку: database error: [You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘get, IF (e.start 0, 1.0000, IF (e.startx <> 0, e.sta’ at line 4] помогите плиз, пробую восстановить из бекапа, тоже выдает ошибку. Вы, 02.12.2014 18:43 Здравствуйте, можно посмотреть полностью код запроса? Антон Алексеевич, 02.12.2014 18:48 если вы имеете ввиду саму ошибку, которую выдает скрипт после запуска для обновления, тогда вот: WordPress database error: [You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘get, IF (e.start 0, 1.0000, IF (e.startx <> 0, e.sta’ at line 4] INSERT INTO `wp_emetal_calc` SELECT e.*, IF (e.start 0, e.startx / e.start, IF (e.startx <> 0, 1.0000, e.startx)) get, IF (e.start 0, 1.0000, IF (e.startx <> 0, e.start / e.startx, e.start)) give FROM `wp_emetal` e WHERE emetalx <> emetaly AND start <> 0 AND startx <> 0 Вы, 02.12.2014 19:31 Здравствуйте, уточните какие шаги необходимо выполнить, чтобы воспроизвести ошибку? Предоставьте необходимые доступы. Денис Викторович, 02.12.2014 19:51 вот с помощью данной ссылки: http://superobmen.org/wp-content/plugins/exchangers-monitor/tbot.php?tb=superobmen.org запускается скрипт и в результате выдает ошибку которой не должно быть. Вы, 02.12.2014 20:27 Приветствую. Прошу прощения за долгий ответ. Проблема, собственно, заключается в некорректном синтаксисе запроса к БД, как и указано в ошибке. Полагаю, для начала, Вам необходимо уточнить, по какой причине появляется данная ошибка у разработчика данного скрипта. Максим Викторович, 03.12.2014 01:51 Подскажите, а у вас вчера ни чего не происходило с MySQL, может быть версия менялась, обновлялась или ещё что либо? Вы, 03.12.2014 14:00 Нет. Скорее всего это не будет являться причиной ошибки в синтаксисе запроса к базе. Роман Игоревич, 03.12.2014 15:10 Может Вы поможете? Или подсказать что делать?

    Вам уже отвечали Мы не правим чужой код. Обратитесь к разработчику вашего плагина. В чём ошибка,вам уже сказали:некорректный синтаксис mysql Что за бред у вас в синтаксисе разобрать вообще проблемно. Куча левой ненужной ерунды. Мой вам совет,выбросить этот плагин

    Для добавления комментариев надо войти в систему.
    Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

    Источник

    Читайте также:  Стиральная машина не работает замок причина
    Оцените статью