Сбой MySQL на SQL - PullRequest
       8

Сбой MySQL на SQL

2 голосов
/ 20 июня 2011

В течение последних 4 дней MySQL продолжает падать при запуске скриптов, например, один раз в день

это журнал ошибок

key_buffer_size=134217728
read_buffer_size=1048576
max_used_connections=39
max_threads=100
threads_connected=34
It is possible that mysqld could use up to
key_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = 336508 K
bytes of memory
Hope that's ok; if not, decrease some variables in the equation.

thd: 0x92025f38
Attempting backtrace. You can use the following information to find out
where mysqld died. If you see no messages after this, something went
terribly wrong...
stack_bottom = 0x95dce36c thread_stack 0x30000
/usr/sbin/mysqld(my_print_stacktrace+0x2d) [0x6b65ad]
/usr/sbin/mysqld(handle_segfault+0x494) [0x3823d4]
[0x110400]
/usr/sbin/mysqld(MYSQLparse(void*)+0x6aa) [0x3b42da]
/usr/sbin/mysqld(mysql_parse(THD*, char const*, unsigned int, char const**)+0x23e) [0x39ce6e]
/usr/sbin/mysqld(dispatch_command(enum_server_command, THD*, char*, unsigned int)+0xf35) [0x39df25]
/usr/sbin/mysqld(do_command(THD*)+0xf3) [0x39f0e3]
/usr/sbin/mysqld(handle_one_connection+0x2a0) [0x38dbd0]
/lib/tls/i686/cmov/libpthread.so.0(+0x596e) [0x93d96e]
/lib/tls/i686/cmov/libc.so.6(clone+0x5e) [0xd78a4e]
Trying to get some variables.
Some pointers may be invalid and cause the dump to abort...
thd->query at 0x86982ef4 is an invalid pointer
thd->thread_id=2906
thd->killed=NOT_KILLED

Коробка работает на 2 ГБ ОЗУ, по моим подсчетам она не должна иметь проблемы с максимальной памятью. Я специально снизил требования к памяти до минимума, но все еще получаю ошибки.

mysql> show variables like "sort_buffer%";
+------------------+---------+
| Variable_name    | Value   |
+------------------+---------+
| sort_buffer_size | 1048576 |
+------------------+---------+

Сегодня в этом SQL-запросе произошел сбой

ALTER TABLE FieldDefaultValue MODIFY value_field varchar(2000) CHARACTER SET utf8 collate utf8_bin;

Кто-нибудь имел подобный опыт?

EDIT:

Таблица, о которой идет речь, на самом деле не содержит много данных, в базе данных есть таблицы намного большего размера:

mysql> desc fielddefaultvalue;
+----------------------+---------------+------+-----+---------+----------------+
| Field                | Type          | Null | Key | Default | Extra          |
+----------------------+---------------+------+-----+---------+----------------+
| fielddefaultvalue_Id | bigint(20)    | NO   | PRI | NULL    | auto_increment |
| version              | bigint(20)    | NO   |     | NULL    |                |
| value_field          | varchar(2000) | YES  | MUL | NULL    |                |
| optimistic_version   | bigint(20)    | NO   |     | NULL    |                |
| property_fk          | bigint(20)    | YES  | MUL | NULL    |                |
| esg_fk               | bigint(20)    | YES  | MUL | NULL    |                |
+----------------------+---------------+------+-----+---------+----------------+
6 rows in set (0.02 sec)

mysql> select count(*) from fielddefaultvalue;
+----------+
| count(*) |
+----------+
|      690 |
+----------+
1 row in set (0.00 sec)

Сбой также возможен при нескольких вставках (400-500) небольших данных, но не всегда, один и тот же сценарий может работать правильно один раз или завершиться сбоем

РЕДАКТИРОВАТЬ 2: После восстановления после сбоя журнал ошибок также сообщает:

InnoDB: which exceeds the log group capacity 9433498.
InnoDB: If you are using big BLOB or TEXT rows, you must set the
InnoDB: combined size of log files at least 10 times bigger than the
InnoDB: largest such row.

my.cnf

lower_case_table_names = 1
key_buffer              = 16M
key_buffer_size = 128M
max_allowed_packet      = 16M
thread_stack            = 192K
thread_cache_size       = 8
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched
myisam-recover         = BACKUP
max_connections        = 100
table_cache            = 512
thread_concurrency     = 4
sort_buffer_size = 1M
read_buffer_size = 1M
table_open_cache = 512
read_rnd_buffer_size = 8M
innodb_file_per_table = 1
open_files_limit = 65536
default_character_set=utf8

query_cache_limit       = 1M
query_cache_size        = 64M

expire_logs_days        = 10
max_binlog_size         = 250M

innodb_buffer_pool_size = 256M
innodb_additional_mem_pool_size = 20M

РЕДАКТИРОВАТЬ: 5 часов спустя

Он просто снова рухнул на том же «обычном» скрипте, это скрипт обновления 25 000 строк в столбце даты.

То же сообщение об ошибке:

InnoDB: Log scan progressed past the checkpoint lsn 186 4056481576
110620 17:30:52  InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
InnoDB: Read

Забавно, я сегодня запустил этот скрипт и не ошибся, но он сделал это сейчас.

Ответы [ 3 ]

1 голос
/ 20 июня 2011

Наиболее вероятное объяснение - исчерпание адресного пространства;пожалуйста, отправьте весь свой my.cnf.

Запуск 32-битной ОС в рабочей среде не является хорошей идеей.

Однако вам следует сделать следующее:

  1. Воспроизвести ошибку в той же версии MySQLна непроизводственной машине
  2. Убедитесь, что вы используете правильно поддерживаемую текущую сборку из Oracle.Если это не так, установите один из них и воспроизведите проблему.Если вы используете Redhat (или аналогичный), то вы можете использовать RPM Oracle.Они также предоставляют пакеты и двоичные файлы некоторых других дистрибутивов в файле tar.gz.Поставщик вашего пакета может исправить MySQL несколькими хитрыми исправлениями.Я никогда не запускаю OEM-сборки MySQL.
  3. Кажется, вы используете 32-битную версиюУбедитесь, что у вас не хватает адресного пространства.

Если вы можете воспроизвести ошибку, используя стандартную сборку Oracle на поддерживаемой операционной системе если у вас не хватает памяти / адресного пространства и аппаратного сбоя нет, то вы можете отправить ошибку в Oracle.

Лучшая идея - воспроизвести тестовый набор с минимальным объемом данных /Размер стола.

1 голос
/ 20 июня 2011

Звучит так, как будто ваш innodb_log_file_size недостаточно велик - попробуйте использовать 256 МБ в my.cnf: innodb_log_file_size = 256M

Вам необходимо аккуратно завершить работу, удалить старые файлы журналов, а затем перезапустить - mysql восстановит новыефайлы журналов.

0 голосов
/ 20 июня 2011

Странно ... Я не знаю, насколько оптимизирован ALTER TABLE на MySQL.Возможно, он потребляет много энергии.Если таблица содержит много данных, попробуйте переместить все ваши данные во временную таблицу и очистить основную.Затем сделайте свою таблицу изменений и отправьте данные обратно.Если он должен выполнять работу над каждой строкой, то вы можете разделить эту работу следующим образом и сделать несколько записей за раз.

...