Назад | Перейти на главную страницу

MySQL замедляется / замедляется при большой нагрузке

Сервер MySQL продолжает давать сбой на выделенном сервере, на котором также работает apache / php. Я не MySQL PRO, поэтому мне нужны предложения экспертов.

На веб-сайте используются движки Innodb и MyISAM, но Innodb широко используется.

Из WHM phpmyadmin я нашел следующие красные варианты

Innodb_buffer_pool_pages_dirty      18       
Innodb_buffer_pool_reads    31 k     
Handler_read_rnd    128 k
Handler_read_rnd_next   3,013 k
Created_tmp_disk_tables     1,534    
Sort_merge_passes   10 
Opened_tables   807 
Table_locks_waited      8

Вот конфигурация MySQL

max_connections = 500
safe-show-database
skip-locking
key_buffer = 700M
max_allowed_packet = 32M
table_cache = 512
sort_buffer_size = 64M
read_buffer_size = 2M
read_rnd_buffer_size = 2M
myisam_sort_buffer_size = 128M
thread_cache_size = 16
query_cache_size= 512M
query_cache_limit=1024M
thread_concurrency = 8
connect_timeout = 8
wait_timeout = 120
interactive_timeout = 15
wait_timeout = 500
innodb_buffer_pool_size=1024M
open_files_limit = 8192
tmp_table_size = 64M
long_query_time = 1
log_slow_queries
innodb_autoinc_lock_mode = 2
set-variable = innodb_lock_wait_timeout=10

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash

[isamchk]
key_buffer = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M

[myisamchk]
key_buffer = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M

Журнал ошибок

100930  9:44:12 [Warning] /usr/sbin/mysqld: Forcing close of thread 283  user: 'rdf'

100930  9:44:19 [ERROR] /usr/sbin/mysqld: Sort aborted
100930  9:44:19 [ERROR] /usr/sbin/mysqld: Sort aborted
100930  9:44:21 [ERROR] /usr/sbin/mysqld: Sort aborted

100930  9:44:53 [Warning] /usr/sbin/mysqld: Option '--set-variable' is deprecated. Use --variable-name=value instead.

100930 10:37:16 [ERROR] Cannot find or open table XXXX from
the internal data dictionary of InnoDB though the .frm file for the
table exists. Maybe you have deleted and recreated InnoDB data
files but have forgotten to delete the corresponding .frm files
of InnoDB tables, or you have moved .frm files to another database?

Я вижу много ошибок, не могу найти или открыть таблицу. Я не касался конфигурации MySQL.

Лично я считаю, что некоторые из этих значений вышли из строя, но это не должно вызывать сбоев.

http://blog.mysqltuner.com/ есть сценарий, который может дать вам некоторые подсказки по настройке, хотя они предполагают, что сервер работает более 48 часов.

Когда вы говорите сбой, вы имеете в виду, что mysqld завершает работу или не отвечает? Система не отвечает или просто mysql? проверьте dmesg, / var / log / messages, дампы ядра и т. д. За исключением проблем с оборудованием, мы предполагаем, что mysql блокируется. Вы не упоминаете время безотказной работы для этих значений выше или версию mysql, которую вы используете, но мы предполагаем относительно короткое время безотказной работы. Таблицы tmp, созданные на диске, могут означать, что размер вашей временной таблицы слишком мал или у вас есть запросы, которые нельзя кэшировать в памяти.

Первое, что я вижу, это table_cache ниже открытых таблиц. Это не обязательно серьезная проблема, но может вызвать большой отток. показывать статус как 'open_tables'; Если это ограничено вашим table_cache, вы можете увеличить table_cache.

Если у вас относительно последняя версия mysql, /var/lib/mysql/hostname.err или /var/log/mysql/mysql.err может содержать некоторую дополнительную информацию. Если вы можете выполнить 'show processlist' во время события или mysqladmin -u root -ppassword processlist> / var / tmp / pl (в некоторую область, которая не очищается при перезагрузке, если ваш сервер необходимо перезагрузить), вы можете иметь возможность проверить, что происходит при аварии. Как насчет журнала медленных запросов mysql? Longquery на 1 может создать массу дополнительных журналов, но, если вы обнаружите, что запросы, занимающие более 300 секунд, должны занять 4 секунды, у вас может быть указание на то, какая таблица зависает.

InnoDB - не лекарство от всего, что вас беспокоит. Программисты, которые не понимают mysql, будут использовать InnoDB, потому что он использует блокировку на уровне строк, а не на уровне таблицы. Заблокируйте меньшую часть таблицы, и вы увидите рост параллелизма. Теория верна, но вещи, которые вы делаете с InnoDB, работают не так, как с MyISAM.

select count(*) from innodbtable where condition='asdf';
select count(*) from myisamtable where condition='asdf';

В первом случае InnoDB заблокирует таблицу и выполнит полное сканирование. Во втором случае MyISAM не будет блокировать таблицу (и ответит из индекса, если условие содержится в индексе).

select count(varname) from table where condition='asdf';

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

При выборе таблицы, содержащей текстовое поле, автоматически создается временная таблица диска - вы можете изменить запросы, чтобы этого избежать.

Если вы можете опубликовать немного больше информации о запущенном приложении, о том, что вы имеете в виду под сбоем, выводе из показа переменных / статуса показа, содержимом журналов ошибок и т. Д., Я уверен, что кто-то здесь с немного большими знаниями сможет отладить это дальше.

Я предполагаю, что вы перезапустили сервер с перезагрузкой / включением. В вашем каталоге / var / lib / mysql должно быть несколько файлов, например:

ibdata1
ib_logfile0
ib_logfile1

Я предполагаю, что один из этих файлов содержит неверные данные.

Вы можете перезапустить mysql с innodb_force_recovery = 4 в разделе [mysqld], чтобы увидеть, можно ли восстановить файл innodb. Если нет, загрузите одну из ваших горячих копий или недавних дампов. Возможно, вам не удастся удалить эту таблицу без какой-либо магии, но вы должны иметь возможность переименовать таблицу и повторно импортировать из ваших резервных копий.