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

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

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

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

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

решение1

Вы можете начать другой файл ibdata

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

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

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

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

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

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

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 может жаловаться на то, что она заполнена, когда нет места для маневра (места для информации об отмене).

Связанный контент