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

Таблица innodb заполнена и автоматически расширяется

Привет, я использую бакулу, и одна из таблиц заполнена:

JobId 8946: Fatal error: sql_create.c:860 Fill File table Query failed: INSERT INTO File (FileIndex, JobId, PathId, FilenameId, LStat, MD5, DeltaSeq) SELECT batch.FileIndex, batch.JobId, Path.PathId, Filename.FilenameId,batch.LStat, batch.MD5, batch.DeltaSeq FROM batch JOIN Path ON (batch.Path = Path.Path) JOIN Filename ON (batch.Name = Filename.Name): ERR=The table 'File' is full

Потом бегу:

mysql> show table status from current_bacula like 'File';
+------+--------+---------+------------+----------+----------------+-------------+-----------------+--------------+------------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows     | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free  | Auto_increment | Create_time         | Update_time | Check_time | Collation         | Checksum | Create_options | Comment |
+------+--------+---------+------------+----------+----------------+-------------+-----------------+--------------+------------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+
| File | InnoDB |      10 | Compact    | 52153488 |            142 |  7419723776 |               0 |   2593128448 | 2605711360 |      569929045 | 2013-04-15 21:03:59 | NULL        | NULL       | latin1_swedish_ci |     NULL |                |         |
+------+--------+---------+------------+----------+----------------+-------------+-----------------+--------------+------------+----------------+---------------------+-------------+------------+-------------------+----------+----------------+---------+
1 row in set (0.31 sec)

В файле my.cnf есть:

innodb_data_file_path = ibdata1:128M;ibdata2:50M:autoextend:max:12800M

Как я понял команду:

ALTER TABLE tbl_name MAX_ROWS=1000000000 AVG_ROW_LENGTH=nnn;

работает только для движка MyISAM не работает? (Пожалуйста, поправьте меня, если я ошибаюсь)

Итак, мой вопрос: могу ли я изменить только las autotextend: max, например, примерно так:

innodb_data_file_path = ibdata1:128M;ibdata2:50M:autoextend:max:76800M

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

Что вы мне порекомендуете?

У меня mysql-5.1.67-1.el6_3.x86_64 на CentOS 6.4

Заранее спасибо!

Вы можете запустить другой файл ibdata

Однако прежде чем вы это сделаете, вам нужно знать, что занимает ibdata1 и ibdata2.

  • Табличные данные (если innodb_file_per_table выключен)
  • Индексы таблиц (если innodb_file_per_table выключен)
  • Данные MVCC (Multiversioning Concurrency Control)
  • Табличные метаданные
  • Сегменты отката
  • Отменить журналы
  • Двойной буфер записи

Архитектура InnoDB

Я имел дело с добавлением ibdata3 в прошлом с одним из клиентов моего бывшего работодателя (см. Мой пост DBA StackExchange Как решить «Таблица… заполнена» с помощью «innodb_file_per_table»?). Это было необходимо, потому что ibdata2 достигла потолка ext3 2,196,875,759,616 байтов. У вас нет такой ситуации.

Вы могли бы пойти со своей идеей

innodb_data_file_path = ibdata1:128M;ibdata2:50M:autoextend:max:76800M

но лучше вообще убрать макс

innodb_data_file_path = ibdata1:128M;ibdata2:50M:autoextend

ПРЕДОСТЕРЕЖЕНИЕ

Причина, по которой вам не хватает места, - это журналы отмены. Файл ibdata содержит 1023 журнала отмены. Для работы этих журналов требуется пространство для маневра. Без этого внутреннего пространства для маневра информация MVCC не может содержать моментальные снимки данных в случае отката. Ваша внутренняя комната для маневра 2605711360 или о 2.5G, чего явно недостаточно. С клиентом моего предыдущего работодателя у них было 106G комнаты для маневра и им этого было мало.

ПРЕДЛОЖЕНИЕ

Если вы хотите оставить все свои данные внутри ibdata1 и ibdata2и измените настройку на

innodb_data_file_path = ibdata1:128M;ibdata2:50M:autoextend:max:76800M

вам нужно следить за комнатой для маневра.

Вы можете контролировать это так

IBDATA_FILESIZE=8187281408
#
# 8187281408 is 7680M + 128M
#
SQL="SELECT SUM(data_length+index_length)"
SQL="${SQL} FROM information_schema.tables WHERE ENGINE='InnoDB'"
IBDATA_DATAINDEX=`mysql -uroot -p... -ANe"${SQL}"`
(( WIGGLE_ROOM = IBDATA_FILESIZE - IBDATA_DATAINDEX )))
echo ${WIGGLE_ROOM}

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