Back-upscript. Over gegevensbeveiliging. Hoe u oude kopieën van bestanden kunt verwijderen en de laatste paar kunt behouden

Manieren back-up Er zijn er heel veel, maar voor mij persoonlijk hebben ze hun nadelen, daarom gebruik ik ze niet. Het is gemakkelijker om een ​​paar eenvoudige scripts te schrijven, bijvoorbeeld met behulp van de zogenaamde bat-bijnaam of PowerShell. In dit artikel vertel ik hoe je een back-up kunt instellen met behulp van scripts, ik combineer ze en maak bundels.

Back-upschema

In de meeste gevallen komt een back-up neer op het opslaan van bepaalde bestanden. Het kunnen afbeeldingen zijn virtuele machines, gebruikersbestanden, back-up SQL-databases, het uitladen van de 1C:Enterprise-informatiebank, enz. Het is juister om al deze back-upkopieën van bestanden op een andere locatie op te slaan, dit kan een netwerkmap zijn, een externe schijf, tapedrive, ftp, enz. Voor het gemak gebruik ik een ftp-server.

Laten we eens kijken naar het diagram van hoe dit allemaal gebeurt:

  1. Kopieer of verplaats ze naar een map om ze naar het archief te verzenden
  2. Controleer de map op nieuwe back-ups
  3. Wij sturen bestanden naar het archief op FTP-server
  4. Oude back-upbestanden verwijderen

In de eerste stap hebben we de bestanden gemaakt die we naar onze FTP-server moeten kopiëren. Nu moeten we ze naar een map kopiëren, die we op zijn beurt naar FTP zullen sturen. Om dit te doen, kunt u een eenvoudig commando gebruiken:

Kopieer "PATH_TO_SOURCE_FOLDER\* C:\Backup\

Door deze opdracht uit te voeren, worden al onze bestanden gekopieerd naar C:\Backup\. Vervullen deze opdracht logisch als je verzamelt verschillende plaatsen Uw back-ups. Nu hebben we een script nodig dat de map controleert op nieuwe bestanden en deze naar de FTP-server stuurt leeg bestand backup.ps1 en schrijf het volgende script erin.

$a = (Get-Host).UI.RawUI $a.WindowTitle = "Map synchroniseren met 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" !}

Laten we uitzoeken hoe het werkt dit script. Eerst worden variabelen ingesteld die de server, gebruikersnaam, wachtwoord en bronmap aangeven. Vervolgens in de regel $Files = Get-ChildItem $localDirectory | Waar ($_.LastWriteTime -gt (Get-Date).AddDays(-1)) alle bestanden selecteert waarvan de wijzigingsdatum groter is (-qt) dan de huidige datum min 1 dag. Hier kunt u het aanpassen aan uw schema. Ik maak elke dag back-ups. Vervolgens doorlopen we in een lus elk bestand dat aan de voorwaarden voldoet en sturen het naar de FTP-server.

Om geen schijfruimte in beslag te nemen, verwijder ik back-ups ouder dan 30 dagen. In principe kun je ze, nadat je ze naar FTP hebt verzonden, onmiddellijk verwijderen. Ik laat ze alleen staan ​​zodat ik, als ze plotseling nodig zijn, geen tijd hoef te verspillen met het downloaden van ze vanaf FTP, en extra exemplaar back-ups kunnen geen kwaad, je weet nooit wat er kan gebeuren met FTP. Dus als je ruimte het toelaat, raad ik aan ze op de originele server op te slaan.

Om de map op te ruimen gebruik ik het script removeOldBackups.ps1

$fullTargetPath = "C:\Backup" $deleteFiles = Get-Childitem $fullTargetPath -Recurse |

Waar ($_.LastWriteTime -lt (Get-Date).AddDays(-30)) | Foreach (Item verwijderen $_.FullName -Force -Recurse) Een uiterst eenvoudig script, ik zal slechts één ding uitleggen tekenreeks Waar($_.LastWriteTime -lt (Get-Date).AddDays(-30)) | deze regel vergelijkt de wijzigingsdatum van het bestand met de huidige datum minus 30 dagen. Deze vergelijking omvat bestanden waarvan de LastWriteTime korter is

huidige datum

min 30 dagen. Indien nodig kunt u deze aanpassen aan uw behoeften. Voorwoord Het idee om een ​​script te maken dat met een paar klikken een back-up van een site (alle bestanden + databasedump) kan maken, ontstond toen ik aan verschillende projecten werkte en aan het ontwikkelen en testen was bij

lokale webserver

. Zelfs toen had ik Denver, dat in de loop van de tijd werd vervangen door een zich sneller ontwikkelende lokale combinatie van webservices: OpenServer.

De projecten werden bezocht, dus eerst werd een lokale kopie van de hele site gemaakt, en pas daarna was het mogelijk om ermee te werken en te experimenteren, waardoor onderbrekingen in het werk van het live project werden vermeden. Ik heb als volgt een back-up gemaakt: ik logde in via SSH en pakte de projectmap in met de 7Zip- of TGZ-archiver, maakte een dump met behulp van mysqldump en downloadde al deze dingen via internet of SCP/WinSCP.

Onmiddellijk werd luiheid voelbaar en ontstond de gedachte aan automatisering: "het zou cool zijn als alles wat ik in de console typ automatisch voor elke site zou worden gedaan, en er maar een paar klikken van mij nodig waren." Mijn eerste zoektocht naar een SSH-automatiseringsoplossing voor Windows leidde me meteen naar een hulpprogramma dat ik al heel lang gebruik om met bestanden op servers te werken - .

  1. Hoe het back-upscript werkt
  2. De essentie van het geautomatiseerde back-upscript is dus als volgt:
  3. We starten het WinSCP-programma, dat inlogt op de server en een back-up maakt van de site + database, en ook alle gegevens archiveert met behulp van een archiveringshulpmiddel met hoge graad compressie - 7Zip of TAR+GZip;
  4. Download het archief;
  5. Sluit WinSCP en wis de logs + verwijder het tijdelijk gegenereerde script voor WinSCP met opdrachten;
  6. Klaar! Een kopie van een andere site nodig? - GA NAAR 1!

Het kan zijn dat er niet één, maar meerdere sites zijn, waardoor het mogelijk is om met veel ini-bestanden te werken aparte instellingen voor elke locatie.

Alle WinSCP-verwerkings- en beheerbewerkingen worden door het script uitgevoerd. geschreven in de scripttaal van bat-bestanden voor Windows. Het biedt ook een eenvoudige console-interface waarmee u alle noodzakelijke bewerkingen kunt uitvoeren.

Voor deze taak is, op basis van zijn eenvoud, de scripttaal van bat-bestanden ruim voldoende, maar nog steeds neemt niemand de moeite om dit systeem in Autoit of in een van de programmeertalen te implementeren hoog niveau, zoals C#, Delphi, enz.

Aandacht! Het script is alleen relevant als u via SSH toegang heeft tot de serverconsole.

Back-upinterface en menu

Nadat we het script hebben uitgevoerd, hebben we toegang tot een eenvoudig menu:

Het eerste item (druk op 1 en enter) is verantwoordelijk voor het back-upproces en geeft een lijst weer met beschikbare sjabloonconfiguratiebestanden voor sites.

Het tweede punt is het genereren van een configuratiebestandsjabloon en het openen ervan voor bewerking.

Derde punt - korte informatie over het schrijven van sjabloonbestanden.

In de onderstaande afbeelding is een menu geopend met een selectie van locaties die beschikbaar zijn voor reservering:

Hier is het subitem "0. Alle onderstaande sites" verantwoordelijk voor het starten van een back-up van alle sites met de onderstaande configuratiebestanden. U kunt dus een back-up maken van één site of van alle sites tegelijk.

Voorbeeldconfiguratiebestand voor een script

Hier is een voorbeeld van een somesite.com.ini-configuratiebestand voor het maken van een back-up van somesite.com:

Sitename_string=somesite_com store_path=D:\Backup\ archive_method=7z archive_password=StrOngp@sswOrd hostnaam=000.111.222.333 ssh_user=root ssh_password=p@ssmetotheserver mysql_user=site1_user mysql_password=PZBkOyjMmxWgQHhd 185g mysq l_db_name=site1_db dirs_to_backup=/var/www/somesite. com /www/* /var/www/somesite.com/www/.htaccess

Zoals u kunt zien, is alles eenvoudig en niets overbodigs. Ik zal je in detail vertellen over elke regel met instellingen:

sitename_string - wijs een duidelijke naam toe aan de site (alleen Latijn en het _-symbool).

winkel_pad - pad naar lokale computer, waar het back-uparchief wordt gedownload.

archive_method - methode voor het archiveren van sitebestanden.

  • 7z - het archiveringsprogramma met dezelfde naam zal worden gebruikt, de uitvoer zal een archief zijn met de extensie "zip".
  • gz - archiveren met TAR+GZip, de uitvoer zal een archief zijn met de extensie "tgz" .

archive_password - archiefwachtwoord, werkt alleen wanneer archive_method=7z .

hostnaam - extern IP-adres of domein van de server waarop de website en database worden gehost.

ssh_user - gebruikersnaam voor verbinding via SSH. In de meeste gevallen heb je root nodig om alle bewerkingen uit te voeren, hoewel je kunt proberen het in te stellen voor een andere gebruiker zonder rechten.

ssh_wachtwoord!! - wachtwoord voor de bovenstaande gebruiker.

mysql_user * - gebruikersnaam voor verbinding met de sitedatabase op de MySQL-server.

mysql_password - wachtwoord voor de bovenstaande MySQL-gebruiker. Moet geïnstalleerd worden!

mysql_db_name - de naam van de sitedatabase waarvoor we een volledige dump zullen uitvoeren.

dirs_to_backup ** - schrijf een door spaties gescheiden lijst met volledige paden, mappen en bestanden die moeten worden gearchiveerd.

Opmerkingen:

Als u de waarde leeg laat, wordt later om het wachtwoord gevraagd interactieve modus(Ik raad aan het wachtwoord niet op te slaan).

* Er wordt aangenomen dat de scripts en de database MySQL-gegevens gehost op dezelfde server. Dat wil zeggen dat het MySQL-serveradres 127.0.0.1 (localhost) is.

** Archivers pakken standaard geen .htaccess-bestanden in, dus u moet bovendien het volledige pad ernaartoe opgeven!

** Zorg ervoor dat u volledige en geen relatieve paden naar mappen of bestanden opgeeft.

U kunt zoveel configuratiebestanden maken als u wilt; wanneer u het script uitvoert, wordt de naam van elk bestand weergegeven met een toegewezen nummer. Om te beginnen moet u het configuratienummer (nummer) invoeren en dat is alles (als u dat hebt gedaan). geen wachtwoord opgegeven, voer dan een ander wachtwoord in).

Werkvoorbereiding en gebruik van het script

Het is heel eenvoudig!

De eerste stap is om te beslissen waar we het script met al zijn configuraties zullen opslaan. Ik raad aan om niet op te slaan soortgelijke programma's en gegevens op lokale machine V open vorm, omdat het niet veilig is, vooral als er wachtwoorden voor zijn root-toegang naar de servers. Het complex kan ergens op een versleuteld medium worden opgeslagen of ergens waar virussen of vreemden. Wat de veiligheid betreft, is de keuze aan jou, laten we verder gaan.

Laat het hele complex langs het pad liggen:

  • D:\Backup\ - archieven met back-upkopieën worden hier geladen.
  • D:\Backup\script\ - ons script en WinSCP-programma bevinden zich hier.

1) Download de nieuwste geconfigureerde en draagbare versie van het WinSCP-programma van de PortableApps-website - WinSCP Portable. We installeren het programma in de map D:\Backup\script\ - daar wordt de map WinSCPPortable gemaakt en daarin staat het bestand WinSCPPortable.exe.

2) Download het archief met het script en de sjablonen hier - backup_sites_v1.2 en pak het uit in de map D:\Backup\script\.

3) Open het bestand backup_sites_v1.2.bat om te bewerken en bewerk de paden in de sectie "WinSCP-configuratie":

  • "D:\Backup\script\WinSCPPortable\WinSCPPortable.exe" - pad naar het WinSCP Portable-programma;
  • "D:\Backup\script\WinSCPPortable\Data\settings\winscp.log" - het pad waar het WinSCP Portable-programmalogboekbestand is gemaakt.

We zorgen ervoor dat de paden die in het script zijn geschreven overeenkomen met die waar het WinSCP-programma zich bevindt, anders start het gewoon niet.

4) We maken sjabloonbestanden voor websiteback-up. Er zijn er verschillende in het archief. Hernoem ze volgens de domeinnamen van uw sites en verwijder de overbodige domeinnamen.

Creëren nieuw sjabloon website voor het script op de volgende manieren:

  1. Kopieer gewoon het INI-bestand en hernoem het naar de juiste naam, en vervolgens bewerken we de instellingen daarin;
  2. We genereren de sjabloon met behulp van een script. Voer het script uit, druk op 2 en voer de domeinnaam of sitenaam in (alleen Latijnse tekens en het _-symbool). Kladblok wordt daarna geopend met het nieuw gemaakte bestand wijzigingen aangebracht sla het op en sluit het.

Welke optie is handiger - kies zelf.

5) Alles is klaar, u kunt het script uitvoeren en proberen een back-up van een van uw sites te maken.

Nadat u de keuze van de locatie voor back-up heeft bevestigd, wordt u mogelijk om een ​​wachtwoord gevraagd. SSH-gebruiker, als dit niet is opgegeven in configuratiebestand. Er wordt onmiddellijk een venster geopend met een logboek van het WinSCP-programma, waarin de voortgang van de acties op de server wordt weergegeven, evenals de voortgang van het downloaden van het voltooide archief van de server.

Wanneer WinSCP klaar is met het downloaden van het archief, wordt het venster gesloten; u hoeft alleen maar op een willekeurige toets in het venster te drukken.

Over gegevensbeveiliging

Het script genereert tijdens de werking ervan tijdelijk bestand".tmp" met een reeks opdrachten voor WinSCP. Dit bestand bevat de login en het wachtwoord voor toegang tot de server via SSH.

INI-sjablonen met site-instellingen bevatten ook belangrijke informatie: dit zijn databasetoegangsparameters.

Ik raad ten zeerste NIET aan om dit script en de instellingenbestanden op te slaan op schijven die op elk moment direct toegankelijk zijn na het opstarten en eenvoudige manipulaties met de computer. Voor opslag kunt u een gecodeerde schijf maken of afzonderlijke media kopen.

Dit script is slechts een hulpmiddel dat tijd bespaart bij het uitvoeren van routinematige en soortgelijke acties. Neem de tijd en maak u zorgen over de veiligheid en beveiliging van uw gegevens!

Alle verantwoordelijkheid voor het gebruik van dit script ligt bij u, wees uiterst voorzichtig!

Conclusie

Het script kan worden aangepast en aangepast zodat het functioneler wordt en de acties uitvoert die u nodig heeft op uw sites.

Ook deze methode automatisering WinSCP kan worden gebruikt om andere scripts te bouwen die zullen presteren verschillende taken op uw VPS of Dedicated server via de console.

Bijgewerkt: 21/07/2017 Gepubliceerd: 15-08-2016

Dit script is geschreven in Unix Shell besturingssysteem CentOS. Het zal op de meeste systemen werken Linux-families en BSD.

Voorbeeldscript

Het script maakt voor elke database een eigen dump. Dit is nodig voor snel herstel gegevens.

  1. #!/bin/bash
  2. PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
  3. bestemming="/backup/mysql"
  4. userDB = "back-up"
  5. wachtwoordDB = "back-up"
  6. fdate=`datum +%Y-%m-%d`
  7. zoek $bestemming -type d \(-naam "*-1[^5]" -o -naam "*-?" \) -ctime +30 -exec rm -R () \; 2>&1
  8. zoek $bestemming -type d -naam "*-*" -ctime +180 -exec rm -R () \; 2>&1
  9. mkdir $bestemming/$fdate 2>&1
  10. voor dbnaam in `echo show databases | mysql -u$userDB -p$wachtwoordDB | grep -v Database`; Doen
  11. case $dbnaam in
  12. informatie_schema)
  13. doorgaan ;;
  14. mysql)
  15. doorgaan ;;
  16. prestatieschema)
  17. doorgaan ;;
  18. test)
  19. doorgaan ;;
  20. *) mysqldump --databases --skip-comments -u$userDB -p$passwordDB $dbname | gzip > $bestemming/$fdate/$dbnaam.sql.gz ;;
  21. klaar;

Scriptbeschrijving

1 Wij wijzen het pad naar de tolk aan.
2 We stellen systeemvariabelen zo in dat we ze niet in het script hoeven te schrijven volledige paden naar uitvoerbare bestanden.
4 - 7 Wij stellen de variabelen in.
4 De map waarin we back-ups zullen opslaan.
5 Account voor verbinding met de database.
6 Wachtwoord voor verbinding met de database.
7 De datum waarop het script wordt uitgevoerd.
9 Wij vinden alle back-ups die ouder zijn dan 30 dagen en verwijderen deze. We laten de bestanden achter voor het archief op de 15e.
10 Wij verwijderen alle back-ups ouder dan 180 dagen.
11 We maken een map aan waarin we back-ups opslaan. Als mapnaam gebruiken we de startdatum van het script in de notatie JJJJ-MM-DD.
13 - 25 We maken verbinding met de database en halen een lijst met alle databases tevoorschijn. Van elk maken wij een reservekopie.
15 - 22 We slaan de servicedatabases information_schema, mysql, performance_schema, test over.
23 Wij maken een reservekopie voor de databases.

Het systeem voorbereiden

Maak verbinding met de database en creëer rekening met het recht om te creëren reservekopieën:

> SELECTIE TONEN, WEERGAVE TONEN, HERLADEN, REPLICATIECLIENT, GEBEURTENIS, TRIGGER, TABELLEN VERGRENDELEN OP *.* NAAR backup@localhost GEIDENTIFICEERD DOOR "backup";

* V in dit voorbeeld wij maken een account aan back-up met wachtwoord back-up.

Maak een map waarin back-ups worden opgeslagen:

mkdir -p /backup/mysql

Gegevens opslaan op een externe computer

Back-ups moeten worden gemaakt op externe computer of externe schijf zodat ze beschikbaar zijn als de server uitvalt. Dit voorbeeld gebruikt gedeelde map op externe server, die back-upbestanden zal bevatten.

Om het installatieproces te vereenvoudigen netwerkmap, open het volgende bestand om te bewerken:

en voeg daar de volgende regel aan toe:

//192.168.0.1/backup /mnt cifs user,rw,noauto,credentials=/root/.smbclient 0 0

* in dit voorbeeld is de gedeelde map aangekoppeld back-up op een server met een IP-adres 192.168.0.1 naar de catalogus /mnt. Als netwerk bestandssysteem gebruikt cif's(SMB-protocol: sambaserver of gedeeld Windows-map). Verbindingsparameters - gebruiker: staat elke gebruiker toe het te mounten, rw: met lees- en schrijftoestemming, geen auto: niet automatisch koppelen bij het opstarten van het systeem, referenties: een bestand waarin de gebruikersnaam en het wachtwoord voor verbinding met de gedeelde map zijn geschreven.

Laten we nu een bestand maken met login en wachtwoord:

# vi /root/.smbclient

en breng het naar de volgende vorm:

gebruikersnaam=back-up
wachtwoord=back-up

* gebruikersnaam: gebruikersnaam, wachtwoord: wachtwoord. Vermeld in uw geval uiteraard uw gegevens.

Voer nu het volgende commando in.

Back-up belangrijke informatie- elk systeembeheerder staat voor deze uitdaging. De taak lijkt triviaal en zal bij veel lezers geen interesse wekken. Maar ik zou er bijvoorbeeld graag zo’n artikel in willen hebben bepaald moment zou veel helpen, dus ik denk dat dit artikel er moet zijn.

Taak: Gegevensback-up naar een lokale map en naar aparte server, met behulp van een minimum aan software van derden, loggen en melden aan de beheerder in Jabber in geval van storingen. Alle hoofdfuncties van de meeste automatische back-upsoftware, maar zonder deze te installeren en dus zonder bugs (wat in feite tot dit idee leidde).

Laten we nu aan de slag gaan.

Laten we eerst een script maken en openen
nano back-up-script
Laten we nu de regel aan het script toevoegen
#!/bin/bash
Laten we enkele variabelen declareren.
TN - TASKNAME - taaknaam Wordt gebruikt voor uitvoer naar het logboek en het bepalen van de bestandsnaam.
Omdat er verschillende taken zijn (maandelijks, wekelijks, dagelijks) en ik te lui was om voor elke casus een script te schrijven, heb ik een universeel script gemaakt waarin je alleen maar commentaar hoeft te verwijderen benodigde lijnen. De namen van taken moeten zonder spaties worden geschreven, bij voorkeur in het Latijn, als u geen problemen wilt met codering en onjuiste opdrachtparameters.
TN=docs-maandelijks
#TN=docs-wekelijks
#TN=docs-dagelijks
OF - Uitvoerbestand - naam van het uitvoerbestand. Verkregen uit de TN-variabele, dat wil zeggen de taaknaam.
OF=$TN.tar.gz
We declareren een variabele met het pad naar het logbestand, en vervolgens worden alle foutmeldingen en andere zaken naar het logbestand uitgevoerd.
LOGFILE=/var/log/backup.log
Laten we een logvermelding maken over het begin van de back-up (datum, tijd, taaknaam)
echo >>$LOGFILE echo "========================================= ============== ==========" >>$LOGFILE echo "$(datum +"%d-%b-%Y %R")" > >$LOGFILE echo "Taak \"$TN\" is gestart. .." >>$LOGFILE
Er is een probleem: als u mapnamen opgeeft met spaties in opdrachtparameters (bijvoorbeeld tar), zal het script mislukken. De oplossing werd gevonden op internet - operatiekamer Linux-systeem gebruikt spatie alsingsteken. Laten we het standaardscheidingsteken (opgeslagen in de variabele $IFS) opnieuw definiëren als iets anders dan een spatie, bijvoorbeeld \n als een regeleinde.
Onthoud de oude waarde van het standaardscheidingsteken
OLD_IFS=$IFS
Vervang de standaardscheider door uw eigen afscheider
IFS=$"\n"
SRCD - Source Directory - map met back-upgegevens
Nu kunt u meerdere mappen vermelden, het scheidingsteken bestaat uit regeleinden, zoals we zelf in de regel hierboven hebben aangegeven
SRCD="/mnt/bron/map_1 /mnt/bron/map_2 /mnt/bron/map_N"
TGTD - TarGeT Directory - de map waarin back-ups worden opgeslagen
TGTD="/var/back-ups/"
Wij begrijpen uiteraard dat het bewaren van belangrijke back-ups alleen bij de bron op zijn minst lichtzinnig is. Daarom laten we een kopie achter externe bron, die we afzonderlijk zullen mounten met behulp van mount en fstab. Ik zal meteen uitleggen waarom ik mount en fstab gebruikte, en niet alleen maar mount - ik mount deze map in mijn andere scripts, en zoals een van mijn programmeursvrienden zei: goede programmeur zal niet twee keer dezelfde code schrijven (op de een of andere manier kan ik het me niet woordelijk herinneren, maar ik hoop dat ik de betekenis duidelijk heb gemaakt).
TGTD2="/mnt/archief/"
Het archiveringsproces zelf in de optie "Maken". nieuw archief"
tar -czf $TGTD$OF $SRCD &>>$LOGFILE
en in de optie "Bestanden bijwerken in het oude archief"
tar -u -f $TGTD$OF $SRCD &>>$LOGFILE
In het tweede geval is het beter om een ​​specifieke bestandsnaam te gebruiken in plaats van $OF, omdat bijvoorbeeld mijn wekelijkse archief dagelijks wordt bijgewerkt en hun $TN (taaknamen) niet overeenkomen, en dus $OF.

In de variabele "?" De uitvoeringsstatus van het laatste commando wordt vernietigd. Laten we het opslaan om later te gebruiken.
STATUS=$?
Het standaardscheidingsteken retourneren naar oorspronkelijke waarde
IFS=$OLD_IFS
Laten we nu een voorwaarde toevoegen: als het verpakkingsproces in tar-archief eindigde met een fout, stuur een bericht naar de beheerder, verwijder mislukt bestand back-up. Anders gaan we verder: we koppelen een netwerkshare aan en gooien er een kopie van het archief in. Na elke bewerking controleren we het resultaat van de uitvoering, schrijven we logboeken en gaan we verder of brengen we de beheerder op de hoogte en onderbreken we de procedure.
als [[ $STATUS != 0 ]]; dan rm $TGTD$OF &>>$LOGFILE echo "############################### ######" >>$LOGFILE echo "### Er is een fout opgetreden! Back-up is mislukt ###" >>$LOGFILE echo "################ # ########################" >>$LOGFILE echo "$(datum +"%d-%b-%Y %R% nFile ") $OF back-up niet gemaakt" | sendxmpp -t -f /usr/local/etc/XMPP_settings receiver_login@domain &>>$LOGFILE else echo "Back-upbestand opgeslagen als \"$TGTD$OF\"" >>$LOGFILE echo "Back-up succesvol voltooid op $(datum +"%R %d-%b-%Y")!" >>$LOGFILE echo "Aankoppelen van het bestandssysteem voor het back-uparchief $TGTD_archive" >>$LOGFILE mount $TGTD2 &>>$LOGFILE if [[ $? != 0 ]]; echo dan "####################################### #############" >>$LOGFILE echo "### Er is een fout opgetreden tijdens het koppelen van de back-upbron ###" >>$LOGFILE echo "######## ## ######################################## ## #" >>$LOGFILE echo "$(date +"%d-%b-%Y %R%nFile") van de back-up $OF is niet gekopieerd naar de back-upbron" | sendxmpp -t -f /usr/local/etc/XMPP_settings receiver_login@domain &>>$LOGFILE exit fi echo "Bestand kopiëren naar back-upbron gestart" >>$LOGFILE cp -f $TGTD$OF $TGTD_archive$OF &>> $LOGFILE als [[ $? != 0 ]]; echo dan "####################################### #############" >>$LOGFILE echo "### Er is een fout opgetreden tijdens het kopiëren naar de back-upbron ###" >>$LOGFILE echo "####### ## ######################################## ## ##" >>$LOGFILE echo "$(datum +"%d-%b-%Y %R%nFile") van back-up $OF niet gekopieerd naar back-upbron" | sendxmpp -t -f /usr/local/etc/XMPP_settings receiver_login@domain &>>$LOGFILE else echo "Het kopiëren van bestanden is succesvol voltooid op $(datum +"%R %d-%b-%Y")!" >>$LOGFILE echo "Bestand gekopieerd als \"$TGTD_archive$OF\"" >>$LOGFILE fi echo "Het bestandssysteem voor het back-uparchief $TGTD_archive ontkoppelen" >>$LOGFILE umount $TGTD2 &>>$LOGFILE echo " Alle operaties zijn succesvol afgerond!" >>$LOGFILE fi afsluiten

Daarbij kopiëren we het archief van de lokale opslag naar de externe opslag. Uiteraard controleren we of elke bewerking met succes is voltooid en schrijven we alles in de logboeken.
Om een ​​bericht naar de beheerder te sturen, gebruik ik een XMPP-bericht, aangezien de organisatie een Jabber-server heeft en ik het liefst ontvang snel bericht over een fout, in plaats van naar mijn e-mail te gaan, wachtwoorden in te typen, op links te klikken en te wachten tot de browser alles aan mij weergeeft. In ieder geval houdt niemand je tegen om sendmail te gebruiken in plaats van sendxmpp.
Het bestand /usr/local/etc/XMPP_settings bevat het volgende:

#sender_login@domain;jabber_server_IP:jabber_server_port sender_password login@domen;127.0.0.1:5222 wachtwoord
IN fstab-bestand een tekenreeks die de verbinding met Windows-shares beschrijft
//192.168.0.250/arhiv /mnt/archive cifs noauto,rw,iocharset=utf8,cp866,file_mod=0666,dir_mod=0777,noexec,_netdev,credentials=/root/.passwd_to_archive_directory 0 0
Nu hoeft u alleen nog maar de taak aan cron toe te voegen. Dit kan worden gedaan met behulp van het bestand /etc/crontab, maar vanwege mijn GUI-gewoonte, geërfd van Windows, gebruik ik voor dergelijke gevallen webinterfaces. De opdracht moet worden uitgevoerd met rootrechten, dat wil zeggen bijvoorbeeld sudo bash backup_script. Door een opdracht aan cron toe te voegen, kunt u bepalen dat deze onmiddellijk als root wordt uitgevoerd

Tijdens de discussies werd het probleem van de houtgroei ter sprake gebracht. Ik heb het eenvoudigste (naar mijn mening) pad gevolgd: we slaan alleen de laatste N regels van het log op, bijvoorbeeld 300. Er worden twee regels aan het script toegevoegd, waarin we de laatste 300 regels van het log opslaan in een tijdelijk bestand, dan zullen we het logbestand ermee wissen
tail -n 300 $LOGFILE >/tmp/unique_fantastic_filename.tmp mv -f /tmp/unique_fantastic_filename.tmp $LOGFILE
Ik breng je volledige tekst script:
#!/bin/bash TN=docs-maandelijks #TN=docs-wekelijks #TN=docs-daily OF=$TN.tar.gz LOGFILE=/var/log/backup.log echo >>$LOGFILE echo "== ================================================= === =" >>$LOGFILE echo "$(datum +"%d-%b-%Y %R")" >>$LOGFILE echo "Taak \"$TN\" gestart..." >>$ LOGFILE OLD_IFS= $IFS IFS=$"\n" SRCD="/mnt/source/folder_1 /mnt/source/folder_2 /mnt/source/folder_N" TGTD="/var/backups/" TGTD2="/mnt/archive /" tar -czf $TGTD$OF $SRCD &>>$LOGFILE #tar -u -f $TGTD$OF $SRCD &>>$LOGFILE STATUS=$? IFS=$OLD_IFS als [[ $STATUS != 0 ]]; dan rm $TGTD$OF &>>$LOGFILE echo "############################### ######" >>$LOGFILE echo "### Er is een fout opgetreden! Back-up is mislukt ###" >>$LOGFILE echo "################ # ########################" >>$LOGFILE echo "$(datum +"%d-%b-%Y %R% nFile ") $OF back-up niet gemaakt" | sendxmpp -t -f /usr/local/etc/XMPP_settings receiver_login@domain &>>$LOGFILE else echo "Back-upbestand opgeslagen als \"$TGTD$OF\"" >>$LOGFILE echo "Back-up succesvol voltooid op $(datum +"%R %d-%b-%Y")!" >>$LOGFILE echo "Aankoppelen van het bestandssysteem voor het back-uparchief $TGTD_archive" >>$LOGFILE mount $TGTD2 &>>$LOGFILE if [[ $? != 0 ]]; echo dan "####################################### #############" >>$LOGFILE echo "### Er is een fout opgetreden tijdens het koppelen van de back-upbron ###" >>$LOGFILE echo "######## ## ######################################## ## #" >>$LOGFILE echo "$(date +"%d-%b-%Y %R%nFile") van de back-up $OF is niet gekopieerd naar de back-upbron" | sendxmpp -t -f /usr/local/etc/XMPP_settings receiver_login@domain &>>$LOGFILE exit fi echo "Bestand kopiëren naar back-upbron gestart" >>$LOGFILE cp -f $TGTD$OF $TGTD_archive$OF &>> $LOGFILE als [[ $? != 0 ]]; echo dan "####################################### #############" >>$LOGFILE echo "### Er is een fout opgetreden tijdens het kopiëren naar de back-upbron ###" >>$LOGFILE echo "####### ## ######################################## ## ##" >>$LOGFILE echo "$(datum +"%d-%b-%Y %R%nFile") van back-up $OF niet gekopieerd naar back-upbron" | sendxmpp -t -f /usr/local/etc/XMPP_settings receiver_login@domain &>>$LOGFILE else echo "Het kopiëren van bestanden is succesvol voltooid op $(datum +"%R %d-%b-%Y")!" >>$LOGFILE echo "Bestand gekopieerd als \"$TGTD_archive$OF\"" >>$LOGFILE fi echo "Het bestandssysteem voor het back-uparchief $TGTD_archive ontkoppelen" >>$LOGFILE umount $TGTD2 &>>$LOGFILE echo " Alle operaties zijn succesvol afgerond!" >>$LOGFILE fi tail -n 300 $LOGFILE >/tmp/unique_fantastic_filename.tmp mv -f /tmp/unique_fantastic_filename.tmp $LOGFILE exit

Bedankt allemaal voor jullie aandacht!

De back-up moet zodanig zijn dat u op elk moment van host kunt wisselen en er naartoe kunt verhuizen nieuwe server. Daarom moet het hele proces van het maken van archieven worden geautomatiseerd. En back-upbestanden moeten op een veilige plaats worden opgeslagen, waar ze 24 uur per dag toegang hebben, waar ook ter wereld.

Ik publiceer een andere oplossing voor het maken van een back-up van een webserver. Dit bash-script creëert een enkel archief van de database en alle sitebestanden. Voor het gemak worden de 30 meest recente back-ups lokaal op de schijf opgeslagen. En voor de betrouwbaarheid worden er back-uparchieven op geplaatst cloud-opslag Yandex.Schijf.
Er zijn tal van vergelijkbare oplossingen op internet te vinden. Maar dit script weerspiegelt het meest volledig mijn visie op het maken van back-ups van webservers.

Basisprincipes van back-up

We maken archieven met behulp van ingebouwde besturingssysteemtools om het proces van het maken van een archief te vergemakkelijken en indien nodig het herstel van de site op een nieuwe server te versnellen.
We gebruiken archiefformaten waarmee u alle kenmerken van bestanden en mappen kunt opslaan. Om te krijgen exacte kopie locatie op een nieuwe locatie.
We archiveren en comprimeren de database en de webservermap met alle bestanden afzonderlijk. En dan combineren we ze tot één archief zonder compressie. Voor het gemak vormen wij de archiefnaam op basis van de domeinnaam en de datum van creatie.
Laten we ons organiseren lokale opslag uit de laatste 30 archiefexemplaren. Om de site terug te kunnen draaien naar vorige staat in het geval dat onvoorziene situaties. Bijvoorbeeld als u besmet bent met virussen. Of mislukte update CMS.
We organiseren onafhankelijke back-upopslag in de Yandex.Disk-cloudopslag en uploaden onze archieven daar.

BASH-script voor het maken van back-ups van sitebestanden en MySQL-database

#!/bin/bash # #ver 1.0 #2013-09-09 # #Databasevariabelen DBHOST="localhost" #Address MySQL-servers DBUSER="bd_user" #Database gebruikersnaam DBPASS="dBpAsS" #Database gebruikerswachtwoord DBNAME="db_name" #Database naam DBARC=$DBNAME.sql.gz #Database archiefnaam # #Variables WEBDAV WEBDAVURL="https ://webdav .yandex.ru/backup/" #Yandex.Schijfadres. De map moet bestaan! WEBDAVUSER = " [e-mailadres beveiligd]" #Gebruikersnaam van Yandex.Disk (Yandex.Mail) WEBDAVPASS="MyPasWordAtYandexMail" #Wachtwoord van Yandex.Disk # #Sitevariabelen SCRIPTDIR="/home/serveruser/backup/" #Absoluut pad vanaf waar het script wordt gestart en waar SCRDIR archieven worden opgeslagen ="/home/serveruser/web/mydomain.com/public_html/" #Absoluut pad naar de site vanaf de hoofdmap van de schijf SCREXCLUDE="webstat" #Wat wordt niet opgenomen in het archief SCRARC="public_html. tar.gz" #Naam van het archief met sitebestanden # #Backup Variabelen ARCNAME="mijndomein.com"=$(date "+%F(%H:%M)")".tar" #Naam van de siteback-up ARCMAX="30" #Aantal bestanden in lokale opslag # # Laten we naar gaan hoofdmap webserver cd $SCRDIR # #Create bestandsarchief houd bij compressie rekening met uitzonderingen tar cfz $SCRIPTDIR$SCRARC --exclude=$SCREXCLUDE * # #Ga terug naar de map met het script, waar alle archieven zich bevinden cd $SCRIPTDIR # #Archiveer de database met compressie mysqldump -h$DBHOST -u$DBUSER - p$DBPASS $DBNAME | gzip > $DBARC # #Combineer het bestandsarchief en de databasedump, nu zonder compressie tar cf $SCRIPTDIR$ARCNAME $SCRARC $DBARC # #Stuur het resultaat naar Yandex.Disk curl --user $WEBDAVUSER:$WEBDAVPASS -T $ARCNAME $ WEBDAVURL # #Verwijder tussenliggende archieven rm *.gz # #Verwijder oude exemplaren van de site, laat verschillende nieuwe exemplaren achter ls -t *.tar | staart -n+$ARCMAX | xargs rm-f

Laten we nu het script stukje bij beetje bekijken. Alles is duidelijk met de variabelen die aan het begin van het script zijn opgegeven. Ik probeerde de vliegen zoveel mogelijk van de schnitzels te scheiden en gaf commentaar op alles wat nodig was.
Laten we verder gaan met het uitvoerbare deel van het script.

Hoe u een archief van sitebestanden kunt maken

In de regel zijn er geen problemen met het maken van een archief. Het belangrijkste is om niet te verwarren met absoluut en relatieve paden. Om zeker te zijn wat u archiveert en waar u het archiveert.
Om compleet te voorkomen absolute paden Ga in het archief eerst naar de hoofdmap van de site.

Ik vind het niet zo leuk, je opent het archief en er is een map thuis, je gaat erin, en er is er nog eentje, je gaat erin, gevolgd door de volgende, enzovoort, kortom een ​​nestpop. Je zult uitgeput zijn als je bij de inhoud probeert te komen.
Laten we daarom, voordat we het archief maken, de opdracht uitvoeren:

Cd$SCRDIR

Vervolgens bevat het archief onmiddellijk de inhoud van de hoofdmap van de site, zonder mappen en submappen. Iets als dit:


Als u bestanden heeft die niet in de back-up van de site hoeven te staan, is dit voor mij de map webstat, dan moet u de parameter --exclude configureren.

Lees meer over alle opties teer Je kunt het lezen in de officiële handleiding.

Een back-up maken van een MySQL-database

Om een ​​databasedump te verkrijgen, hebben we er toegangsparameters voor nodig. Ze worden allemaal beschreven in scriptvariabelen en zouden geen problemen moeten veroorzaken. Om de bestandsgrootte te verkleinen, comprimeert u de uitvoer van het hulpprogramma mysqldump. Ik gebruik gzip, die standaard aanwezig is in *NIXs.
Als u een oude gebruikt MySQL-versie servers, tot 4.1, en op grote databases kan de parameter nuttig zijn --snel. Het gebruik hiervan vertelt het commando mysqldump Schrijf onmiddellijk een databasedump naar schijf, in plaats van deze in het geheugen op te slaan. Meer nieuwste versies deze optie is standaard ingeschakeld.

Back-upbestand voor één site

Om de oplossing elegant te maken, combineren we twee archieven met sitebestanden en een databasedump in één archief. Alleen nu zonder compressie, aangezien we ze eerder allemaal hebben doorstaan gzip.
Voor het gemak zal de bestandsnaam bestaan ​​uit de naam van het gebruikte domein en het tijdstip van aanmaak.

Hoe u een back-up van een website opslaat in Yandex.Disk

Yandex.Disk hoeft niet noodzakelijkerwijs als cloudopslag te fungeren. U kunt bijvoorbeeld Microsoft SkyDrive of een andere dienst gebruiken die het WebDAV-protocol gebruikt voor toegang.

Hoe u oude kopieën van bestanden kunt verwijderen en de laatste paar kunt behouden

Aan het einde van het script zullen we verwijderen onnodige bestanden, dit zijn bestandsarchieven en databases en we zullen het aantal beperken archiefkopieën plaats.
We zullen zoeken naar verouderde back-upkopieën en deze indien aanwezig verwijderen. De volgende code is hiervoor verantwoordelijk:

Ls -t *.tar | staart -n+$MAXARC | xargs rm-f

Hoe werkt dit? Op bevel ls archieven worden doorzocht (bestanden met de extensie teer), wordt de uitvoer gegenereerd op basis van het tijdstip waarop het bestand is gemaakt. Volgende opdracht staart filtert de lijst door de eerste 30 eruit te verwijderen. En de rest wordt overgedragen aan het team rm voor verwijdering. Parameter F Het dient voor “stilte” als er niets te verwijderen valt. Dit gebeurt wanneer u net bent begonnen met het verzamelen van back-ups en hun aantal de waarde van de variabele niet overschrijdt $MAXARC.
Om eerlijk te zijn, zullen na het uitvoeren van deze opdracht slechts 29 back-upkopieën “live” blijven.

Een back-upscript uitvoeren

We bewaren bijvoorbeeld het script backup.sh. En we kennen er uitvoeringsrechten aan toe:

#chmod +x backup.sh

De handigste manier is om CRON te gebruiken om een ​​script volgens een schema uit te voeren. Eén keer per dag maak ik back-ups tijdens de daluren, dat wil zeggen in de tweede helft van de nacht in de ochtend.
Vergeet de eigenaren van mappen en bestanden niet wanneer we het script uitvoeren voor uitvoering. De bestanden van gebruiker VASYA zijn immers niet toegankelijk als u het script uitvoert als gebruiker PETYA.

Resultaten van het back-upscript


Elke dag om 6 uur 's ochtends wordt er een back-up van de site gemaakt op de server (bestanden plus database) en verzonden naar de Yandex.Disk-cloudopslag.
Bij het schrijven van dit artikel fungeerde de echte server waarop deze blog draait als testsite. De server gebruikt CentOS 6.4 met alle updates van begin september 2013.
Opmerkingen en suggesties over de werking van het script zijn welkom. Er zijn plannen om een ​​limiet te implementeren op het aantal back-upkopieën, niet alleen op de server, maar ook in de Yandex.Disk-cloud. In de tussentijd moeten archieven die zich in de loop van de tijd hebben verzameld, handmatig worden opgeruimd.