Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Howto:Bereinigen Sie eine mysql InnoDB-Speicher-Engine?

Hier ist eine vollständigere Antwort in Bezug auf InnoDB. Es ist ein etwas langwieriger Prozess, aber die Mühe kann sich lohnen.

Denken Sie daran, dass /var/lib/mysql/ibdata1 ist die am stärksten ausgelastete Datei in der InnoDB-Infrastruktur. Es enthält normalerweise sechs Arten von Informationen:

  • Tabellendaten
  • Tabellenindizes
  • MVCC (Multiversioning Concurrency Control) Daten
    • Rollback-Segmente
    • Rückgängig machen
  • Tabellenmetadaten (Datenwörterbuch)
  • Doppelter Schreibpuffer (Schreiben im Hintergrund, um die Abhängigkeit vom Betriebssystem-Caching zu verhindern)
  • Puffer einfügen (Verwaltung von Änderungen an nicht eindeutigen Sekundärindizes)
  • Siehe Bilddarstellung von ibdata1

InnoDB-Architektur

Viele Leute erstellen mehrere ibdata Dateien, die auf eine bessere Speicherplatzverwaltung und Leistung hoffen, aber dieser Glaube ist falsch.

Kann ich OPTIMIZE ausführen TABELLE ?

Leider läuft OPTIMIZE TABLE gegen eine InnoDB-Tabelle, die in der gemeinsam genutzten Tabellenbereichsdatei ibdata1 gespeichert ist macht zwei Dinge:

  • Macht die Daten und Indizes der Tabelle zusammenhängend innerhalb von ibdata1
  • Erzeugt ibdata1 wachsen, da die zusammenhängenden Daten- und Indexseiten angehängt werden zu ibdata1

Sie können jedoch Tabellendaten und Tabellenindizes von ibdata1 trennen und unabhängig verwalten.

Kann ich OPTIMIZE ausführen TABELLE mit innodb_file_per_table ?

Angenommen, Sie würden innodb_file_per_table nach /etc/my.cnf (my.ini) . Können Sie dann einfach OPTIMIZE TABLE ausführen auf allen InnoDB-Tabellen?

Gute Nachrichten :Wenn Sie OPTIMIZE TABLE mit innodb_file_per_table aktiviert, erzeugt dies eine .ibd Datei für diese Tabelle. Zum Beispiel, wenn Sie die Tabelle mydb.mytable haben mit einem Datenverzeichnis von /var/lib/mysql , wird Folgendes erzeugt:

  • /var/lib/mysql/mydb/mytable.frm
  • /var/lib/mysql/mydb/mytable.ibd

Die .ibd enthält die Datenseiten und Indexseiten für diese Tabelle. Großartig.

Schlechte Nachrichten :Sie haben lediglich die Datenseiten und Indexseiten von mydb.mytable extrahiert vom Leben in ibdata . Der Data-Dictionary-Eintrag für jede Tabelle, einschließlich mydb.mytable , verbleibt weiterhin im Datenwörterbuch (siehe die Bilddarstellung von ibdata1 ). SIE KÖNNEN ibdata1 NICHT EINFACH LÖSCHEN AN DIESER STELLE !!! Bitte beachten Sie, dass ibdata1 ist überhaupt nicht geschrumpft.

Bereinigung der InnoDB-Infrastruktur

Um ibdata1 zu verkleinern Ein für alle Mal müssen Sie Folgendes tun:

  1. Dump (z. B. mit mysqldump ) alle Datenbanken in eine .sql Textdatei (SQLData.sql wird unten verwendet)

  2. Löschen Sie alle Datenbanken (außer mysql und information_schema ) ACHTUNG :Als Vorsichtsmaßnahme führen Sie bitte dieses Skript aus, um sicherzustellen, dass alle Benutzerberechtigungen vorhanden sind:

    mkdir /var/lib/mysql_grants
    cp /var/lib/mysql/mysql/* /var/lib/mysql_grants/.
    chown -R mysql:mysql /var/lib/mysql_grants
    
  3. Melden Sie sich bei mysql an und führen Sie SET GLOBAL innodb_fast_shutdown =0; aus (Dadurch werden alle verbleibenden Transaktionsänderungen vollständig aus ib_logfile0 geleert und ib_logfile1 )

  4. Beenden Sie MySQL

  5. Fügen Sie die folgenden Zeilen zu /etc/my.cnf hinzu (oder my.ini unter Windows)

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

    (Nebenbemerkung:Was auch immer Sie für innodb_buffer_pool_size eingestellt haben , stellen Sie sicher, dass innodb_log_file_size beträgt 25 % von innodb_buffer_pool_size .

    Außerdem:innodb_flush_method=O_DIRECT ist unter Windows nicht verfügbar)

  6. Löschen Sie ibdata* und ib_logfile* , Optional können Sie alle Ordner in /var/lib/mysql entfernen , außer /var/lib/mysql/mysql .

  7. Starten Sie MySQL (Dadurch wird ibdata1 neu erstellt [standardmäßig 10 MB] und ib_logfile0 und ib_logfile1 bei jeweils 1G).

  8. Importieren Sie SQLData.sql

Jetzt ibdata1 wird immer noch wachsen, aber nur Tabellenmetadaten enthalten, da jede InnoDB-Tabelle außerhalb von ibdata1 existiert . ibdata1 wird keine InnoDB-Daten und Indizes für andere Tabellen mehr enthalten.

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

  • mytable.frm (Storage Engine-Header)
  • mytable.ibd (Tabellendaten und Indizes)

Mit der innodb_file_per_table Option 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 schrumpfen.

Ich habe das in meiner Karriere als MySQL DBA viele Male gemacht. Als ich das zum ersten Mal tat, schrumpfte ich sogar um 50 GB ibdata1 Datei auf nur 500 MB herunter!

Versuche es. Wenn Sie weitere Fragen dazu haben, fragen Sie einfach. Vertrau mir; dies funktioniert sowohl kurzfristig als auch langfristig.

ACHTUNG

Bei Schritt 6, wenn mysql aufgrund von mysql nicht neu gestartet werden kann schema begin gelöscht haben, sehen Sie sich Schritt 2 noch einmal an. Sie haben die physische Kopie von mysql erstellt Schema. Sie können es wie folgt wiederherstellen:

mkdir /var/lib/mysql/mysql
cp /var/lib/mysql_grants/* /var/lib/mysql/mysql
chown -R mysql:mysql /var/lib/mysql/mysql

Gehen Sie zurück zu Schritt 6 und fahren Sie fort

UPDATE 2013-06-04 11:13 EDT

In Bezug auf die Einstellung innodb_log_file_size auf 25 % von innodb_buffer_pool_size in Schritt 5 ist diese pauschale Regel ziemlich altmodisch.

Zurück am 3. Juli 2006 , hatte Percona einen netten Artikel warum man eine richtige innodb_log_file_size wählen sollte . Später, am 21. November 2008 , folgte Percona mit einem weiteren Artikel über wie man die richtige Größe basierend auf der Spitzenarbeitslast berechnet, wobei Änderungen im Wert von einer Stunde beibehalten werden .

Seitdem habe ich Beiträge im DBA StackExchange über die Berechnung der Protokollgröße geschrieben und auf diese beiden Percona-Artikel verwiesen.

Ich persönlich würde immer noch mit der 25%-Regel für eine Ersteinrichtung gehen. Da die Arbeitslast im Laufe der Zeit in der Produktion genauer bestimmt werden kann, können Sie die Größe ändern die Protokolle während eines Wartungszyklus in nur wenigen Minuten.