Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ
  • në shtëpi
  • Windows 8
  • Rezervoni duke përdorur skriptet. Shembull i skriptit për krijimin e një kopje rezervë të MySQL

Rezervoni duke përdorur skriptet. Shembull i skriptit për krijimin e një kopje rezervë të MySQL

Parathënie

Ideja e krijimit të një skripti që mund të bëjë një kopje rezervë të një siti (të gjithë skedarët + depozitimi i bazës së të dhënave) me disa klikime u shfaq ndërsa isha duke punuar në disa projekte dhe isha duke u zhvilluar dhe testuar në server lokal në internet. Edhe atëherë, unë kisha Denverin, i cili me kalimin e kohës u zëvendësua nga një kombinim lokal i shërbimeve në internet që po zhvillohej më shpejt - OpenServer.

Projektet u vizituan, kështu që fillimisht u bë një kopje lokale e të gjithë faqes, dhe vetëm pas kësaj u bë e mundur të punohej dhe eksperimentohej me të, duke shmangur ndërprerjet në punën e projektit të drejtpërdrejtë. Bëra një kopje rezervë si kjo: u identifikova përmes SSH dhe paketova dosjen e projektit me arkivuesin 7Zip ose TGZ, bëra një hale duke përdorur mysqldump dhe shkarkova të gjitha këto gjëra përmes ueb-it ose SCP/WinSCP.

Menjëherë përtacia u ndie dhe lindi mendimi i automatizimit: "do të ishte mirë nëse gjithçka që shkruaj në tastierë do të bëhej automatikisht për çdo sajt dhe do të kërkoheshin vetëm disa klikime nga unë." Kërkimi im i parë për një zgjidhje automatizimi SSH për Windows më çoi menjëherë te një mjet që kam përdorur për një kohë të gjatë për të punuar me skedarë në serverë - .

Si funksionon skripti rezervë

Pra, thelbi i skriptit të automatizuar rezervë është si më poshtë:

  1. Lexojmë të dhënat nga skedari ini, ku ruajmë cilësimet për faqen (emri, login, fjalëkalimi, llogaria mysql...);
  2. Bazuar në të dhënat, ne gjenerojmë një skript për WinSCP, i cili do të kryejë të gjitha operacionet e nevojshme në konsolën në server;
  3. Ne lëshojmë programin WinSCP, i cili regjistrohet në server dhe bën një kopje rezervë të sitit + bazën e të dhënave, dhe gjithashtu arkivon të gjitha të dhënat duke përdorur një arkivues me një raport të lartë kompresimi - 7Zip ose TAR + GZip;
  4. Shkarkoni arkivin;
  5. Mbyllni WinSCP dhe pastroni regjistrat + fshini skriptin e krijuar përkohësisht për WinSCP me komanda;
  6. Gati! Keni nevojë për një kopje të një faqeje tjetër? - SHKO 1!

Mund të ketë më shumë se një sajt, kështu që është e mundur të përdoren skedarë të shumtë ini me cilësime të veçanta për secilin sajt.

Të gjitha operacionet e përpunimit dhe menaxhimit të WinSCP do të kryhen nga skripti. shkruar në gjuhën e skriptimit të skedarëve bat për Windows. Ai gjithashtu ofron një ndërfaqe të thjeshtë konsole që ju lejon të kryeni të gjitha operacionet e nevojshme.

Për këtë detyrë, bazuar në thjeshtësinë e saj, gjuha e skriptimit të skedarëve bat është mjaft e mjaftueshme, por megjithatë askush nuk shqetësohet ta zbatojë këtë sistem në Autoit ose në një nga gjuhët e programimit. nivel të lartë, si C#, Delphi, etj.

Kujdes! Skripti është i rëndësishëm vetëm nëse keni akses në tastierën e serverit nëpërmjet SSH.

Ndërfaqja dhe menyja rezervë

Pas ekzekutimit të skriptit, ne kemi qasje në një menu të thjeshtë:

Artikulli i parë (shtypni 1 dhe enter) është përgjegjës për procesin e rezervimit dhe shfaq një listë të skedarëve të disponueshëm të konfigurimit të shablloneve për sajtet.

Pika e dytë është krijimi i një shablloni të skedarit të konfigurimit dhe hapja e tij për redaktim.

Pika e tretë është një udhëzues i shkurtër për të shkruar skedarë shabllonesh.

Në figurën më poshtë, hapet një menu me një përzgjedhje të vendeve të disponueshme për rezervim:

Këtu nën-artiku "0. Të gjitha faqet e listuara më poshtë" është përgjegjës për fillimin e një kopje rezervë të të gjitha sajteve me skedarët e konfigurimit të listuar më poshtë. Kështu që ju mund të bëni kopje rezervë të një sajti ose të të gjithave në të njëjtën kohë.

Shembull i skedarit të konfigurimit për një skript

Këtu është një shembull i skedarit të konfigurimit somesite.com.ini për rezervimin e somesite.com:

Sitename_string=somesite_com store_path=D:\Backup\ archive_method=7z archive_password=StrOngp@sswOrd emri i hostit=000.111.222.333 ssh_user=root ssh_password=p@ssmetothe_password=p@ssmetothe_password=p@ssmetothe-password=p@ssmetotheserver_Busersql mysq1 jMmxWgQHh d185g mysql_db_name=site1_db dirs_to_backup=/var/www/somesite. com /www/* /var/www/somesite.com/www/.htaccess

Siç mund ta shihni, gjithçka është e thjeshtë dhe asgjë e tepërt. Unë do t'ju tregoj në detaje për secilën linjë të cilësimeve:

emri i faqes_string - cakto një emër të qartë për sitin (vetëm latinisht dhe simbolin _).

shtegu i dyqanit - rruga drejt kompjuter lokal, ku do të shkarkohet arkivi rezervë.

archive_method - metodë për arkivimin e skedarëve të faqes.

  • 7z - do të përdoret arkivuesi me të njëjtin emër, dalja do të jetë një arkiv me shtrirjen "zip".
  • gz - arkivimi duke përdorur TAR+GZip, dalja do të jetë një arkiv me shtesën "tgz" .

archive_password - fjalëkalimi i arkivit, funksionon vetëm kur archive_method=7z.

emri i hostit - adresa IP e jashtme ose domeni i serverit në të cilin strehohet uebfaqja dhe baza e të dhënave.

ssh_user - emri i përdoruesit për t'u lidhur përmes SSH. Në shumicën e rasteve, ju nevojitet root për të kryer të gjitha operacionet, megjithëse mund të provoni ta konfiguroni për një përdorues tjetër të paprivilegjuar.

ssh_password!! - fjalëkalim për përdoruesin e mësipërm.

mysql_user * - emri i përdoruesit për t'u lidhur me bazën e të dhënave të faqes në serverin MySQL.

mysql_password - fjalëkalim për përdoruesin e mësipërm të MySQL. Duhet të instalohet!

mysql_db_name - emri i bazës së të dhënave të faqes për të cilën do të bëjmë një hale të plotë.

dirs_to_backup ** - shkruani një listë të ndarë me hapësirë ​​të shtigjeve, drejtorive dhe skedarëve të plotë që duhet të arkivohen.

Shënime:

Nëse e lini vlerën bosh, fjalëkalimi do të kërkohet më vonë në modalitetin interaktiv (unë rekomandoj të mos e ruani fjalëkalimin).

* Supozohet se skriptet dhe baza e të dhënave Të dhënat e MySQL të pritur në të njëjtin server. Kjo do të thotë, adresa e serverit MySQL është 127.0.0.1 (localhost).

** Si parazgjedhje, arkivuesit nuk i paketojnë skedarët .htaccess, kështu që ju duhet të specifikoni gjithashtu rrugën e plotë drejt tyre!

** Sigurohuni që të tregoni të plotë dhe jo rrugët relative te dosjet ose skedarët.

Ju mund të krijoni skedarë konfigurimi sa të doni; kur të ekzekutoni skriptin, emri i secilit do të shfaqet me një numër të caktuar. Për të filluar punën, duhet të vendosni numrin (numrin) e konfigurimit dhe kjo është ajo (nëse keni strehë nuk specifikoni një fjalëkalim, pastaj vendosni një fjalëkalim tjetër).

Përgatitja për punë dhe përdorimi i skenarit

Gjithçka është shumë e thjeshtë!

Hapi i parë është të vendosim se ku do ta ruajmë skriptin me të gjitha konfigurimet e tij. Unë rekomandoj të mos ruani programe dhe të dhëna të tilla makinë lokale V formë e hapur, sepse nuk është i sigurt, veçanërisht nëse në konfigurime ruhen fjalëkalimet për qasjen rrënjësore në serverë. Kompleksi mund të ruhet diku në një medium të koduar ose diku ku ka viruse ose të huajt. Për sa i përket sigurisë, zgjedhja është e juaja, le të vazhdojmë.

Le të vendoset i gjithë kompleksi përgjatë shtegut:

  • D:\Backup\ - arkivat rezervë do të ngarkohen këtu.
  • D:\Backup\script\ - skripti ynë dhe programi WinSCP do të vendosen këtu.

1) Shkarkoni versionin më të fundit të konfiguruar dhe portativ të programit WinSCP nga faqja e internetit PortableApps - WinSCP Portable. Ne e instalojmë programin në dosjen D:\Backup\script\ - dosja WinSCPPportable do të krijohet atje dhe do të ketë një skedar WinSCPPortable.exe në të.

2) Shkarkoni arkivin me skriptin dhe shabllonet këtu - backup_sites_v1.2 dhe shpaketoni atë në dosjen D:\Backup\script\.

3) Hapni skedarin backup_sites_v1.2.bat për redaktim dhe modifikoni shtigjet në seksionin "konfigurimi WinSCP":

  • "D:\Backup\script\WinSCPPortable\WinSCPPortable.exe" - rruga për në programin WinSCP Portable;
  • "D:\Backup\script\WinSCPPportable\Data\settings\winscp.log" - rruga ku krijohet skedari i regjistrit të programit WinSCP Portable.

Sigurohemi që shtigjet e shkruara në skript të korrespondojnë me ato ku ndodhet programi WinSCP, përndryshe thjesht nuk do të fillojë.

4) Ne krijojmë skedarë shabllonesh për kopje rezervë të faqes në internet. Ka disa prej tyre në arkiv - riemëroni ato sipas emrave të domeneve të faqeve tuaja dhe fshini ato të panevojshme.

Krijo shabllon i ri faqe interneti për skenarin në mënyrat e mëposhtme:

  1. Thjesht kopjoni skedarin INI, duke e riemërtuar atë në emrin e duhur, dhe më pas ne redaktojmë cilësimet në të;
  2. Ne gjenerojmë shabllonin duke përdorur një skript. Ekzekutoni skriptin, shtypni 2 dhe futni emrin e domenit ose emrin e faqes (vetëm karaktere latine dhe simbolin _). Një bllok shënimesh do të hapet me skedarin e krijuar rishtazi; pasi të bëni ndryshime, ruajeni dhe mbylleni.

Cili opsion është më i përshtatshëm - zgjidhni vetë.

5) Gjithçka është gati, mund të ekzekutoni skriptin dhe të përpiqeni të bëni një kopje rezervë të një prej faqeve tuaja.

Pas konfirmimit të zgjedhjes së një siti për kopje rezervë, mund t'ju kërkohet fjalëkalimi i përdoruesit SSH nëse nuk është specifikuar në skedari i konfigurimit. Menjëherë do të hapet një dritare me një regjistër të programit WinSCP, i cili do të shfaqë ecurinë e veprimeve në server, si dhe përparimin e shkarkimit të arkivit të përfunduar nga serveri.

Kur WinSCP përfundon shkarkimin e arkivit, dritarja do të mbyllet; për të përfunduar skriptin, thjesht shtypni çdo çelës në dritare.

Rreth sigurisë së të dhënave

Skripti gjatë funksionimit të tij gjeneron skedar i përkohshëm".tmp" me një grup komandash për WinSCP. Ky skedar përmban hyrjen dhe fjalëkalimin për të hyrë në server nëpërmjet SSH.

Modelet INI me cilësimet e faqes përmbajnë gjithashtu informacione të rëndësishme - këto janë parametra të hyrjes në bazën e të dhënave.

Unë me forcë NUK rekomandoj ruajtjen e këtij skripti dhe skedarët e cilësimeve në disqe që mund të aksesohen drejtpërdrejt në çdo kohë pas nisjes dhe manipulimeve të thjeshta me kompjuterin. Për ruajtje, mund të krijoni një disk të koduar ose të blini media të veçanta.

Ky skenar është vetëm një mjet që kursen kohë në kryerjen e veprimeve rutinë dhe të ngjashme. Merrni kohë dhe shqetësohuni për sigurinë dhe sigurinë e të dhënave tuaja!

E gjithë përgjegjësia për përdorimin e këtij skenari bie mbi ju, jini jashtëzakonisht të kujdesshëm!

konkluzioni

Skripti mund të rregullohet dhe modifikohet në mënyrë që të bëhet më funksional dhe të kryejë veprimet që ju nevojiten në sajtet tuaja.

Gjithashtu këtë metodë Automatizimi WinSCP mund të përdoret për të ndërtuar skripta të tjerë që do të kryejnë detyra të ndryshme në serverin tuaj VPS ose të Dedikuar përmes tastierës.

Ka shumë metoda rezervë, por për mua personalisht ato kanë të metat e tyre, kjo është arsyeja pse unë nuk i përdor ato. Është më e lehtë të shkruash disa skripta të thjeshtë, për shembull, duke përdorur të ashtuquajturin pseudonim shkopi ose PowerShell. Në këtë artikull do t'ju tregoj se si mund të krijoni kopje rezervë duke përdorur skriptet, unë i kombinoj ato dhe krijoj paketa.

Skema rezervë

Në shumicën e rasteve, rezervimi zbret në ruajtjen e skedarëve të caktuar. Mund të jenë imazhe makina virtuale, skedarët e përdoruesit, kopje rezervë Bazat e të dhënave SQL, shkarkimi i bazës së informacionit 1C: Enterprise, etj. Është më e saktë të ruash të gjitha këto kopje rezervë të skedarëve në një vendndodhje tjetër, kjo mund të jetë një dosje rrjeti, një disk i jashtëm, makinë kasetë, ftp, etj. Për lehtësi, unë përdor një server ftp.

Le të shohim diagramin se si ndodh e gjithë kjo:

  1. Kopjoni ose zhvendosini ato në një dosje për t'i dërguar në arkiv
  2. Kontrolloni dosjen për kopje rezervë të reja
  3. Ne dërgojmë skedarë në arkiv në Server FTP
  4. Fshirja e skedarëve të vjetër rezervë

Në hapin e parë, ne krijuam skedarët që duhet të kopjojmë në serverin tonë FTP. Tani duhet t'i kopjojmë ato në një dosje, të cilën nga ana tjetër do ta dërgojmë në FTP. Për ta bërë këtë, mund të përdorni një komandë të thjeshtë:

Kopjo "PATH_TO_SOURCE_FOLDER\* C:\Backup\

Duke ekzekutuar këtë komandë, të gjithë skedarët tanë do të kopjohen në C:\Backup\. Plotësoni këtë komandë Ka kuptim nëse mbledhni kopje rezervë nga vende të ndryshme. Tani na duhet një skript që do të kontrollojë dosjen për skedarë të rinj dhe do t'i dërgojë ato në serverin FTP. Krijo skedar bosh backup.ps1 dhe shkruani skriptin e mëposhtëm në të.

$a = (Get-Host).UI.RawUI $a.WindowTitle = "Sinkronizoni dosjen me Ftp" $ftp = "ftp://АДРЕС_FTP_СЕРВЕРА/" $localDirectory = "C:\Backup" $user = "ИМЯ_ПОЛЬЗОВАТЕЛЯ" $pass = "ПАРОЛЬ" $webclient = New-Object System.Net.WebClient $webclient.Credentials = New-Object System.Net.NetworkCredential($user,$pass) $Files = Get-ChildItem $localDirectory | Where {$_.LastWriteTime -gt (Get-Date).AddDays(-1)} foreach ($File in $Files) { $LocalFile = $File.FullName Write-Host "Getting $File from $localDirectory" -Foreground "Red" $webclient.UploadFile($ftp + $File, $LocalFile) Write-Host "Puting $File to $ftp" -Foreground "Yellow" } Write-Host "Finished Sync to $ftp" -Foreground "Green" !}

Le të shohim se si funksionon ky skenar. Së pari, vendosen variablat që tregojnë serverin, emrin e përdoruesit, fjalëkalimin dhe dosjen burimore. Pastaj në rreshtin $Files = Get-ChildItem $localDirectory | Ku ($_.LastWriteTime -gt (Get-Date).AddDays(-1)) zgjedh të gjithë skedarët, data e modifikimit të të cilëve është më e madhe (-qt) se data aktuale minus 1 ditë. Këtu mund ta rregulloni atë për t'iu përshtatur orarit tuaj. Unë bëj kopje rezervë çdo ditë. Më pas në një cikli kalojmë çdo skedar që plotëson kushtet dhe e dërgojmë në serverin FTP.

Për të mos zënë hapësirë ​​në disk, fshij kopjet rezervë më të vjetra se 30 ditë. Në parim, pasi t'i dërgoni në FTP, mund t'i fshini menjëherë, i lë vetëm që nëse ju nevojiten papritur, të mos humbas kohë duke i shkarkuar nga FTP dhe një kopje shtesë e kopjeve rezervë nuk do të dëmtonte. , kurrë nuk e dini se çfarë mund të ndodhë me FTP, kështu që nëse hapësira juaj e lejon, unë rekomandoj t'i ruani ato edhe në serverin origjinal.

Për të pastruar dosjen përdor skriptin removeOldBackups.ps1

$fullTargetPath = "C:\Backup" $deleteFiles = Get-Childitem $fullTargetPath -Recurse | Ku ($_.LastWriteTime -lt (Get-Date).AddDays(-30)) | Foreach ( Remove-Item $_.FullName -Force -Recurse)

Një skenar jashtëzakonisht i thjeshtë, do të shpjegoj vetëm një rresht Where ($_.LastWriteTime -lt (Get-Date).AddDays(-30)) | Ky rresht krahason datën e modifikimit të skedarit me datën aktuale minus 30 ditë; ky krahasim do të përfshijë skedarë LastWriteTime i të cilëve është më i vogël se data aktuale minus 30 ditë. Nëse është e nevojshme, mund ta rregulloni sipas nevojave tuaja.

Rezervoni informacione të rëndësishme - të gjithë Administratori i sistemit përballet me këtë sfidë. Detyra do të dukej e parëndësishme dhe nuk do të zgjojë interes tek shumë lexues. Por, për shembull, një artikull i tillë do të më ndihmonte shumë në një moment të caktuar, ndaj mendoj se ky artikull duhet të ekzistojë.

Detyra: Rezervimi i të dhënave në një drejtori lokale dhe në një server të veçantë, duke përdorur një minimum softuerësh të palëve të treta, duke regjistruar dhe njoftuar administratorin në Jabber në rast të dështimeve. Të gjitha funksionet themelore të shumicës së softuerit automatik të rezervimit, por pa e instaluar atë, dhe për këtë arsye pa gabimet e tij (të cilat, në fakt, çuan në këtë ide).

Tani le të zbresim në biznes.

Së pari, le të krijojmë dhe hapim një skenar
nano-skript rezervë
Tani le të shtojmë rreshtin në skenar
#!/bin/bash
Le të deklarojmë disa variabla.
TN - TASKNAME - emri i detyrës Përdoret për të nxjerrë në regjistër dhe për të përcaktuar emrin e skedarit.
Meqenëse ka disa detyra (mujore, javore, ditore) dhe isha shumë dembel për të shkruar një skenar për secilin rast, krijova një universale në të cilën thjesht duhet të hiqni komentet e rreshtave të nevojshëm. Emrat e detyrave duhet të shkruhen pa hapësira, mundësisht në latinisht, nëse nuk dëshironi probleme me kodimin dhe parametrat e gabuar të komandës.
TN=docs-mujore
#TN=docs-javore
#TN=docs-ditore
OF - Skedari i daljes - emri i skedarit dalës. Marrë nga ndryshorja TN, domethënë emri i punës.
OF=$TN.tar.gz
Ne deklarojmë një variabël me rrugën drejt skedarit të regjistrit dhe më pas të gjitha mesazhet e gabimit dhe gjërat e tjera do të dalin në regjistër.
LOGFILE=/var/log/backup.log
Le të bëjmë një hyrje në regjistër për fillimin e kopjimit (data, ora, emri i detyrës)
jehonë >>$LOGFILE jehonë "========================================== ============== ==========" >>$LOGFILE echo "$(data +"%d-%b-%Y %R")" > >$LOGFILE echo "Detyra \"$TN\" ka filluar. .." >>$LOGFILE
Ekziston një problem që nëse specifikoni emrat e drejtorive me hapësira në parametrat e komandës (p.sh. tar), skripti do të dështojë. Zgjidhja u gjet në internet - salla e operacionit sistemi linux përdor hapësirën si ndarës standard i parametrave të komandës. Le të ripërcaktojmë ndarësin standard (të ruajtur në variablin $IFS) si diçka tjetër përveç hapësirës, ​​për shembull \n si një ndërprerje rreshti.
Mos harroni vlerën e vjetër të ndarësit standard
VJETËR_IFS=$IFS
Zëvendësoni ndarësin standard me tuajin
IFS=$"\n"
SRCD - Drejtoria e Burimeve - drejtori me të dhëna rezervë
Tani mund të rendisni disa drejtori, ndarësi do të jetë ndërprerje e linjës, siç treguam ne vetë në rreshtin e mësipërm
SRCD="/mnt/source/folder_1 /mnt/source/folder_2 /mnt/source/folder_N"
TGTD - Drejtoria TarGeT - drejtoria në të cilën do të ruhen kopjet rezervë
TGTD="/var/backups/"
Natyrisht, ne e kuptojmë se ruajtja e kopjeve rezervë të rëndësishme vetëm në burim është të paktën joserioze. Prandaj, ne do të lëmë një kopje në burimin në distancë, të cilin do ta montojmë veçmas duke përdorur montimin dhe fstab. Do të shpjegoj menjëherë pse përdora montimin dhe fstab, dhe jo vetëm montimin - e montoj këtë drejtori në skriptet e mia të tjera dhe siç tha një nga miqtë e mi programues - programues i mirë nuk do të shkruaj të njëjtin kod dy herë (në një farë mënyre, nuk e mbaj mend fjalë për fjalë, por shpresoj se e kam kuptuar kuptimin).
TGTD2="/mnt/archive/"
Vetë procesi i arkivimit në opsionin "Krijo". arkiv i ri"
tar -czf $TGTD$OF $SRCD &>>$LOGFILE
dhe në opsionin "Përditëso skedarët në arkivin e vjetër"
tar -u -f $TGTD$OF $SRCD &>>$LOGFILE
Në rastin e dytë, është më mirë të përdorni një emër skedari specifik në vend të $OF sepse, për shembull, arkivi im javor përditësohet çdo ditë dhe $TN (emrat e detyrave) të tyre nuk përputhen, dhe për këtë arsye $OF.

Në ndryshoren "?" Statusi i ekzekutimit të komandës së fundit është shkatërruar. Le ta ruajmë për ta përdorur më vonë.
STATUSI=$?
Kthimi i ndarësit standard në vlerën e tij origjinale
IFS=$OLD_IFS
Tani le të shtojmë një kusht - nëse procesi i paketimit është në arkivi i katranit përfundoi me një gabim, dërgoni një mesazh te administratori, fshini skedarin rezervë të pasuksesshëm. Përndryshe, ne vazhdojmë më tej - ne montojmë një ndarje rrjeti dhe hedhim një kopje të arkivit në të. Pas çdo operacioni, ne kontrollojmë rezultatin e ekzekutimit, shkruajmë regjistrat dhe ose vazhdojmë ose njoftojmë administratorin dhe ndërpresim procedurën.
nëse [[ $STATUS != 0 ]]; pastaj rm $TGTD$OF &>>$LOGFILE echo "##################################################################################### ######" >>$LOGFILE echo "### Ndodhi një gabim! Rezervimi dështoi. ###" >>$LOGFILE echo "############### # ###########################" >>$LOGFILE echo "$(data +"%d-%b-%Y % R%nFile ") $OF rezervë nuk u krijua" | sendxmpp -t -f /usr/local/etc/XMPP_settings recipient_login@domain &>>$LOGFILE tjetër echo "Skedari rezervë u ruajt si \"$TGTD$OF\"" >>$LOGFILE echo "Rezervimi përfundoi me sukses në $(date +"%R %d-%b-%Y")!" >>$LOGFILE echo "Montimi i sistemit të skedarëve për arkivin rezervë $TGTD_archive" >>$LOGFILE montoni $TGTD2 &>>$LOGFILE nëse [[ $? != 0 ]]; pastaj jehona "##################################################################### ##############" >>$LOGFILE echo "### Ndodhi një gabim gjatë montimit të burimit rezervë ###" >>$LOGFILE echo "######## ## ################################################################# ## #" >>$LOGFILE echo "$(data +"%d-%b-%Y %R%nFile") e rezervës $OF nuk u kopjua në burimin rezervë" | sendxmpp -t -f /usr/local/etc/XMPP_settings recipient_login@domain &>>$LOGFILE dalje fi echo "Kopjimi i skedarit në burimin rezervë filloi" >>$LOGFILE cp -f $TGTD$OF $TGTD_archive$OF &>> $LOGFILE nëse [[ $? != 0 ]]; pastaj jehona "##################################################################### ##############" >>$LOGFILE echo "### Ndodhi një gabim gjatë kopjimit në burimin rezervë ###" >>$LOGFILE echo "####### ## ################################################################# ## ##" >>$LOGFILE jehonë "$(data +"%d-%b-%Y %R%nFile") e rezervës $OF nuk është kopjuar në burimin rezervë" | sendxmpp -t -f /usr/local/etc/XMPP_settings recipient_login@domain &>>$LOGFILE else echo "Kopjimi i skedarit përfundoi me sukses në $(date +"%R %d-%b-%Y")!" >>$LOGFILE echo "Skedari u kopjua si \"$TGTD_archive$OF\"" >>$LOGFILE fi echo "Çmontimi i sistemit të skedarëve për arkivin rezervë $TGTD_archive" >>$LOGFILE shton $TGTD2 &>>$LOGFILE echo " Të gjitha operacionet përfunduan me sukses!” >>$LOGFILE fi dalje

Gjatë procesit, ne kopjojmë arkivin nga ruajtja lokale në atë të largët. Natyrisht, ne kontrollojmë që çdo operacion të ketë përfunduar me sukses dhe shkruajmë gjithçka në regjistrat.
Për të dërguar një mesazh te administratori, unë përdor një mesazh XMPP, pasi organizata ka një server Jabber dhe unë preferoj të marr mesazh i shpejtë për një dështim, në vend që të hyj në emailin tim, të shkruaj fjalëkalime, duke klikuar në lidhje dhe duke pritur që shfletuesi të më shfaqë gjithçka. Në çdo rast, askush nuk po ju ndalon të përdorni sendmail në vend të sendxmpp.
Skedari /usr/local/etc/XMPP_settings përmban sa vijon:

#sender_login@domain;jabber_server_IP:jabber_server_port sender_password login@domen;127.0.0.1:5222 fjalëkalim
skedar fstab një varg që përshkruan lidhjen me aksionet e Windows
//192.168.0.250/arhiv /mnt/archive cifs noauto,rw,iocharset=utf8,cp866,file_mod=0666,dir_mod=0777,noexec,_netdev,kredencialet=/root/.passwd_ory0_archive
Tani gjithçka që mbetet është të shtoni punën në cron. Kjo mund të bëhet duke përdorur skedarin /etc/crontab, por për shkak të zakonit tim GUI, të trashëguar nga Windows, unë përdor ndërfaqe në internet për raste të tilla. Komanda duhet të ekzekutohet me të drejta rrënjësore, që është, për shembull, sudo bash backup_script. Duke shtuar një komandë në cron, mund të përcaktoni se ajo do të ekzekutohet menjëherë si rrënjë

Gjatë diskutimeve u ngrit problemi i rritjes së trungjeve. Unë ndoqa rrugën më të thjeshtë (për mendimin tim): ne do të ruajmë vetëm N rreshtat e fundit të regjistrit, për shembull 300. Dy rreshta do t'i shtohen skriptit, në të cilat do të ruajmë 300 rreshtat e fundit të regjistrit në një skedar i përkohshëm, atëherë do ta fshijmë regjistrin me të
tail -n 300 $LOGFILE >/tmp/unique_fantastic_filename.tmp mv -f /tmp/unique_fantastic_filename.tmp $LOGFILE
Këtu është teksti i plotë i skenarit:
#!/bin/bash TN=docs-mujore #TN=docs-javore #TN=docs-ditore OF=$TN.tar.gz LOGFILE=/var/log/backup.log echo >>$LOGFILE echo "== ================================================== === =" >>$LOGFILE echo "$(date +"%d-%b-%Y %R")" >>$LOGFILE echo "Detyra \"$TN\" filloi..." >>$ LOGFILE OLD_IFS= $IFS IFS=$"\n" SRCD="/mnt/source/folder_1 /mnt/source/folder_2 /mnt/source/folder_N" TGTD="/var/backups/" TGTD2="/mnt/arkiv /" tar -czf $TGTD$OF $SRCD &>>$LOGFILE #tar -u -f $TGTD$OF $SRCD &>>$STATUSI I LOGFILE=$? IFS=$OLD_IFS nëse [[ $STATUS != 0 ]]; pastaj rm $TGTD$OF &>>$LOGFILE echo "##################################################################################### ######" >>$LOGFILE echo "### Ndodhi një gabim! Rezervimi dështoi. ###" >>$LOGFILE echo "############### # ###########################" >>$LOGFILE echo "$(data +"%d-%b-%Y % R%nFile ") $OF rezervë nuk u krijua" | sendxmpp -t -f /usr/local/etc/XMPP_settings recipient_login@domain &>>$LOGFILE tjetër echo "Skedari rezervë u ruajt si \"$TGTD$OF\"" >>$LOGFILE echo "Rezervimi përfundoi me sukses në $(date +"%R %d-%b-%Y")!" >>$LOGFILE echo "Montimi i sistemit të skedarëve për arkivin rezervë $TGTD_archive" >>$LOGFILE montoni $TGTD2 &>>$LOGFILE nëse [[ $? != 0 ]]; pastaj jehona "##################################################################### ##############" >>$LOGFILE echo "### Ndodhi një gabim gjatë montimit të burimit rezervë ###" >>$LOGFILE echo "######## ## ################################################################# ## #" >>$LOGFILE echo "$(data +"%d-%b-%Y %R%nFile") e rezervës $OF nuk u kopjua në burimin rezervë" | sendxmpp -t -f /usr/local/etc/XMPP_settings recipient_login@domain &>>$LOGFILE dalje fi echo "Kopjimi i skedarit në burimin rezervë filloi" >>$LOGFILE cp -f $TGTD$OF $TGTD_archive$OF &>> $LOGFILE nëse [[ $? != 0 ]]; pastaj jehona "##################################################################### ##############" >>$LOGFILE echo "### Ndodhi një gabim gjatë kopjimit në burimin rezervë ###" >>$LOGFILE echo "####### ## ################################################################# ## ##" >>$LOGFILE jehonë "$(data +"%d-%b-%Y %R%nFile") e rezervës $OF nuk është kopjuar në burimin rezervë" | sendxmpp -t -f /usr/local/etc/XMPP_settings recipient_login@domain &>>$LOGFILE else echo "Kopjimi i skedarit përfundoi me sukses në $(date +"%R %d-%b-%Y")!" >>$LOGFILE echo "Skedari u kopjua si \"$TGTD_archive$OF\"" >>$LOGFILE fi echo "Çmontimi i sistemit të skedarëve për arkivin rezervë $TGTD_archive" >>$LOGFILE shton $TGTD2 &>>$LOGFILE echo " Të gjitha operacionet përfunduan me sukses!” >>$LOGFILE fi bisht -n 300 $LOGFILE >/tmp/unique_fantastic_filename.tmp mv -f /tmp/unique_fantastic_filename.tmp dalje e $LOGFILE

Faleminderit të gjithëve për vëmendjen tuaj!

Dhe kështu, një përmbledhje e shkurtër e njohurive teorike që na duhen:

Mund të kryeni kopje rezervë në burimi i rrjetit ose në një vëllim të veçantë. Kopjimi në një ndarje rrjeti ka një çift mangësi të konsiderueshme: së pari, nëse ka probleme me rrjetin (ndërsa arkivimi është duke u ekzekutuar) kopja juaj rezervë nuk do të krijohet padyshim dhe së dyti, dosja e rrjetit mund të përmbajë vetëm një kopje rezervë të vetme (duke kopjuar në të njëjtën dosje rrjeti, si më parë, ju shkatërroni kopje rezervë e mëparshme).

Kopjimi në një vëllim të veçantë kryhet si më poshtë: Dosja WindowsImageBackup\ krijohet në vëllimin e synuar<Emri i kompjuterit>\. Në këtë dosje, nga ana tjetër, do të krijohet disqe virtuale(një për secilin nga vëllimet rezervë), tek i cili do të kryhet kopjimi. Pas përfundimit të kopjimit, gjendja e disqeve virtuale që ruajnë kopjet rezervë do të ruhet duke përdorur shërbimin kopjimi në hije. Herën tjetër që të arkivoni, do të kryhen të njëjtat veprime, duke rezultuar që çdo arkiv specifik të jetë i disponueshëm kur qaseni në një kopje specifike hije. Për më tepër, nga pikëpamja e programit të arkivimit, çdo arkiv i tillë do të jetë një arkiv i plotë, dhe nga pikëpamja e hapësirës së përdorur, do të jetë në rritje (kopja hije ruan informacionin vetëm për blloqet e të dhënave të ndryshuara).

Informacioni në lidhje me procesin e përfunduar të arkivimit ruhet në disa vende në OS, të cilat mund të përmbajnë informacione jokonsistente. Është e qartë se numri aktual i kopjeve rezervë që ruhen lokalisht në kompjuter nuk mund të jetë më i madh se numri i kopjeve hije të vëllimit në të cilin është kryer kopjimi. Mund të shikoni informacione rreth numrit të kopjeve në hije, për shembull, në linja e komandës duke përdorur komandën hije disk(dhe nënkomandat e tij lista i bën hije të gjitha). Megjithatë, kopje hije nuk përmbajnë informacion të mjaftueshëm të nevojshëm për të krijuar një listë të kopjeve rezervë, kështu që ky informacion është marrë nga vende të tjera. Kështu, për shembull, OS mban të dhëna kopje arkivore në katalogun global të arkivave, si dhe në revistë Ngjarjet e Windows Regjistri i rezervimit të serverit. Informacioni nga këto burime shfaqet në skedarin "Sistemi i arkivimit të të dhënave". Windows Server" Si rezultat, mund të lindë një situatë që pajisjet do të na tregojnë informacione kontradiktore që nuk kanë asnjë lidhje me realitetin.

Shikoni pamjen e ekranit. Është bërë në një sistem për të cilin disku lokal u ruajtën vetëm dy arkiva (kishte vetëm dy kopje hije) dhe nuk u krijua asnjë arkiv i vetëm rrjeti. Sidoqoftë, pajisjet na tregojnë në seksionin "Të gjitha arkivat" që supozohet se kemi 6 arkiva, dhe në dritaren e mesazheve shohim një raport për krijimin e vetëm 3 arkivave. Për të detyruar sistemin operativ të shfaqë informacion të qëndrueshëm që korrespondon me realitetin, ne do të duhet të inicializojmë të gjithë komponentët e sistemit të arkivimit që ruajnë informacionin rreth kopjeve rezervë ose vetë kopjet rezervë. Për ta bërë këtë, do të na duhet të pastrojmë regjistrin e rezervimit të Windows, të fshijmë drejtorinë e arkivit global (duke përdorur komandën wbadmin fshini katalogun) dhe fshini të gjitha kopjet hije (duke përdorur komandën diskshadow fshij hijet e të gjitha). Në përgjithësi, informacioni i ruajtur në kopje rezervë e Windows log, ka natyrë thjesht informative dhe nuk ndikon në asnjë mënyrë në procesin e rikthimit të informacionit nga arkivi, nëse duhet të bëhet, gjë që nuk mund të thuhet për informacionin e ruajtur në katalogun global. Nëse katalogu global dëmtohet, atëherë ne nuk do të jemi në gjendje të rivendosim informacionin duke përdorur mjetet standarde të arkivimit të Windows OS. Megjithatë, një katalog i arkivit global i dëmtuar ose i fshirë mund të rikthehet kopje rezervë, e cila krijohet çdo herë që arkivohet në dosjen WindowsImageBackup\<Emri i kompjuterit>\. Për të rivendosur një katalog të arkivit global të dëmtuar, së pari duhet ta fshini atë (duke përdorur komandën katalogu i fshirjes wbadmin), dhe më pas rivendosni nga rezervimi (duke përdorur komandën katalogu i rivendosjes së wbadmin).

Epo, tani, në fakt, unë do të publikoj skenarin rezervë:

Write-Verbose "Start..." #Ruaj vlerën e ndryshores së mjedisit $VerbosePreference $tmpVerbpref=$VerbosePreference $VerbosePreference="Continue" #Path në dosjen e rrjetit në të cilën do të kopjojmë arkivin $NetworkBackupPath="\\SRV66 \Backup$\SRV02 \BMR" #Emri i ndarjes në të cilën do të krijojmë arkivin $VolumeTarget="D:" # Numri i kopjeve rezervë që duhet të ruhen në median lokale $BackupQuantity=3 # Numri i kopjeve rezervë që duhet të ruhet në hapësirën ruajtëse të rrjetit $NetBackupQuantity=5 # Shtegu për në skedarin e listës rezervë $csvFile="D:\Backup\ProfileBackup.csv" #Rruga drejt dosjes në të cilën do të krijojmë arkivin 7zip $Path2Arc="D: \Backup" # lidhni shtesën e rezervimit të serverit-PSSnapin Windows.Serverbackup -ErrorAction SilentlyContinue # krijoni një detyrë rezervë $policy = New-WBPolicy<# # создаём и добавляем в задание бэкапа о бэкапируемых файлах $source = New-WBFileSpec -FileSpec "C:\Users" Add-WBFileSpec -Policy $policy -FileSpec $source #># #Merr listën e vëllimeve kritike $VolSources = Get-WBVolume -CriticalVolumes #Shto vëllime që do të rezervohen Shto-WBVolume -Politika $policy -Volume $VolSources #Përcakto opsionet rezervë VSS Set-WBVssBackupsySystemetVolumeVolume -Volume rezervë Add-WBSystemState -policy $policy #Enable Bare Metal Recovery Add-WBBareMetalRecovery -Policy $policy # # specifikoni vëllimin lokal në të cilin do të kopjohet arkivi $target = New-WBBackupTarget -VolumePath $VolumePath Add-WolumegeT -Target $target Write-Verbose "Ne fillojmë procesin e krijimit të një kopje rezervë" # kryejmë një kopje rezervë Start-WBBackup -Policy $policy # kontrolloni kodin e kthimit me rezultatin e kopjes rezervë nëse ((Get-WBSummary).LastBackupResultHR -eq 0) ( # riemërto arkivin në një emër më miqësor $newname = "_Backup_$(Get-Date -f yyyyMMddHHmm)" Write-Verbose "Riemërto dosjen me arkivin e sapo krijuar në $newname ..." Ren $VolumeTarget\ WindowsImageBackup -NewName $newname # Zip arkivin duke përdorur 7zip $arc="C:\Program Files\7-Zip\7z.exe" $arc_params="a -t7z -m0=LZMA2 -mmt -mx9" $arc_source="$ VolumeTarget\$newname" $arc_dest="$Path2Arc \$newname.7z" Write-Verbose "Paketo dosjen $newname duke përdorur 7zip në $newname.7z" Fillimi i Procesit $arc -ArgumentList "$arc_params $arc_dest $arc_source" Prisni # kopjoni arkivin në një dosje rrjeti #copy $VolumeTarget \$newname $NetworkBackupPath -Recurse Write-Verbose "Kopjo skedarin $arc_dest në dosjen e rrjetit..." kopjo "$arc_dest" $NetworkBackupPath nëse ($?) ( #nëse kopjimi ka përfunduar pa gabime, fshi skedarin e arkivit dhe dosjen që është paketuar në këtë arkiv del "$arc_dest" -Force -Verbose del $VolumeTarget\$newname -Recurse -Force #-Verbose ) # fshi arkivat e vjetra nga dosje rrjeti, duke përjashtuar arkivat më të fundit të $BackupQuantity $NetBackups=dir $NetworkBackupPath | ?($_.Name -match "_.+(\d)+\.7z$") $NetBackupsCount=$NetBackups.count if (($NetBackupsCount - $NetBackupQuantity) -gt 0) ( $NetBackups | renditi funditwritetime | zgjidhni -First ($NetBackupsCount - $NetBackupQuantity) | del -Force -Verbose #-Recurse -WhatIf ) # lexoni direktorinë tonë rezervë $csv=@() nëse (Test-Path $csvFile) ($csv = @(Import- Csv $csvFile)) # lexo të dhëna për rezervimin më të fundit $aktuale = Get-WBBackupSet | zgjidhni -E fundit 1 | zgjidhni VersionID, SnapshotId # dhe shtojeni atë në grupin e objekteve të kopjeve rezervë ekzistuese $csv += $current # për të shmangur konfuzionin, renditni përsëri objektet dhe shkruajeni përsëri në skedarin CSV $csv | rendit @(Shprehje=(($_.VersionId)))| zgjidhni -Last $BackupQuantity | Export-Csv $csvFile -NoTypeInformation # dhe numëroni sa regjistrime ka $count = $csv.count # nëse ka më shumë regjistrime BackupQuantity, atëherë numëroni sa arkiva shtesë duhen fshirë. # nëse ka më pak hyrje në BackupQuantity, atëherë nuk ka nevojë të fshini asgjë dhe thjesht shtoni një hyrje të re nëse ($count -gt $BackupQuantity) ( $old = $count - $BackupQuantity # gjeneron një emër të rastësishëm për skriptin që do do të përdoret në hijen e diskut $file = : :GetRandomFileName() # zgjidhni të gjitha arkivat e panevojshme dhe kaloni ato nëpër tubacionin e fshirjes $csv | sort @(Expression=(($_.VersionId))| zgjidhni -First $old | %( #Read-Host "Shtypni Enter për të vazhduar..." | Out-Null #Write-Verbose $file ##Read-Host "Shtypni Enter për të vazhduar..." | Out-Null # shkruani komandën në një skedar të përkohshëm " fshij ID-në e hijeve ($($_.SnapshotID ))"|Out-File -FilePath $Env:TEMP\$file -Enkodimi OEM #gc $Env:TEMP\$file #Read-Host "Shtypni Enter për të vazhduar... " | Out-Null # dhe ekzekutoni diskshadow në modalitetin e skriptit, diskshadow /s $Env:TEMP\$file | Out-Default ) del $Env:TEMP\$file ) ) other ( # betohu se rezervimi nuk u përfundua me sukses Shkruani- Verbose "Gabim në ekzekutimin e kopjes rezervë" ) Write-Verbose "Skripti ka mbaruar ekzekutimin" #Rivendosja e vlerës së ndryshores së mjedisit $VerbosePreference $VerbosePreference=$tmpVerbpref

Përditësuar: 21.07.2017 Publikuar: 15.08.2016

Ky skript është shkruar në Unix Shell duke ekzekutuar sistemi operativ CentOS. Do të funksionojë në shumicën e sistemeve Familje Linux dhe BSD.

Shembull i skenarit

Skripti do të krijojë deponinë e vet për çdo bazë të dhënash. Kjo është e nevojshme për shërim të shpejtë të dhëna.

  1. #!/bin/bash
  2. PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
  3. destinacion="/backup/mysql"
  4. userDB = "backup"
  5. fjalëkalimDB = "backup"
  6. fdate=`datë +%Y-%m-%d`
  7. gjeni $destinacion -lloji d \(-emri "*-1[^5]" -o -emri "*-?" \) -ctime +30 -exec rm -R () \; 2>&1
  8. gjeni $destinacion -lloji d -emri "*-*" -ctime +180 -exec rm -R () \; 2>&1
  9. mkdir $destination/$fdate 2>&1
  10. për dbname në `echo tregojnë bazat e të dhënave| mysql -u$userDB -p$passwordDB | grep -v Baza e të dhënave`; bëj
  11. rasti $dbname në
  12. informacion_skema)
  13. vazhdo ;;
  14. mysql)
  15. vazhdo ;;
  16. skema_ performancës)
  17. vazhdo ;;
  18. test)
  19. vazhdo ;;
  20. *) mysqldump --bazat e të dhënave --skip-comments -u$userDB -p$fjalëkalimiDB $dbname | gzip > $destination/$fdate/$dbname.sql.gz ;;
  21. bërë;

Përshkrimi i skriptit

1 Ne tregojmë rrugën drejt përkthyesit.
2 Ne vendosim variabla të sistemit në mënyrë që të mos na duhet të shkruajmë shtigje të plota drejt skedarëve të ekzekutueshëm në skript.
4 - 7 Ne vendosim variablat.
4 Drejtoria në të cilën do të ruajmë kopjet rezervë.
5 Llogaria për t'u lidhur me bazën e të dhënave.
6 Fjalëkalimi për t'u lidhur me bazën e të dhënave.
7 Data kur ekzekutohet skenari.
9 Ne gjejmë të gjitha kopjet rezervë që janë më të vjetra se 30 ditë dhe i fshijmë ato. Ne i lëmë dosjet për arkiv në datën 15.
10 Ne fshijmë të gjitha kopjet rezervë më të vjetra se 180 ditë.
11 Ne krijojmë një direktori në të cilën do të ruajmë kopjet rezervë. Si emër direktoriumi, ne përdorim datën e nisjes së skriptit në formatin VVVV-MM-DD.
13 - 25 Ne lidhemi me bazën e të dhënave dhe nxjerrim një listë të të gjitha bazave të të dhënave. Ne bëjmë një kopje rezervë për secilën.
15 - 22 Ne kapërcejmë bazën e të dhënave të shërbimit information_schema, mysql, performance_schema, test.
23 Ne bëjmë një kopje rezervë për bazat e të dhënave.

Përgatitja e sistemit

Lidhu me bazën e të dhënave dhe krijoni llogari me të drejtën për të krijuar kopje rezervë:

> ZGJIDHJE TË GRANT, SHFAQJE PAMJEN, RINGARKOJ, KLIENTIN REPLIKIM, NGJARJE, AKTIZIM, KYÇO TABELAVE NË *.* TE backup@localhost Identifikuar NGA "backup";

* në këtë shembull ne po krijojmë një llogari rezervë me fjalëkalim rezervë.

Krijoni një direktori në të cilën do të ruhen kopjet rezervë:

mkdir -p /backup/mysql

Ruajtja e të dhënave në një kompjuter të largët

Duhet të krijohen kopje rezervë kompjuter në distancë ose disku i jashtëm në mënyrë që ato të jenë të disponueshme nëse serveri dështon. Ky shembull përdor një dosje të përbashkët në server në distancë, i cili do të përmbajë skedarë rezervë.

Për të thjeshtuar procesin e montimit të një dosje rrjeti, le të hapim skedarin e mëposhtëm për redaktim:

dhe shtoni rreshtin e mëposhtëm në të:

//192.168.0.1/backup /mnt cifs përdorues,rw,noauto,kredencialet=/root/.smbclient 0 0

* në këtë shembull, dosja e përbashkët është montuar rezervë në një server me një adresë IP 192.168.0.1 te katalogu /mnt. Përdoret si një sistem skedari rrjeti cifs(Protokolli SMB: server samba ose dosje e përbashkët e Windows). Parametrat e lidhjes - përdorues: Lejon çdo përdorues të montohet rw: me leje leximi dhe shkrimi, noauto: mos montoni automatikisht gjatë nisjes së sistemit, kredencialet: një skedar në të cilin janë shkruar identifikimi dhe fjalëkalimi për t'u lidhur me dosjen e përbashkët.

Tani le të krijojmë një skedar me hyrje dhe fjalëkalim:

# vi /root/.smbclient

dhe sillni atë në formën e mëposhtme:

emri i përdoruesit = rezervë
fjalëkalim = rezervë

* emri i përdoruesit: Emri i përdoruesit, fjalëkalimin: fjalëkalimi. Sigurisht, në rastin tuaj, tregoni të dhënat tuaja.

Tani shkruani komandën e mëposhtme.

Artikujt më të mirë mbi këtë temë