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"
Ещё одна похожая и часто встречающаяся ошибка подключения — «(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) контролируется системной переменной max_connections
. Устранить проблему можно, увеличив значение переменной в файле конфигурации /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, MariaDB, как и любой программа, имею тенденцию к ошибкам и поломкам. В этом руководстве попытаюсь создать инструкцию с чего начинать анализ проблем базы данных. В конце опишу ряд типичных ошибок и буду их дополнять.
Начинать нужно не с просмотра логов, как бы не странно это звучало. Нужно собрать сведения о рабочем окружении базы данных.
Если не будет сказано обратного, то статья тестировалась на CentOS 7.
Из листинга ниже, видно что на сервере установлен именно MySQL версии 5.6.51, а не MariaDB.
mysql --version mysql Ver 14.14 Distrib 5.6.51, for Linux (x86_64) using EditLine wrapper
Теперь нужно узнать какими мощностями обладает сервер, как минимум количество процессоров, размер оперативной памяти и свободное место нужно проверить.
# free -h total used free shared buff/cache available Mem: 991M 537M 76M 207M 376M 109M
cat /proc/cpuinfo или lscpu
CPU(s): 1 Model name: DO-Regular CPU MHz: 2294.606 Hypervisor vendor: KVM Virtualization type: full L1d cache: 32K L1i cache: 32K L2 cache: 4096K
В нашем случае всего 1 ядро, процессор DO-Regular (это самый минимум).
Читайте также: Размер базы данных PostgreSQL
Предполагаем, что все файлы баз данных хранятся физически в одном месте (по умолчанию это директория /var/lib/mysql). Стандартно используем утилиту du.
Вывести полный размер директории:
# du -hsx /var/lib/mysql 208M /var/lib/mysql
Вывести полный размер директории для каждой базы данных. Учтите, что файлы находящие непосредственно в директории /var/lib/mysql показаны не будут, а в примере ниже как раз они и занимают больше всего места. А это очень интересные файлы: ibdata1, ib_logfile0,ib_logfile1, но о них поговорим ниже.
# du -h /var/lib/mysql 2.0M /var/lib/mysql/mysql 636K /var/lib/mysql/performance_schema 13M /var/lib/mysql/task41topadm 2.8M /var/lib/mysql/task42topadm 2.7M /var/lib/mysql/task43topadm 1.6M /var/lib/mysql/postfix 1.9M /var/lib/mysql/task3 12M /var/lib/mysql/task42wordpress 208M /var/lib/mysql
Узнаем размер базы данных (в мегабайтах) с помощью SQL запроса. Запрос выведет точный размер базы MySQL для каждой из существующих баз, теперь вы можете ориентироваться что и сколько занимает
(поменяйте название БД на свое в строке — «WHERE table_schema = «dbname»»):
SELECT table_schema AS "Name DB", ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS "Size in MB" FROM information_schema.TABLES GROUP BY table_schema;
Если какая -то из БД вам кажется большой, можно посмотреть для конкретной базы данных размер ее таблиц. Используя SQL запрос ниже не забудьте заменить, в параметре table_schema = «nameDB», nameDB на имя вашей БД.
SELECT TABLE_NAME AS "Name table", ROUND(((data_length + index_length) / 1024 / 1024), 2) AS "Size in MB" FROM information_schema.TABLES WHERE table_schema = "nameDB" ORDER BY (data_length + index_length) DESC;
Заключение
В этом примере наглядно показано, что размер базы данных физический (занимаемое место на жестком диске) и виртуальный — РАЗНЫЙ. И это нужно понимать.
Зачастую приблуды типо phpmyadmin или нет времени использовать или нет возможности. Значит все сведения нужно получить из консоли Mysql.
Возможно понадобится узнать движки, которые поддерживает установленная версия MySQL. Для этого используем SQL запрос: SHOW ENGINES;
Обратите внимание на столбец Support, если указано значение «NO» тип хранения данных не поддерживается (не включен).
Самый простой способ узнать тип движка у таблицы — это вызвать SHOW CREATE TABLE <имя_таблицы>
SHOW CREATE TABLE wp_posts; ... ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci ...
Для обнаружения неэффективных запросов к базе, следует проверить лог медленных запросов. В случае оптимизации запросов этот лог поможет выяснить, что необходимо оптимизировать в первую очередь.
Настройки в my.cnf раздел mysqld
[mysqld] log_output = file slow_query_log = ON long_query_time = 0 log_slow_admin_statements = ON log_slow_slave_statements = ON slow_query_log_file = /var/log/mariadb/slow-queries.log
Загрузка mysql, которую вы видите в «top», представляет собой общую загрузку всех потоков mysql на всех ядрах. Если у вас есть система с 24 ядрами, вы можете приблизиться к нагрузке одного ядра, разделив 200%/24, что дает нагрузку ~ 8%, что неплохо. Если вы хотите иметь подробное представление о том, что происходит, используйте «htop» вместо «top», а в его настройках включите «древовидное представление» (settings- > display options- > tree view). Вы увидите все потоки mysql с их загрузкой и общую нагрузку (теперь вы видите) в корневом дереве.
Говорят! MySQL полностью многопоточен и будет использовать несколько процессоров, при условии, что операционная система поддерживает их, это также увеличит системные ресурсы при правильной настройке производительности.
Но настройка этой так называемой многопоточности разница от версии к версии:
Типичным параметром в my.ini, влияющим на производительность потока, является:
thread_cache_size = 8
Thread_cache_size может быть увеличен для улучшения производительность, если у вас много новых подключений. Обычно это не обеспечивает заметного повышения производительности, если у вас хорошая реализация потоков. Однако, если ваш сервер видит сотни подключений в секунду, вам обычно следует установить значение thread_cache_size достаточно высоким, чтобы большинство новых подключений использовали кэшированные потоки
Если вы используете Solaris, то вы можете использовать
thread_concurrency = 8
Thread_concurrency позволяет приложениям давать системе потоков подсказку о желаемом количестве потоков, которые должны выполняться одновременно.
Эта переменная устарела с MySQL 5.6.1 и удалена в MySQL 5.7. Вы должны удалять ее из файлов конфигурации MySQL всякий раз, когда вы ее видите, если они не предназначены для Solaris 8 или более ранних версий.
Если же нужно посмотреть информацию в более удобном виде и узнать не только ENGINE, то можно выполнить такой SQL-запрос:
SELECT TABLE_NAME,ENGINE,ROW_FORMAT,TABLE_ROWS,DATA_LENGTH,INDEX_LENGTH FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'mysql' ORDER BY ENGINE ASC;
Колонка ENGINE — это тип движка у таблицы;
Колонка ROW_FORMAT — это формат строк таблицы;
Колонка TABLE_ROWS — это количества записей в таблице;
Колонка DATA_LENGTH — это размер данных в таблице в байтах;
Колонка INDEX_LENGTH — это размер индекса в таблице в байтах;
InnoDB — основной движок для MySQL, который с версии 5.5 стал дефолтным. Поддерживает транзакции, репликацию, построчную блокировку. В отличие от таблиц MyISAM, где для каждой таблицы создается один файл данных, данные InnoDB в настройках по умолчанию хранятся в больших совместно используемых файлах. То есть данные для всех таблиц и всех баз данных хранятся в одном файле, изменить это можно с помощью настроек опции innodb_file_per_table (Как включить MySQL innodb_file_per_table?). http://michael-xiii.blogspot.com/2011/10/mysql-innodbfilepertable.html
Чтобы уменьшить размер своей базы данных с движком InnoDB, необходимо воспользоваться mysqldump, чтобы сделать дамп всех своих таблиц, создать новую базу данных и импортировать таблицы в новую базу данных.
Источник https://runebook.dev/ru/docs/mariadb/innodb-persistent-statistics/index
MariaDB начиная с 10.0.4
Постоянная статистика для InnoDB была введена в MariaDB 10.0.4 .
До MariaDB 10.0 статистика InnoDB не хранилась на диске, а это означало, что при перезапуске сервера статистику необходимо было пересчитывать, что является как ненужным вычислением, так и приводило к несогласованным планам запросов.
Существует ряд переменных,контролирующих постоянную статистику:
innodb_stats_persistent — если установлено (по умолчанию), включает постоянную статистику InnoDB.
innodb_stats_auto_recalc — если установлено (по умолчанию), постоянная статистика автоматически пересчитывается при значительном изменении таблицы (более 10% строк)
innodb_stats_persistent_sample_pages — Количество страниц индекса, отобранных (по умолчанию 20) при оценке количества элементов и статистики для индексированных столбцов. Увеличение этого значения повысит точность статистики индекса, но потребует больше ресурсов ввода-вывода при запуске ANALYZE TABLE .
Эти настройки могут быть перезаписаны для каждой таблицы с помощью предложений STATS_PERSISTENT , STATS_AUTO_RECALC и STATS_SAMPLE_PAGES в операторе CREATE TABLE или ALTER TABLE .
Данные, относящиеся к таблицам формата InnoDB, могут храниться в одном файле ibdata1 или в раздельных файлах формата .ibd. Исторически хранение в одном файле является основным методом.
Ранее MySQL по умолчанию все таблички innodb хранил в одном файле — когда их накапливается приличное количество — файл значительно разрастается. Плюс не забывайте, что при удалении данных в innodb — размер файла не уменьшается — он растет только в большую сторону. Так что если данных в базе у вас много или идет активное удаление — рано или поздно вы задумаетесь о том, чтобы выполнить подобное разделение
Как уменьшить размер InnoDB
Данные, загруженные в таблицы MySQL, остаются в файле ibdata1 и не удаляются даже после того как удалены сами таблицы. Размер файла при этом может значительно увеличиваться. Чтобы этого избежать в конфигурацию сервера баз данных добавляют директиву innodb_file_per_table, благодаря ей данные вновь создаваемых таблиц сохраняются в отдельные файлы.
Значения параметра, используемые по умолчанию для разных версий пакетов:
Аналогичная ошибки, если вы в логах видите Can’t open file: ‘*.MYI’. (errno: 145) или Fix: MySQL table is marked as crashed and last repair failed
То лечится это одинаково, что MYSQL, что в MariaDB
<code>
100125 9:33:30 /usr/local/libexec/mysqld: Can’t open file: ‘*.MYI’. (errno: 145)
ERROR: 1016 Can’t open file: ‘***.MYI’. (errno: 145)
</code>
Table 'your table' is marked as crashed and last (automatic?) repair failed
Предварительно остановите Базу данных, например так
service mysql stop
myisamchk --silent --force */*.MYI
myisamchk -r /var/lib/mysql/*/*.MYI
Also, run the following SQL query using phpMyAdmin:
REPAIR TABLE TableName
Если такая проблема возникает, необходимо выяснить, заключается она в сервере или в клиенте. Обратите внимание, что многие сбои сервера вызваны повреждёнными файлами данных или индексными файлами.
Чтобы узнать время безотказной работы сервера, запустите команду mysqladmin.
mysqladmin version -uroot -p Server version 5.6.51 Protocol version 10 Connection Localhost via UNIX socket UNIX socket /var/lib/mysql/mysql.sock Uptime: 1 hour 4 min 51 sec Threads: 1 Questions: 59 Slow queries: 0 Opens: 102 Flush tables: 1 Open tables: 95 Queries per second avg: 0.015
Кроме того, можно остановить сервер, сделать отладку MySQL и снова запустить службу. Для отображения статистики процессов MySQL во время выполнения других процессов откройте окно командной строки и введите следующее:
$ sudo mysqladmin -i 5 status
Или
$ sudo mysqladmin -i 5 -r status
100125 9:49:57 Error reading packet from server: Client requested master to start replication from impossible position (server_errno=1236) 100125 9:49:57 Got fatal error 1236: 'Client requested master to start replication from impossible position' from master when reading data from binary log 100125 9:49:57 Slave I/O thread exiting, read up to log 'broadband-bin.3239', position 61452688
Остановить репликацию.
Сделать mysqldump на мастере, перед этим
SHOW MASTER STATUSG;
Отметить у себя текущий File (binlog.000xx) и позицию Position.
Дамп залить на slave, там же сделать
CHANGE MASTER TO MASTER_LOG_FILE=»записанный binlog.000xx», MASTER_LOG_POS=»записанная позиция»;
Запустить репликацию
Access denied for user ‘debian-sys-maint’@’localhost’
Ошибка «Access denied for user ‘debian-sys-maint’@’localhost'» в FAQ Debian может появляться в нескольких случаях, например
Пользователь debian-sys-maint служит например для проверки таблиц при запуске сервера MySQL.
Для исправления ошибки, запоминаем пароль(строка password) из файла debian.cnf. И через клиента mysql и выполняем две SQL команды
# nano /etc/mysql/debian.cnf # mysql -u root -p mysql> GRANT RELOAD, SHUTDOWN, PROCESS, SHOW DATABASES, SUPER, LOCK TABLES ON *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'пишем пароль из debian.cnf'; mysql> GRANT ALL PRIVILEGES ON *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'пишем пароль из debian.cnf' WITH GRANT OPTION;
Существует несколько видов журналов (logs) сервера MySQL:
-
бинарный лог (binary log)
-
лог ошибок (error log)
-
лог медленный запросов (slow query log)
-
лог запросов (general query log)
-
лог репликаций (relay log)
Для включения подробного логгирования запросов ко всем базам Движок БД MySQL, нужно в файле my.cnf в секции [mysqld] нужно прописать строки:
general_log_file = /var/log/mysql/mysql.log general_log = 1
Создать и присвоить права этому файлу, перегрузить сервер MySQL:
touch /var/log/mysql/mysql.log chown mysql:mysql /var/log/mysql/mysql.log /etc/init.d/mysql restart
Самое важное при диагностике — понять, что именно вызвало ошибку. Следующие шаги помогут вам в этом:
От автора: функционал системы управления базами данных MySQL невероятен. Освоить работу с этим инструментом не легче, чем выучить абсолютно новый язык программирования. Многие начинающие разработчики даже не знают с чего начать. С другой стороны, когда MySQL прописывает «error» с неизвестным номером, у новичка и вовсе опускаются руки. Среди тем, которые мы обсудим в сегодняшней статье, будет работа с MySQL в Linux. Полностью мы не сможем охватить все, но покажем, что не стоит паниковать при первых трудностях. У каждой MySQL error есть решение!
Установить на Linux – легко
Если вы работаете с языком программирования PHP, то базы данных MySQL уже установлены на вашем компьютере. Они поставляются вместе с AMP наборами разработчика. Но в пакете программного обеспечения может находится MariaDB или другая СУБД, а вам нужен именно MySQL. Тем более, что обработка ошибок намного лучше реализована именно на версии My.
Как всегда, главным героем этого параграфа станет терминал. Он наилучшим образом подходит для установки программного обеспечения на Linux-подобные операционные системы:
он потребляет меньше ресурсов, чем любой, даже самый оптимизированный интерфейс. А сложность работы с командной строкой не больше, чем изучение php;
JavaScript. Быстрый старт
Изучите основы JavaScript на практическом примере по созданию веб-приложения
Узнать подробнее
перечень команд. Когда вы пользуетесь графическим установщиком, то вынуждены ждать, пока программа поэтапно выполнит все действия. В терминале можно прописать определенную последовательность. Таким образом, у системного администратора высвобождается время для более трудоемких задач;
копипаст. Когда вы хотите скачать программу на Windows, вам необходимо загружать на компьютер установщики, причем, не всегда из проверенных источников. В случае с Linux, нужно просто скопировать команду, если она не была известна вам ранее.
Предпочтительная установка MySQL на Linux тоже происходит благодаря консоли. Чтобы ее совершить, будет необходимо использовать три команды:
$ sudo apt update $ sudo apt install mysql—server $ sudo mysql_secure_installation |
Первая из них служит для того, чтобы обновить пакеты. Когда мы рассматривали установку MySQL в Windows, то одним из первых шагов были установки утилит: фреймворка и Visual C++. Примерно то же самое мы делаем и командой apt update, чтобы обеспечить совместимость оси с новым программным обеспечением.
Далее, по команде apt install mysql-server будет произведена установка самой MySQL. На данном этапе все могло бы быть окончено, но такая СУБД пока небезопасна, а коды ошибок будут частыми гостями в вашем воркфлоу. Но и здесь консоль выручает пользователя дистрибутива Linux. Вместо того, чтобы вручную настраивать всю конфигурацию, он просто пропишет одну sudo-команду: sudo mysql_secure_installation.
Далее, автопилот Linux на время отключается и управлять настройками начинает администратор. На этом этапе, он получит предложение об инсталляции валидатора паролей (надежное средство от подбора и брутфорса). А после, необходимо будет создать рут-пароль, как и в GUI-установщике Windows.
Существуют и решения для обеспечения безопасности при подключении к MySQL других инструментов, таких как phpMyAdmin. Согласно стандартным настройкам, рут-права получает пользователь, который введет пароль либо использует плагин для автоматического входа. phpMyAdmin не позволит программе вводить данные аутентификации. Он требует лишь ввода рут-пасса, который подтвердит санкционированность действий пользователя.
База данных из консоли
Если программное обеспечение можно установить при помощи терминала, значит можно проводить управление ею точно таким же способом. К примеру, создать базу данных можно не только с GUI-интерфейса Linux, но и при помощи командной строки. Для этого нужно лишь знать немного команд и владеть root в MySQL, где мы и будем создавать базу данных. Сделать это можно при помощи команды:
JavaScript. Быстрый старт
Изучите основы JavaScript на практическом примере по созданию веб-приложения
Узнать подробнее
Далее, в том же интерфейсе, необходимо дать команду для создания базы данных:
mysql> CREATE DATABASE имя_базы; |
Чтобы убедится в том, что база данных создана, нужно прописать команду:
Прямо из терминала, базами данных можно и управлять. Но, это тема для целой книги, а не краткого параграфа в рамках статьи. Чтобы ознакомится с другими возможностями такого управления, читайте документацию MySQL и операционной системы, с которой вы стартуете.
Обработка исключений
Некоторые называют их ошибками, но это не совсем верный подход. Дело в том, что исключения не всегда являются таковыми, несмотря на то, что даже утилиты могут называть «обработчиками ошибок». Исключительная ситуация – это такое состояние данных или целой системы, которое делает дальнейшие операции невозможными или лишенными всякого смысла. То есть, это может быть не столько ошибка программиста или системы, сколько закономерное явление, которое препятствует работе. Конечно же, подобные ситуации возникают и в MySQL. Благо, программа умеет обрабатывать ошибки.
Иногда, ошибка может показаться незначительной. Например, несмотря на то, что какая-то из операций выдала ошибку, сама программа сработала правильно, полностью игнорируя искаженные данные. В ряде случаев программисты даже создают алгоритмы, в которых код выполняется несмотря ни на что. Но, с базами данных MySQL так поступать нельзя. Хранимые операции, если окажутся ошибочными, могут полностью дискредитировать целостность базы данных, как и информацию, которая в ней хранится.
Разработчики, которые используют MySQL в качестве системы управления базами данных, назначают сразу несколько обработчиков, а после, задают им приоритет. Важно, чтобы программа не только остановила свою работу при обнаружении ошибки, но и сигнализировала об этом. Игнорирование здесь неуместно: лучше увидеть разочаровывающие оповещения с номером ситуации, чем иметь полностью неправильные вычисления.
Цифры в ошибках
MySQL обозначает все свои ошибки при помощи цифр. Взирая на то, что неполадка может возникнуть как на клиентской, так и на серверной стороне, числа помогают понять, где искать проблему. Кроме чисел, ошибки имеют название и описание. Но, искать ошибку по слову – не очень хорошая затея. Эти атрибуты меняются от версии к версии программного обеспечения, в то время, как числа – довольно стойкая характеристика.
ER_INVALID_DEFAULT
Это одна из самых распространённых ошибок, обозначение которой 1067. В документации объяснение мало чем поможет: оно создано программистами. Но, сообщество пользователей уже сумело разгадать причину invalid_default. Ошибка 1067 может сигнализировать сразу о нескольких ситуациях. Как правило, причина преткновения в том, что неверно была указана директория для инсталлирования MySQL. Если построить процедуру установки СУБД и не использовать пробелы в «пути», то такая проблема больше не возникнет.
А у нас все! Осваивайте MySQL на практике: только так можно стать джедаем баз данных.
JavaScript. Быстрый старт
Изучите основы JavaScript на практическом примере по созданию веб-приложения
Узнать подробнее
MongoDB
Посмотрите видео по MongoDB!
Смотреть
Contents
- Server Not Running in Specified Location
- Unable to Connect from a Remote Location
- Authentication Problems
- Problems Exporting Query Results
- Access to the Server, but not to a Database
- Option Files and Environment Variables
- Unable to Connect to a Running Server / Lost root Password
- localhost and %
- See Also
If you are completely new to MariaDB and relational databases, you may want to start with the MariaDB Primer. Also, make sure you understand the connection parameters discussed in the Connecting to MariaDB article.
There are a number of common problems that can occur when connecting to MariaDB.
Server Not Running in Specified Location
If the error you get is something like:
mysql -uname -p ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2 "No such file or directory")
or
mysql -uname -p --port=3307 --protocol=tcp ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (111 "Connection refused")
the server is either not running, or not running on the specified port, socket or pipe. Make sure you are using the correct host, port, pipe, socket and protocol options, or alternatively, see Getting, Installing and Upgrading MariaDB, Starting and Stopping MariaDB or Troubleshooting Installation Issues.
The socket file can be in a non-standard path. In this case, the socket
option is probably written in the my.cnf file. Check that its value is identical in the [mysqld] and [client] sections; if not, the client will look for a socket in a wrong place.
If unsure where the Unix socket file is running, it’s possible to find this out, for example:
netstat -ln | grep mysqld unix 2 [ ACC ] STREAM LISTENING 33209505 /var/run/mysqld/mysqld.sock
Unable to Connect from a Remote Location
Usually, the MariaDB server does not by default accept connections from a remote client or connecting with tcp and a hostname and has to be configured to permit these.
(/my/maria-10.4) ./client/mysql --host=myhost --protocol=tcp --port=3306 test ERROR 2002 (HY000): Can't connect to MySQL server on 'myhost' (115) (/my/maria-10.4) telnet myhost 3306 Trying 192.168.0.11... telnet: connect to address 192.168.0.11: Connection refused (/my/maria-10.4) perror 115 OS error code 115: Operation now in progress
To solve this, see Configuring MariaDB for Remote Client Access
Authentication Problems
Note that from MariaDB 10.4.3, the unix_socket authentication plugin is enabled by default on Unix-like systems. This uses operating system credentials when connecting to MariaDB via the local Unix socket file. See unix_socket authentication plugin for instructions on connecting and on switching to password-based authentication as well as Authentication from MariaDB 10.4 for an overview of the MariaDB 10.4 changes..
Authentication is granted to a particular username/host combination. user1'@'localhost'
, for example, is not the same as user1'@'166.78.144.191'
. See the GRANT article for details on granting permissions.
Passwords are hashed with PASSWORD function. If you have set a password with the SET PASSWORD statement, the PASSWORD function must be used at the same time. For example, SET PASSWORD FOR 'bob'@'%.loc.gov' = PASSWORD('newpass')
rather than just SET PASSWORD FOR 'bob'@'%.loc.gov' = 'newpass'
;
Problems Exporting Query Results
If you can run regular queries, but get an authentication error when running the SELECT … INTO OUTFILE, SELECT … INTO DUMPFILE or LOAD DATA INFILE statements, you do not have permission to write files to the server. This requires the FILE privilege. See the GRANT article.
Access to the Server, but not to a Database
If you can connect to the server, but not to a database, for example:
USE test; ERROR 1044 (42000): Access denied for user 'ian'@'localhost' to database 'test'
or can connect to a particular database, but not another, for example
mysql -u name db1
works but not mysql -u name db2
, you have not been granted permission for the particular database. See the GRANT article.
Option Files and Environment Variables
It’s possible that option files or environment variables may be providing incorrect connection parameters. Check the values provided in any option files read by the client you are using (see mysqld Configuration Files and Groups and the documentation for the particular client you’re using — see Clients and Utilities).
Option files can usually be suppressed with no-defaults
option, for example:
mysqlimport --no-defaults ...
Unable to Connect to a Running Server / Lost root Password
If you are unable to connect to a server, for example because you have lost the root password, you can start the server without using the privilege tables by running the --skip-grant-tables
option, which gives users full access to all tables. You can then run FLUSH PRIVILEGES to resume using the grant tables, followed by SET PASSWORD to change the password for an account.
localhost and %
You may have created a user with something like:
CREATE USER melisa identified by 'password';
This creates a user with the ‘%’ wildcard host.
select user,host from mysql.user where user='melisa'; +--------+------+ | user | host | +--------+------+ | melisa | % | +--------+------+
However, you may still be failing to login from localhost. Some setups create anonymous users, including localhost. So the following records exist in the user table:
select user,host from mysql.user where user='melisa' or user=''; +--------+-----------+ | user | host | +--------+-----------+ | melisa | % | | | localhost | +--------+-----------+
Since you are connecting from localhost, the anonymous credentials, rather than those for the ‘melisa’ user, are used. The solution is either to add a new user specific to localhost, or to remove the anonymous localhost user.
See Also
- CREATE USER
- GRANT
- Authentication from MariaDB 10.4
- Authentication from MariaDB 10 4 video tutorial