Starten / Stoppen von MySQL

8

Ich suche Hilfe, um zu verstehen, was passiert, wenn die folgende Befehlszeile ausgeführt wird:

root@prodn$ service mysqld stop

Ja, der MySQL-Server wird heruntergefahren, sodass der Zugriff darauf erst verfügbar ist, wenn der Dienst erneut gestartet wird. Gibt es jedoch noch etwas, das passiert, wenn der Dienst gestoppt wird? Verzeihen Sie meinen Anfängern hier, aber wenn mysqld neu gestartet wird, bedeutet dies, dass Protokolle geleert, Speicher freigegeben, Caches geleert usw. wurden?

Der Grund, den ich frage, ist der folgende:

Unsere Data Warehouse-Datenbank ist eine MySQL-Datenbank und hat in den letzten 4 Monaten durchschnittlich 8,5 Stunden gedauert.

Letzten Mittwoch habe ich den MySQL-Dienst beendet und ihn nach 30 Minuten neu gestartet. Seitdem stelle ich eine massive Verbesserung der Gesamtleistung fest - SELECT / INSERT / UPDATE / DELETE-Prozesse waren effizienter. DW beendete fast 4 Stunden zuvor mit der gleichen Anzahl von Datenzeilen

Mit jedem Tag werden jedoch 15 bis 20 Minuten zur Zielzeit hinzugefügt. Ich vermute also, dass ich den Dienst wöchentlich neu starten muss.

Gibt es eine Erklärung für dieses Verhalten? Ich weiß nicht, welche anderen Fragen relevant sind, aber es wäre großartig zu wissen, was passiert, wenn der mysqldDienst neu gestartet wird.

Kann jemand bitte etwas Licht ins Dunkel bringen?

dat789
quelle
1
Fragen Sie nach Serverfault oder DBA.
Gbjbaanb
1
Klingt so, als hätten Sie viele Daten im Speicher, die festgeschrieben werden. dev.mysql.com/doc/refman/5.0/en/server-shutdown.html
ethrbunny
@ dat789, der richtige Ort, um nach Antworten zu suchen, ist bereits von ethrbunny gegeben. Das ist der erste Ort, an den du gehen musst, um ihn zu finden.
Mrigesh Raj Shrestha

Antworten:

2

Wenn Sie Probleme haben service mysql stop, passiert viel mehr als nur das Abschalten von DB Connectivity. Der Link im Kommentar von @ethrbunny erklärt bereits, was passiert.

Ich möchte mich auf einen bestimmten Aspekt konzentrieren: den InnoDB-Pufferpool. InnoDB muss die schmutzigen Seiten des InnoDB-Pufferpools leeren. Wenn Sie wissen möchten, wie viel, führen Sie dies vor dem Herunterfahren aus:

SELECT CONCAT(dpbytes/power(1024,expo),' ',SUBSTR(units,expo*2+1,2)) DirtyPages FROM
(SELECT dpbytes,FLOOR(LOG(dpbytes)/LOG(1024)) expo FROM
(SELECT dirty_pages*page_size dpbytes FROM
(SELECT VARIABLE_VALUE dirty_pages FROM information_schema.global_status
WHERE VARIABLE_NAME='Innodb_buffer_pool_pages_dirty') AAA,
(SELECT VARIABLE_VALUE page_size FROM information_schema.global_status
WHERE VARIABLE_NAME='Innodb_page_size') BBB) AA) A,(SELECT ' BKBMBGBTB' units) B;

Hier erfahren Sie, wie viele Daten aus dem InnoDB-Pufferpool gelöscht werden müssen.

Bitte beachten Sie, dass InnoDB viele bewegliche Teile im Systemtabellenbereich (der Datei ibdata1) enthält. Klicken Sie hier, um die bildliche Darstellung der gesamten InnoDB-Infrastruktur anzuzeigen .

Einige Transaktionsinformationen sind so geschrieben, dass die Crash-Wiederherstellung beim Ausführen ausgeführt wird service mysql start.

OPTIONAL

Sie können alle Daten löschen und alle Transaktionen sauber von ibdata1 und den Transaktionsprotokollen ( ib_logfile0, ib_logfile1) festschreiben , indem Sie dies ausführen

SET GLOBAL innodb_fast_shutdown = 0;

vor dem Laufen

service mysql stop

Versuche es !!!

UPDATE 2013-04-24 07:17 EDT

Da Sie MyISAM als Hauptspeicher-Engine haben, geschieht nur das Löschen von Indexänderungen in alle .MYIDateien, für die Änderungen ausstehen.

Ich möchte auch empfehlen, dass Sie mysqld beim nächsten Herunterfahren vorher in einer anderen Sitzung ausführen:

tail -f /var/log/mysqld.log

und sehen Sie sich die Nachrichten an, die vorbeigehen, und sehen Sie, wie mysqld mit einer Speicher-Engine umgeht. Wenn Sie absolut keine InnoDB-Tabellen verwenden, sollten Sie darüber nachdenken, InnoDB mit zu deaktivieren

[mysqld]
skip-innodb

Dies führt zu einem schnelleren Start und möglicherweise zu einem schnelleren Herunterfahren.

RolandoMySQLDBA
quelle
Danke dafür. Ich hätte genauer auf einen anderen Aspekt eingehen sollen, den ich nicht erwähnt habe - wir verwenden die MyISAM-Engine für die meisten unserer Tabellen. Macht dies einen Unterschied zu InnoDB? Gibt es eine Möglichkeit, dasselbe zu tun, ohne mysqld neu zu starten? Wenn nicht, würde dies bedeuten, dass ich unseren Systemadministrator von Zeit zu Zeit ärgern müsste. Der Grund ist auch recht einfach: Nach jedem Tag seit dem letzten Neustart scheinen sich die SELECT / UPDATE / INSERT-Vorgänge um 25 bis 40 Minuten zu verzögern. Ein Neustart bringt es zurück zu seiner "optimierten" Zeit. Ich kann nicht erklären warum.
Datum 789
Ich bin der festen Überzeugung, dass InnoDB bereits deaktiviert war. Siehe Auszug: 130422 15:35:31 mysqld_safe Das Starten des mysqld-Daemons mit Datenbanken aus / srv / mysqldb / mysql 130422 15:35:33 [Hinweis] Das Plugin 'FEDERATED' ist deaktiviert. 130422 15:35:33 [Hinweis] Das Plugin 'InnoDB' ist deaktiviert. 130422 15:35:33 [Hinweis] Ereignisplaner: 0 Ereignisse geladen 130422 15:35:33 [Hinweis] / usr / libexec / mysqld: Bereit für Verbindungen. Version: '5.5.17' Socket: '/srv/mysqldb/mysql/mysql.sock' Port: 3306 MySQL Community Server (GPL) Wie können wir dann Indexänderungen auf alle .MYI-Dateien übertragen, ohne sie neu zu starten? Möglich?
Datum 789