MySQL Backup

Că sunt un backup freak este știut. Am două hdd-uri puse în RAID 1 (adică aceeași informație este scrisă pe ambele hdd-uri) iar fișierele importante sunt salvate pe Dropbox, Crashplan și Amazon S3 cel puțin o dată pe zi. În plus, folosesc version control (Git) pentru proiectele la care lucrez.

Azi mi-a venit următoarea idee: ce-ar fi dacă aș pune și tot ce ține de mysql sub Git? La o adică, nu de puține ori mi s-a întâmplat să dau drop la ce nu trebuie, iar toate modificările făcute de la ultimul backup erau pierdute. Deci a trebuit să găsesc o modalitate.

Ai nevoie doar de Git (full installer). La momentul scrierii acestui articol, ultima versiune este Git-1.7.4-preview20110204.exe. Știu că Git poate fi folosit și din cygwin, dar bash-skill-ul meu este destul de low… :D

Este esențial să faci următoarea setare:

În rest next, next, next, next… :D

Cum eu folosesc Xammp, fișierele ce țin de mysql sunt ținute aici: C:\xampp\mysql\data. Prin urmare fie apeși win+r și tastezi cmd, fie apeși shift și faci click dreapta pe folderul data și alegi open command window here, după care îi dai un git init, pentru a inițializa repository local.

Dacă ai deja multe baze de date, toată treaba asta s-ar putea să dureze câteva secunde/minute. La cele ~50 DB ale mele (~4500 fișiere și ~ 300Mb) a durat în jur de cinci secunde (SSD FTW!).

După ce ai făcut toată șmecheria asta, dacă vrei să faci backup remote (pe un server de Git), acum ar fi momentul să adaugi un server:

git remote add origin remote_git_server_url

Dacă nu… Nu.

Automatizarea

Nu cred că vrei să rulezi manual câte un commit, nu? Cel puțin eu nu vreau. Prin urmare, Task Scheduler face o treabă excelentă! Facem un fișier, să-i zicem … backup.bat. Îl punem în același director cu datele mysql, să nu îl rătăcim sau să uităm de el și scriem în el următoarele:

@echo off
call git add .
call git commit -a -m "%DATE% %TIME%"
call git push origin master

Dacă ai ales varianta mai… ieftină (adică fără server), ultima linie este inutilă (și generatoare de erori!).

După ce ai făcut fișierul-minune, apeși iar win+r și scrii: taskschd.msc. Din meniul ferestrei apărute din neant alegi action->create basic task:

Apoi urmezi pașii:

În următoarea fereastră alegi cât de des vrei să ruleze toată povestea:

Eu am ales o oră. Ajustezi în funcție de necesități. De asemenea, alegi cât timp să ruleze un backup. Până acum nu am întâlnit vreun repo de git care să nu termine treaba în mai puțin de cinci minute. Dacă ai un server ceva mai lent, poate că ar fi bine să lași un timp de execuție mai mare.

Serverul

Dacă ești un pic paranoic (nu că aș fi!) și vrei să salvezi și pe un server remote, poți alege fie un cont plătit pe GitHub (pleacă de la 12$/lună un cont ce-l poți folosi la mai multe proiecte), fie un VPS configurat pentru a fi (și) server de Git. Eu am optat pentru cea de-a doua variantă, un VPS la MX Host din mai multe motive, unul dintre ele fiind viteză (2-3Mb/sec upload și 10-11Mb/sec download; comparativ, github nu sare de 500kb/sec).

Update

Pentru a face backup.bat să ruleze invizibil, faci încă un fișier, lângă backup.bat, pe care îl botezi backup.vbs, în care pui următoarea poveste:

Set WshShell = CreateObject("WScript.Shell")
WshShell.Run chr(34) & "C:\xampp\mysql\data\backup.bat" & Chr(34), 0
Set WshShell = Nothing

Evident, schimbi în Task Scheduler programul pe care îl vrei apelat.

6 Comentarii to “MySQL Backup”

  1. Saaau, poti sa activezi Mysql Binlogs si ai grija sa fie resetate cand faci un backup. Astfel, daca dai din greseala drop la ceva, stergi inregistrari sau whatever, rulezi mysqlbinlog pe log-urile cu pricina ca sa obtii un dump SQL cu toate modificarile. Editezi dump-ul si stergi comenzile gresite. Apoi restaurezi ultimul backup + dump-ul obtinut din binlogs.

    Bafta!

  2. Staicu Ionuț-Bogdan

    Sau așa :D
    Nu sunt în relații foarte bune cu „mațele” mysql. Am folosit soluția care mi s-a părut cea mai la îndemână.

  3. Zmanda ai incercat ?
    zmanda.com/backup-mysql.html

  4. Staicu Ionuț-Bogdan

    well… nu. Din două motive:
    1) nu știam că există așa ceva (a durat vreo cinci minute până am făcut toată povestea de mai sus; un tool nou presupune și să înțeleg cum funcționează)
    2) nu merge pe windows :D

  5. Nu am citit foarte atent articolul dar din cate am inteles tu faci backup la fisierele MYD si MYI.
    Nu am observat inca mentiunea ca mysql server sa fie oprit sau sa se execute FLUSH TABLES si apoi un LOCK.
    Daca nu faci asta e foarte posibil ca acele fisiere sa fie corupte si deci inutile.
    (Exact asa a “murit” situl Ma.gnolia)

  6. Staicu Ionuț-Bogdan

    @Ruslan: da, se face backup la acele fișiere. Mulțumesc pentru pont, voi face ajustări (sau voi încerca și soluția propusă de Mihai).

Show trackbacks

Ți-a plăcut articolul? Lasă un comentariu!

You can insert code snippets using BBcode:
[js].[/js] [html].[/html] [php].[/php] [css].[/css]
You can also use some HTML tags:
<blockquote>.</blockquote> <code>.</code> <a href="">.</a> <strong>.</strong> <em>.</em>