InnoDB-Architektur

InnoDB-Architektur

Hallo, ich verwende Bacula und eine der Tabellen ist voll:

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

Dann führe ich aus:

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)

Die Datei my.cnf enthält:

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

So wie ich den Befehl verstehe:

ALTER TABLE tbl_name MAX_ROWS=1000000000 AVG_ROW_LENGTH=nnn;

funktioniert nur mit der MyISAM-Engine, oder nicht? (Bitte korrigieren Sie mich, wenn ich falsch liege)

Meine Frage ist also: Kann ich ändernnurdas letzte autotextend:max sieht zum Beispiel so aus:

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

Sollte ich außer dem Neustarten des Dienstes noch eine andere Aktion ausführen? Ist das sicher? Ich weiß, dass ich eine andere ibdataN-Datei definieren kann, aber ich möchte die anderen Datenbanken, die derzeit auf dem Server laufen, so wenig wie möglich beeinträchtigen.

Was empfehlt ihr mir?

Ich habe mysql-5.1.67-1.el6_3.x86_64 auf CentOS 6.4

Dank im Voraus!

Antwort1

Sie könnten eine weitere ibdata-Datei starten

Bevor Sie dies tun, müssen Sie jedoch wissen, was die Plätze ibdata1und einnimmt ibdata2.

  • Tabellendaten (fallsinnodb_datei_pro_tabelleist behindert)
  • Tabellenindizes (fallsinnodb_datei_pro_tabelleist behindert)
  • MVCC-Daten (Multiversioning Concurrency Control)
  • Tabellenmetadaten
  • Rollback-Segmente
  • Undo-Protokolle
  • Doppelter Schreibpuffer

InnoDB-Architektur

InnoDB-Architektur

Ich hatte mich in der Vergangenheit mit dem Hinzufügen von ibdata3 bei einem der Kunden meines ehemaligen Arbeitgebers befasst (siehe meinen DBA StackExchange-BeitragWie löst man „Die Tabelle … ist voll“ mit „innodb_file_per_table“?). Dies war notwendig, da ibdata2 die Obergrenze von ext3 2,196,875,759,616-Bytes erreicht hat. Diese Situation haben Sie nicht.

Du könntest mit deiner Idee gehen

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

aber es ist besser, wenn Sie das Maximum ganz entfernen

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

VORBEHALT

Der Grund, warum Ihnen der Speicherplatz ausgegangen ist, hat mit den Undo-Protokollen zu tun. Die ibdata-Datei enthält 1023 Undo-Protokolle. Diese Protokolle benötigen Spielraum, um zu funktionieren. Ohne diesen internen Spielraum können MVCC-Informationen im Falle eines Rollbacks keine Daten-Snapshots speichern. Ihr interner Spielraum beträgt 2605711360oder ungefähr 2.5G, was anscheinend nicht ausreicht. Beim Kunden meines früheren Arbeitgebers hatten sie 106GSpielraum undes war ihnen nicht genug.

ANREGUNG

ibdata1Wenn Sie alle Ihre Daten in und belassen möchten ibdata2, ändern Sie die Einstellung auf

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

Sie müssen den Spielraum überwachen.

Sie könnten es so überwachen

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}

Bei jedem Ausführen wissen Sie, wie viel freier Speicherplatz vorhanden ist. Sie müssen nicht wissen, um welche Tabelle es sich handelt, da jede InnoDB-Tabelle möglicherweise einen vollen Speicherplatz beanstandet, wenn der Spielraum (Platz für Undo-Informationen) nicht vorhanden ist.

verwandte Informationen