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