{"id":31287,"date":"2020-12-16T10:34:05","date_gmt":"2020-12-16T09:34:05","guid":{"rendered":"https:\/\/fotc.com\/?p=31287"},"modified":"2023-11-27T09:53:50","modified_gmt":"2023-11-27T08:53:50","slug":"program-do-backupu","status":"publish","type":"post","link":"https:\/\/fotc.com\/pl\/blog\/program-do-backupu\/","title":{"rendered":"Tworzenie w\u0142asnego programu do backupu bazy danych MySQL na GCP [Node.js + cron]"},"content":{"rendered":"\n<div class=\"wp-block-yoast-seo-table-of-contents yoast-table-of-contents collapsed\"><h2> Spis tre\u015bci <\/h2><ul><li><a href=\"#h-czym-jest-kopia-zapasowa\" data-level=\"2\">Czym jest kopia zapasowa?<\/a><ul><li><a href=\"#h-jak-cz-sto-prowadzi-backup\" data-level=\"3\">Jak cz\u0119sto prowadzi\u0107 backup?<\/a><\/li><li><a href=\"#h-gdzie-przechowywa-kopi-zapasow\" data-level=\"3\">Gdzie przechowywa\u0107 kopi\u0119 zapasow\u0105?<\/a><\/li><\/ul><\/li><li><a href=\"#h-w-jaki-spos-b-mo-na-robi-kopi-zapasow-bazy-danych\" data-level=\"2\">W jaki spos\u00f3b mo\u017cna robi\u0107 kopi\u0119 zapasow\u0105 bazy danych?<\/a><\/li><li><a href=\"#h-co-to-jest-cron-i-jak-rol-odgrywa-w-opisanym-programie-do-backupu\" data-level=\"2\">Co to jest cron i jak\u0105 rol\u0119 odgrywa w opisanym programie do backupu?<\/a><ul><li><a href=\"#h-ustawienie-terminu-wykonania-dzia-ania\" data-level=\"3\">Ustawienie terminu wykonania dzia\u0142ania<\/a><\/li><li><a href=\"#h-nie-tylko-kopia-zapasowa-do-czego-jeszcze-mo-na-u-y-crona\" data-level=\"3\">Nie tylko kopia zapasowa \u2013 do czego jeszcze mo\u017cna u\u017cy\u0107 crona?<\/a><\/li><\/ul><\/li><li><a href=\"#h-program-do-backupu-w-node-js-z-u-yciem-crona-tutorial\" data-level=\"2\">Program do backupu w Node.js z u\u017cyciem crona \u2013 tutorial<\/a><ul><li><a href=\"#h-wymagania-pocz-tkowe\" data-level=\"3\">Wymagania pocz\u0105tkowe<\/a><\/li><li><a href=\"#h-inicjalizacja-projektu\" data-level=\"3\">Inicjalizacja projektu<\/a><\/li><li><a href=\"#h-skrypt-wykonuj-cy-backup-bazy-danych\" data-level=\"3\">Skrypt wykonuj\u0105cy backup bazy danych<\/a><\/li><li><a href=\"#h-po-czenie-z-google-cloud-storage\" data-level=\"3\">Po\u0142\u0105czenie z Google Cloud Storage<\/a><\/li><li><a href=\"#h-stworzenie-crona-kt-ry-b-dzie-wywo-ywa-kod\" data-level=\"3\">Stworzenie crona, kt\u00f3ry b\u0119dzie wywo\u0142ywa\u0142 kod\u00a0<\/a><\/li><\/ul><\/li><\/ul><\/div>\n\n\n\n<p><span>Powiedzenie o dw\u00f3ch grupach ludzi i backupie jest tak powszechne, \u017ce chyba nie warto go po raz kolejny przytacza\u0107. Warto za to pokaza\u0107, jak niewielkim wysi\u0142kiem wykona\u0107 kopi\u0119 zapasow\u0105 \u2013 a najlepiej ustawi\u0107 regularne, automatyczne wykonanie backupu.<\/span><\/p>\n\n\n\n<p><span><strong>Zaplanowanie wykonania kopii zapasowej wed\u0142ug ni\u017cszego tutorialu zajmie kilkana\u015bcie minut<\/strong>, a pozwoli zaoszcz\u0119dzi\u0107 godziny odzyskiwania danych lub tworzenia ich od nowa.<\/span><\/p>\n\n\n\n<p><span>Na pocz\u0105tek kilka s\u0142\u00f3w teorii \u2013 o samej kopii zapasowej, miejscu jej przechowywania oraz o tym, czym jest cron.<\/span><\/p>\n\n\n\n<h2 id=\"h-czym-jest-kopia-zapasowa\"><span>Czym jest kopia zapasowa?<\/span><\/h2>\n\n\n\n<p><span>Kopia zapasowa jest nazywana te\u017c kopi\u0105 bezpiecze\u0144stwa lub, bardziej potocznie, backupem.<\/span><\/p>\n\n\n\n<p><span>Polega na skopiowaniu warto\u015bciowych danych \u2013 dokument\u00f3w, plik\u00f3w, grafik \u2013 i umieszczeniu ich w innej, bezpiecznej lokalizacji. Takie dzia\u0142anie jest kluczowe dla&nbsp; przywracania informacji po awarii, zachowania ci\u0105g\u0142o\u015bci funkcjonowania aplikacji czy zapewnienia spokojnego snu pracownikom dzia\u0142u IT.<\/span><\/p>\n\n\n\n<h3 id=\"h-jak-cz-sto-prowadzi-backup\"><span>Jak cz\u0119sto prowadzi\u0107 backup?<\/span><\/h3>\n\n\n\n<p><span>Nie ma na to pytanie uniwersalnej odpowiedzi.<\/span><\/p>\n\n\n\n<p><span>To zale\u017cy od tego, jak cz\u0119sto w aplikacji czy bazie danych zachodz\u0105 zmiany, ile ich jest i jaka jest ich waga. W przypadku niekt\u00f3rych serwis\u00f3w wystarczy przeprowadzi\u0107 kopi\u0119 zapasow\u0105 raz w tygodniu, w przypadku innych dobrze b\u0119dzie robi\u0107 backup co godzin\u0119.&nbsp;<\/span><\/p>\n\n\n\n<h3 id=\"h-gdzie-przechowywa-kopi-zapasow\"><span>Gdzie przechowywa\u0107 kopi\u0119 zapasow\u0105?<\/span><\/h3>\n\n\n\n<p><span>Z pewno\u015bci\u0105 w innym miejscu, ni\u017c oryginalny, kopiowany plik. Je\u015bli baza danych znajduje si\u0119 na fizycznym serwerze, backup lepiej umie\u015bci\u0107 na innym urz\u0105dzeniu lub w chmurze. Je\u015bli dane aplikacji oryginalnie znajduj\u0105 si\u0119 w chmurze, backup mo\u017cemy zapisa\u0107 w innej instancji (nawet w odleg\u0142ym regionie) czy na rozwi\u0105zaniu innego, zaufanego dostawcy us\u0142ug chmurowych.<\/span><\/p>\n\n\n\n<p><strong>Zobacz te\u017c:<\/strong><\/p>\n\n\n\n<ul><li><a href=\"https:\/\/fotc.com\/pl\/blog\/disaster-recovery-plan\/\" class=\"ek-link\"><strong>Disaster Reco<\/strong><\/a><strong><a href=\"https:\/\/fotc.com\/pl\/blog\/disaster-recovery-plan\/\" class=\"ek-link\">very Plan,<\/a> <\/strong>czyli jak zachowa\u0107 dost\u0119pno\u015b\u0107 aplikacji w obliczu awarii<\/li><li><strong><a href=\"https:\/\/fotc.com\/pl\/blog\/business-continuity-plan-czym-jest-i-jak-go-stworzyc\/\" target=\"_blank\" aria-label=\"Business Continuity Plan (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">Business Continuity Plan<\/a> <\/strong>\u2013 czym jest i jak go stworzy\u0107?\u00a0 <\/li><\/ul>\n\n\n\n<h2 id=\"h-w-jaki-spos-b-mo-na-robi-kopi-zapasow-bazy-danych\"><span>W jaki spos\u00f3b mo\u017cna robi\u0107 kopi\u0119 zapasow\u0105 bazy danych?<\/span><\/h2>\n\n\n\n<p><span>Backup mo\u017cna robi\u0107 r\u0119cznie. Jednak trzeba by\u0107 naprawd\u0119 zdyscyplinowanym, \u017ceby zachowa\u0107 regularno\u015b\u0107 wykonywania kopii zapasowej i mie\u0107 pewno\u015b\u0107, \u017ce na \u017cadnym kroku nie pope\u0142ni si\u0119 b\u0142\u0119du.<\/span><\/p>\n\n\n\n<p><span>Lepszym rozwi\u0105zaniem jest automatyzacja wykonania kopii zapasowej \u2013 za pomoc\u0105 gotowej us\u0142ugi lub w\u0142asnego programu do backupu. Automatyzacja da pewno\u015b\u0107, \u017ce kopia zosta\u0142a wykonana prawid\u0142owo, o okre\u015blonej porze, a Ty zaoszcz\u0119dzisz przy okazji troch\u0119 czasu.<\/span><\/p>\n\n\n\n<p><span>Je\u015bli posiadasz baz\u0119 danych w us\u0142udze <\/span><a href=\"https:\/\/fotc.com\/pl\/blog\/cloud-sql\/\"><span>Cloud SQL<\/span><\/a><span>\u00a0w <a href=\"https:\/\/fotc.com\/pl\/google-cloud-platform\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">Google Cloud Platform<\/a>, mo\u017cesz skorzysta\u0107 z wbudowanej mo\u017cliwo\u015bci automatyzacji prowadzenia kopii zapasowej. A je\u015bli chcesz stworzy\u0107 sw\u00f3j program do backupu, czytaj dalej. Opisali\u015bmy spos\u00f3b, kt\u00f3ry obejmuje skrypt Node.js, u\u017cywa crona i zapisuje kopi\u0119 bazy danych w us\u0142udze <\/span><a href=\"https:\/\/fotc.com\/pl\/blog\/gcp-cloud-storage\/\"><span>Cloud Storage<\/span><\/a><span>. Analogiczny program mo\u017cna napisa\u0107 w innym j\u0119zyku, kt\u00f3ry posiada sterownik do bazy danych MySQL \u2013 na przyk\u0142ad Python, Go czy C#.<\/span><\/p>\n\n\n\n<h2 id=\"h-co-to-jest-cron-i-jak-rol-odgrywa-w-opisanym-programie-do-backupu\"><span>Co to jest cron i jak\u0105 rol\u0119 odgrywa w opisanym programie do backupu?<\/span><\/h2>\n\n\n\n<p><span>Cron to program do harmonogramowania zada\u0144 dost\u0119pny w systemach operacyjnych z rodziny Unix. W okre\u015blonym terminie cron wykona powierzone mu zadanie \u2013 na przyk\u0142ad uruchomi skrypt lub wykona przypisan\u0105 komend\u0119 co pi\u0105tek o godzinie 23:00.<\/span><\/p>\n\n\n\n<p><span>Cronowi trzeba przed\u0142o\u017cy\u0107 jasne instrukcje:<\/span><\/p>\n\n\n\n<ul><li><span><strong>gdzie ma wykona\u0107 akcj\u0119<\/strong> (\u015bcie\u017cka dotarcia, np. do pliku, folderu, programu),<\/span><\/li><li><span><strong>jak\u0105 akcj\u0119 ma wykona\u0107<\/strong> (np. odpali\u0107 skrypt, wykona\u0107 komend\u0119, przes\u0142a\u0107 plik),<\/span><\/li><li><span><strong>kiedy ma to zrobi\u0107<\/strong> (np. co p\u00f3\u0142 godziny, co poniedzia\u0142ek, raz na miesi\u0105c).<\/span><\/li><\/ul>\n\n\n\n<p><span>Ten zestaw informacji \u2013 cz\u0119\u015bciowo zapisany w kodzie, cz\u0119\u015bciowo w ustawieniach crona \u2013 jest nazywany <\/span><i><span>cron job<\/span><\/i><span>.<\/span><\/p>\n\n\n\n<p><span>W przypadku programu do backupu wska\u017cemy za pomoc\u0105 komend w Node.js, \u017ce cron codziennie o godzinie 1.00 ma skopiowa\u0107 baz\u0119 danych znajduj\u0105c\u0105 si\u0119 na serwerze i zapisa\u0107 j\u0105 w zasobniku Cloud Storage o nazwie <\/span><i><span>cron-backup<\/span><\/i><span>.<\/span><\/p>\n\n\n\n<h3 id=\"h-ustawienie-terminu-wykonania-dzia-ania\"><span>Ustawienie terminu wykonania dzia\u0142ania<\/span><\/h3>\n\n\n\n<p><span>Podczas tworzenia crona b\u0119dziemy wskazywa\u0107, z jak\u0105 cz\u0119stotliwo\u015bci\u0105 ma on wykonywa\u0107 zlecone zadanie.<\/span><\/p>\n\n\n\n<p><span>Mamy mo\u017cliwo\u015b\u0107 wskazania:<\/span><\/p>\n\n\n\n<ul><li><span><strong>godziny<\/strong> (zakres 0-23) z dok\u0142adno\u015bci\u0105 do <strong>minuty<\/strong> (zakres 0-59),<\/span><\/li><li><span><strong>dnia miesi\u0105ca<\/strong> (warto\u015bci od 1 do 28, 29, 30 lub 31 \u2013 w zale\u017cno\u015bci od d\u0142ugo\u015bci miesi\u0105ca),<\/span><\/li><li><span><strong>miesi\u0105ca<\/strong> (warto\u015bci od 1 do 12),<\/span><\/li><li><span><strong>dnia tygodnia<\/strong> (warto\u015bci w zale\u017cno\u015bci od rodzaju crona \u2013 0-6 lub 1-7).<\/span><\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/fotc.com\/app\/uploads\/2021\/08\/cron-termin.png\" alt=\"tworzenie programu do backupu - ustawienie crona\" class=\"wp-image-53198\"\/><\/figure>\n\n\n\n<p><span>Wstawiaj\u0105c liczby w odpowiednie miejsca, mo\u017cemy wskaza\u0107 jeden termin, kilka termin\u00f3w lub zakres dat. Gwiazdka oznacza, \u017ce cron b\u0119dzie wykonywa\u0142 akcj\u0119 cyklicznie w najkr\u00f3tszym mo\u017cliwym odst\u0119pie, np. codziennie.<\/span><\/p>\n\n\n\n<p><span>Przyk\u0142adowo:<\/span><\/p>\n\n\n\n<ul><li><b>0 0 * * *<\/b><span> \u2013 cron wykona akcj\u0119 codziennie o p\u00f3\u0142nocy,<\/span><\/li><li><b>30 1 * * 1<\/b><span> \u2013 co poniedzia\u0142ek o godzinie 1.30,<\/span><\/li><li><b>0 22 * * 1-5<\/b><span> \u2013 codziennie od poniedzia\u0142ku do pi\u0105tku o godzinie 22.00,<\/span><\/li><li><b>0 12 10 * * <\/b><span>\u2013 10. dnia miesi\u0105ca o godzinie 12.00,<\/span><\/li><li><b>0 20 1-5 * *<\/b><span> \u2013 w 1., 2., 3., 4. i 5. dzie\u0144 miesi\u0105ca o godzinie 20.00,<\/span><\/li><li><b>59 23 31 12 *<\/b><span> \u2013 o godzinie 23.59 w dniu 31 grudnia.<\/span><\/li><li style=\"list-style-type: none;\"><\/li><\/ul>\n\n\n\n<p><span>\u017beby prawid\u0142owo wyznaczy\u0107 termin uruchomienia crona, warto skorzysta\u0107 chocia\u017cby z <\/span><a href=\"https:\/\/crontab.guru\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><span>crontab.guru<\/span><\/a><span> \u2013 edytora harmonogramu crona online.<\/span><\/p>\n\n\n\n<h3 id=\"h-nie-tylko-kopia-zapasowa-do-czego-jeszcze-mo-na-u-y-crona\"><span>Nie tylko kopia zapasowa \u2013 do czego jeszcze mo\u017cna u\u017cy\u0107 crona?<\/span><\/h3>\n\n\n\n<p><span>Cron nie jest dedykowany jedynie do robienia kopii zapasowej. Z jego pomoc\u0105 mo\u017cna zautomatyzowa\u0107 wiele dzia\u0142a\u0144 \u2013 m.in. prowadzi\u0107 monitoring log\u00f3w, generowa\u0107 raporty czy przesy\u0142a\u0107 newslettery. Wszystko zale\u017cy od tego, jaki skrypt przygotujemy.<\/span><\/p>\n\n\n\n<p><span>Crona mo\u017cna \u201czatrudni\u0107\u201d mi\u0119dzy innymi do:<\/span><\/p>\n\n\n\n<ul><li><span>monitorowania przestrzeni na dysku,<\/span><\/li><li><span>prowadzenia analizy log\u00f3w,<\/span><\/li><li><span>cyklicznej zmiany adresu IP,<\/span><\/li><li><span>czyszczenia bazy danych,<\/span><\/li><li><span>aktualizacji raport\u00f3w, wykres\u00f3w czy dashboard\u00f3w o nowe dane,<\/span><\/li><li><span>od\u015bwie\u017canie listy produkt\u00f3w w <a href=\"https:\/\/fotc.com\/pl\/blog\/sklep-internetowy-czy-warto\/\">sklepie internetowym<\/a>,<\/span><\/li><li><span>wy\u0142\u0105czanie maszyn wirtualnych ze \u015brodowiskami developerskimi i testowymi po godzinach pracy,<\/span><\/li><li><span>agregowanie na skrzynk\u0119 nowych artyku\u0142\u00f3w opublikowanych na portalu Hacker Noon z tagiem <\/span><i><span>#security<\/span><\/i><span>,<\/span><\/li><li><span>przesy\u0142anie wsp\u00f3\u0142pracownikom raz w roku mailowego \u017cyczenia \u201csmacznego\u201d w Dzie\u0144 Pizzy.<\/span><\/li><\/ul>\n\n\n\n<h2 id=\"h-program-do-backupu-w-node-js-z-u-yciem-crona-tutorial\"><span>Program do backupu w Node.js z u\u017cyciem crona \u2013 tutorial<\/span><\/h2>\n\n\n\n<h3 id=\"h-wymagania-pocz-tkowe\"><span>Wymagania pocz\u0105tkowe<\/span><\/h3>\n\n\n\n<ul><li><span>system operacyjny z rodziny Unix,<\/span><\/li><li><span>baza danych MySQL,<\/span><\/li><li><span>korzystanie z us\u0142ugi Cloud Storage na <a href=\"https:\/\/fotc.com\/pl\/google-cloud-platform\/\">Google Cloud Platform<\/a>,<\/span><\/li><li><span>znajomo\u015b\u0107 Node.js.<\/span><\/li><\/ul>\n\n\n\n<p><span><strong>W tutorialu u\u017cywamy Node.js w wersji 13.12.0 i npm w 6.14.8<\/strong>.<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/fotc.com\/app\/uploads\/2021\/08\/image1-2.png\" alt=\"program do backupu w Node.js tutorial\" class=\"wp-image-53205\"\/><\/figure>\n\n\n\n<h3 id=\"h-inicjalizacja-projektu\"><span>Inicjalizacja projektu<\/span><\/h3>\n\n\n\n<p><span>Zaczniemy od stworzenia skryptu, kt\u00f3ry b\u0119dzie tworzy\u0142 backup bazy danych.<\/span><\/p>\n\n\n\n<p><span>Tworzymy nowy folder i rozpoczynamy od zainicjowania projektu poprzez wpisanie komendy:<\/span><\/p>\n\n\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">npm init -y<\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/fotc.com\/app\/uploads\/2021\/08\/image7-1.png\" alt=\"zainicjowanie projektu w pow\u0142oce\" class=\"wp-image-53247\"\/><\/figure>\n\n\n\n<h3 id=\"h-skrypt-wykonuj-cy-backup-bazy-danych\"><span>Skrypt wykonuj\u0105cy backup bazy danych<\/span><\/h3>\n\n\n\n<p><span>B\u0119dziemy u\u017cywa\u0107 biblioteki <\/span><b>mysqldump<\/b><span> (<\/span><a href=\"https:\/\/www.npmjs.com\/package\/mysqldump\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><span>wi\u0119cej informacji o paczce<\/span><\/a><span>).<\/span><\/p>\n\n\n\n<p><span>Instalujemy paczk\u0119, wpisuj\u0105c komend\u0119:<\/span><\/p>\n\n\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">npm install mysqldump<\/pre>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/fotc.com\/app\/uploads\/2021\/08\/image8-2.png\" alt=\"instalacja paczki mysqldump\" class=\"wp-image-53254\"\/><\/figure>\n\n\n\n<p><span>Tworzymy plik o nazwie <\/span><b>index.js<\/b><span> i dodajemy w nim kod, kt\u00f3ry b\u0119dzie odpowiada\u0142 za stworzenie kopii zapasowej bazy danych:<\/span><\/p>\n\n\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\nconst mysqldump = require('mysqldump')\nconst dumpFileName = `${new Date(Date.now()).toISOString()}.dump.sql`\n\nconst createBackup = async () = {\n\nconst connection = {\nhost: 'localhost',\nuser: 'root',\npassword: 'password',\ndatabase: 'employees',\n}\n\ntry {\nawait mysqldump({\nconnection,\ndumpToFile: dumpFileName\n});\n} catch(error) {\nconsole.error(error)\n}\n}\n\ncreateBackup()\n<\/pre>\n\n\n\n<p><span>W kodzie wy\u017cej, w sekcji <\/span><b>connection<\/b><span>,<\/span> <span>wprowad\u017a informacje o swojej bazie danych (<\/span><i><span>host<\/span><\/i><span>, <\/span><i><span>user<\/span><\/i><span>, <\/span><i><span>password<\/span><\/i><span>, <\/span><i><span>database<\/span><\/i><span>).<\/span><\/p>\n\n\n\n<p><span>\u017beby sprawdzi\u0107, czy kod dzia\u0142a, wpisujemy:<\/span><\/p>\n\n\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">node index.js<\/pre>\n\n\n\n<p><span>Po pomy\u015blnej konfiguracji w folderze zostanie utworzony plik z danymi. W nazwie pliku powinna znale\u017a\u0107 si\u0119 data utworzenia.<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/fotc.com\/app\/uploads\/2021\/08\/image10-2.png\" alt=\"Widok folderu z backupem\" class=\"wp-image-53268\"\/><\/figure>\n\n\n\n<h3 id=\"h-po-czenie-z-google-cloud-storage\"><span>Po\u0142\u0105czenie z Google Cloud Storage<\/span><\/h3>\n\n\n\n<p><span>W <\/span><a href=\"https:\/\/console.cloud.google.com\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><span>konsoli Google Cloud Platform<\/span><\/a><span> tworzymy service account, czyli konto us\u0142ugi. Mo\u017cesz zrobi\u0107 to w zak\u0142adce<\/span><b> IAM &amp; Admin &gt; Service Accounts <\/b><span>lub <\/span><b>Identity &gt; Service Accounts<\/b><span> (to ten sam panel, z&nbsp; tymi samymi funkcjonalno\u015bciami; Google wprowadza obecnie lekkie zmiany w UI konsoli \u2013 grudzie\u0144 2020).<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image alignnone wp-image-53226 size-full\"><img src=\"https:\/\/fotc.com\/app\/uploads\/2021\/08\/image4-e1608113396722.png\" alt=\"Wyb\u00f3r zak\u0142adki service accounts\" class=\"wp-image-53226\"\/><figcaption><span style=\"font-size: 10pt;\">IAM &amp; Admin &gt; Service Accounts&nbsp;(starszy widok)<\/span><\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image alignnone wp-image-53219 size-full\"><img src=\"https:\/\/fotc.com\/app\/uploads\/2021\/08\/image3-1.png\" alt=\"Wyb\u00f3r zak\u0142adki service accounts starszy widok\" class=\"wp-image-53219\"\/><figcaption><span style=\"font-size: 10pt;\">Identity &gt; Service Accounts (nowy widok)<\/span><\/figcaption><\/figure>\n\n\n\n<p><span>Nadajemy nowemu kontu us\u0142ugi uprawnienia do Cloud Storage (np. rol\u0119 Storage Object Creator).<\/span><\/p>\n\n\n\n<p><span>Na podstawie naszego service account tworzymy klucz w formacie JSON. Nazw\u0119 klucza zmieniamy na <\/span><b>gcs.json<\/b><span>.<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/fotc.com\/app\/uploads\/2021\/08\/image5-2.png\" alt=\"zmiana nazwy klucza \" class=\"wp-image-53233\"\/><\/figure>\n\n\n\n<p><span>Nast\u0119pnie tworzymy bucket (zasobnik) w us\u0142udze Cloud Storage.<\/span><\/p>\n\n\n\n<p><span>Mo\u017cna to zrobi\u0107 na dwa sposoby:<\/span><\/p>\n\n\n\n<ul><li><b>w Cloud Shellu<\/b><span> poprzez wpisanie komendy:<\/span><\/li><\/ul>\n\n\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">gsutil mb gs:\/\/nazwa-bucketu<\/pre>\n\n\n\n<ul><li><span>lub <\/span><b>w us\u0142udze Cloud Storage<\/b> <span>\u2013 <\/span>przechodzimy do zak\u0142adki <b style=\"font-size: 1rem;\">Storage <\/b><span>w menu po lewej i klikamy <\/span><b style=\"font-size: 1rem;\">create bucket:<\/b><\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/fotc.com\/app\/uploads\/2021\/08\/image15-1.png\" alt=\"Tworzenie bucketu w Cloud Storage\" class=\"wp-image-53296\"\/><\/figure>\n\n\n\n<p><span>Wpisujemy nazw\u0119 bucketu:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/fotc.com\/app\/uploads\/2021\/08\/image11-1.png\" alt=\"Deklarowanie nazwy bucketu\" class=\"wp-image-53275\"\/><\/figure>\n\n\n\n<p><span>Wybieramy region \u2013 najbli\u017cej Polski jest region europe-west3 (Frankfurt):<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/fotc.com\/app\/uploads\/2021\/08\/image12-1-1024x744.png\" alt=\"wyb\u00f3r regionu przechowywania danych\" class=\"wp-image-53282\"\/><\/figure>\n\n\n\n<p><span>Nast\u0119pnie instalujemy w terminalu paczk\u0119 do Node.js obs\u0142uguj\u0105c\u0105 Google Cloud Storage. Robimy to za pomoc\u0105 komendy:<\/span><\/p>\n\n\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">npm install google-cloud\/storage<\/pre>\n\n\n\n<p><span>Tworzymy nowy plik o nazwie <\/span><b>sendDataToBucket.js<\/b><span> i wklejamy poni\u017cszy kod:<\/span><\/p>\n\n\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\nconst { Storage } = require('@google-cloud\/storage');\nconst bucketName = 'cron-backup';\n\nconst sendDataToBucket = async (file) ={\ntry {\nconst storage = new Storage({\nprojectId: 'cron-backup',\nkeyFilename: '.\/gcs.json',\n});\n\nawait storage\n.bucket(bucketName)\n.upload(`${__dirname}\/${file}`, {\ngzip: true,\nmetadata: {\ncacheControl: 'public, max-age=31536000',\n},\n});\n\nawait storage.bucket(bucketName).file(`${__dirname}\/${file}`)\n} catch (error) {\nconsole.error(error);\n}\n};\n\nmodule.exports = sendDataToBucket;\n<\/pre>\n\n\n\n<p><span>Po uruchomieniu kodu komend\u0105 <\/span><b>node index.js <\/b><span>powinni\u015bmy w Cloud Storage otrzyma\u0107 nast\u0119puj\u0105cy widok:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/fotc.com\/app\/uploads\/2021\/08\/image6-1.png\" alt=\"widok listy bucket\u00f3w\" class=\"wp-image-53240\"\/><\/figure>\n\n\n\n<p><span>Dla czysto\u015bci kodu zmienimy nieco struktur\u0119 programu do backupu. Struktura powinna wygl\u0105da\u0107 nast\u0119puj\u0105co:<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/fotc.com\/app\/uploads\/2021\/08\/image2-1.png\" alt=\"Zmiana struktury u\u0142o\u017cenia plik\u00f3w\" class=\"wp-image-53212\"\/><\/figure>\n\n\n\n<p><span>Plik <\/span><b>createBackup.js<\/b><span> powinien zawiera\u0107: <\/span><\/p>\n\n\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\nconst mysqldump = require('mysqldump');\nconst dumpFileName = `${new Date(Date.now()).toISOString()}.dump.sql`;\n\nconst createBackup = async () = {\n\nconst connection = {\nhost: 'localhost',\nuser: 'root',\npassword: 'password',\ndatabase: 'employees',\n}\n\ntry {\nawait mysqldump({\nconnection,\ndumpToFile: dumpFileName\n});\n\nreturn dumpFileName\n} catch(error) {\nconsole.error(error)\n}\n}\n\nmodule.exports = createBackup\n\nPlik index.js:\n\nconst sendDataToBucket = require('.\/sendDataToBucket');\nconst createBackup = require('.\/createBackup')\n\nconst main = async () = {\nconst filename = await createBackup()\nconsole.log(filename)\nawait sendDataToBucket(filename)\n}\n\nmain()\n<\/pre>\n\n\n\n<p><span>Plik <\/span><b>sendDataToBucket.js<\/b><span> powinien zawiera\u0107 kod: <\/span><\/p>\n\n\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\nconst { Storage } = require('@google-cloud\/storage');\nconst bucketName = 'cron-backup';\n\nconst sendDataToBucket = async (file) = {\ntry {\n\nconst storage = new Storage({\nprojectId: 'cron-backup',\nkeyFilename: '.\/gcs.json',\n});\n\nawait storage\n.bucket(bucketName)\n.upload(`${__dirname}\/${file}`, {\ngzip: true,\nmetadata: {\ncacheControl: 'public, max-age=31536000',\n},\n});\n\nawait storage.bucket(bucketName).file(`${__dirname}\/${file}`)\n\n} catch (error) {\nconsole.error(error);\n}\n};\n\nmodule.exports = sendDataToBucket;\n\n<\/pre>\n\n\n\n<h3 id=\"h-stworzenie-crona-kt-ry-b-dzie-wywo-ywa-kod\"><span>Stworzenie crona, kt\u00f3ry b\u0119dzie wywo\u0142ywa\u0142 kod&nbsp;<\/span><\/h3>\n\n\n\n<p><span>Wpisujemy w terminalu: <strong>crontab -e<\/strong>.<\/span><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/fotc.com\/app\/uploads\/2021\/08\/image9-1.png\" alt=\"Stworzenie crona wywo\u0142uj\u0105cego kod\n\" class=\"wp-image-53261\"\/><\/figure>\n\n\n\n<p><span>Wybieramy <\/span><strong>1<\/strong><span>.<\/span><\/p>\n\n\n\n<p><span>Zostaniemy przeniesieni do pliku, gdzie zdefiniujemy <\/span><i><span>cron jobs<\/span><\/i><span>.<\/span><\/p>\n\n\n\n<p><strong><span>Za\u0142\u00f3\u017cmy, \u017ce chcemy odpali\u0107 program do backupu codziennie o godzinie 1.00 w nocy. Pierwsza cz\u0119\u015b\u0107 <\/span><i><span>cron job<\/span><\/i><span> to wyzwalacz, czyli termin wykonania zadania \u2013 <\/span><b>0 1 * * *<\/b><span> (przypomnijmy: minuta, godzina, dzie\u0144 miesi\u0105ca, miesi\u0105c, dzie\u0144 tygodnia). Druga cz\u0119\u015b\u0107 wskazuje \u015bcie\u017ck\u0119 do programu do backupu, czyli aplikacji w Node.js.<\/span><\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/fotc.com\/app\/uploads\/2021\/08\/image14-1.png\" alt=\"cron zdefiniowanie terminu wykonania zadania \" class=\"wp-image-53289\"\/><\/figure>\n\n\n\n<p>I to wszystko. Po zatwierdzeniu program do backupu b\u0119dzie dzia\u0142a\u0142, a kopia zapasowa b\u0119dzie wykonywana i zapisywana codziennie w Cloud Storage o godzinie 1.00 w nocy.<\/p>\n\n\n\n<p><span>Kod do aplikacji jest dost\u0119pny na GitLab: <\/span><a href=\"https:\/\/gitlab.com\/machmielewski\/node-mysql-to-gcs\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><span>gitlab.com\/machmielewski\/node-mysql-to-gcs<\/span><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Powiedzenie o dw\u00f3ch grupach ludzi i backupie jest tak powszechne, \u017ce chyba nie warto go po raz kolejny przytacza\u0107. Warto za to pokaza\u0107, jak niewielkim wysi\u0142kiem wykona\u0107 kopi\u0119 zapasow\u0105 \u2013 a najlepiej ustawi\u0107 regularne, automatyczne wykonanie backupu. Zaplanowanie wykonania kopii zapasowej wed\u0142ug ni\u017cszego tutorialu zajmie kilkana\u015bcie minut, a pozwoli zaoszcz\u0119dzi\u0107 godziny odzyskiwania danych lub tworzenia&#8230;<\/p>\n","protected":false},"author":13,"featured_media":5685,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_editorskit_title_hidden":false,"_editorskit_reading_time":7,"_editorskit_typography_data":[],"_editorskit_blocks_typography":"","_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}"},"categories":[560],"tags":[153,224,230,139],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v16.7 (Yoast SEO v19.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>W\u0142asny program do backupu bazy danych MySQL [Node.js, cron]<\/title>\n<meta name=\"description\" content=\"Zobacz, jak stworzy\u0107 program do wykonywania kopii zapasowej bazy danych MySQL w Node.js, z wykorzystaniem crona i zapisaniem kopii w Google Cloud Storage.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fotc.com\/pl\/blog\/program-do-backupu\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tworzenie w\u0142asnego programu do backupu bazy danych MySQL na GCP [Node.js + cron]\" \/>\n<meta property=\"og:description\" content=\"Zobacz, jak stworzy\u0107 program do wykonywania kopii zapasowej bazy danych MySQL w Node.js, z wykorzystaniem crona i zapisaniem kopii w Google Cloud Storage.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fotc.com\/pl\/blog\/program-do-backupu\/\" \/>\n<meta property=\"og:site_name\" content=\"FOTC\" \/>\n<meta property=\"article:published_time\" content=\"2020-12-16T09:34:05+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-11-27T08:53:50+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/fotc.com\/app\/uploads\/2021\/07\/Tworzenie-wlasnego-programu-do-backupu.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Ida O\u017carowska\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fotc.com\/pl\/blog\/program-do-backupu\/\",\"url\":\"https:\/\/fotc.com\/pl\/blog\/program-do-backupu\/\",\"name\":\"W\u0142asny program do backupu bazy danych MySQL [Node.js, cron]\",\"isPartOf\":{\"@id\":\"https:\/\/fotc.com\/#website\"},\"datePublished\":\"2020-12-16T09:34:05+00:00\",\"dateModified\":\"2023-11-27T08:53:50+00:00\",\"author\":{\"@id\":\"https:\/\/fotc.com\/#\/schema\/person\/84a7428ea802a35722a1839225ab0dfb\"},\"description\":\"Zobacz, jak stworzy\u0107 program do wykonywania kopii zapasowej bazy danych MySQL w Node.js, z wykorzystaniem crona i zapisaniem kopii w Google Cloud Storage.\",\"breadcrumb\":{\"@id\":\"https:\/\/fotc.com\/pl\/blog\/program-do-backupu\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fotc.com\/pl\/blog\/program-do-backupu\/\"]}],\"accessibilityFeature\":[\"tableOfContents\"]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fotc.com\/pl\/blog\/program-do-backupu\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"PL\",\"item\":\"https:\/\/fotc.com\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Google Cloud\",\"item\":\"https:\/\/fotc.com\/pl\/blog\/category\/google-cloud-platform-pl\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Tworzenie w\u0142asnego programu do backupu bazy danych MySQL na GCP [Node.js + cron]\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fotc.com\/#website\",\"url\":\"https:\/\/fotc.com\/\",\"name\":\"FOTC\",\"description\":\"Partner Google Cloud\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fotc.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/fotc.com\/#\/schema\/person\/84a7428ea802a35722a1839225ab0dfb\",\"name\":\"Ida O\u017carowska\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/fotc.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e05ba028ea67bd9a1d51e046729088a9?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e05ba028ea67bd9a1d51e046729088a9?s=96&d=mm&r=g\",\"caption\":\"Ida O\u017carowska\"},\"description\":\"Ida has a Master's Degree in Communication Management from the University of Wroc\u0142aw. For over 7 years, she has been creating content that connects the worlds of technology and business. At FOTC, she is a Content Manager.\",\"url\":\"https:\/\/fotc.com\/pl\/blog\/author\/ida-ozarowska\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"W\u0142asny program do backupu bazy danych MySQL [Node.js, cron]","description":"Zobacz, jak stworzy\u0107 program do wykonywania kopii zapasowej bazy danych MySQL w Node.js, z wykorzystaniem crona i zapisaniem kopii w Google Cloud Storage.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fotc.com\/pl\/blog\/program-do-backupu\/","og_locale":"pl_PL","og_type":"article","og_title":"Tworzenie w\u0142asnego programu do backupu bazy danych MySQL na GCP [Node.js + cron]","og_description":"Zobacz, jak stworzy\u0107 program do wykonywania kopii zapasowej bazy danych MySQL w Node.js, z wykorzystaniem crona i zapisaniem kopii w Google Cloud Storage.","og_url":"https:\/\/fotc.com\/pl\/blog\/program-do-backupu\/","og_site_name":"FOTC","article_published_time":"2020-12-16T09:34:05+00:00","article_modified_time":"2023-11-27T08:53:50+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/fotc.com\/app\/uploads\/2021\/07\/Tworzenie-wlasnego-programu-do-backupu.png","type":"image\/png"}],"author":"Ida O\u017carowska","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/fotc.com\/pl\/blog\/program-do-backupu\/","url":"https:\/\/fotc.com\/pl\/blog\/program-do-backupu\/","name":"W\u0142asny program do backupu bazy danych MySQL [Node.js, cron]","isPartOf":{"@id":"https:\/\/fotc.com\/#website"},"datePublished":"2020-12-16T09:34:05+00:00","dateModified":"2023-11-27T08:53:50+00:00","author":{"@id":"https:\/\/fotc.com\/#\/schema\/person\/84a7428ea802a35722a1839225ab0dfb"},"description":"Zobacz, jak stworzy\u0107 program do wykonywania kopii zapasowej bazy danych MySQL w Node.js, z wykorzystaniem crona i zapisaniem kopii w Google Cloud Storage.","breadcrumb":{"@id":"https:\/\/fotc.com\/pl\/blog\/program-do-backupu\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fotc.com\/pl\/blog\/program-do-backupu\/"]}],"accessibilityFeature":["tableOfContents"]},{"@type":"BreadcrumbList","@id":"https:\/\/fotc.com\/pl\/blog\/program-do-backupu\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"PL","item":"https:\/\/fotc.com\/pl\/"},{"@type":"ListItem","position":2,"name":"Google Cloud","item":"https:\/\/fotc.com\/pl\/blog\/category\/google-cloud-platform-pl\/"},{"@type":"ListItem","position":3,"name":"Tworzenie w\u0142asnego programu do backupu bazy danych MySQL na GCP [Node.js + cron]"}]},{"@type":"WebSite","@id":"https:\/\/fotc.com\/#website","url":"https:\/\/fotc.com\/","name":"FOTC","description":"Partner Google Cloud","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fotc.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pl-PL"},{"@type":"Person","@id":"https:\/\/fotc.com\/#\/schema\/person\/84a7428ea802a35722a1839225ab0dfb","name":"Ida O\u017carowska","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/fotc.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e05ba028ea67bd9a1d51e046729088a9?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e05ba028ea67bd9a1d51e046729088a9?s=96&d=mm&r=g","caption":"Ida O\u017carowska"},"description":"Ida has a Master's Degree in Communication Management from the University of Wroc\u0142aw. For over 7 years, she has been creating content that connects the worlds of technology and business. At FOTC, she is a Content Manager.","url":"https:\/\/fotc.com\/pl\/blog\/author\/ida-ozarowska\/"}]}},"_links":{"self":[{"href":"https:\/\/fotc.com\/pl\/wp-json\/wp\/v2\/posts\/31287"}],"collection":[{"href":"https:\/\/fotc.com\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fotc.com\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fotc.com\/pl\/wp-json\/wp\/v2\/users\/13"}],"replies":[{"embeddable":true,"href":"https:\/\/fotc.com\/pl\/wp-json\/wp\/v2\/comments?post=31287"}],"version-history":[{"count":0,"href":"https:\/\/fotc.com\/pl\/wp-json\/wp\/v2\/posts\/31287\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fotc.com\/pl\/wp-json\/wp\/v2\/media\/5685"}],"wp:attachment":[{"href":"https:\/\/fotc.com\/pl\/wp-json\/wp\/v2\/media?parent=31287"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fotc.com\/pl\/wp-json\/wp\/v2\/categories?post=31287"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fotc.com\/pl\/wp-json\/wp\/v2\/tags?post=31287"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}