Toon posts:

[php][tar] backup script traag door massaal aantal bestanden

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een aantal maanden geleden een php scripje geschreven om een backup van een server te draaien.

in feite werkte het redelijk simpel.
Loop elke directorie het systeem af. (min wat niet interesante directories)
en kijk of je een tag bestand ziet staan.

Staat er een tag bestand, parse dan de opties die daar in staan.
(bestanden en/of directories die genegeerd moeten worden, etc..)
en maak een backup van de onderliggende directories.

dit doe ik mogelijk zwaar onefficient door bestand voor bestand toe te voegen aan een tar archief.
Hier is ooit voor gekozen omdat dat gewoon wat meer vrijheid geeft en controle over wat er wel en niet gebackuped word.

Echter is er nu een bepaalde map die gebackuped moet worden die zo'n 4000 directories bevat, met in elke directorie zo'n 5 bestanden.
Goed voor een 20.000 bestanden, en een MB of 670.

Opzich maakt mij dat natuurlijk helemaal geen ruk uit. Maar mijn backup script is er meerdere dagen mee bezig om dat allemaal te verwerken.
Dat is uiteraard niet acceptabel.

Maar toch vraag ik me af waar deze traagheid vandaan komt, want gezamelijk komen alle andere directories die gebackuped worden ook wel aan 20.000 bestanden, en qua grote halen ze het ook wel.

nu heb ik uiteraard een testje gedaan.
als ik de directorie in kwestie gewoon tar via tar czvf bbb bbb.tar.gz dan duurt het al met al maar een paar minuten.

Een mogelijke oplossing is dus gewoon vanaf de backup "tag" de rest met tar afhandelen in combi met --exclude om sommige bestanden niet te backuppen.
Echter ben ik wel bang dat ik wat flexibilitiet verlies dan.

Want het zou zomaar kunnen zijn dat ik bestanden die als volgt genoemt zijn
bestand_van_10gb_01.jpg
bestand_van_10gb_02.jpg

niet wil backuppen, maar dan zou ik ze allemaal specefiek moeten gaan noemen?
Ook kan het voorkomen dat ik b.v. een directorie genaamt belangrijke_bestanden niet wil backuppen.
Maar bestanden die zo heten wel.
Ook die distinctie kan ik dan niet maken.

De vraag is dus eigenlijk vergis ik me qua tar en hoe specefiek je moet en kunt zijn over wat je wel en niet wilt backuppen.
en of meschien iemand weet hoe je de boel wat sneller kan later verlopen als je bestanden 1 voor 1 aan een tar toevoegd.

een soort threaded manier meschien waar ik gewoon de tar commando's allemaal tegelijk op het systeem zijn nek gooi. (moet hij kunnen hebben hoor)

offtopic:
Ja ik snap dat dat niks met threaden te maken heeft, maar kon niet echt een beter woord vinden

  • Wilke
  • Registratie: December 2000
  • Laatst online: 19:49
Laat je script een lijst genereren van alle bestanden die wel gebackuped moeten worden, en tar die in 1 keer?

Zo, dat je niet voor elk bestand tar aanroept met de optie om iets toe te voegen, maar gewoon eerst een lange lijst van filenames bouwt en dan in een keer tegen tar zegt 'maak een archief van de files in deze lijst'.


Heb even zitten zoeken, tar heeft daar een optie voor:

code:
1
2
-T, --files-from F
  get names to extract or create from file F


Verder zou ik als ik jou was dan zeer zeker de '--null' vlag ook gebruiken:

code:
1
2
--null
  -T reads null-terminated names, disable -C


Dit laatste voorkomt een hoop ellende met bestandsnamen met een spatie er in of andere vreemde tekens (bv. een bestand dat '-rf' heet, waar laatst nog zo'n uitgebreid topic over was). Je moet dan de lijst dus ook wel 'null-terminated' genereren. Dus geen newlines tussen de filenames zetten, maar gewoon een null-character (ASCII 0, ik denk dat je dat in PHP gewoon kunt genereren door 'echo "/een/filename/met spaties/enzo.txt\0"' te schrijven - maar check dat even).

[ Voor 54% gewijzigd door Wilke op 03-11-2004 10:55 ]


Verwijderd

Topicstarter
Daar had ik nog helemaal niet aan gedacht/Zo had ik het helmaal nog niet bekeken.

Daar ga ik meteen eens mee experiementeren :)

  • Sendy
  • Registratie: September 2001
  • Niet online
find kan een lijst genereren die null-terminated is. Je kan dan find de file laten vinden, deze in een bestand wegschrijven en daarna tarren(, of direct naar tar pipen) Ik zou geen php gaan gebruiken ;)

  • Wilke
  • Registratie: December 2000
  • Laatst online: 19:49
Ja find kan dat...maar als je bezig bent met allemaal geavanceerde opties en dergelijke (configuratiebestanden in directories etc.), dat kan find natuurlijk niet (zelfde probleem als met de --exclude-dinges van tar).

Waarom zou je zoiets niet in PHP maken? Kan prima denk ik.


Btw. de reden dat je het via een file moet doen (dus met -T) en niet via de commandline, is dat de commandline maar 10k argumenten mag hebben (misschien verschilt dat zelfs per shell - waarschijnlijk, zelfs). Bovendien krijg je dan dus allerlei ellende omdat de shell speciale tekens (*, - etc.) gaat interpreteren terwijl je dat niet wilt. Daarom is het veel verstandiger dit via een file te doen.

Het is goed mogelijk dat je als optie voor '-T' gewoon de stdin kunt gebruiken. Dus dat je het zo maakt:

code:
1
phpscript_dat_lijst_genereert | tar cfz backup.tgz --null -T -


Waarbij dat phpscript dus gewoon naar standaard-uitvoer schrijft (dus domweg echo "$eenfilenaam\0" in een lusje, met jouw eigen geavanceerde checks/opties uiteraard). PHP lijkt me daarvoor prima te gebruiken.

[ Voor 60% gewijzigd door Wilke op 03-11-2004 11:29 ]


Verwijderd

Topicstarter
klopt, was niet echt aan de orde voor het probleem.
Maar er kunnen ook nog extra data bronnen bij een directorie horen die ook gebackuped moeten worden.

b.v. meerdere mysql databases, of tabellen etc..

verder is de overhead van php, qua cpu gebruik, geheugen gebruik nihil.
Pagina: 1