Устраняем типичные ошибки в 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, как показано ниже.
$ ps xa | grep mysqld | grep -v mysqld
Если эти команды не показывают выходных данных, то сервер БД не работает. Поэтому клиент не может подключиться к нему. Чтобы запустить сервер, выполните команду systemctl.
$ sudo systemctl start mysql #Debian/Ubuntu $ sudo systemctl start mysqld #RHEL/CentOS/Fedora
Чтобы проверить состояние службы MySQL, используйте следующую команду:
$ sudo systemctl status mysql #Debian/Ubuntu $ sudo systemctl status mysqld #RHEL/CentOS/Fedora
Если в результате выполнения команды произошла ошибка службы MySQL, вы можете попробовать перезапустить службу и ещё раз проверить её состояние.
$ sudo systemctl restart mysql $ sudo systemctl status mysql
Если сервер работает (как показано) и вы по-прежнему видите эту ошибку, вам следует проверить, не заблокирован ли порт TCP/IP брандмауэром или любой другой службой блокировки портов.
Для поиска порта, который прослушивается сервером, используйте команду netstat
.
$ sudo netstat -tlpn | grep "mysql"
Не удаётся подключиться к серверу MySQL
Ещё одна похожая и часто встречающаяся ошибка подключения — «(2003) Can’t connect to MySQL server on ‘server’ (10061)». Это означает, что в сетевом соединении было отказано.
Следует проверить, работает ли в системе сервер MySQL (смотрите выше) и на тот ли порт вы подключаетесь (как найти порт, можно посмотреть выше).
Похожие частые ошибки, с которыми вы можете столкнуться при попытке подключиться к серверу MySQL:
ERROR 2003: Cannot connect to MySQL server on 'host_name' (111) ERROR 2002: Cannot connect to local MySQL server through socket '/tmp/mysql.sock' (111)
Ошибки запрета доступа в MySQL
В MySQL учётная запись (УЗ) определяется именем пользователя и клиентским хостом, с которого пользователь может подключиться. УЗ может также иметь данные для аутентификации (например, пароль).
Причин для запрета доступа может быть много. Одна из них связана с учётными записями MySQL, которые сервер разрешает использовать клиентским программам при подключении. Это означает, что имя пользователя, указанное в соединении, может не иметь прав доступа к базе данных.
В MySQL есть возможность создавать учётные записи, позволяющие пользователям клиентских программ подключаться к серверу и получать доступ к данным. Поэтому при ошибке доступа проверьте разрешение УЗ на подключение к серверу через клиентскую программу.
Увидеть разрешённые привилегии учётной записи можно, выполнив в консоли команду SHOW GRANTS
Входим в консоль (пример для Unix, для Windows консоль можно найти в стартовом меню):
В консоли вводим команду:
> SHOW GRANTS FOR 'tecmint'@'localhost';
Дать привилегии конкретному пользователю в БД по IP-адресу можно, используя следующие команды:
> grant all privileges on *.test_db to 'tecmint'@'192.168.0.100'; > flush privileges;
Ошибки запрещённого доступа могут также возникнуть из-за проблем с подключением к MySQL (см. выше).
Потеря соединения с сервером MySQL
С этой ошибкой можно столкнуться по одной из следующих причин:
- плохое сетевое соединение;
- истекло время ожидания соединения;
- размер BLOB больше, чем
max_allowed_packet
.
В первом случае убедитесь, что у вас стабильное сетевое подключение (особенно, если подключаетесь удалённо).
Если проблема с тайм-аутом соединения (особенно при первоначальном соединении MySQL с сервером), увеличьте значение параметра connect_timeout
.
В случае с размером BLOB нужно установить более высокое значение для max_allowed_packet
в файле конфигурации /etc/my.cnf
в разделах [mysqld]
или [client]
как показано ниже.
[mysqld] connect_timeout=100 max_allowed_packet=500M
Если файл конфигурации недоступен, это значение можно установить с помощью следующей команды.
> SET GLOBAL connect_timeout=100; > SET GLOBAL max_allowed_packet=524288000;
Слишком много подключений
Эта ошибка означает, что все доступные соединения используются клиентскими программами. Количество соединений (по умолчанию 151) контролируется системной переменной
. Устранить проблему можно, увеличив значение переменной в файле конфигурации /etc/my.cnf
.
[mysqld] max_connections=1000
Недостаточно памяти
Если такая ошибка возникла, это может означать, что в MySQL недостаточно памяти для хранения всего результата запроса.
Сначала нужно убедиться, что запрос правильный. Если это так, то нужно выполнить одно из следующих действий:
- если клиент MySQL используется напрямую, запустите его с ключом
--quick switch
, чтобы отключить кешированные результаты; - если вы используете драйвер MyODBC, пользовательский интерфейс (UI) имеет расширенную вкладку с опциями. Отметьте галочкой «Do not cache result» (не кешировать результат).
Также может помочь MySQL Tuner. Это полезный скрипт, который подключается к работающему серверу MySQL и даёт рекомендации по настройке для более высокой производительности.
$ sudo apt-get install mysqltuner #Debian/Ubuntu $ sudo yum install mysqltuner #RHEL/CentOS/Fedora $ mysqltuner
MySQL продолжает «падать»
Если такая проблема возникает, необходимо выяснить, заключается она в сервере или в клиенте. Обратите внимание, что многие сбои сервера вызваны повреждёнными файлами данных или индексными файлами.
Вы можете проверить состояние сервера, чтобы определить, как долго он работал.
$ sudo systemctl status mysql #Debian/Ubuntu $ sudo systemctl status mysqld #RHEL/CentOS/Fedora
Чтобы узнать время безотказной работы сервера, запустите команду mysqladmin
.
$ sudo mysqladmin version -p
Кроме того, можно остановить сервер, сделать отладку MySQL и снова запустить службу. Для отображения статистики процессов MySQL во время выполнения других процессов откройте окно командной строки и введите следующее:
$ sudo mysqladmin -i 5 status
Или
$ sudo mysqladmin -i 5 -r status
Заключение
Самое важное при диагностике — понять, что именно вызвало ошибку. Следующие шаги помогут вам в этом:
- Первый и самый важный шаг — просмотреть журналы 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
, чтобы получить от него ответ. - Если при подключении проблема не связана с сервером, проверьте, нормально ли работает клиент. Попробуйте получить какие-либо его выходные данные для устранения неполадок.
Перевод статьи «Useful Tips to Troubleshoot Common Errors in MySQL»
Решение проблем с MySQL | FirstVDS
MySQL — система управления базами данных (СУБД). С её помощью можно управлять базами данных (БД) на сервере.
В зависимости от операционной системы, на сервере может быть установлена СУБД MySQL или MariaDB — их функционал сильно похож, и для работы разницы, как правило, нет.
В данной статье рассмотрим, с какими проблемами вы можете столкнуться при работе с MySQL и как их решить.
- Создание базы через ISPmanager
- Раздела «Базы данных» нет в меню
- Не подходит пароль к серверу баз данных
- Где искать ошибки?
- Перечень возможных проблем
- Table ‘./site/content’ is marked as crashed and should be repaired
- mysql_connect() [function. mysql-connect]: Access denied for user ‘user_xxx’@’localhost’ (using password: YES)
- Не удалось подключиться к базе данных
- В панели ISPmanager не удается создать базу данных, ошибка «Недостаточно данных»
- MySQL не запускается ни в сервисах, ни через консоль
- Решение проблем с кодировками MySQL
- Перечень возможных проблем
- Русификация MySQL
Панель управления ISPmanager значительно упрощает управление СУБД и базами данных. На корректно работающем VDS создание базы займет не больше 5 минут.
В левом меню ISPmanager переходим в раздел Базы данных и нажимаем Создать базу данных.
Заполняем необходимые поля: имя БД, владелец БД (должен совпадать с владельцем сайта), сервер БД, кодировка БД, после чего создаем нового пользователя БД (либо выбираем существующего) и задаем пароль. Рекомендуем создавать сложные пароли.
Подробнее о создании Базы данных можно узнать в отдельной статье.
Теперь немного о тех местах, где могут возникнуть сложности.
Раздела «Базы данных» нет в меню
Есть 2 возможных варианта решения проблемы:
1. На сервере не запущен сервер баз данных MySQL
Проверить, активен ли сервис, вы можете в разделе Мониторинг и журналы панели ISPmanager. Попробуйте запустить или перезапустить службу mariadb
(в ОС CentOS и Debian) или mysql
(в ОС Ubuntu) с помощью кнопок в панели.
Если не помогло, перезапустите из консоли командой systemctl restart mysql
для Ubuntu/Debian или командой systemctl restart mariadb
для Centos 7.
2. Проблемы с подключением к базе данных
Перейдите в раздел Серверы БД, двойным кликом откройте свойства и нажмите Сохранить, ничего не меняя. Это принудительно обновит информацию о MySQL в панели управления. После этого обновите страницу — раздел Базы данных должен появиться.
Случается так, что пароль root от MySQL-сервера утерян и надо установить новый. Делается следующим образом:
Останавливаем MySQL-сервер:
В Debian/Ubuntu:
# systemctl stop mysql
В CentOS 7:
# systemctl stop mariadb
или
# systemctl stop mysqld
Запускаем его без проверки таблиц прав:
# mysqld_safe --skip-grant-tables &
Заходим root’ом без пароля:
# mysql -uroot
Меняем пароль:
# use mysql;
MySQL < 5.7
# UPDATE user SET Password=PASSWORD("new_password") WHERE User='root';
MySQL => 5.7
# UPDATE user SET authentication_string=PASSWORD("new_password") WHERE User='root';
Проверить версию MySQL можно с помощью команды:
# mysql –version
или
# mariadb –version
Продолжаем для всех версий
# FLUSH PRIVILEGES;
В Debian/Ubuntu:
# systemctl restart mysql
В Centos 7:
# systemctl restart mariadb
или
# systemctl restart mysqld
Авторизуемся как root с паролем new_password
# mysql -uroot -p
После вводим новый пароль.
MySQL — свободная реляционная система управления базами данных. Поиск проблем с сервисом лучше всего начинать с изучения логов. Для этого необходимо подключиться на сервер по SSH. Их расположение разнится в зависимости от используемой файловой системы. В конфигурационном файле my.cnf
нужно искать строки log
и log-error
, чтобы определить, где находятся логи. Также можно воспользоваться mysql запросом:
show variables like '%log%';
Если логирование не включено, сделать это можно следующим образом. Зайти в файл:
/etc/my.cnf #Centos /etc/mysql/my.cnf #Debian /etc/mysql/mysql.conf.d/mysql.cnf #Ubuntu
Расположение конфигурационного файла может отличаться в зависимости от дистрибутива или CMS.
И в секцию [mysqld]
добавить строку:
log-error=/var/log/mysql-errors.log
Выйти из файла, выполнить команды:
touch /var/log/mysql-errors.log chown mysql:mysql /var/log/mysql* chmod 640 /var/log/mysql*
Следующая команда включит просмотр созданного лога в режиме реального времени(tail –f) и оставить его в фоне(&) что бы можно было параллельно запускать другие команды:
tail –f /var/log/mysql-errors. log &
Данная команда позволяет проводить действия с БД или сайтов и одновременно смотреть на ошибки в логе. Чтобы остановить команду, нажмите Ctrl+C
.
Перечень возможных проблем
Table ‘./site/content’ is marked as crashed and should be repaired
Такое сообщение может появиться в логах или на сайте. Оно означает, что таблица одной из БД «побилась» и требуется ее восстановление. Необходимо подключится на сервер по SSH, выполнить команду, которая проверит все базы данных на предмет ошибок
mysqlcheck --repair --analyze --optimize --all-databases -u<USER> –p<PASSWORD>
Если эта команда выдаёт ошибку, вставьте ключи раздельно:
mysqlcheck --repair --all-databases -u<USER> –p<PASSWORD> mysqlcheck --analyze --all-databases -u<USER> –p<PASSWORD> mysqlcheck --optimize --all-databases -u<USER> –p<PASSWORD>
где
- <USER> — имя пользователя базы данных или root,
- <PASSWORD> — заменить на пароль пользователя или root от MySQL (его можно посмотреть в ISPmanager — Базы данных — Серверы БД — двойной клик на сервер MySQL для просмотра пароля root (либо Базы данных — двойной клик на нужную базу данных и двойной клик на нужного пользователя).
Либо можно выполнить исправление конкретной базы данных:
mysqlcheck --repair --analyze --optimize <DB> -u<USER> -p<PASSWORD>
где
- <USER> — имя пользователя базы данных или root,
- <PASSWORD> — заменить на пароль пользователя или root от MySQL (его можно посмотреть в ISPmanager — Базы данных — Серверы БД — двойной клик на сервер MySQL для просмотра пароля root (либо Базы данных — двойной клик на нужную базу данных и двойной клик на нужного пользователя),
- <BD> — база данных, которой требуется исправление.
mysql_connect() [function.mysql-connect]: Access denied for user ‘user_xxx’@’localhost’ (using password: YES)
Чаще всего связана с тем, что в настройках сайта указаны не верные данные (логин и/или пароль) для подключения к базе. Вариант решения: посмотреть в админ-панели сайта данные пользователя, пароль и название базы для подключения к базе. Зайти в ISPmanager — Базы данных — кликнуть на базу, затем на пользователя и в графу Пароль поставить пароль из админ-панели.
Может быть обратная ситуация, когда в панели ISPmanager указаны верные данные, а в конфигурационных файлах указаны неверные. В таком случае нужно править конфигурационные файлы, для CMS Bitrix, например, это /bitrix/.settings.php
и/bitrix/php_interface/dbconn.php
.
На сайте ошибка «Не удалось подключиться к базе данных»
В зависимости от используемой CMS эта ошибка может по-разному выглядеть:
Возникла ошибка при подключении сервера баз данных MySQL Can't connect to local MySQL server Error connect to mysql Unable to connect to the database:Could not connect to ...
Подключится на сервер по SSH, выполнить:
systemctl restart mysql #перезапуск MySQL для Ubuntu, Debian systemctl restart mariadb #перезапуск MySQL для Centos 7 ps axuw | grep mysql #Эта команда должна вывести список процессов MySQL. #Если ничего не вывела – значит, MySQL не запустился.
Убедится что в ISPmanager, в разделе Службы лампочка mysql или mariadb горит.
В панели ISPmanager не удается создать базу данных, ошибка «Недостаточно данных»
Это значит у вас в ISPmanager — Серверы БД не создано ни одного сервера баз данных. Для создания нажмите на Серверы БД, далее на Создать сервер. В полях введите название сервера БД (например, MySQL), придумайте имя пользователя и пароль. Также в панели ISPmanager можно установить более 1 СУБД, альтернативные СУБД будут работать в контейнерах Docker.
MySQL не запускается ни в сервисах, ни через консоль
При запуске через консоль ошибки могут быть вида:
cant connect to local mysql server throught socket /var/run/mysqld/mysql.d.sock /etc/init.d/mysql start Starting MySQL database server: mysqld . . . . . . . . . . . . . . failed! /usr/local/etc/rc.d/mysql-server restart mysql not running? (check /var/db/mysql/peroksid.ispvds.com.pid). Starting mysql.
Проверить свободное место на диске:
df –h #общая информация du –hs /* #сколько занимает конкретные папки
Если не осталось места, удалить ненужные файлы.
Частая ситуация, когда логи сайтов разрастаются и места на диске свободного не остается, MySQL не может нормально работать (справедливо и для всех остальных сервисов – apache, exim и т.д.)
Снова пробуем перезапустить MySQL:
systemctl restart mysql #перезапуск MySQL для Ubuntu и Debian systemctl restart mariadb #перезапуск MySQL для Centos 7
Если проблема не со свободным местом, в логах должны появиться записи, похожие на эти:
130929 06:16:05 mysqld_safe Starting mysqld daemon with databases from /var/db/mysql 130929 6:16:05 [Warning] '--skip-locking' is deprecated and will be removed in a future release. Please use '--skip-external-locking' instead. 130929 6:16:05 [Warning] option 'max_allowed_packet': unsigned value 5824839680 adjusted to 1073741824 Unknown suffix '-' used for variable 'sort_buffer_size' (value '--read_buffer_size=256K') 130929 6:16:05 [Warning] option 'sort_buffer_size': unsigned value 0 adjusted to 32776 130929 6:16:05 [ERROR] /usr/local/libexec/mysqld: Error while setting value '--read_buffer_size=256K' to 'sort_buffer_size' 130929 6:16:05 [ERROR] Aborting
Смотрим записи с меткой [ERROR]. В логе выше ошибка «Error while setting value ‘—read_buffer_size=256K’ to ‘sort_buffer_size’» означает, что в конфиге my.cnf
неверно прописана директива ‘sort_buffer_size. Этот случай приведен только для примера. В каждом конкретном случае лог будет различаться. Ошибки могут быть самые разные. Дальнейшие действия зависят от конкретной ошибки и требуют детального разбирательства.
Решение проблем с кодировками MySQL
Чтобы решить проблему — достаточно понять логику работы. MySQL, начиная с версии 4.1, знает, что такое кодировки и как с ними работать. Если до 4.0 она работала с байтами, то теперь работает с символами.
MySQL написали шведы, поэтому кодировкой по умолчанию (сразу после установки) является latin1, а «сравнение» (последовательность букв, алфавит; влияет на сортировки) — latin1_swedish.
Итак, где кодировки указываются.
1. Кодировка конкретной базы/таблицы/столбца. Это кодировка, в которой MySQL будет хранить данные. Например, если у вас данные в cp1251, то будет большой ошибкой указывать для хранения кодировку latin1. В ней нет соответствий для русских символов, все они будут заменены на вопросы.
Кодировку хранения можно задать, например, так.В терминале открываем MySQL с помощью команды mysql
или mysql -u имя_пользователя -p
, вводим пароль, после чего пишем в консоли MySQL:
create database `имя базы` default charset cp1251;
Если кодировка не указана — будет использовано значение параметра default-character-set
из файла /etc/my. cnf
(либо latin1, если параметра нет). Кстати, именно этот параметр редактирует ISPmanager в свойствах сервера баз данных.
2. Кодировка соединения. Это кодировка, в которой клиент (скрипт пользователя, форум, mysql-клиент и т.д.) общается с MySQL. Когда клиент подсоединяется к серверу, тот ему сообщает значение параметра default-character-set
. Таким образом они договариваются о том, в какой кодировке будут общаться. Кодировку общения можно изменить запросом (его лучше выполнять сразу после соединения с сервером):
set names cp1251
где вместо cp1251 вы можете указать нужную кодировку.
Кстати, множество современных правильных скриптов именно это и делают.
Одна сложность: есть ряд кривых клиентов, которые всего этого не понимают и общаются в какой-то своей кодировке. Персонально для них можно написать в /etc/my.cnf
, секцию [mysqld]
:
[mysqld] set init_connect="set names utf8"
где вместо utf8 вы можете указать нужную кодировку.
Что это означает? Сразу после подсоединения любого клиента, MySQL выполнит запрос set names utf8
, как будто смену кодировки общения запросил сам клиент.
Это всё, что нужно знать для решения любой проблемы с кодировками в MySQL. Осталось несколько уточнений (самое интересное):
phpMyAdmin, mysqldump — обычные клиенты, на них действуют те же самые правила. Одно «но»: на все PHP-скрипты (включая phpMyAdmin) действует default-character-set
из секции [client]
в my.cnf
. Для mysqldump
есть отдельная секция [mysqldump]
. Часто бывает так, что команда mysqldump «не видит» секцию [mysqldump]
, поэтому в случаях, когда необходимо делать дамп БД в определенной кодировке, лучше использовать mysqldump
с параметром --default-character-set=utf8
(вместо utf8 укажите нужную кодировку). ISPmanager прописывает default-character-set
во все секции.
Дамп базы — это обычный набор MySQL-команд. Если вы в самое его начало напишете set names cp1251;
, то эта команда тоже выполнится, и MySQL будет считать, что дальше все данные в дампе идут в кодировке cp1251.
Кодировки в MySQL-командах пишутся без кавычек и без «-» (дефисов). Популярные в России кодировки: utf8, cp866 (DOS), cp1251 (windows-1251), koi8r, utf8mb4.
И, наконец, пара советов:
- Если вы в этом новичок, постарайтесь свести всё к одной кодировке. Пусть у вас дамп и
default-character-set
(напомню, влияет на кодировку хранилища при создании таблиц и на кодировку общения с клиентом) будет в одной кодировке. Это избавит от путаницы и решит 90% проблем. - Если есть возможность — используйте консольную утилиту mysqldump. phpMyAdmin — это дополнительная прослойка, которая лишь добавляет свою путаницу и свои баги.
Чтобы русифицировать базу данных MySQL, не вдаваясь в подробности почему и как, проделайте следующие процедуры:
1. В конфигурационном файле /etc/my. cnf
добавьте следующие строчки:
Под разделом [client]:
default-character-set=cp1251
Под разделом [mysqld]:
character-set-server=cp1251 collation-server=cp1251_general_ci init-connect = "set names cp1251"
2. После этого перезапустите базу MySQL или весь ваш виртуальный сервер (из ISPmanager или консоли).
MySQL: 12 наиболее распространенных ошибок, с которыми вы можете столкнуться авторы Чинтан Мехта, Анкит Бхавсар, Субхаш Шах и Хетал Оза. Эта книга содержит советы и рекомендации по решению проблем, с которыми вы можете столкнуться при администрировании решения MySQL.
[/box]При использовании MySQL 8 может быть несколько сценариев, в которых вы не сможете получить доступ или использовать MySQL должным образом. Эти ситуации могут быть очень раздражающими, но легко исправимы. Однако, прежде чем искать решение, вы должны знать проблему! Вот некоторые из распространенных ошибок, с которыми вы можете столкнуться при использовании MySQL 8. 9.0009
1. Доступ запрещен
MySQL предоставляет систему привилегий, которая аутентифицирует пользователя, который подключается с хоста, и связывает пользователя с привилегиями доступа к базе данных. Привилегии включают SELECT, INSERT, UPDATE и DELETE и могут идентифицировать анонимных пользователей и предоставлять привилегии для определенных функций MySQL, таких как LOAD DATA INFILE и административные операции. Ошибка отказа в доступе может возникать по многим причинам. Во многих случаях проблема возникает из-за учетных записей MySQL, которые клиентские программы используют для подключения к серверу MySQL с разрешения сервера.
2. Потеряно соединение с сервером MySQL
Потеря соединения с сервером MySQL может произойти по одной из трех вероятных причин, описанных в этом разделе. Одной из возможных причин ошибки является проблема с сетевым подключением.
Если это частая ошибка, следует проверить условия сети. Если при запросе к базе данных появляется сообщение об ошибке, например «Потеряно соединение с сервером MySQL», наверняка ошибка произошла из-за проблем с сетевым подключением.
Системная переменная connection_timeout определяет количество секунд, в течение которых сервер mysqld ожидает пакет соединения перед ответом на тайм-аут соединения. Иногда эта ошибка может возникать, когда клиент пытается установить начальное соединение с сервером, а значение connection_timeout установлено на несколько секунд. В этом случае проблему можно решить, увеличив значение connection_timeout в зависимости от расстояния и скорости соединения. SHOW GLOBAL STATUS LIKE и Aborted_connects можно использовать, чтобы определить, сталкиваемся ли мы с этим чаще. Можно с уверенностью сказать, что увеличение значения connection_timeout является решением, если сообщение об ошибке содержит пакет авторизации чтения. Возможно, проблема может возникнуть из-за больших значений Binary Large OBject (BLOB), чем max_allowed_packet. Это может привести к потере соединения с ошибкой сервера MySQL с клиентами. Если наблюдается ошибка ER_NET_PACKET_TOO_LARGE, это подтверждает, что значение max_allowed_packet должно быть увеличено.
3. Ошибка ввода пароля при неправильном вводе
Клиенты MySQL запрашивают пароль, когда клиентская программа вызывается с параметром —password или -p без значения пароля. Ниже приведена команда:
> mysql -u user_name -p Введите пароль:
В некоторых системах может случиться так, что пароль работает нормально, если он указан в файле параметров или в командной строке. Но это не работает при интерактивном вводе в командной строке в строке ввода пароля:. Это происходит из-за того, что системная библиотека для чтения паролей ограничивает значения паролей небольшим числом символов (обычно восемью). Это проблема с системной библиотекой, а не с MySQL. В качестве обходного пути измените пароль MySQL на значение, состоящее из восьми или менее символов, или сохраните пароль в файле параметров.
4. Хост имя_хоста заблокирован
Если сервер mysqld получает слишком много запросов на подключение от хоста, который прерывается посередине, возникает следующая ошибка:
Хост 'имя_хоста' заблокирован из-за множества ошибок подключения. Разблокировать с помощью «mysqladmin flush-hosts»
Системная переменная max_connect_errors определяет разрешенное количество последовательных прерванных запросов на подключение. При наличии невыполненных запросов max_connect_errors без успешного подключения mysqld предполагает, что что-то не так, и блокирует хост от дальнейших подключений до тех пор, пока не будет выполнен оператор FLUSH HOSTS или команда mysqladmin flush-hosts.
mysqld по умолчанию блокирует хост после 100 ошибок подключения. Его можно настроить, установив значение max_connect_errors при запуске сервера следующим образом:
> mysqld_safe --max_connect_errors=10000
Это значение также можно настроить во время выполнения следующим образом:
mysql> SET GLOBAL max_connect_errors=10000 ;
Сначала следует проверить, что с TCP/IP-подключениями от хоста все в порядке, если для определенного хоста получена ошибка host_name is block. Увеличение значения переменной max_connect_errors не помогает, если в сети есть проблемы.
5. Слишком много подключений
Эта ошибка указывает на то, что все доступные подключения используются для других клиентских подключений. max_connections — это системная переменная, которая управляет количеством подключений к серверу. Значение по умолчанию для максимального количества подключений – 151. Мы можем установить большее значение, чем 151, для системной переменной max_connections, чтобы поддерживать больше подключений, чем 151. клиенты для подключения. Одно дополнительное подключение зарезервировано для аккаунтов с правами CONNECTION_ADMIN или SUPER. Эта привилегия может быть предоставлена администраторам с доступом к привилегии PROCESS. С этим доступом администратор может подключиться к серверу, используя зарезервированное соединение. Они могут выполнить команду SHOW PROCESSLIST для диагностики проблем, даже если исчерпано максимальное количество клиентских подключений.
6. Недостаточно памяти
Если у mysql недостаточно памяти для хранения всего запроса запроса, выданного клиентской программой MySQL, сервер выдает следующую ошибку:
mysql: Недостаточно памяти в строке 42, 'malloc. c' mysql: требуется 8136 байт (8 КБ), используемая память: 12481367 байт (12189 КБ) ОШИБКА 2008: Клиенту MySQL не хватило памяти
Чтобы устранить проблему, мы должны сначала проверить правильность запроса. Ожидаем ли мы, что запрос вернет так много строк? Если нет, мы должны исправить запрос и выполнить его снова. Если запрос правильный и не нуждается в исправлении, мы можем подключить mysql с параметром –quick. Использование параметра –quick приводит к вызову функции C API mysql_use_result() для получения набора результатов. Функция добавляет больше нагрузки на сервер и меньше на клиента.
7. Слишком большой пакет
Коммуникационный пакет является одним из следующих:
- Один оператор SQL, который клиент MySQL отправляет на сервер MySQL
- Одна строка, отправленная клиенту MySQL с сервера MySQL
- Событие двоичного журнала, которое отправляется с главного сервера репликации на подчиненное устройство репликации
Размер пакета 1 ГБ — это максимально возможный размер пакета, который может быть передан на или с сервера или клиента MySQL 8. Сервер или клиент MySQL выдает ошибку ER_NET_PACKET_TOO_LARGE и закрывает соединение, если получает пакет больше, чем max_allowed_packet bytes.
Размер max_allowed_packet по умолчанию составляет 16 МБ для клиентской программы MySQL. Чтобы установить большее значение, можно использовать следующую команду:
> mysql --max_allowed_packet=32M
Значение по умолчанию для сервера MySQL составляет 64 МБ. Следует отметить, что нет ничего плохого в том, чтобы установить большее значение для этой системной переменной, так как дополнительная память выделяется по мере необходимости.
8. Таблица заполнена
Ошибка заполнения таблицы возникает при одном из следующих условий:
- Диск заполнен
- Таблица достигла максимального размера
Фактический максимальный размер таблицы в базе данных MySQL может быть определен ограничениями, накладываемыми операционной системой на размеры файлов.
9. Невозможно создать/записать в файл
Это указывает на то, что MySQL не может создать временный файл во временном каталоге для набора результатов, если мы получаем следующую ошибку при выполнении запроса:
Невозможно создать /запись в файл 'sqla3fe_0. ism'
Возможное решение этой ошибки — запустить сервер mysqld с параметром –tmpdir. Ниже приведена команда:
> mysqld --tmpdir C:/temp
10. Рассинхронизация команд
Если функции клиента вызываются в неправильном порядке, будет получена ошибка рассинхронизации команд. Это означает, что команда не может быть выполнена в клиентском коде. Например, если мы выполним mysql_use_result() и попытаемся выполнить другой запрос перед выполнением mysql_free_result(), может возникнуть эта ошибка. Это также может произойти, если мы выполним два запроса, которые возвращают набор результатов, не вызывая функции mysql_use_result() или mysql_store_result() между ними.
11. Игнорирование пользователя
При обнаружении учетной записи в таблице пользователей с недопустимым паролем при запуске сервера mysqld или при перезагрузке сервером таблиц привилегий возникает следующая ошибка:
Найден неправильный пароль для пользователя 'some_user' @'некоторый_хост'; ignoring user
В результате учетная запись игнорируется системой разрешений MySQL. Чтобы решить эту проблему, мы должны назначить новый действительный пароль для аккаунта.
12. Таблица tbl_name не существует
Следующая ошибка указывает на то, что указанная таблица не существует в базе данных по умолчанию:
Таблица 'tbl_name' не существует Не удается найти файл: 'tbl_name' (ошибка: 2)
В некоторых случаях пользователь может неправильно ссылаться на таблицу. Это возможно, потому что сервер MySQL использует каталоги и файлы для хранения таблиц базы данных. В зависимости от управления файлами операционной системы имена баз данных и таблиц могут быть чувствительны к регистру.
Для файловых систем без учета регистра, таких как Windows, ссылки на указанную таблицу, используемые в запросе, должны использовать один и тот же регистр букв.
В дополнение к этому вы можете столкнуться с ошибками сервера MySQL 8, такими как проблема с разрешением, или с ошибками клиента, такими как проблема со значениями NULL. Чтобы узнать, как с ними бороться, вы можете обратиться к этой книге Руководство администратора MySQL 8 .
Читать далееMySQL 8.0 обычно доступен с дополнительными функциями
Базовый веб-сайт с использованием базы данных Node.js и MySQL
Распространенные ошибки MySQL и способы их исправления
Учебные пособия6 мин чтения
Хотя коды ошибок MySQL полезны, понять, что они означают, может быть сложно. В этой статье рассматриваются распространенные коды ошибок MySQL, незакодированные ошибки и способы их исправления.
Каждая ошибка MySQL включает:
- Номер ошибки: специфичный для MySQL номер, соответствующий конкретной ошибке.
- Значение
SQLSTATE
: строка из пяти символов, указывающая на состояние ошибки. - Сообщение об ошибке: текстовое описание ошибки.
Пример ошибки MySQL
Вот пример кода ошибки MySQL:
ОШИБКА 1146 (42S02): Таблица 'test.no_such_table' не существует
В приведенной выше ошибке:
- 904163 116163 это номер ошибки.
-
422s02
— это значениеSQLSTATE
. -
Таблица test.no_such_table не существует
— это сообщение об ошибке.
Давайте рассмотрим некоторые распространенные коды ошибок, их значение и способы их устранения.
Ошибка 1040: Слишком много подключений
Ошибка 1040 возникает, когда MySQL достигает максимального количества клиентских подключений, заставляя вас закрывать подключения, чтобы сервер мог принимать новые подключения.
По умолчанию MySQL может обрабатывать до 151 соединения. При необходимости вы можете изменить это, отредактировав значение переменной max_connections
. Один из подходов к исправлению этой ошибки — установка max_connections
значение числа, соответствующего использованию соединения.
Например, если вы считаете, что вам нужно около 200 подключений, вы можете установить значение 250.
SET GLOBAL max_connections = 250;
Обратите внимание, что чем больше вы увеличиваете количество подключений, тем больше ресурсов памяти получает MySQL, что увеличивает вероятность сбоя сервера.
Ошибка 1045: Доступ запрещен
Ошибка 1045 возникает, когда пользователю отказано в разрешении на выполнение таких операций, как SELECT
, INSERT
, UPDATE
и DELETE
в базе данных. Ниже приведен список некоторых причин, по которым MySQL отказывает в доступе, и возможные исправления.
- Пользователь не существует. Проверьте, существует ли пользователь в базе данных, и если нет, создайте нового пользователя.
- Неверный пароль. Чтобы это исправить, сбросьте пароль MySQL.
- Подключение к неверному хосту. Дважды проверьте правильность хоста, к которому вы подключаетесь.
Ошибка 1064: Синтаксическая ошибка
В этой ошибке часто виноваты проблемы синтаксиса SQL, такие как зарезервированные ключевые слова, отсутствующие данные или неправильно введенные команды. Лучший способ определить синтаксическую проблему — сравнить запрос с сообщением об ошибке, чтобы определить конкретную точку в запросе, вызвавшую ошибку. Чтобы устранить эту ошибку:
- Проверьте свой код и исправьте опечатки в командах.
- Если вам необходимо использовать зарезервированные ключевые слова, поместите их в обратные кавычки следующим образом:
ВСТАВКА
. - Замените устаревшие команды текущими.
- Добавить недостающие данные в базу данных.
- Используйте автоматическую проверку синтаксиса, например EverSQL.
Ошибка 1114: Таблица заполнена
Ошибка 1114 возникает при попытке вставить данные в таблицу из-за нехватки дисковой памяти. Проблемы с заполнением диска также могут возникать при создании резервной копии больших баз данных вместе с исходной базой данных.
Чтобы исправить эту ошибку, проверьте раздел, в котором установлен сервер MySQL, и убедитесь, что он заполнен менее чем на 80%.
Ошибка 2006: соединение с сервером MySQL закрыто
Ошибка 2006 возникает, когда время ожидания соединения с сервером MySQL истекло и соединение было закрыто. Значение wait_timeout
определяет, как долго сервер ожидает закрытия соединения из-за бездействия. Чтобы это исправить, проверьте значение wait_timeout
(по умолчанию 28800 секунд) и увеличьте его, если оно слишком низкое.
Ошибка 2008: Клиенту не хватило памяти
Это сообщение об ошибке означает, что недостаточно памяти для хранения всего результата запроса. Чтобы решить эту проблему, проверьте особенности запроса. Вам нужно вернуть столько результатов из базы данных? Если нет, измените запрос, чтобы он возвращал только необходимые строки.
Ошибка 2013: Потеряно соединение во время запроса
Ошибка 2013 возникает, когда соединение между клиентом MySQL и сервером базы данных разрывается, обычно из-за того, что базе данных требуется слишком много времени для ответа.
Чтобы исправить ошибку, сначала убедитесь, что ваше интернет-соединение стабильно. Задержка результатов может быть связана с проблемами подключения к сети. Кроме того, попробуйте увеличить значение net-read-timeout
, чтобы дать больше времени для выполнения запроса.
В дополнение к закодированным ошибкам существует несколько распространенных незакодированных ошибок MySQL, с которыми вы можете столкнуться.
Слишком большой пакет
Максимально возможный размер кармана, передаваемого на сервер или клиент MySQL 8.0 или с него, составляет 1 ГБ. Переменная max_allowed_packet
хранит допустимый размер пакета.
Для клиента значение по умолчанию max_allowed_packet
составляет 16 МБ, а для сервера — 64 МБ. Чтобы исправить эту ошибку, увеличьте значение max_allowed_packet
для клиента и сервера.
Например, увеличьте max_allowed_packet
для клиента до 32 МБ:
mysql --max_allowed_packet=32M
Обратите внимание, что MySQL необходимо перезапустить, чтобы изменения вступили в силу.
Невозможно создать/записать файл
Вы получите эту ошибку, если MySQL не сможет создать временный файл для результата во временном каталоге. Это может быть связано с тем, что в папке /tmp
не осталось памяти, или с неправильной конфигурацией, которая не позволяет MySQL записывать в папку /tmp
.
Чтобы решить проблему с памятью, попробуйте запустить сервер MySQL с параметром --tmpdir
и указать каталог, в который сервер будет производить запись. Например, чтобы указать C:/temp:
tmpdir=C:/temp
Если конфигурация неверна, убедитесь, что у MySQL есть разрешение на запись в каталог, указанный параметром tmpdir
.
Команды рассинхронизированы
Ошибка рассинхронизирована команд
возникает при вызове клиентских функций в неправильном порядке. Например, используя mysql_use_result()
перед вызовом mysql_free_result()
вызовет эту ошибку.
Чтобы исправить эту ошибку, проверьте свои функции и убедитесь, что вы вызываете их в правильном порядке.
Имя хоста заблокировано
Эта ошибка возникает, когда сервер MySQL получает слишком много соединений, которые были прерваны хостом. Сервер предполагает, что что-то не так, например, кто-то пытается проникнуть в систему, и блокирует имя хоста, пока вы не выполните flush-hosts 9.Команда 0163.
Количество прерванных запросов на подключение определяется переменной max_connect_errors
, по умолчанию 10. Измените значение, запустив сервер MySQL следующим образом:
mysqld_safe --max_connect_errors=10000
Прерванные соединения
Эта ошибка возникает, когда клиенты пытаются и не могут подключиться к серверу MySQL, часто из-за того, что клиент использует неверные учетные данные или не имеет права доступа.
Чтобы исправить эту ошибку, начните с проверки журналов ошибок и общих журналов в /var/log/mysql/
, чтобы определить причину прерывания соединения.
Обработка ошибок может быть утомительной и занимать много времени, поэтому важно понимать, как исправить распространенные ошибки MySQL. Если вы ищете простой и удобный для разработчиков способ запуска MySQL, попробуйте PlanetScale.