Решение ошибки в phpMyAdmin «Данная таблица не содержит уникального столбца»

Нужно было недавно изменить некоторые данные в MySQL базе данных, решил воспользоваться phpMyAdmin и столкнулся с сообщением:

Данная таблица не содержит уникального столбца. Изменение сетки, выставление галочки, редактирование, копирование и удаление не доступно.

На английском сообщение выглядит так:

This table does not contain a unique column. Grid edit, checkbox, Edit, Copy and Delete features are not available.

Можно решить это выполнив указанный ниже sql запрос, который добавит к таблице уникальный столбец по которому можно определять номера строк:

ALTER TABLE таблица add newid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;

Но чтобы не менять структуру таблицы, я просто изменил нужные данные sql запросом. Например:

UPDATE таблица SET serv='131' WHERE user='767' AND date='2016-02-04' AND serv='64';

Вот и все. Указанное выше сообщение указывает что изменять данные через phpMyAdmin нельзя, но их можно изменить написав sql запрос.

Решение ошибки «Расширение mysqli|mysql не найдено»

Заметил как-то на одном из новых Ubuntu серверов ошибку при открытии phpMyAdmin — «Расширение mysqli|mysql не найдено».

Решается она естественно установкой расширения следующей командой:

sudo apt-get install php5-mysql

После чего перезагрузим веб-сервер чтобы применить изменения:

sudo service apache2 restart

Все.

Решение ошибки «Using unique option prefix pass instead of password is deprecated …»

Заметил как-то ошибки приходящие на почту root с темой и текстом:

Cron /usr/bin/test -x /usr/local/cpanel/scripts/update_db_cache && /usr/local/cpanel/scripts/update_db_cache
Warning: Using unique option prefix pass instead of password is deprecated and will be removed in a future release. Please use the full name instead.

Проблема кроется в файле ~/.my.cnf, то есть /root/.my.cnf в моем случае.

В котором параметр «pass» устарел и должен быть изменен на новый «password».

Например вот так было когда ошибка возникала:

[client]
user=root
pass=пароль

Изменил на password и ошибка исчезла:

[client]
user=root
password=пароль

Настройка MySQL сервера. Описание конфигурационного файла

Перед началом настройки сделаем резервную копию файла конфигурации:

sudo cp /etc/mysql/my.cnf /etc/mysql/my.cnf.bakup

Стандартные примеры конфигурации могут также находится в директории /usr/share/mysql/

Посмотреть текущие соединения можно командой:

sudo netstat -tap | grep mysql

Перенастроить можно командой:

sudo dpkg-reconfigure mysql-server-5.5

Список процессов можно посмотреть подключившись к серверу:

mysql -u root -p
show processlist;
exit

Опишу ниже некоторые возможные параметры конфигурационного файла my.cnf

bind-address
(адрес который будет слушать сервер, например 127.0.0.1 если внешние соединения не используются)

skip-networking
(соединение с сервером выполняется только через сокет)

skip-name-resolve
(не определять доменные имена для IP-адресов подключающихся клиентов)

max_allowed_packet
(максимальный размер данных, которые могут быть переданы за один запрос. Следует увеличить значение при появлении ошибки «Packet too large»)

max_join_size
(максимальный размер анализируемых данных через оператор SELECT. Стандартно более 4 миллиардов)

query_cache_limit = 6MB
(максимальный размерор данных, которые можно поместить в кэш)

query_cache_size = 64M
(сколько памяти выделить для внутреннего кэша запросов mysql. В кэш будет добавляться результат запроса целиком («таблица», полученная в результате запроса). Примерно равно одной десятой, одной пятой от размера оперативной памяти)

thread_concurrency = 8
(количество одновременных процессов, «обрабатывающих» конкурентные запросы к mysql. Примерно равно количеству процессорам (ядрам) системы умноженное на два. Также следует обращать внимание на количество винчестеров и загрузке процессора чтобы избежать излишней нагрузки)

max_connections = 500
(максимальное количество соединений, при ошибке «Too many connections» следует увеличить значение)

thread_cache_size = 501
(число потоков, которые сервер будет держать в кэше открытыми для обслуживания новых соединений. Примерно равно значению max_connections + 1. При это необходимо мониторить переменную max_used_connections длительный период)

back_log
(сколько запросов на соединение с mysql сервером может помещаться в очередь и в последствии обслужено, если сервер в данный момент занят обработкой запроса на подключение. Стандартно пять запросов на подключение будет поставлено в очередь на ожидание, а остальные игнорируются. Если mysql сильно нагружен, рекомендуется увеличить значение)

table_open_cache
(количество открытых таблиц для всех потоков. Открытие таблиц – ресурсоёмкий процесс, рекомендуется определенное количество таблиц держать открытыми в кэше)
Количество открытых таблиц можно посмотреть командой:

mysql -u root -p
SHOW STATUS LIKE 'Opened_tables';
exit

table_cache = 1024
(кеш таблиц)

max_heap_table_size = 64MB
(максимальный размер временной таблицы хранящейся в памяти, при превышении размера таблица будет создана на жестком диске)

tmp_table_size = 64MB
(максимальный размер памяти для временных таблиц, если размер превышен, таблица будет создана на диске)

log_bin = /var/log/mysql/mysql-bin.log
(расположение лог-файла со всеми запросами к серверу, кроме select, show)
max_binlog_size= 500M
(максимальный размер)
expire_logs_days = 3
(время хранения в днях)

log_error = /var/log/mysql/mysql.err
(расположение лог-файла ошибок)
log_warnings = 1
(записывать ли в лог-файл ошибок предупреждения)
log_slow_queries = /var/log/mysql/mysql_slow.log
(расположение лог-файла медленных запросов, используется для анализа запросов чтобы повысить производительность сайта)

long_query_time = 10
(после скольки секунд выполнения запрос считается медленным, стандартно 10)
log-queries-not-using-indexes
(для записи запросов, которые не используют индексы)
relay-log = /var/log/mysql/mysql-relay-bin.log
(расположение лог-файла)
max_relay_log_size = 500М
(максимальный размер)

Чтобы изменения в конфигурационном файле применились необходимо перезапустить MySQL сервер командой:

sudo service mysqld restart

Подсчитать возможный объем потребляемой оперативной памяти можно онлайн на сайте http://www.omh.cc/mycnf/

Решение ошибки #1064 — You have an error in your SQL syntax

Заметил как-то при выполнении SQL запроса ошибку следующего содержания:

#1064 — You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near

Чтобы ее решить необходимо внимательно просмотреть sql запрос на предмет ошибок, например пропущенные или неправильные кавычки или отсутствие точки с запятой, убедится в правильности синтаксиса.

Это и есть основное решение ошибки.

Кстати в интернете есть сайты с онлайн проверкой синтаксиса, достаточно лишь вставить запрос и нажать кнопку проверить.

Выполнение SQL запроса из скрипта в Linux

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

# Описание, тут я написал для других что скрипт добавлен в crontab, дабы его не переместили
mysql -u ПОЛЬЗОВАТЕЛЬ -pПАРОЛЬ -h 127.0.0.1 -e "UPDATE nika_system.abon SET otkl=0 WHERE depozit > '10' AND (otkl='-1' OR otkl='-2');";

Чтобы скрипт выполнялся автоматически, откроем в любом текстовом редакторе файл crontab (в редакторе nano CTRL+X для выхода и y/n для сохранения или отмены изменений):

sudo nano /etc/crontab

Добавим в него следующую строку:

0 9 * * * root /home/nika/scripts/reset_credit_nika.sh > /dev/null 2>&1

Теперь ежедневно в 9 утра скрипт будет выполняться.

Приведу пример ежедневного автоматического вывода данных из sql таблицы в текстовый файл:

#!/bin/bash
mysql -u ПОЛЬЗОВАТЕЛЬ -pПАРОЛЬ -h 192.168.1.1 -s -N -e "SELECT id FROM nika_system.abon WHERE tarif=109;";

В /etc/crontab добавим:

0 8 * * * root /scripts/freektb.sh > /srv/samba/dir/mirazh/$(date +%Y-%m-%d).txt

Решение ошибки запуска MySQL сервера — «Unknown/unsupported storage engine: InnoDB»

Заметил недавно ошибку запуска MySQL сервера:

150821 20:34:03 InnoDB: Fatal error: cannot allocate memory for the buffer pool
150821 20:34:03 [ERROR] Plugin ‘InnoDB’ init function returned error.
150821 20:34:03 [ERROR] Plugin ‘InnoDB’ registration as a STORAGE ENGINE failed.
150821 20:34:03 [ERROR] Unknown/unsupported storage engine: InnoDB
150821 20:34:03 [ERROR] Aborting

Удаление следующих файлов не дало результата:

sudo rm /var/lib/mysql/ib_logfile0
sudo rm /var/lib/mysql/ib_logfile1 
sudo rm /var/lib/mysql/ibdata1
sudo service mysql restart

Причиной ошибки оказалась нехватка оперативной памяти.
Посмотреть количество свободной памяти можно например командой:
free -m

После добавления оперативной памяти (ОЗУ) к серверу данная ошибка больше не отображалась.