Ошибка 1292: Incorrect date value
При попытке добавить данные в таблицу MySQL без указания даты может выдаваться ошибка:
ERROR 1292 (22007): Incorrect date value: '0000-00-00' for column 'columnname' at row 1
Из-за этой ошибки может нарушаться работа импорта в 1С.
Для решения проблемы необходимо:
1. Открыть файл
nano /etc/mysql/my.cnf
2. В строке, начинающейся с удалить следующие значения:
NO_ZERO_IN_DATE NO_ZERO_DATE STRICT_ALL_TABLES
3. Выполнить перезагрузку mysql-сервера:
sudo service mysql restart
Примечание:
Если строка вида отсутствует, необходимо:
1. В файл после параметра добавить строку:
sql-mode="ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
2. Выполнить перезагрузку mysql-сервера:
sudo service mysql restart
Не удаётся подключиться к локальному серверу
Одной из распространённых ошибок подключения клиента к серверу является «ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2)».
Эта ошибка означает, что на хосте не запущен сервер MySQL () или вы указали неправильное имя файла сокета Unix или порт TCP/IP при попытке подключения.
Убедитесь, что сервер работает. Проверьте процесс с именем на хосте сервера, используя команды ps или grep, как показано ниже.
Если эти команды не показывают выходных данных, то сервер БД не работает. Поэтому клиент не может подключиться к нему. Чтобы запустить сервер, выполните команду .
Чтобы проверить состояние службы MySQL, используйте следующую команду:
Если в результате выполнения команды произошла ошибка службы MySQL, вы можете попробовать перезапустить службу и ещё раз проверить её состояние.
Если сервер работает (как показано) и вы по-прежнему видите эту ошибку, вам следует проверить, не заблокирован ли порт TCP/IP брандмауэром или любой другой службой блокировки портов.
Java Developer
Piano, Казань, По итогам собеседования
tproger.ru
Вакансии на tproger.ru
Для поиска порта, который прослушивается сервером, используйте команду .
Создание пользователя mysql
1. Как создать пользователя MySQL
Предположим, что база данных уже создана и называется test_database. Нам нужно открыть клиент базы данных. Для этого наберите в терминале:
Теперь можно работать. Для создания пользователя используется команда CREATE USER, её синтаксис такой:
CREATE USER ‘имя_пользователя’ @ ‘хост’ IDENTIFIED BY ‘пароль’ ;
Кроме имени пользователя, здесь нужно задать хост, с которого может авторизоваться этот пользователь. Здесь может быть доменное имя, IP-адрес, адрес подсети или знак “%”, который означает все возможные хосты. Это очень удобно, потому что вы можете создать пользователя, к которому можно будет подключится только локально или настроить отдельно права для локального или удалённого пользователя.
Например, давайте создадим локального пользователя test_user с паролем password:
CREATE USER ‘test_user’@’localhost’ IDENTIFIED BY ‘password’;
Или можно создать пользователя, который будет доступен со всех хостов:
CREATE USER ‘test_user’@’%’ IDENTIFIED BY ‘password’;
Смотрим наших пользователей:
SELECT User,Host FROM mysql.user;
Все пользователи созданы.
2. Права пользователя MySQL
Создать пользователя — это ещё далеко не всё, теперь нужно назначить ему права. Для этого используется команда GRAT. У неё такой синтаксис:
GRANT привилегии ON база_данных . таблица TO ‘ имя_пользователя ‘ @ ‘ хост ‘ ;
Здесь можем дать определённые привилегии для опредёленного пользователя к базе данных или таблице. Если нужно дать права для всех баз данных или таблиц, используйте вместо названия звездочку — “*”. Вот основные права пользователя MySQL, которые вы можете использовать:
- ALL PRIVILEGES — все, кроме GRANT;
- USAGE PRIVILEGES — никаких привилегий;
- SELECT — делать выборки из таблиц;
- INSERT — вставлять данные в таблицу;
- UPDATE — обновлять данные в таблице;
- DELETE — удалять данные из таблицы;
- FILE — разрешает читать файлы на сервере;
- CREATE — создавать таблицы или базы данных;
- ALTER — изменять структуру таблиц;
- INDEX — создавать индексы для таблиц;
- DROP — удалять таблицы;
- EVENT — обработка событий;
- TRIGGER — создание триггеров.
Также доступны такие привилегии администрирования баз данных:
- GRANT — изменять права пользователей;
- SUPER — суперпользователь;
- PROCESS — получение информации о состоянии MySQL;
- RELOAD — позволяет перезагружать таблицы привилегий;
- SHUTDOWN — позволяет отключать или перезапускать базу данных;
- SHOW DATABASES — просмотр списка баз данных;
- LOCK TABLES — блокирование таблиц при использовании SELECT;
- REFERENCES — создание внешних ключей для связывания таблиц;
- CREATE USER — создание пользователей;
Чтобы дать права пользователю MySQL на обновление и добавление записей для базы данных test_database, выполните:
GRANT SELECT,UPDATE,INSERT ON test_database . * TO ‘test_user’@’localhost’;
Дальше дадим этому же пользователю все права над этой базой данных:
GRANT ALL PRIVILEGES ON test_database . * TO ‘test_user’@’localhost’;
Теперь посмотрим привилегии нашего пользователя:
SHOW GRANTS FOR ‘test_user’@’localhost’;
Мы видим, что для всех баз данных и таблиц привелегий нет, но зато есть все привилегии для базы данных test_database. Вот так это работает. После обновления прав пользователя необходимо обновить таблицу прав пользователей MySQL в памяти. Для этого выполните:
3. Удаление прав пользователя MySQL
Чтобы отозвать права у пользователя MySQL, используйте команду REVOKE вместо GRANT. Её синтаксис похож на GRANT:
REVOKE привилегии ON база_данных . таблица FROM ‘ имя_пользователя ‘ @ ‘ хост ‘ ;
Например, заберём все права на базу данных test_database у нашего пользователя:
REVOKE ALL PRIVILEGES ON test_database . * FROM ‘test_user’@’localhost’;
4. Создание суперпользователя MySQL
Если вам необходимо создать пользователя со всеми правами MySQL на замену для root, то можно использовать такую конструкцию:
GRANT ALL PRIVILEGES ON * . * TO ‘test_user’@’localhost’;
Даём все привилегии для пользователя test_user над всеми базами данными и всеми таблицами. Но наш пользователь не сможет давать права другим пользователям. Чтобы это исправить, нужно дать ему привилегию GRANT, а для этого используется такая команда:
GRANT ALL PRIVILEGES ON * . * TO ‘test_user’@’localhost’ WITH GRANT OPTION;
Теперь этот пользователь является суперпользователем для MySQL и, авторизовавшись от его имени в PhpMyAdmin, вы можете делать всё то же самое, что и с помощью root.
А что делать если WordPress уже установлен и появилась такая ошибка?
В этом случае нам нужно открыть файл wp-config.php, который находится в корневой папке вашего сайта. Для этого:
- 1. Скачиваем файл к себе на компьютер. Здесь вам нужно зайти в панель правления хстингом и найти там инструмент «Файловый менеджер». Затем найти папку с файлами сайта и в ней должен быть файл wp-config.php. Так же вы можете воспользоваться FTP-клиентом для того чтобы скачать этот файл к себе на компьютер. Подробнее о том как работать с FTP клиентом я писала здесь.
- 2.Открываем скачанный файл при помощи текстового редактора Блокнот или любого редактора кода если он у вас установлен.
3.Находим вот такой код:
PHP
define(‘DB_NAME’, ‘r217_test’);
/** Имя пользователя MySQL */
define(‘DB_USER’, ‘r217_test’);
/** Пароль к базе данных MySQL */
define(‘DB_PASSWORD’, ‘8kjllk1233’);1
2
3
4
5define(‘DB_NAME’,’r217_test’);
/** Имя пользователя MySQL */
define(‘DB_USER’,’r217_test’);
/** Пароль к базе данных MySQL */
define(‘DB_PASSWORD’,’8kjllk1233′);
Вместо ‘r217_test’ у вас будет название вашей базы данных.
Проверяем правильность данных показанных на скриншоте:
4.Заходим в панель управления вашим хостингом и находим там раздел, связанный с базами данных. Убедитесь в том, что нужная база данных существует, имеет такое название как вы указываете, а так же проверьте чтобы имя пользователя и пароль совпадали.
При копировании названия базы данных, имени пользователя я и пароля обращайте внимания на пробелы. Их не должно быть в начале и в конце копируемых данных.
Если пароль посмотреть нельзя, попробуете его изменить, не забыв при этом сохранить новый пароль в отдельный текстовый документ на будущее.
- 5.Так же можно найти в панели управления хостингом инструмент для управления базами данных phpMyAdmin и попробовать открыть вашу базу данных через него.
Если у вас не получается зайти в phpMyAdmin и высвечивается ошибка, связанная с некорректным логином или паролем, то проверяйте ещё раз правильность данных, которые вы вводите, скорее всего причина ошибки кроется в них.
- 6.Если название БД или логин пользователя и пароль в файле wp-config.php отличаются от тех что на хостинге – нужно их перезаписать и сохранить изменения в файле.
- 7.Загружаем изменённый файл к себе на хостинг с заменой существующего там файла.
Можно не скачивать фалы сайта к себе на компьютера, а редактировать их сразу на хостинге. Для этого вам понадобится редактор кода Notepad++ или его аналог. - 8.
Как им пользоваться я писала в этой статье: «Редактирование файлов сайта в Notepad++»
Если всё указано правильно но ошибка установки соединения с базой данных не исчезла идём дальше.
Ошибка mysql: «Fatal error: cannot allocate memory…»
В логах mysql звучит оно чаще всего именно так. Обычно что-то вроде
InnoDB: Fatal error: cannot allocate memory for the buffer pool
При этом всём, сервер не будет показывать явную нехватку памяти. Именно это и заводит обычно разбирающихся с проблемой в тупик. Чаще всего это бывает, когда на сервере 1-2 гб памяти.
Происходит при этом интересная вещь. Mysql аккуратно убивается ядром системы. Для того, чтобы системе хватило памяти на саму себя и другие процессы. Обычно это конечно неоправданно, ибо на сервере нет других столь же ресурсоёмких процессов, как mysql или mariadb. Не всегда причина в этом, но это наиболее частая, типичная картина при регулярных падениях базы данных сайта.
Убедиться в том можно посмотрев в системный лог /var/log/messages либо /var/log/syslog — в зависимости от семейства OS. Там будут сообщения о том, что сработал OOMKiller и выключил mysql.
Как это происходит:
Чаще всего, с mysql за потребление памяти конкурирует Apache. Скажем, на сервере 1 гб памяти. Из них, скажем, в норме mysql использует 200, апач 100 и ядро OS и вся остальная система 100. В сумме 400 мегабайт занято, всё хорошо, система работает стабильно. Тут начинается час пик, на сайт идёт трафик. Апач начинает есть 200 мб памяти, mysql 500, а ОС все так же 100. В сумме — 800. А у нас на сервере 1 gb, всё хорошо, проблем быть не должно. Но по-умолчанию политика 50%. Ядро видит, что mysql взяло 500, не дожидается что пока оно съест ещё больше, и убивает его. А иначе вероятна ситуация, что процесс съест память, и система умрёт сама. Для защиты от этого и предназначен сей механизм.
Отсюда и возникают проблемы с базой данных. Обычно вебмастера «лечат» это обычной перезагрузкой сервера. Что и логично — всё перезагрузили, память переспределилась, потребление меньше — система работает. Но буквально через считанные минуты под нагрузкой всё может повториться. Те кто продвинутей, понимают, что дёргать весь сервер смысла нет. Можно перезапускать процессы.
Начинающие сисадмины могут «лечить» это костылем куда нибудь в cron, типа перезапуск mysql каждые 10 минут. В принципе вариант. Но довольно опасный. Ибо можно, и часто так и бывает, убить данные в базах таким способом. У вас через какое-то время просто перестанет корректно подниматься база, посыпятся таблицы, и т.д.
Недостаточно памяти
Если такая ошибка возникла, это может означать, что в MySQL недостаточно памяти для хранения всего результата запроса.
Сначала нужно убедиться, что запрос правильный. Если это так, то нужно выполнить одно из следующих действий:
- если клиент MySQL используется напрямую, запустите его с ключом , чтобы отключить кешированные результаты;
- если вы используете драйвер MyODBC, пользовательский интерфейс (UI) имеет расширенную вкладку с опциями. Отметьте галочкой «Do not cache result» (не кешировать результат).
Также может помочь MySQL Tuner. Это полезный скрипт, который подключается к работающему серверу MySQL и даёт рекомендации по настройке для более высокой производительности.
Распространенные ошибки, возникающие при создании дампа MySQL
Error 2013: Lost connection to MySQL server during query …
1 | Error2013Lost connection toMySQL server during query… |
Ошибка связана с тем, что не хватает времени для выполнения операции. Для исправления в конфигурационном файле /etc/my.cnf в секции увеличьте значение параметров
и
. Значение времени подберите под ваши условия.
Error 2020: Got packet bigger than ‘max_allowed_packet’ bytes when dumping table …
1 | Error2020Got packet bigger than’max_allowed_packet’bytes when dumping table… |
Ошибка связана с тем, что объем вносимых данных превышает разрешенный. Решается 2-я способами:
добавить параметр
к нашим командам
Добавить параметр
в секцию конфигурационного файла /etc/my.cnf
Соответственно, размер данных указываем тот, который нам необходим.
Error 2006: MySQL server has gone away
1 | Error2006MySQL server has gone away |
Данная ошибка может быть связана, как с недостаточным значение параметра
, так и с маленьким размером
. Решения собственно уже приведены.
Как проверить наличие swap и создать его
Для этого нужно лишь взглянуть на менеджер процессов в вашей системе. Обычно это top:
На скрине отмечена информация о свопе. А точнее, о его отсутствии.
Но я сам люблю и всем рекомендую пользоваться htop (поставьте его командой yum install -y htop )
В нем это гораздо наглядней и понятней:
Как видите, нижняя строка — Swp — 0. Это значит, что в системе свопа нет. Скорей всего ваш случай. Только у вас строка Mem над ней будет выглядеть иначе, поскольку у вас скорей всего будет меньше памяти. А если говорить конкретно об этом сервере, откуда я сделал скрин — то для него отсутствие свопа не проблема, ибо на нём памяти более чем достаточно и её нехватки не предвидится ( Кстати, такой мощный сервер с 24 гб памяти и 6 ядрами, 600 GB SSD стоит всего 15 евро в месяц )
Если же своп у вас уже есть, то выглядеть это будет примерно вот так:
Создаем свопфайл
Вообще, на большинстве серверов обычно своп создается по умолчанию, при установке системы. Под него выделяется отдельный раздел диска. Но поскольку вебмастера чаще имеют дело с VPS, то если он не был создан хостером при создании VPS, возможности создать его отдельным разделом уже нет. Или это довольно сложно и не нужно. Удобно и достаточно создать swap-файл.
Делается это следующим образом:
dd if=/dev/zero of=/swapfile bs=1M count=1024
Эта команда создаст файл по адресу /swapfile объемом в 1 гб . Если же вы хотите создать подкачку большего объема, соответственно вам нужно в параметре count указать большее значение — например 2048 для создания свопа в 2 gb.
По завершении команда выдаст отчет о том что сколько-то данных было записано и с какой скоростью.
Теперь нужно этот файл инициализировать и подключить в качестве свопа.
chmod 0600 /swapfile
mkswap /swapfile
Теперь нужно прописать его в таблицу файловых систем, чтобы после перезагрузки сервера он подключался автоматически.
Для этого добавим строку в файл /etc/fstab такого содержания:
/swapfile swap swap defaults 0 0
В приниципе после перезагрузки у нас своп теперь появится. Но чтобы подключить его в первый раз сразу и без перезагрузки мы можем дать такую команду:
swapon -a
Эта команда перечитает файл /etc/fstab и подключит наш новый своп. Теперь можем снова смотреть в htop, и увидим что он появился.
Оптимизация медленных запросов Mysql
Следующая часть посвящена тому, как определить медленные запросы к Mysql и анализировать их.
Для начала снова обратимся к файлу конфигурации MySQl – my.cnf
Здесь необходимо обратить внимание на такой пункт настроек, как лог медленных запросов. Выглядит он так:
Здесь вы видите 3 пункта. Определение где будет храниться лог запросов, определение количества секунд выполнения запроса, которые должны заноситься в лог и указание записывать отсутствие индексов у баз данных. Включаем все три и через некоторое время проводим анализ с помощью команды:
Эта команда выведет 10 самых медленных запросов. Если изменить цифру соответственно выведется нужное количество запросов сортировкой по самому долгому выполнению. После этого вы уже сможете анализировать их и оптимизировать скрипты.
Ошибка 2006: MySQL server has gone away
Ошибка MySQL server has gone away означает, что сервер закрыл соединение, что происходит, как правило, в двух случаях: превышение таймаута ожидания или получение сервером слишком большого пакета.
Конфигурационный файл может располагаться по различным путям, например:
/etc/my.cnf /etc/mysql/my.cnf /etc/mysql/mysql.conf.d/mysqld.cnf
Чтобы определить, в какой файл необходимо вносить изменения, можно использовать команду вида:
grep -Rl 'имя_параметра' /etc/* # Например: grep -Rl 'wait_timeout' /etc/* # или: grep -Rl 'max_allowed_packet' /etc/*
С ее помощью можно выяснить, в каких файлах прописан интересующий нас параметр, и изменить в них его значение.
Таймаут
Чтобы увеличить таймаут ожидания, необходимо скорректировать значение параметра .
Откройте конфигурационный файл с помощью редактора (укажите корректный путь к файлу):
nano /etc/mysql/my.cnf
Измените значение параметра wait_timeout на более высокое. Значение указывается в секундах, т.е. чтобы увеличить время ожидания, например, до 10 минут, необходимо указать 600:
wait_timeout = 600
После перезапустите службу MySQL:
# Debian / Ubuntu service mysql restart # CentOS service mysqld restart
Размер пакетов
В этом случае можно скорректировать максимально допустимый размер пакетов, увеличив параметр .
Откройте файл конфигурации (укажите корректный путь к файлу):
nano /etc/mysql/my.cnf
Измените значение параметра max_allowed_packet на более высокое (значение указывается в мегабайтах):
max_allowed_packet = 64M
И перезапустите службу:
# Debian / Ubuntu service mysql restart # CentOS service mysqld restart
Делаем резервную копию (он же дамп, он же бекап)
Все данные одной базы
mysqldump -u USER -pPASSWORD DATABASE > dumpname.sql
1 | mysqldump-uUSER-pPASSWORD DATABASE>dumpname.sql |
– логин пользователя,
– пароль
Обратите внимание, что между. и
и
нет пробела.
Все данные нескольких определенных баз
Добавляем параметр
или
mysqldump -u USER -pPASSWORD –databases DATABASE1 DATABASE2 DATABASE3 … > dumpname.sql
1 | mysqldump-uUSER-pPASSWORD–databases DATABASE1 DATABASE2 DATABASE3…>dumpname.sql |
– логин пользователя,
– пароль
Обратите внимание, что между. и
и
нет пробела.
Данные всех баз
Указываем ключ
или
.
mysqldump -u USER -pPASSWORD –all-databases > dumpname.sql
1 | mysqldump-uUSER-pPASSWORD–all-databases>dumpname.sql |
– логин пользователя,
– пароль
Обратите внимание, что между. и
и
нет пробела.
Дамп только структуры базы данных MySQL
За это это отвечает параметр
или
.
mysqldump –no-data -u USER -pPASSWORD DATABASE > dumpstruct.sql
1 | mysqldump–no-data-uUSER-pPASSWORD DATABASE>dumpstruct.sql |
Дамп определенных таблиц
mysqldump -u USER -pPASSWORD DATABASE TABLENAME1 TABLENAME2 .. > dumpstruct.sql
1 | mysqldump-uUSER-pPASSWORD DATABASE TABLENAME1 TABLENAME2..>dumpstruct.sql |
Сразу архивируем дамп MySQL
mysqldump -u USER -pPASSWORD DATABASE | gzip > dumpname.sql.gz
1 | mysqldump-uUSER-pPASSWORD DATABASE|gzip>dumpname.sql.gz |
Добавляем дату и время к дампу
mysqldump -u USER -pPASSWORD DATABASE | gzip > `date +dumpname.%Y%m%d_%H%M%S.sql.gz`
1 | mysqldump-uUSER-pPASSWORD DATABASE|gzip>`date+dumpname.%Y%m%d_%H%M%S.sql.gz` |
Ремонт и востановление базы MySQL по SSH
Есть у меня один сайт в большим форумом. База на MySQL в несколько сотен тысяч сообщений требует регулярного обслуживания, там неизбежно возникают ошибки, пускай и мелкие, но они имеют свойство накапливаться, и если подзабросить сайт на несколько месяцев, то возможно возникновение проблем. В большинстве случаев все легко решается простой оптимизацией таблиц (тех, которым эта оптимизация нужна) через phpMyAdmin, иногда какие-то таблицы приходится восстанавливать. Но иногда проблема оказывается слишком серьезной и phpMyAdmin банально виснет пытаясь восстановить огромную таблицу. Вот тут то на помощь и приходит возможность зайти и все исправить через SSH.
Что такое SSH я здесь объяснять не стану, подразумеваем что вы уже знаете что это и как этим пользоваться. По этому начнем сразу в главного.
{module Баннер2}
Итак, заходим по SSH на сервер и набираем следующую команду:
mysqlcheck -uваш_логин_базы -pваш_пароль_базы –auto-repair –check –optimize –all-databases
На место команды -uваш_логин_базы подставляете после -u свой логин, на место пароля – свой пароль. Тут все просто. Остальные инструкции обеспечивают проверку базы, в случае найденных ошибок восстановление, оптимизацию таблиц, ну и наконец последняя команда –all-databases означает что будут обработаны все базы данных. Работает эта утилита быстро, спокойно кушает то, на чем намертво виснет phpMyAdmin, в общем крайне полезная штука.
На случай если вам вдруг нужны другие команды утилиты mysqlcheck привожу тут списочек (его же можно получить просто набла в командной строке mysqlcheck или mysqlcheck -help):
Проверить все базы данных. Аналогична опции , если указать все базы данных.
Вместо выполнения запросов для каждой таблицы в отдельности выполнить все запросы в одном отдельно для каждой таблицы. Имена таблиц будут представлены в виде списка имен, разделенных запятой.
Анализировать данные таблицы.
Если проверенная таблица повреждена, автоматически восстановить ее. Исправления будут произведены после проверки всех таблиц, если были обнаружены повреждения.
Выводит информацию журнала отладки. Часто используется следующий набор параметров: ‘d:t:o,filename’
Директория, где находятся установки символов.
Проверить таблицу на наличие ошибок.
Проверить только таблицы, измененные со времени последней проверки или некорректно закрытые.
Использовать сжатие данных в протоколе сервер/клиент.
Вывести данную вспомогательную информацию и выйти из программы.
Проверить несколько баз данных
Обратите внимание на разницу в использовании: в этом случае таблицы не указываются. Все имена аргументов рассматриваются как имена баз данных.
Установить набор символов по умолчанию.
Проверить только базы данных, которые не были закрыты должным образом.
Продолжать даже при получении ошибки SQL.
При использовании данного параметра совместно с можно быть на 100 процентов быть уверенным в целостности таблицы, хотя это и займет много времени
Если же использовать этот параметр с , запустится расширенное восстановление таблицы, которое может потребовать не только длительного времени выполнения, но и привнесет также массу ненужных строк!
Подключиться к хосту.
Быстрее, чем , но находит только 99,99 процентов всех ошибок. Для большинства случаев этот вариант вполне подходит.
Оптимизировать таблицу.
Используемый пароль при подключении к серверу. Если пароль не указан, у пользователя запрашивается пароль с терминала.
Номер порта, используемого для подключения по TCP/IP.
Для указания протокола соединения, который надлежит использовать. Новшество в MySQL 4.1.0.
При использовании данной опции совместно с предотвращается сканирование строк для корректировки неправильных связей. Это наиболее быстрый метод проверки. Если же использовать этот параметр с , программа попытается восстановить только систему индексов. Это наиболее быстрый метод восстановления таблицы.
Может исправить почти все, за исключением уникальных ключей, имеющих дубликаты.
Выводить только сообщения об ошибках.
Файл сокета, используемый для подсоединения.
Перекрывает опцию ().
Имя пользователя MySQL, если этот пользователь в данное время не является активным.
Вывести информацию о различных этапах.
Вывести информацию о версии и выйти из программы.
Общий формат запуска утилиты (в зависимости от потребностей чинить ли отдельные таблицы в базе, отдельные базы, или все сразу):
shell> mysqlcheck database
shell> mysqlcheck –databases DB1
shell> mysqlcheck –all-databases
В общем вот. Надеюсь кому то пригодится.
{module Баннер2}
You have no rights to post comments
Что же тут делать чтобы избежать падений?
Логичный вариант — добавить оперативной памяти на сервер. Но многие скажут — да как же, у нас и так всего 800 из одного гб используется, какой смысл добавлять ещё? И будут правы.
Можно не добавлять. Особенно если сайты у вас не такие уж и посещаемые, вы уверены, что нагрузка там не такая уж большая и вашего 1 gb должно хватать. И действительно, это лечится. Многие уже догадались, что нужно лишь изменить политику распределения памяти в ядре.
Дело в том, что в ядре Linux есть параметры, отвечающие за выделение памяти процессам. По-умолчанию задана политика, когда на процесс не может быть выделено более 50% доступной машине памяти. И есть там такая штука, которая прибивает процессы, требующие большего объема памяти, чем указано в этой политике. Называется она OOMKiller. OOM = Out Of Memory — классическая аббревиатура, обозначающая нехватку памяти. А в логах ещё обычно пишут «cannot allocate memory».
Итак, за это отвечают два параметра:
vm.overcommit_ratio = 50
vm.overcommit_memory = 0
Именно такие значения они имеют по-умолчанию. Нам же нужно их изменить следующим образом:
vm.overcommit_ratio = 90
vm.overcommit_memory = 2
Я не буду вдаваться в подробности и объяснения по второму параметру. Кому нужна эта информация может ознакомиться здесь.
Переопределять эти параметры нужно в файле /etc/sysctl.conf. Но прежде, нужно сделать ещё одну важную вещь, без которой вы можете сильно навредить системе. Перед тем как назначить такие значения ядру, необходимо убедиться в том, что на вашем сервере есть swap. То есть файл или раздел подкачки. И если нет, то нужно его создать. Он необходим для распределения памяти согласно заданным параметрам ядра.
Проверяем имя сервера MySQL
В большинстве случаев при установке WordPress для установки соединения в качестве сервера базы данных указывается localhost.
Однако, на многих хостингах такой вариант не работает и там вместо localhost нужно указывать другое имя сервера. Для каждого хостинга это имя сервера будет своим, поэтому его нужно уточнить в техподержке или покопаться в справочных материалах на хостинге.
Особенно часто эта проблема возникает при переезде с одного хостинга на другой.
Для перезаписи имени сервера нам так же понадобится файл wp-config.php.
1.Скачиваем файл себе на компьютер и в нём нам нужно найти строку:
PHP
/** Имя сервера MySQL */
define(‘DB_HOST’, ‘ localhost ‘);1
2/** Имя сервера MySQL */
define(‘DB_HOST’,’ localhost ‘);
- 2.В кавычках вместо localhost пишем имя сервера для вашего хостинга.
- 3.Затем сохраняем файл и загружаем обратно на хостинг с заменой существующего.
Объявление обработчика
Чтобы объявить обработчик мы используем оператор DECLARE HANDLER:
DECLARE action HANDLER FOR condition_value statement;
Если значение условия совпадает со значением condition_value, MySQL выполнит оператор statement и продолжит или завершит текущий блок кода, исходя из значения action.
action может принимать следующие значения:
- CONTINUE: исполнение блокированного кода (BEGIN … END) продолжается;
- EXIT: выполнение блокированного кода, в котором был объявлен обработчик, завершается.
condition_value задает конкретное условие или класс условия, которые активируют обработчик.
condition_value может принимать одно из следующих значений:
- код ошибки MySQL;
- стандартное значение SQLSTATE. Или это может быть условие SQLWARNING, NOTFOUND или SQLEXCEPTION, которое является сокращением для класса значений SQLSTATE. Условие NOTFOUND используется для курсора или оператора SELECT INTO variable_list;
- название условия, связанного либо с кодом ошибки MySQL, либо со значением SQLSTATE.
В качестве statement может использоваться простой оператор или составной оператор, вшитый с помощью ключевых слов BEGIN и END.
Заключение
Самое важное при диагностике — понять, что именно вызвало ошибку. Следующие шаги помогут вам в этом:
Первый и самый важный шаг — просмотреть журналы MySQL, которые хранятся в каталоге . Вы можете использовать утилиты командной строки вроде для чтения файлов журнала.
Если служба MySQL не запускается, проверьте её состояние с помощью . Или используйте команду (с флагом ) в systemd.
Вы также можете проверить файл системного журнала (например, ) на предмет обнаружения ошибок.
Попробуйте использовать такие инструменты, как Mytop, glances, top, ps или htop, чтобы проверить, какая программа использует весь ресурс процессора или блокирует машину
Они также помогут определить нехватку памяти, дискового пространства, файловых дескрипторов или какого-либо другого важного ресурса.
Если проблема в каком-либо процессе, можно попытаться его принудительно остановить, а затем запустить (при необходимости).
Если вы уверены, что проблемы именно на стороне сервера, можете выполнить команды: или , чтобы получить от него ответ.
Если при подключении проблема не связана с сервером, проверьте, нормально ли работает клиент. Попробуйте получить какие-либо его выходные данные для устранения неполадок.
Перевод статьи «Useful Tips to Troubleshoot Common Errors in MySQL»
Выводы
В этой статье мы рассмотрели, как создать пользователя MySQL в Ubuntu или в любом другом дистрибутиве. Работа в командной строке с MySQL может показаться довольно сложной. Но сделать это надо всего один раз -после установки базы данных. А дальше можно выполнять все действия в Phpmyadmin.
Пользователи MySQL Все пользователи MySQL хранятся в таблице user базы mysql. Чтобы посмотреть список пользователей нужно переключиться на базу mysql и сделать выборку с помощью команды select:
Из списка видно, что в базе имеются учетные данные суперпользователя root с возможностью подключаться только локально с данного сервера(адреса 127.0.0.1, localhost и имя сервера testhost). Еще есть системная учетная запись debian-sys-maint служит для внутренних системных целей СУБД MySQL.
В предыдущей части я рассказывал как настроить в конфигурационном файле /etc/mysql/my.cnfудаленное подключение к серверу баз данных MySQL. Напомню: для этого в параметре bind-address выставляется IP адрес 0.0.0.0 вместо 127.0.0.1, т.е. демон mysqld будет слушать не только локальный интерфейс 127.0.0.1, а все адреса имеющиеся на сервере. В этой части я расскажу как создать пользователя mysql, какие права выдать для различных пользователей, как выставить пароль и хост с которого будет производиться подключение.
Пользователь для веб сайта Обычно различные веб приложения которые хранят информацию в базе mysql требуют создать отдельную учетную запись. Создадим пользователя website-user от имени которого будет работать наше веб приложение. Пользователя можно создать через команду create user, а потом выдать права grant select,insert. но удобнее и быстрее сразу воспользоваться командой grant
Здесь я сразу указал:
- выдать права GRANT SELECT,INSERT,UPDATE,ALTER,DELETE,CREATE,DROP,INDEX (возможно для вашего веб приложения список прав будет иной, обратитесь к документации веб приложения);
- на базу website.* — имя базы указывается по маске (все файлы с названием website). Здесь можно указать *.*, тогда пользователь будет иметь права на все базы;
- ‘websiteuser’@’localhost’ — имя пользователя, и хост с которого этот пользователь может подключаться в базу;
- IDENTIFIED BY ‘website-password’ — указываем пароль пользователя.
Администратор баз данных В следующем примере создадим учетную запись администратора баз данных который будет подключаться с IP адреса компьютера администратора 192.168.8.10
Выдадим полные права пользователю admin на базу website:
Теперь администратор может подключиться со своего компьютера к серверу баз данных. В этом примере я использовал команду create user, а уже потом grant в принципе разницы нет как будут создаваться пользователи.
Пользователь backup Создадим пользователя backup для резервного копирования всех базы данных
- GRANT SHOW DATABASES, SELECT, LOCK TABLES, RELOAD — Здесь я указал необходимый набор прав для удаленного резервного копирования и в то же время достаточный для безопасного бэкапа;
- *.* — Пользователь backup может просматривать все базы;
- ‘backup’@’%’ — пользователь backup может подключаться с любого IP адреса. Обычно не требуется разрешать подключения с любого ip для целей резервного копирования, так как у сервера backup всегда постоянный IP адрес.
Как поменять пароль? Чтобы поменять пароль можно воспользоваться командой mysqladmin эту команду нужно запускать в bash.
А так же можно воспользоваться командой (SQL синтаксис) из консоли MySQL
Как сбросить пароль root? Поменять пароль root можно всеми теми же командами, что и для обычного пользователя. Но вот что делать если вы забыли пароль рута или по каким-то причинам его утеряли, тогда проделаем следующие операции.
1) Останавливаем MySQL:
2) Запускаем MySQL с особыми параметрами:
3) Запускаем клиента MySQL:
4) Выполняем запрос SQL:
где newpassword — новый пароль
5) Применяем изменения:
6) Выходим из клиента MySQL:
7) Перезапускаем MySQL сервер:
как создавать из командной строки mysql новую базу данных и нового пользователя mysql с полными правами на только что созданную базу.
Посмотрим существующих пользователей
Дадим права пользователю test на чтение всех таблиц базы scada
Дадим все права пользователю test на все таблицы базы scada
Для того чтобы выставить новому пользователю полные права на все базы данных используем следующую команду:
Доступ к базе для данного пользователя возможен только с localhost. Если вы хотите дать ему доступ к базе с любого хоста, используете % вместо localhost:
Проверить права пользователя :
Удаляются пользователи проще, чем создаются :). Например, если мы решим избавиться от пользователя ’my_user’