Ich verwende MySQL in localhost als "Abfragetool" zum Ausführen von Statistiken in R, dh jedes Mal, wenn ich ein R-Skript ausführe, erstelle ich eine neue Datenbank (A), erstelle eine neue Tabelle (B) und importiere die Daten in B. Senden Sie eine Abfrage, um das zu erhalten, was ich brauche, und lassen Sie dann B und A fallen.
Es funktioniert gut für mich, aber ich stelle fest, dass die Größe der ibdata-Datei schnell zunimmt. Ich habe nichts in MySQL gespeichert, aber die ibdata1-Datei hat bereits 100 MB überschritten.
Ich verwende mehr oder weniger die Standardeinstellung für MySQL für das Setup. Gibt es eine Möglichkeit, die ibdata1-Datei nach einem festgelegten Zeitraum automatisch zu verkleinern / löschen?
Antworten:
Das
ibdata1
nicht schrumpfen ist eine besonders ärgerliche Funktion von MySQL. Dieibdata1
Datei kann nur verkleinert werden, wenn Sie alle Datenbanken löschen, die Dateien entfernen und einen Speicherauszug neu laden.Sie können MySQL jedoch so konfigurieren, dass jede Tabelle einschließlich ihrer Indizes als separate Datei gespeichert wird. Auf diese Weise
ibdata1
wird nicht so groß. Laut dem Kommentar von Bill Karwin ist dies ab Version 5.6.6 von MySQL standardmäßig aktiviert.Es ist eine Weile her, dass ich das getan habe. Um Ihren Server so
my.cnf
einzurichten, dass für jede Tabelle separate Dateien verwendet werden, müssen Sie Folgendes ändern , um Folgendes zu aktivieren:http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html
Wenn Sie den Speicherplatz zurückfordern möchten, müssen
ibdata1
Sie die Datei tatsächlich löschen:mysqldump
der Datenbanken, Prozeduren, Trigger usw. mit Ausnahme der Datenbankenmysql
und ausperformance_schema
ibdata1
undib_log
DateienWenn Sie MySQL in Schritt 5 starten, werden die
ibdata1
undib_log
-Dateien neu erstellt.Jetzt können Sie loslegen. Wenn Sie eine neue Datenbank für die Analyse erstellen, befinden sich die Tabellen in separaten
ibd*
Dateien, nicht inibdata1
. Da Sie die Datenbank normalerweise bald danachibd*
löschen , werden die Dateien gelöscht.http://dev.mysql.com/doc/refman/5.1/en/drop-database.html
Sie haben dies wahrscheinlich gesehen:
http://bugs.mysql.com/bug.php?id=1341
Mit dem Befehl
ALTER TABLE <tablename> ENGINE=innodb
oderOPTIMIZE TABLE <tablename>
kann man Daten und Indexseiten aus ibdata1 extrahieren, um Dateien zu trennen. Ibdata1 wird jedoch nur verkleinert, wenn Sie die obigen Schritte ausführen.In Bezug auf die
information_schema
ist das weder notwendig noch möglich zu fallen. Es ist in der Tat nur eine Reihe von schreibgeschützten Ansichten, keine Tabellen. Und ihnen sind keine Dateien zugeordnet, nicht einmal ein Datenbankverzeichnis. Dasinformations_schema
verwendet die Speicher-DB-Engine und wird beim Stoppen / Neustarten von mysqld gelöscht und neu generiert. Siehe https://dev.mysql.com/doc/refman/5.7/en/information-schema.html .quelle
innodb_file_per_table
standardmäßig aktiviert.Hinzufügen zu John Ps Antwort ,
Für ein Linux-System können die Schritte 1 bis 6 mit den folgenden Befehlen ausgeführt werden:
mysqldump -u [username] -p[root_password] [database_name] > dumpfilename.sql
DROP DATABASE [database_name];
sudo /etc/init.d/mysqld stop
sudo rm /var/lib/mysql/ibdata1
sudo rm /var/lib/mysql/ib_logfile
(und löschen Sie alle anderen ib_log-Dateien, die benannt werden könnenib_logfile0
,ib_logfile1
etc ...)sudo /etc/init.d/mysqld start
create database [database_name];
mysql -u [username]-p[root_password] [database_name] < dumpfilename.sql
Warnung: Diese Anweisungen führen dazu, dass Sie andere Datenbanken verlieren, wenn Sie andere Datenbanken auf dieser MySQL-Instanz haben. Stellen Sie sicher, dass die Schritte 1, 2 und 6, 7 geändert wurden, um alle Datenbanken abzudecken, die Sie behalten möchten.
quelle
create database database_name;
und danngrant all privileges on database_name.* to 'username'@'localhost' identified by 'password';
Password:
Eingabeaufforderung einzugeben (was sicherer ist), geben Sie einfach-p
ein Passwort ein.Wenn Sie innodb-Tabellen löschen, gibt MySQL den Speicherplatz in der ibdata-Datei nicht frei. Deshalb wächst es weiter. Diese Dateien schrumpfen kaum.
So verkleinern Sie eine vorhandene ibdata-Datei:
http://dev.mysql.com/doc/refman/5.5/en/innodb-resize-system-tablespace.html
Sie können dies skripten und planen, dass das Skript nach einem festgelegten Zeitraum ausgeführt wird. Für das oben beschriebene Setup scheinen jedoch mehrere Tablespaces eine einfachere Lösung zu sein.
Wenn Sie die Konfigurationsoption verwenden
innodb_file_per_table
, erstellen Sie mehrere Tablespaces. Das heißt, MySQL erstellt für jede Tabelle separate Dateien anstelle einer gemeinsam genutzten Datei. Diese separaten Dateien werden im Verzeichnis der Datenbank gespeichert und beim Löschen dieser Datenbank gelöscht. Dies sollte die Notwendigkeit beseitigen, ibdata-Dateien in Ihrem Fall zu verkleinern / löschen.Weitere Informationen zu mehreren Tablespaces:
http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html
quelle
Ich denke, Sie können dort eine gute Erklärung und Lösung finden:
http://vdachev.net/2007/02/22/mysql-reducing-ibdata1/
quelle
Schreiben Sie die Prozedur der akzeptierten Antwort schnell in Bash:
Speichern unter
purge_binlogs.sh
und ausführen alsroot
.Ausgeschlossen
mysql
,information_schema
,performance_schema
(undbinlog
Verzeichnis).Angenommen, Sie haben Administrator-Anmeldeinformationen
/root/.my.cnf
und Ihre Datenbank befindet sich im Standardverzeichnis/var/lib/mysql
.Sie können Binärprotokolle auch nach dem Ausführen dieses Skripts löschen, um mehr Speicherplatz wiederzugewinnen.
quelle
alldatabases.sql
bevor ich noch einmal überprüft habe, ob alle Tabellen fehlerfrei sind. Einige Verbesserungen:innodb_fast_shutdown=0
Vor dem Herunterfahren festlegen,autocommit=0
vor dem Importieren der SQL-DateiCOMMIT
festlegen , ausführen undautocommit=1
nach dem Importieren der SQL-Datei festlegen ,mysqlcheck --all-databases
vor dem Löschen der Sicherung verwenden.Wenn Ihr Ziel darin besteht, den freien Speicherplatz von MySQL zu überwachen und Sie MySQL nicht stoppen können, um Ihre ibdata-Datei zu verkleinern, rufen Sie sie über Tabellenstatusbefehle ab. Beispiel:
MySQL> 5.1.24:
MySQL <5.1.24:
Vergleichen Sie diesen Wert dann mit Ihrer ibdata-Datei:
Quelle: http://dev.mysql.com/doc/refman/5.1/en/show-table-status.html
quelle
In einer neuen Version der oben genannten MySQL-Server-Rezepte wird die "MySQL" -Datenbank zerstört. In der alten Version funktioniert es. In neuen Tabellen wechseln einige Tabellen zum Tabellentyp INNODB, wodurch Sie sie beschädigen. Der einfachste Weg ist:
quelle
Wie bereits erwähnt, können Sie ibdata1 nicht verkleinern (dazu müssen Sie sichern und neu erstellen), aber es besteht auch oft keine wirkliche Notwendigkeit.
Bei Verwendung von Autoextend (wahrscheinlich die häufigste Größeneinstellung) weist ibdata1 den Speicher vorab zu und wächst jedes Mal, wenn er fast voll ist. Dies beschleunigt das Schreiben, da bereits Speicherplatz zugewiesen ist.
Wenn Sie Daten löschen, werden diese nicht verkleinert, aber der Speicherplatz in der Datei wird als nicht verwendet markiert. Wenn Sie jetzt neue Daten einfügen, wird der leere Speicherplatz in der Datei wiederverwendet, bevor die Datei weiter vergrößert wird.
Es wird also nur dann weiter wachsen, wenn Sie diese Daten tatsächlich benötigen. Wenn Sie den Speicherplatz nicht tatsächlich für eine andere Anwendung benötigen, gibt es wahrscheinlich keinen Grund, ihn zu verkleinern.
quelle
storage leak
.