Avvia / arresta MySQL


8

Sto cercando aiuto per capire cosa succede quando viene eseguita la seguente riga di comando:

root@prodn$ service mysqld stop

Sì, arresta il server MySQL, quindi l'accesso ad esso non è più disponibile fino a quando il servizio non viene riavviato. Tuttavia, più specificamente, c'è qualcos'altro che accade quando il servizio viene interrotto? Perdona la mia novizia qui, ma quando mysqld viene riavviato, significa che i log sono stati scaricati, un po 'di memoria liberata, le cache svuotate, ecc.?

Il motivo per cui chiedo è il seguente:

Il nostro DB di data warehouse è un DB MySQL e negli ultimi 4 mesi ha impiegato in media 8,5 ore.

Mercoledì scorso, ho interrotto il servizio mysql e poi lo ho riavviato dopo 30 minuti. Da allora, ho iniziato a notare un notevole miglioramento delle prestazioni complessive : i processi SELECT / INSERT / UPDATE / DELETE erano più efficienti. DW ha terminato quasi 4 ore prima con lo stesso numero di righe di dati

Tuttavia, ogni giorno che passa, in qualche modo vengono aggiunti 15-20 minuti all'ora di fine. Quindi, sospetto che potrebbe essere necessario riavviare il servizio settimanalmente.

C'è una spiegazione per questo comportamento? Non so quali altre domande siano rilevanti, ma sarebbe geniale sapere cosa succede al mysqldriavvio del servizio.

Qualcuno può far luce su questo per favore?


1
prova a chiedere su serverfault o dba.
gbjbaanb,


1
Sembra che tu abbia molti dati in memoria che vengono impegnati. dev.mysql.com/doc/refman/5.0/en/server-shutdown.html
ethrbunny

@ dat789, il posto giusto per cercare le risposte è già dato da ethrbunny. questo è il primo posto dove dovresti trovarlo.
Mrigesh Raj Shrestha,

Risposte:


2

Quando si emette service mysql stop, succede molto di più che tagliare semplicemente la connettività DB. Il link nel commento di @ethrbunny spiega già cosa succede.

Vorrei concentrarmi su un aspetto particolare: il pool di buffer InnoDB. InnoDB deve svuotare le pagine sporche del pool di buffer InnoDB. Se vuoi sapere quanto, eseguilo prima dell'arresto:

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;

Questo ti dirà quanti dati devono essere scaricati dal pool di buffer InnoDB.

Tieni presente che InnoDB ha molte parti mobili nel tablespace di sistema (il file ibdata1). Fai clic qui per vedere la rappresentazione grafica dell'intera infrastruttura InnoDB .

Alcune delle informazioni transazionali sono scritte in modo tale da eseguire Crash Recovery durante l'esecuzione service mysql start.

OPZIONALE

Puoi ottenere lo svuotamento di tutti i dati e il commit di tutte le transazioni in modo pulito da ibdata1 e Log delle transazioni ( ib_logfile0, ib_logfile1) eseguendo questo

SET GLOBAL innodb_fast_shutdown = 0;

prima di correre

service mysql stop

Provaci !!!

AGGIORNAMENTO 2013-04-24 07:17 EDT

Dato che hai MyISAM come motore di archiviazione principale, l'unica cosa che succede è lo svuotamento delle modifiche dell'indice a tutti i .MYIfile che hanno modifiche in sospeso.

Vorrei anche raccomandare che il prossimo arresto di mysqld, esegua questo in anticipo in un'altra sessione:

tail -f /var/log/mysqld.log

e guarda i messaggi che passano e vedi che ti dice cosa sta facendo mysqld con qualsiasi motore di archiviazione. Se non hai assolutamente tabelle InnoDB in uso, dovresti pensare di disabilitare InnoDB con

[mysqld]
skip-innodb

poiché ciò consentirà un avvio più rapido e possibilmente un arresto più rapido.


Grazie per questo. Avrei dovuto essere più specifico su un altro aspetto che non ho menzionato: stiamo usando il motore MyISAM sulla maggior parte dei nostri tavoli. Questo fa qualche differenza rispetto a InnoDB? C'è un modo per fare lo stesso senza riavviare mysqld? In caso contrario, ciò significherebbe che di tanto in tanto dovrei infastidire il nostro amministratore di sistema. Inoltre, il motivo è piuttosto semplice: dopo ogni giorno che passa dall'ultimo riavvio, le operazioni SELECT / UPDATE / INSERT sembrano essere ritardate di 25-40 minuti. Un riavvio lo riporta al suo tempo "ottimizzato". Non so spiegare perché.
dat789,

Credo fermamente che InnoDB fosse già disabilitato. Vedi estratto: 130422 15:35:31 mysqld_safe L' avvio del demone mysqld con database da / srv / mysqldb / mysql 130422 15:35:33 [Nota] Il plug-in 'FEDERATED' è disabilitato. 130422 15:35:33 [Nota] Il plug-in 'InnoDB' è disabilitato. 130422 15:35:33 [Nota] Utilità di pianificazione eventi: caricati 0 eventi 130422 15:35:33 [Nota] / usr / libexec / mysqld: pronto per le connessioni. Versione: socket '5.5.17': porta '/srv/mysqldb/mysql/mysql.sock': 3306 MySQL Community Server (GPL) Come possiamo quindi scaricare le modifiche all'indice su tutti i .MYI senza riavviare? Possibile?
dat789,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.