{"id":3030,"date":"2018-04-07T07:04:09","date_gmt":"2018-04-07T05:04:09","guid":{"rendered":"http:\/\/www.unicoda.com\/?p=3030"},"modified":"2019-04-05T23:25:47","modified_gmt":"2019-04-05T21:25:47","slug":"procedure-de-restauration-de-sauvegarde-surprise","status":"publish","type":"post","link":"https:\/\/www.unicoda.com\/?p=3030","title":{"rendered":"Proc\u00e9dure de restauration de sauvegarde&#8230; Surprise !"},"content":{"rendered":"<p>Depuis plusieurs mois donc, mes services auto-h\u00e9berg\u00e9s sont sauvegard\u00e9s quotidiennement de fa\u00e7on automatique et incr\u00e9mentale. Je suis en th\u00e9orie prot\u00e9g\u00e9 contre la perte de mes donn\u00e9es en cas de panne mat\u00e9rielle du support de stockage de mon serveur. \u00c7a, c&rsquo;est la th\u00e9orie, il me restait en l&rsquo;occurrence \u00e0 valider le processus de sauvegarde en m&rsquo;assurant de la fa\u00e7on de restaurer les donn\u00e9es.<\/p>\n<p>J&rsquo;ai donc commenc\u00e9 ces derniers jours l&rsquo;\u00e9criture d&rsquo;un script ansible permettant de red\u00e9ployer automatiquement l&rsquo;ensemble de mes services sur un nouveau serveur si besoin. L&rsquo;occasion r\u00eav\u00e9e de v\u00e9rifier que la restauration de sauvegarde fonctionne correctement.<\/p>\n<p>Apr\u00e8s configuration de duplicity sur la nouvelle machine, je tente donc de restaurer un fichier pris au hasard:<\/p>\n<pre>duplicity restore --file-to-restore path\/to\/wallabag\/vendor\/jdorn\/sql-formatter\/LICENSE.txt -t now cf+hubic:\/\/ test\/LICENSE-restored.txt<\/pre>\n<p>J&rsquo;obtiens une erreur d\u00e8s les premi\u00e8res tentatives : <code>No backup chains found<\/code>, et lis au d\u00e9tour d&rsquo;une page web qu&rsquo;il faut \u00e0 priori effectuer un <code>list-current-files<\/code> au pr\u00e9alable. Il faudra que je v\u00e9rifie cette information lors du test r\u00e9el de mon script sur un syst\u00e8me vierge. Je d\u00e9couvre donc que duplicity r\u00e9cup\u00e8re dans un premier temps tous les fichiers <em>manifest<\/em>. La r\u00e9cup\u00e9ration des fichiers se poursuit, et c&rsquo;est le drame :<\/p>\n<pre>Giving up after 1 attempts. NoSuchObject: Object 'duplicity-inc.20180212T113006Z.to.20180213T113007Z.manifest.gpg' doesn't exist (HTTP 404)<\/pre>\n<p>L&rsquo;un des fichiers n&rsquo;est pas renvoy\u00e9 par hubiC. Il est n\u00e9anmoins visible dans l&rsquo;interface, mais impossible de le r\u00e9cup\u00e9rer, la requ\u00eate effectu\u00e9e par l&rsquo;interface web retourne elle aussi une mauvaise erreur 404. Ce probl\u00e8me de manifeste manquant concerne une cha\u00eene secondaire, mais impacte malheureusement l&rsquo;ensemble de la collection. Impossible de restaurer les donn\u00e9es via duplicity&#8230;<\/p>\n<p><!--more--><\/p>\n<pre>Last full backup date: Tue Mar 6 22:30:07 2018\r\nCollection Status\r\n-----------------\r\n[...]\r\n\r\nFound 3 secondary backup chains.\r\nSecondary chain 1 of 3:\r\n-------------------------\r\n[...]\r\n-------------------------\r\n\r\nSecondary chain 2 of 3:\r\n-------------------------\r\n[...]\r\n-------------------------\r\n\r\nSecondary chain 3 of 3:\r\n-------------------------\r\nChain start time: Mon Feb 12 22:30:06 2018\r\nChain end time: Mon Mar 5 22:30:07 2018\r\nNumber of contained backup sets: 22\r\nTotal number of contained volumes: 24\r\n Type of backup set: Time: Num volumes:\r\n Full Mon Feb 12 22:30:06 2018 3\r\n Incremental Tue Feb 13 22:30:07 2018 1\r\n Incremental Wed Feb 14 22:30:07 2018 1\r\n Incremental Thu Feb 15 22:30:08 2018 1\r\n Incremental Fri Feb 16 22:30:07 2018 1\r\n Incremental Sat Feb 17 22:30:08 2018 1\r\n Incremental Sun Feb 18 22:30:07 2018 1\r\n Incremental Mon Feb 19 22:30:07 2018 1\r\n Incremental Tue Feb 20 22:30:08 2018 1\r\n Incremental Wed Feb 21 22:30:07 2018 1\r\n Incremental Thu Feb 22 22:30:07 2018 1\r\n Incremental Fri Feb 23 22:30:08 2018 1\r\n Incremental Sat Feb 24 22:30:06 2018 1\r\n Incremental Sun Feb 25 22:30:05 2018 1\r\n Incremental Mon Feb 26 22:30:07 2018 1\r\n Incremental Tue Feb 27 22:30:07 2018 1\r\n Incremental Wed Feb 28 22:30:08 2018 1\r\n Incremental Thu Mar 1 22:30:07 2018 1\r\n Incremental Fri Mar 2 22:30:09 2018 1\r\n Incremental Sat Mar 3 22:30:07 2018 1\r\n Incremental Sun Mar 4 22:30:06 2018 1\r\n Incremental Mon Mar 5 22:30:07 2018 1\r\n-------------------------\r\n\r\n\r\nFound primary backup chain with matching signature chain:\r\n-------------------------\r\nChain start time: Tue Mar 6 22:30:07 2018\r\nChain end time: Tue Mar 20 22:30:09 2018\r\nNumber of contained backup sets: 13\r\nTotal number of contained volumes: 17\r\n Type of backup set: Time: Num volumes:\r\n Full Tue Mar 6 22:30:07 2018 3\r\n Incremental Wed Mar 7 22:30:07 2018 1\r\n Incremental Thu Mar 8 22:30:07 2018 1\r\n Incremental Fri Mar 9 22:30:08 2018 1\r\n Incremental Mon Mar 12 22:30:06 2018 1\r\n Incremental Tue Mar 13 22:30:07 2018 1\r\n Incremental Wed Mar 14 22:30:07 2018 1\r\n Incremental Thu Mar 15 22:30:07 2018 1\r\n Incremental Fri Mar 16 22:30:07 2018 1\r\n Incremental Sat Mar 17 22:30:07 2018 1\r\n Incremental Sun Mar 18 22:30:07 2018 1\r\n Incremental Mon Mar 19 22:30:07 2018 1\r\n Incremental Tue Mar 20 22:30:09 2018 3\r\n-------------------------\r\nNo orphaned or incomplete backup sets found.<\/pre>\n<p>En cas de corruption ou de perte de l&rsquo;un des \u00e9l\u00e9ments de la cha\u00eene de sauvegarde, il faut donc garder \u00e0 l&rsquo;esprit que l&rsquo;ensemble de la cha\u00eene devient inutilisable par duplicity, m\u00eame si l&rsquo;\u00e9l\u00e9ment incrimin\u00e9 concerne une cha\u00eene secondaire et que l&rsquo;on dispose d&rsquo;une cha\u00eene primaire plus r\u00e9cente partant d&rsquo;une sauvegarde compl\u00e8te. Du c\u00f4t\u00e9 des bonnes nouvelles, si les sauvegardes compl\u00e8tes effectu\u00e9es p\u00e9riodiquement ne sont pas corrompues, il est possible de r\u00e9cup\u00e9rer les donn\u00e9es \u00e0 la main tr\u00e8s simplement, en quelques commandes.<\/p>\n<p>En r\u00e9cup\u00e9rant les fichiers chiffr\u00e9s composants la sauvegarde compl\u00e8te, en se munissant du mot de passe utilis\u00e9 et en suivant les instructions du <a href=\"https:\/\/wiki.gnome.org\/Apps\/DejaDup\/Help\/Restore\/WorstCase\" target=\"_blank\" rel=\"noopener noreferrer\">wiki Gnome<\/a>, on commence donc par d\u00e9chiffrer chaque fichier avec <em>gpg<\/em> :<\/p>\n<pre>gpg --output duplicity-full.20180306T223007Z.vol1.difftar --decrypt duplicity-full.20180306T223007Z.vol1.difftar.gpg<\/pre>\n<p>Pour d\u00e9chiffrer l&rsquo;ensemble des fichiers en une commande :<\/p>\n<pre>gpg --multifile --decrypt duplicity-full.20180306T223007Z.*.difftar.gpg<\/pre>\n<p>Une fois les fichiers d\u00e9chiffr\u00e9s, on peut d\u00e9compresser l&rsquo;ensemble avec tar :<\/p>\n<pre>tar xf duplicity-full.20180306T223007Z.vol1.difftar<\/pre>\n<p>Ou l&rsquo;ensemble des fichiers en une fois :<\/p>\n<pre>for t in duplicity-full.20180306T223007Z.*.difftar; do tar xf $t; done<\/pre>\n<p>Il ne reste plus qu&rsquo;\u00e0 explorer le contenu des dossiers d\u00e9compress\u00e9s pour y chercher les donn\u00e9es que l&rsquo;on souhaite r\u00e9cup\u00e9rer. Une proc\u00e9dure similaire est ensuite applicable \u00e0 chaque dossier incr\u00e9mental pris s\u00e9par\u00e9ment, si la derni\u00e8re sauvegarde compl\u00e8te n&rsquo;est pas suffisante.<\/p>\n<p>Une autre solution consiste \u00e0 prendre son mal en patience, croiser les doigts et r\u00e9essayer p\u00e9riodiquement. Il se trouve que le lendemain, le fichier manquant \u00e9tait \u00e0 nouveau disponible : plus d&rsquo;erreur 404.<\/p>\n<p>Cette m\u00e9saventure m&rsquo;aura au moins permis de valider la r\u00e9cup\u00e9ration des donn\u00e9es en cas de probl\u00e8me unitaire sur la cha\u00eene de sauvegarde. Pour le reste, l&rsquo;automatisation suit son cours et l&rsquo;utilisation d&rsquo;ansible, au vu des premiers essais, devrait me permettre de red\u00e9ployer facilement mes services sur une nouvelle machine \u00e0 partir des donn\u00e9es sauvegard\u00e9es.<br \/>\nLa boucle est boucl\u00e9e.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Depuis plusieurs mois donc, mes services auto-h\u00e9berg\u00e9s sont sauvegard\u00e9s quotidiennement de fa\u00e7on automatique et incr\u00e9mentale. Je suis en th\u00e9orie prot\u00e9g\u00e9 contre la perte de mes donn\u00e9es en cas de panne mat\u00e9rielle du support de stockage de mon serveur. \u00c7a, c&rsquo;est la th\u00e9orie, il me restait en l&rsquo;occurrence \u00e0 valider le processus de sauvegarde en m&rsquo;assurant &hellip; <a href=\"https:\/\/www.unicoda.com\/?p=3030\" class=\"more-link\">Continuer la lecture<span class=\"screen-reader-text\"> de &laquo;&nbsp;Proc\u00e9dure de restauration de sauvegarde&#8230; Surprise !&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":[337,316,415],"tags":[357,362,363],"class_list":["post-3030","post","type-post","status-publish","format-standard","hentry","category-auto-hebergement","category-configuration","category-sauvegarde","tag-duplicity","tag-manifest","tag-restore"],"_links":{"self":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts\/3030","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=3030"}],"version-history":[{"count":6,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts\/3030\/revisions"}],"predecessor-version":[{"id":3504,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=\/wp\/v2\/posts\/3030\/revisions\/3504"}],"wp:attachment":[{"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3030"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3030"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.unicoda.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3030"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}