it-swarm-eu.dev

Was ist der beste Weg, um die Größe von ibdata in MySQL zu reduzieren?

Ich habe einige Produktionsserver, deren ibdata -Dateien von Tag zu Tag größer werden.

Es hat bereits 290 GB Speicherplatz verbraucht.

Die Tabellen in den Servern sind meistens InnoDB und es gibt hohe Lese- und Schreibanforderungen.

Die Größe der Protokolldatei nimmt ebenfalls zu. Die Tabellen enthalten eine große Datenmenge.

Wie kann ich die wachsende Größe von beiden steuern?

Ich benutze nicht innodb_file_per_table.

66
Abdul Manaf

Beachten Sie, dass die am stärksten ausgelastete Datei in der InnoDB-Infrastruktur/var/lib/mysql/ibdata1 ist

Diese Datei enthält normalerweise viele Informationsklassen (wenn innodb_file_per_table 0 ist)

  • Tabellendaten
  • Tabellenindizes
  • MVCC-Daten (Multiversioning Concurrency Control)
    • Rollbacks-Segmente
    • Tablespace rückgängig machen
  • Tabellenmetadaten
  • Siehe Bilddarstellung

Viele Benutzer erstellen mehrere Ibdata-Dateien in der Hoffnung auf eine bessere Verwaltung und Leistung des Speicherplatzes. Es hilft nicht.

Leider führt OPTIMIZE TABLE für eine in ibdata1 gespeicherte InnoDB-Tabelle zwei Dinge aus:

  • Macht die Daten und Indizes der Tabelle in ibdata1 zusammenhängend
  • Dadurch wächst ibdata1, da die zusammenhängenden Daten an ibdata1 angehängt werden

Sie können Tabellendaten und Tabellenindizes von ibdata1 trennen und unabhängig voneinander mit innodb_file_per_table verwalten. Um ibdata1 ein für alle Mal zu verkleinern, müssen Sie Folgendes tun

Schritt 01) MySQLDump alle Datenbanken in eine SQL-Textdatei (nennen Sie es SQLData.sql) ( Weitere Details hier )

Schritt 02) Alle Datenbanken löschen (außer mysql, performance_schema Und information_schema)

Schritt 03) MySQL herunterfahren

Schritt 04) Fügen Sie die folgenden Zeilen zu /etc/my.cnf hinzu

[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G

Nebenbemerkung: Unabhängig von Ihrer Einstellung für innodb_buffer_pool_size stellen Sie sicher, dass innodb_log_file_size 25% von innodb_buffer_pool_size beträgt.

Schritt 05) Löschen Sie ibdata1, ib_logfile0 und ib_logfile1

Zu diesem Zeitpunkt sollte es nur das MySQL-Schema in/var/lib/mysql geben

Schritt 06) Starten Sie mysql neu

Dadurch werden ibdata1 mit 10 MB, ib_logfile0 und ib_logfile1 mit jeweils 1 GB neu erstellt

Schritt 07) Laden Sie SQLData.sql neu in mysql

ibdata1 wächst, enthält jedoch nur Tabellenmetadaten

Jede InnoDB-Tabelle existiert außerhalb von ibdata1

Angenommen, Sie haben eine InnoDB-Tabelle mit dem Namen mydb.mytable. Wenn Sie in/var/lib/mysql/mydb gehen, werden zwei Dateien angezeigt, die die Tabelle darstellen

  • mytable.frm (Storage Engine Header)
  • mytable.ibd (Startseite der Tabellendaten und Tabellenindizes für mydb.mytable)

ibdata1 enthält keine InnoDB-Daten und -Indizes mehr.

Mit der Option innodb_file_per_table in /etc/my.cnf können Sie OPTIMIZE TABLE mydb.mytable Ausführen, und die Datei /var/lib/mysql/mydb/mytable.ibd Wird tatsächlich verkleinert.

Ich habe dies in meiner Karriere als MySQL-DBA viele Male getan

Tatsächlich habe ich beim ersten Mal eine 50-GB-ibdata1-Datei auf 500 MB reduziert.

Versuche es. Wenn Sie weitere Fragen dazu haben, senden Sie mir eine E-Mail. Vertrau mir. Dies wird kurzfristig und langfristig funktionieren. !!!

Wenn Sie sehen möchten, wie viele tatsächliche Daten in MyISAM und InnoDB gespeichert sind, führen Sie diese Abfrage aus:

SELECT IFNULL(B.engine,'Total') "Storage Engine",
CONCAT(LPAD(REPLACE(FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Data Size", CONCAT(LPAD(REPLACE(
FORMAT(B.ISize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Index Size", CONCAT(LPAD(REPLACE(
FORMAT(B.TSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Table Size"
FROM (SELECT engine,SUM(data_length) DSize,SUM(index_length) ISize,
SUM(data_length+index_length) TSize FROM information_schema.tables
WHERE table_schema NOT IN ('mysql','information_schema','performance_schema')
AND engine IS NOT NULL GROUP BY engine WITH ROLLUP) B,
(SELECT 3 pw) A ORDER BY TSize;
110
RolandoMySQLDBA