Démarrer / arrêter MySQL


8

Je cherche de l'aide pour comprendre ce qui se passe lorsque la ligne de commande suivante est exécutée:

root@prodn$ service mysqld stop

Oui, il arrête le serveur MySQL, donc l'accès n'est plus disponible jusqu'à ce que le service soit redémarré. Cependant, plus spécifiquement, y a-t-il autre chose qui se produit lorsque le service est arrêté? Pardonnez mon novice ici mais quand mysqld est redémarré, cela signifie-t-il que les journaux ont été vidés, de la mémoire libérée, des caches vidés, etc.?

La raison pour laquelle je demande est la suivante:

Notre base de données d'entrepôt de données est une base de données MySQL et au cours des 4 derniers mois, cela a pris en moyenne 8,5 heures.

Mercredi dernier, j'ai arrêté le service mysql, puis l'ai redémarré après 30 minutes. Depuis, je commence à remarquer une amélioration massive des performances globales - les processus SELECT / INSERT / UPDATE / DELETE étaient plus efficaces. DW a terminé presque 4 heures plus tôt avec le même nombre de lignes de données

Cependant, chaque jour qui passe, 15 à 20 minutes s'ajoutent en quelque sorte à l'heure d'arrivée. Donc, je pense que je devrai peut-être redémarrer le service chaque semaine.

Y a-t-il une explication à ce comportement? Je ne sais pas quelles autres questions sont pertinentes mais ce serait génial de savoir ce qui se passe lorsque le mysqldservice redémarre.

Quelqu'un peut-il nous éclairer sur ce sujet


1
essayez de demander sur serverfault ou dba.
gbjbaanb


1
On dirait que vous avez beaucoup de données en mémoire qui sont validées. dev.mysql.com/doc/refman/5.0/en/server-shutdown.html
ethrbunny

@ dat789, le bon endroit pour chercher les réponses est déjà donné par ethrbunny. c'est le premier endroit où tu devrais le trouver.
Mrigesh Raj Shrestha

Réponses:


2

Lorsque vous émettez service mysql stop, il se passe beaucoup plus que simplement couper la connectivité DB. Le lien dans le commentaire de @ethrbunny explique déjà ce qui se passe.

Je voudrais me concentrer sur un aspect particulier: le pool de tampons InnoDB. InnoDB doit vider les pages sales du pool de tampons InnoDB. Si vous voulez savoir combien, exécutez ceci avant l'arrêt:

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;

Cela vous indiquera la quantité de données à vider du pool de tampons InnoDB.

Veuillez garder à l'esprit qu'InnoDB a de nombreuses pièces mobiles dans l'espace disque logique du système (le fichier ibdata1). Cliquez ici pour voir la représentation graphique de l'ensemble de l'infrastructure InnoDB .

Certaines informations transactionnelles sont écrites de manière à ce que la récupération après incident soit effectuée lorsque vous exécutez service mysql start.

OPTIONNEL

Vous pouvez obtenir toutes les données vidées et toutes les transactions proprement validées à partir d'ibdata1 et des journaux de transactions ( ib_logfile0, ib_logfile1) en exécutant ce

SET GLOBAL innodb_fast_shutdown = 0;

avant de courir

service mysql stop

Essaie !!!

MISE À JOUR 2013-04-24 07:17 EDT

Puisque vous avez MyISAM comme moteur de stockage principal, la seule chose qui se produit est le vidage des modifications d'index dans tous les .MYIfichiers dont les modifications sont en attente.

Je voudrais également recommander que la prochaine fois que vous fermez mysqld, exécutez ceci au préalable dans une autre session:

tail -f /var/log/mysqld.log

et regardez les messages qui passent et voyez-le, il vous indique ce que mysqld fait avec n'importe quel moteur de stockage. Si vous n'avez absolument aucune table InnoDB en cours d'utilisation, pensez à désactiver InnoDB avec

[mysqld]
skip-innodb

car cela permettra un démarrage plus rapide et éventuellement un arrêt plus rapide.


Merci pour cela. J'aurais dû être plus précis sur un autre aspect que je n'ai pas mentionné - nous utilisons le moteur MyISAM sur la plupart de nos tables. Cela fait-il une différence par rapport à InnoDB? Existe-t-il un moyen de faire de même sans redémarrer mysqld? Sinon, cela signifierait que je devrais parfois ennuyer notre administrateur système. De plus, la raison est plutôt simple: après chaque jour qui s'écoule depuis le dernier redémarrage, les opérations SELECT / UPDATE / INSERT semblent être retardées de 25 à 40 minutes. Un redémarrage le ramène à son temps «optimisé». Je ne peux pas expliquer pourquoi.
dat789

Je crois fermement qu'InnoDB était déjà désactivé. Voir l'extrait: 130422 15:35:31 mysqld_safe Démarrage du démon mysqld avec les bases de données de / srv / mysqldb / mysql 130422 15:35:33 [Note] Le plugin 'FEDERATED' est désactivé. 130422 15:35:33 [Note] Le plugin 'InnoDB' est désactivé. 130422 15:35:33 [Note] Planificateur d'événements: 0 événement chargé 130422 15:35:33 [Note] / usr / libexec / mysqld: prêt pour les connexions. Version: '5.5.17' socket: '/srv/mysqldb/mysql/mysql.sock' port: 3306 MySQL Community Server (GPL) Comment pouvons-nous alors vider les modifications d'index dans tous les .MYI sans redémarrer? Possible?
dat789
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.