web-dev-qa-db-fra.com

Quels sont les paramètres optimaux de mysqldump?

Après quelques recherches, je me suis retrouvé avec les paramètres suivants:

    mysqldump\
    --Host=localhost\
    --port=3306\
    --databases ****\
    --user=****\
    --password=****\
    --default-character-set=utf8\
    --add-drop-database\
    --add-drop-table\
    --add-locks\
    --complete-insert\
    --extended-insert\
    --lock-all-tables\
    --create-options\
    --disable-keys\
    --quick\
    --order-by-primary\
    --set-charset\
    --tz-utc\
    > dump/test.sql

Jusqu'ici tout va bien mais j'ai quelques questions concernant les paramètres ainsi que l'exécution.

Concernant ma première préoccupation, je veux juste m'assurer que tous sont nécessaires et ne causent aucun conflit lorsqu'ils sont utilisés ensemble. En fin de compte, je voudrais créer un fichier de vidage très robuste et cohérent, avec des millions d'enregistrements, qui crée des tables, des bases de données et insère des données. La bonne chose est que rendre la base de données non disponible pendant un certain temps n'est pas un problème pour moi. Mon seul objectif est de créer un fichier de vidage robuste et cohérent.

Concernant mon deuxième concert, j'aimerais savoir comment m'informer quand la commande va mal et si oui lever une exception.

Des idées?

MODIFIER

Ceci est ma commande mysqldump mise à jour basée sur les commentaires de RolandoMySQLDBA.

mysqldump\
--Host=localhost\
--port=3306\
--databases ****\
--user=****\
--password=****\
--default-character-set=utf8\
--opt\
--single-transaction\
--routines\
--triggers\
--events\
--add-drop-database\
--add-drop-table\
--complete-insert\
--delayed-insert\
--tz-utc\
> dump/test.sql
14
user706838

Vous allez trouver cela choquant, mais vous n'avez besoin que d'une option majeure: - opt

Qu'est-ce que - opt ?

Cette option, activée par défaut, est un raccourci pour la combinaison de - add-drop-table- add-locks- create-options = - touches de désactivation- insert-étend- tables de verrouillage- rapide--set-charset . Il donne une opération de vidage rapide et produit un fichier de vidage qui peut être rechargé rapidement sur un serveur MySQL.

Parce que - l'option opt est activée par défaut, vous ne spécifiez que son inverse, l'option --skip-opt pour désactiver plusieurs paramètres par défaut. Voir la discussion sur les groupes d'options mysqldump pour plus d'informations sur l'activation ou la désactivation sélective d'un sous-ensemble des options affectées par --opt.

Puisque - opt est déjà activé, vous n'avez pas besoin de spécifier - opt . Néanmoins, vous devrez peut-être certaines options nécessaires qui ne sont pas incluses.

Exécutez cette requête sur votre base de données

SELECT engine,COUNT(1) TableCount
FROM information_schema.tables
WHERE engine IN ('InnoDB','MyISAM')
AND table_schema NOT IN ('information_schema','mysql','performance_schema')
GROUP BY engine;

Si vous avez toutes les tables InnoDB, vous devez spécifier - single-transaction . Cela désactivera automatiquement - - lock-tables et vous permettra de vider toutes les tables au même point dans le temps et de permettre aux nouvelles écritures de venir en même temps.

Si vous avez une ou plusieurs tables MyISAM, vous devez spécifier - lock-all-tables . Cela désactivera automatiquement - - lock-tables , désactivera - single-transaction , verrouillera toutes les tables sur toutes les bases de données, puis créera le vidage. Les écritures dans les tables InnoDB peuvent toujours se produire, mais elles seront simplement mises en file d'attente jusqu'à ce que les verrous soient libérés. Toute connexion DB tentant d'écrire sur une table MyISAM sera suspendue jusqu'à ce que tous les verrous soient libérés.

Exécutez cette requête: SELECT COUNT(1) Number_Of_Stored_Procedures FROM mysql.proc;

Si Number_Of_Stored_Procedures Est supérieur à zéro, utilisez - routines .

Exécutez cette requête: SELECT COUNT(1) Number_Of_Triggers FROM information_schema.triggers;

Si Number_Of_Triggers Est supérieur à zéro, utilisez - triggers .

[~ # ~] mise en garde [~ # ~] : veuillez ne pas utiliser - order-by-primary pour le dumping toutes les bases de données car cela peut potentiellement rendre les index BTREE plutôt déséquilibrés lors du rechargement. - order-by-primary ne doit être utilisé que lors du vidage d'une table individuelle dont vous savez qu'elle possède une clé primaire entière et comportera de nombreuses analyses de plage à partir de votre application.

Si vous avez besoin de types de sauvegarde mysqldump plus créatifs, consultez mon ancien article Comment puis-je optimiser un mysqldump d'une grande base de données? .

Veuillez lire toutes les options de mysqldump .

MISE À JOUR 2014-12-29 09:44 EST

J'ai mis à jour ma commande mysqldump (veuillez consulter ma modification). J'ai une dernière question cependant. Pensez-vous que cela vaut également la peine d'utiliser tous les arguments suivants? --add-drop-database\--add-drop-table\--complete-insert\--delayed-insert\--tz-utc

En examinant votre commentaire et votre dernière modification, examinons chacune de ces options et voyons si vous en avez besoin

  • - opt : J'ai déjà dit que vous n'avez pas besoin de le spécifier car il est activé par défaut.
  • - delay-insert : Je reste catégoriquement à l'écart de cela avec une base de données entièrement InnoDB. En fait, Je reste fermement à l'écart de cette PÉRIODE !!!. Depuis 1) il est possible que INSERT DELAYED puisse perdre des données, 2) il est converti en INSERT pour les esclaves de réplication MySQL, 3) il y a un rapport de bogue ouvert à propos de son utilisation avec des déclencheurs de retour dans MySQL 5.6 et n'est pas considéré un bug , 4) il est déconseillé dans MySQL 5.6, et 5) Morgan Tocker (bien connu MySQL Guru) a prévu sa dépréciation en 2012 , vous devez oublier que cette option a jamais existé. Ne l'utilisez jamais, jamais (à l'infini) !!!
  • - complete-insert : Ceci utilisera INSERT INTO tblname (colnam_1,colnam_2,...colnam_n) VALUES ... au lieu de INSERT INTO tblname VALUES .... Cela pourrait gonfler le mysqldump s'il y a beaucoup de colonnes dans la définition de la table et de nombreuses lignes dans la table. Ne l'utilisez pas.
  • - add-drop-table : Puisque - opt le permet pour vous, vous n'avez pas besoin de le spécifier.
  • - add-drop-database : Si vous déposez - add-drop-database , cela fait juste le DROP TABLE IF EXISTS (qui a été ajouté par - - add-drop-table ) allez plus vite. Ne pas l'utiliser laisse simplement DROP TABLE IF EXISTS Se produire pour chaque table. Ainsi, l'utilisation de - - add-drop-database est une question de choix personnel.
  • - tz-utc : Si vous prévoyez de restaurer des données sur le même serveur à partir duquel vous sauvegardez, vous n'avez pas besoin - tz-utc . Si vous restaurez les données vers un autre centre de données dans un fuseau horaire différent et ...
    • si vous voulez conserver le même fuseau horaire que celui de votre sauvegarde, vous n'avez pas besoin de - tz-utc .
    • si vous voulez que les données utilisent le fuseau horaire d'un nouveau centre de données, vous avez besoin de - tz-utc .
    • EXEMPLE: Supposons que vous sauvegardiez une base de données à New York. C'est EST. Si vous avez un autre centre de données à Seattle, ce serait PST. Si vous souhaitez que la sauvegarde de New York soit restaurée à Seattle et que les horodatages de la base de données représentent toujours New York, vous ne voulez pas utiliser - - tz-utc .
  • - jeu de caractères par défaut

Ajuster votre dernière édition, c'est ce dont vous avez particulièrement besoin

mysqldump\
--Host=localhost\
--port=3306\
--databases ****\
--user=****\
--password=****\
--single-transaction\
--routines\
--triggers\
--events\
--add-drop-database\
> dump/test.sql

Encore une fois, je dis s'il vous plaît lisez toutes les options pour mysqldump .

30
RolandoMySQLDBA