Quels sont les paramètres optimaux de mysqldump? [fermé]

14

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.

En ce qui concerne 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 indisponible 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, je voudrais savoir comment m'informer quand la commande va mal et si oui lever une exception.

Des idées?

ÉDITER

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
user706838
la source
Lisez chaque argument et ses avantages et choisissez celui qui vous conviendrait. Apprenez également à connaître les scripts pour déclencher des échecs.
Mannoj
Cool. Mais cela ne répond pas vraiment à ma question. Par exemple, lequel utilisez-vous toujours?
user706838
Pardonnez mon ignorance, cette question n'est pas de recommander un livre ou un site Web. Je pense donc que cela ne devrait pas être un type de question basé sur l'opinion. Cela dit, certaines réponses seraient certainement de meilleure qualité selon l'expertise et étayées par des tests. À mon avis, la question est parfaitement posée avec un objectif bien défini.
user10089632

Réponses:

30

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 --disable-keys --extended-insert --lock-tables --quick - 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.

Étant donné que l' option - -opt est activée par défaut , vous spécifiez uniquement son contraire, 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 moment et de permettre de nouvelles écritures 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ésactiver --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_Proceduresest supérieur à zéro, utilisez --routines .

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

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

CAVEAT : veuillez ne pas utiliser --order-by-primary pour vider 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 que de nombreuses analyses de plage seront effectuées à 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 voir ma modification). J'ai une dernière question cependant. Pensez-vous qu'il serait utile d'utiliser également 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.
  • --delayed-insert : Je reste fermement à 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 existe 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é comme un bogue , 4 ) il est obsolète 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 n'a jamais existé. Ne l'utilisez jamais, jamais (à l'infini) !!!
  • --complete-insert : Ceci utilisera à la INSERT INTO tblname (colnam_1,colnam_2,...colnam_n) VALUES ...place 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 supprimez --add-drop-database , cela accélère simplement la DROP TABLE IF EXISTS(qui a été ajoutée par --add-drop-table ). Ne pas l'utiliser laisse simplement se DROP TABLE IF EXISTSproduire 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 de --tz-utc . Si vous restaurez les données vers un autre centre de données dans un fuseau horaire différent et ...
    • si vous souhaitez conserver le même fuseau horaire que celui de la 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 .
  • --default-character-set

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 lire toutes les options de mysqldump .

RolandoMySQLDBA
la source
À propos de --add-drop-database: cela ne garantit-il pas également qu'il n'y a pas d'autres tables aléatoires dans votre base de données qui ne sont pas dans votre vidage? Si quelqu'un a créé manuellement une table de test aléatoire dans votre base de données, elle existerait toujours après le rechargement à partir du vidage sans cette option. Donc, cela dépend si vous le souhaitez ou non. Droite?
jschultz410
Et alors --add-drop-trigger?
lonix