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 ibdata1
und 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
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 2605711360
oder ungefähr 2.5G
, was anscheinend nicht ausreicht. Beim Kunden meines früheren Arbeitgebers hatten sie 106G
Spielraum undes war ihnen nicht genug.
ANREGUNG
ibdata1
Wenn 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.