{"id":2931,"date":"2017-12-30T14:00:15","date_gmt":"2017-12-30T13:00:15","guid":{"rendered":"http:\/\/www.unicoda.com\/?p=2931"},"modified":"2019-04-05T23:26:19","modified_gmt":"2019-04-05T21:26:19","slug":"sauvegarde-de-base-de-donnees-avec-mysqldump-et-logrotate","status":"publish","type":"post","link":"https:\/\/www.unicoda.com\/?p=2931","title":{"rendered":"Sauvegarde de base de donn\u00e9es avec mysqldump et logrotate"},"content":{"rendered":"<p>Cela faisait plus d&rsquo;un an que j&rsquo;avais vaguement mentionn\u00e9 la question de la sauvegarde d&rsquo;Unicoda et des autres services que j&rsquo;h\u00e9berge. Jusqu&rsquo;\u00e0 pr\u00e9sent, je m&rsquo;\u00e9tais content\u00e9 de quelques sauvegardes manuelles effectu\u00e9es de temps \u00e0 autre, lorsque le contenu avait bien \u00e9volu\u00e9 ou que la sauvegarde pr\u00e9c\u00e9dente commen\u00e7ait \u00e0 dater. Je me suis donc int\u00e9ress\u00e9 aux diff\u00e9rentes solutions qu&rsquo;on rencontre sur le net : rsync, rclone, duplicity, script bash, bacula, pour ne citer que quelque-uns des outils. Si l&rsquo;automatisation de la sauvegarde ne m&rsquo;avait jamais sembl\u00e9 essentielle, c&rsquo;est que j&rsquo;\u00e9tais conscient des risques et me reposait sur la duplication RAID de l&rsquo;h\u00e9bergeur (pour le risque de d\u00e9faut mat\u00e9riel), mais surtout, parce que la majorit\u00e9 des informations \u00e9tait g\u00e9n\u00e9ralement pr\u00e9sente en local sur l&rsquo;une ou l&rsquo;autre de mes machines. Apr\u00e8s les r\u00e9cents changements de serveurs et le passage \u00e0 l&rsquo;auto-h\u00e9bergement de nombreux services, la sauvegarde devient critique. Commen\u00e7ons donc par nous pencher sur la sauvegarde des donn\u00e9es du serveur SQL.<\/p>\n<p>Pour exporter les donn\u00e9es d&rsquo;un serveur MySQL, la commande mysqldump est tout indiqu\u00e9e. Pour sauvegarder l&rsquo;int\u00e9gralit\u00e9 des bases du serveur avec l&rsquo;utilisateur root, on pourra par exemple utiliser :<\/p>\n<pre>mysqldump -u root -p --all-databases &gt; all_databases.sql<\/pre>\n<p>De la m\u00eame mani\u00e8re, il est possible de n&rsquo;extraire qu&rsquo;une seule base de donn\u00e9es :<\/p>\n<pre>mysqldump -u [user] -p maBase &gt; maBDD.sql<\/pre>\n<p>Il est possible de sp\u00e9cifier le mot de passe de l&rsquo;utilisateur directement dans la commande via -p[motDePasse] ou encore -p'[motDePasse]&rsquo;.\u00a0 Une fois en possession d&rsquo;une copie de notre base, l&rsquo;import s&rsquo;effectue simplement en utilisant :<\/p>\n<pre>mysql -u [user] -p maNouvelleBase &lt; maBDD.sql<\/pre>\n<p>J&rsquo;ai eu l&rsquo;occasion de mettre \u00e0 l&rsquo;\u00e9preuve cette m\u00e9thode lors des diff\u00e9rentes migrations d&rsquo;Unicoda; toujours avec succ\u00e8s et sans jamais rencontrer de probl\u00e8me.<\/p>\n<p>Maintenant que nous avons une fa\u00e7on de sauvegarder les donn\u00e9es de MySQL, il est temps de s&rsquo;int\u00e9resser \u00e0 l&rsquo;automatisation du processus.\u00a0 Afin de r\u00e9gler la question de l&rsquo;accumulation des fichiers de sauvegarde, j&rsquo;ai d\u00e9cid\u00e9 d&rsquo;utiliser logrotate, en d\u00e9tournant quelque peu son usage pour l&rsquo;appliquer \u00e0 mes sauvegardes SQL et non \u00e0 des fichiers de logs. Avant toutes choses, je cr\u00e9e un nouvel utilisateur au niveau de MySQL en le limitant aux droits Lock Tables et Select sur la base que je veux sauvegarder.<\/p>\n<pre>GRANT LOCK TABLES, SELECT ON maBase.* TO '&lt;user&gt;'@'localhost' IDENTIFIED BY '&lt;password&gt;';<\/pre>\n<p>On passe ensuite \u00e0 la configuration de logrotate pour notre fichier de sauvegarde. J&rsquo;ajoute donc un fichier dans \/etc\/logrotate.d\/sauvegarde-base-sql avec le contenu suivant :<\/p>\n<pre>\/var\/backups\/mysql\/maBDD.sql.gz {\r\n  daily\r\n  dateext\r\n  rotate 21\r\n  nocompress\r\n  create\r\n  postrotate\r\n  mysqldump --single-transaction --add-drop-table -u user -pmonMotDePasse baseASauvegarder &gt; \/var\/backups\/mysql\/maBDD.sql\r\n  gzip -9f \/var\/backups\/mysql\/maBDD.sql\r\n  chown user:user \/var\/backups\/mysql\/maBDD.sql.gz\r\n  chmod 640 \/var\/backups\/mysql\/maBDD.sql.gz\r\n  endscript\r\n}<\/pre>\n<p>C\u00f4t\u00e9 param\u00e8tres :<\/p>\n<ul>\n<li>L&rsquo;ex\u00e9cution est journali\u00e8re.<\/li>\n<li>La date est ajout\u00e9e au fichier lors de la rotation.<\/li>\n<li>On conserve 21 fichiers.<\/li>\n<li>Pas de compression<\/li>\n<li>Le nouveau fichier est cr\u00e9\u00e9 avec les m\u00eames permissions et le m\u00eame propri\u00e9taire que le pr\u00e9c\u00e9dent (create).<\/li>\n<li>On indique les commandes \u00e0 ex\u00e9cuter apr\u00e8s rotation (postrotate) \u00e0 savoir :\n<ul>\n<li>Extraction des donn\u00e9es de la base<\/li>\n<li>Compression du fichier<\/li>\n<li>Modification du propri\u00e9taire<\/li>\n<li>Modification des droits<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Enfin, on pr\u00e9pare l&rsquo;\u00e9tat initial du script en ajoutant un fichier vide de d\u00e9part :<\/p>\n<pre>sudo touch \/var\/backups\/mysql\/maBDD.sql.gz<\/pre>\n<p>Il est alors possible de tester l&rsquo;ex\u00e9cution avec l&rsquo;instruction suivante (d\u00e9bug avec -d et mode verbeux avec -v) :<\/p>\n<pre>sudo logrotate -f \/etc\/logrotate.d\/sauvegarde-base-sql<\/pre>\n<p>La restauration de la base s&rsquo;effectue avec la commande d&rsquo;import d\u00e9crite plus haut, il faudra bien s\u00fbr au pr\u00e9alable d\u00e9compresser le fichier de sauvegarde :<\/p>\n<pre id=\"r-2282593\" class=\"hoveredCourseElement\" data-claire-element-id=\"2587697\">gunzip\u00a0maBDD.sql.gz<\/pre>\n<p>Gr\u00e2ce \u00e0 cette configuration, je dispose d\u00e9sormais de 21 jours de sauvegarde de ma base SQL, le tout enti\u00e8rement automatis\u00e9. Logrotate me permet de b\u00e9n\u00e9ficier simplement de la rotation de mes fichiers de sauvegarde. Il aurait \u00e9t\u00e9 aussi possible d&rsquo;utiliser un script bash et une t\u00e2che cron pour un r\u00e9sultat similaire, mais cela aurait n\u00e9cessit\u00e9 de s&rsquo;occuper de la partie gestion des anciens fichiers; ce que logrotate fait tr\u00e8s bien pour moi. Dans le prochain article d\u00e9di\u00e9 \u00e0 la sauvegarde, je d\u00e9crirai la solution que j&rsquo;ai retenue pour la sauvegarde distante des fichiers du serveur, dont ces exports SQL.<\/p>\n<p>Par ailleurs, n&rsquo;h\u00e9sitez pas \u00e0 partager votre mani\u00e8re de sauvegarder votre base de donn\u00e9es dans les commentaires.<\/p>\n<p>Source : <a href=\"https:\/\/scottlinux.com\/2011\/03\/04\/rotate-mysql-backups-with-logrotate\/\" target=\"_blank\" rel=\"noopener noreferrer\">scottlinux<\/a>, <a href=\"https:\/\/www.leaseweb.com\/labs\/2013\/06\/logrotate-and-rsync-mysqldump-backups\/\" target=\"_blank\" rel=\"noopener noreferrer\">LeaseWeb Labs<\/a>, <a href=\"https:\/\/www.linode.com\/docs\/databases\/mysql\/back-up-your-mysql-databases\" target=\"_blank\" rel=\"noopener noreferrer\">Linode<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cela faisait plus d&rsquo;un an que j&rsquo;avais vaguement mentionn\u00e9 la question de la sauvegarde d&rsquo;Unicoda et des autres services que j&rsquo;h\u00e9berge. Jusqu&rsquo;\u00e0 pr\u00e9sent, je m&rsquo;\u00e9tais content\u00e9 de quelques sauvegardes manuelles effectu\u00e9es de temps \u00e0 autre, lorsque le contenu avait bien \u00e9volu\u00e9 ou que la sauvegarde pr\u00e9c\u00e9dente commen\u00e7ait \u00e0 dater. Je me suis donc int\u00e9ress\u00e9 aux &hellip; <a href=\"https:\/\/www.unicoda.com\/?p=2931\" class=\"more-link\">Continuer la lecture<span class=\"screen-reader-text\"> de &laquo;&nbsp;Sauvegarde de base de donn\u00e9es avec mysqldump et logrotate&nbsp;&raquo;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[415],"tags":[347,268,206],"class_list":["post-2931","post","type-post","status-publish","format-standard","hentry","category-sauvegarde","tag-logrotate","tag-sauvegarde","tag-sql"],"_links":{"self":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts\/2931","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2931"}],"version-history":[{"count":8,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts\/2931\/revisions"}],"predecessor-version":[{"id":3505,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts\/2931\/revisions\/3505"}],"wp:attachment":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2931"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2931"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2931"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}