MySQL große Anzahl geöffneter Tabellen - was bedeutet das und wie kann ich reduzieren?

7

Ich habe 300 Datenbanken mit jeweils maximal 59 Tabellen. Mein Hosting-Anbieter sagt, ich habe viele offene Tische. Ich habe keine Leistungsprobleme. Aber es verursacht Probleme mit der Sicherung (ich verwende die Cloud-Datenbanken von Rackspace, die Percona XtraBackup verwenden).

Was kann viele offene Tabellen verursachen und wie kann ich dies verringern? Ich bekomme nicht zu viel Verkehr und die Leistung ist gut. Ich bin mir nicht sicher, ob ich genau verstehe, was geöffnete Tabellen sind.

Ich habe table_definition_cachefestgelegt, 4096da ich keine Abfragen für Ansichten ausführen konnte, bis ich sie erhöht habe.

mysql> SHOW GLOBAL STATUS LIKE 'Open_%';
mysql> +--------------------------+----------+
    -> | Variable_name            | Value    |
    -> +--------------------------+----------+
    -> | Open_files               | 7        |
    -> | Open_streams             | 0        |
    -> | Open_table_definitions   | 4102     |
    -> | Open_tables              | 4096     |
    -> | Opened_files             | 44025318 |
    -> | Opened_table_definitions | 1660409  |
    -> | Opened_tables            | 1857375  |
    -> +--------------------------+----------+

Hier sind die angeforderten Befehle:

https://gist.github.com/blasto333/aa4241a4e37447961188356719ea6984

Chris Muench
quelle

Antworten:

6

table_open_cache ist die Einstellung, die den Host am wahrscheinlichsten von Ihrem Rücken kriegt.

SHOW VARIABLES LIKE '%open%'; Und wie lange war das System schon aktiv, als das STATUSerfasst wurde? (Benötigen Sie "pro Sekunde", nicht absolute Zählungen.)

Geben Sie mir die Widdergröße SHOW VARIABLESund SHOW GLOBAL STATUS; Ich werde Dutzende von Dingen kritisieren.

Sind einige der Tabellen PARTITIONed? (Jede 'Partition' ist effektiv eine separate 'Tabelle'.)

Überdenken Sie auch Ihre 300x59; das sind mäßig große Zahlen.

VARIABLEN & STATUS-Analyse

Beobachtungen: Version: 5.6.17-log; 4 GB RAM; Betriebszeit = 145d 22:45:14; Sie laufen nicht unter Windows. Ausführen der 64-Bit-Version; Sie scheinen InnoDB vollständig (oder größtenteils) auszuführen.

Die wichtigeren Themen

key_buffer_size - niedriger als 20M; Ihre 400M verschwenden RAM.

table_open_cache scheint es gut zu gehen. Daher sehe ich keine Notwendigkeit darin, das Limit für offene Dateien zu erhöhen. (Es gibt auch keinen Schaden.)

Viele Tabellenscans usw. Schlagen Sie vor, long_query_time auf 1 zu senken und das slow_query_log zu aktivieren. Dann können wir im Slowlog nachsehen, für welche Abfragen Verbesserungen erforderlich sind - entweder über zusammengesetzte Indizes oder andere Techniken.

expire_logs_days ist derzeit 1. Damit haben Sie nur einen Tag Zeit, um festzustellen, dass bei der Replikation und / oder den Binlogs ein Fehler aufgetreten ist, bevor Sie Informationen verlieren.

Entfernen Sie die meisten oder alle OPTIMIZE TABLE-Aufrufe.

Details und andere Beobachtungen

(Opened_tables) = 0,15 / Sekunde - Dies ist eine relativ niedrige und recht respektable Rate. Immerhin sind Sie seit 20 Wochen auf, und dies ist ein "Zähler". Weisen Sie den Hosting-Anbieter auf die 20 Wochen hin. table_open_cache ist die Anzahl der Einträge in einem Cache für "Geöffnete" Tabellen. Vielleicht gibt es während des Backups eine Flut von Öffnungen, aber den Rest der Zeit keine Öffnung? Wie für "Ich habe table_definition_cache auf 4096 gesetzt, da ich keine Abfragen für Ansichten ausführen konnte, bis ich sie vergrößert habe." - Berühren Ihre ANSICHTEN Hunderte oder Tausende von Tischen? (Huch!)

((key_buffer_size - 1.2 * Key_blocks_used * 1024) / _ram) = (400M - 1.2 * 4180 * 1024) / 4096M = 9.6% - Prozent des in key_buffer verschwendeten RAM. - Verringern Sie key_buffer_size.

(Key_blocks_used * 1024 / key_buffer_size) = 4.180 * 1024 / 400M = 1,0% - Prozent des verwendeten Schlüsselpuffers. Hochwassermarke. - Verringern Sie key_buffer_size, um unnötige Speichernutzung zu vermeiden.

(innodb_buffer_pool_size / _ram) = 2.306.867.200 / 4096M = 53,7% -% des für InnoDB buffer_pool verwendeten RAM - Für nur 4 GB RAM ist dies wahrscheinlich in Ordnung, es sei denn, Sie haben andere Anwendungen auf demselben Server.

(table_open_cache) = 4.096 - Anzahl der zu zwischenspeichernden Tabellendeskriptoren - Mehrere hundert sind normalerweise gut. Sie haben jedoch viele Tabellen, daher ist dies möglicherweise in Ordnung oder sogar zu klein.

(table_open_cache_instances) = 1 - Schlagen Sie vor, auf 8 zu wechseln.

Table_open_cache_overflows und _misses sind jeweils kleiner als 0,1 / s. - Der table_open_cache ist groß genug.

(Open_tables / table_open_cache) = 100% - Da Sie jedoch mehrere Monate aktiv waren, ist dies nicht unbedingt schlecht.

((Com_show_create_table + Com_show_fields) / Questions) = (153314 + 9291657) / 543294681 = 1,7% - Freches Framework - viel Aufwand beim erneuten Entdecken des Schemas. - Beschweren Sie sich beim Drittanbieter.

Abfrage-Cache - verschiedene STATUS-Werte zeigen an, dass er in seiner jetzigen Form ziemlich gut ist.

(Created_tmp_disk_tables / (Created_tmp_disk_tables + Created_tmp_tables)) = 10.616.310 / (10616310 + 13112655) = 44,7% - Prozentsatz der temporären Tabellen, die auf die Festplatte verschüttet wurden - möglicherweise tmp_table_size und max_heap_table_size erhöhen; Vermeiden Sie Blobs usw.

(Com_rollback / Com_commit) = 646.634 / 1329015 = 48,7% - Rollback: Commit-Verhältnis - Rollbacks sind kostspielig; App-Logik ändern

(Select_scan) = 16.557.535 / 12609914 = 1,3 / Sek. - vollständige Tabellenscans - Indizes hinzufügen / Abfragen optimieren (es sei denn, es handelt sich um winzige Tabellen)

(Select_scan / Com_select) = 16.557.535 / 57256550 = 28,9% -% der Auswahlen führen einen vollständigen Tabellenscan durch. (Kann durch gespeicherte Routinen getäuscht werden.) - Indizes hinzufügen / Abfragen optimieren

((Com_stmt_prepare - Com_stmt_close) / (Com_stmt_prepare + Com_stmt_close)) = (1587 - 1526) / (1587 + 1526) = 2,0% - Schließen Sie Ihre vorbereiteten Anweisungen? - Fügt Closes hinzu.

(binlog_format) = MIXED - STATEMENT / ROW / MIXED. REIHE wird bevorzugt; Es kann zum Standard werden.

(expire_logs_days) = 1 - Wie schnell das Binlog automatisch gelöscht werden soll (nach diesen vielen Tagen) - Zu groß (oder Null) = belegt Speicherplatz; zu klein = muss schnell auf Netzwerk- / Maschinenabsturz reagieren.

(slow_query_log) = OFF - Gibt an, ob langsame Abfragen protokolliert werden sollen. (5.1.12)

(long_query_time) = 10.000000 = 10 - Cutoff (Sekunden) zum Definieren einer "langsamen" Abfrage. - Schlagen Sie 2 vor

(max_connect_errors) = 10.000 - Ein kleiner Schutz gegen Hacker. - Vielleicht nicht mehr als 200.

(Verbindungen) = 28.367.185 / 12609914 = 2,2 / Sek. - Verbindungen - Wartezeit erhöhen; Pooling verwenden?

(Max_used_connections / max_connections) = 167/410 = 41% - Schlagen Sie vor, max_connections auf beispielsweise 200 zu senken.

(innodb_io_capacity_max) = 800 - Dies ist ziemlich niedrig, aber vielleicht in Ordnung.

(report_port) = 1 - Das ist wahrscheinlich schlecht, aber ich habe keine Erfahrung, um genauer zu sein. Die meisten Leute verlassen es bei 3306.

Com_create_db alle 4 Minuten und Com_drop_db alle 2 Minuten - Sehr hoch; Was ist los?

Com_optimize = 4,9 / Stunde - OPTIMIZE ist praktisch nutzlos, insbesondere bei InnoDB.

Rick James
quelle
4 GB RAM. Ich habe diese 2 Befehle gepostet ( gist.github.com/blasto333/aa4241a4e37447961188356719ea6984 ). Mein Host hat es überprüft und das Limit für geöffnete Dateien auf 70.000 festgelegt, zuvor waren es 32.000. Sie sagten, dass sie keine Leistungsprobleme sehen; Aber ich denke, der Backup-Prozess ist ziemlich ressourcenintensiv (auf dem Slave-Server). Tabellen sind NICHT partitioniert. Alle Innodb-Datenbanken mit 2 verschiedenen Arten von Schemata (das eine oder das andere)
Chris Muench
Ich habe die Analyse zu meiner Antwort hinzugefügt. In der Mitte ist eine Antwort auf Ihre ursprüngliche Frage über begraben Opened_tables. (Ich brauchte viele Zahlen, um eine klare Antwort zu formulieren.)
Rick James
1

Wenn Sie MyISAM verwenden, konvertieren Sie in InnoDB, und es kann zu einem Rückgang dieser Anzahl kommen. Es gibt keine andere Möglichkeit, dies zu reduzieren, wenn Sie nicht aufhören, sie abzufragen.

Erhöhen Sie den table_open_cache und den table_definition_cache und beobachten Sie die Statistiken ... Erhöhen Sie dies so weit wie möglich! Möglicherweise müssen Sie auch die Handler für Systemdateien erhöhen, und das ist ein guter Weg.

mysql_user
quelle