Înapoi la blogToate tutorialele Metin2
Tutoriale Metin2 · Lecția 88 din 99

Compilarea programului db din sursa Metin2, pas cu pas

2 noiembrie 2026 5 min de citit

Programul `db` e „casierul” serverului: primește de la `game` tot ce se schimbă la personaje (iteme, nivel, yang) și scrie în MySQL. Dacă `db` se comportă greșit, poți pierde progresul jucătorilor. De aceea îl compilezi separat, pe serverul de test, și îl verifici atent înainte să ajungă pe live. Vestea bună: e mai mic decât `game` și se compilează repede, deci e un exercițiu bun de început.

Pe scurt: după ce ai compilat librăriile, intri în db/src, citești Makefile-ul, rulezi gmake, verifici fișierul rezultat cu file și ldd, apoi îl încerci pe serverul de test cu login, personaje, iteme și relogare.

Nivel: Avansat. Ce trebuie să știi înainte: mediul de compilare pregătit (inclusiv DBDIR schimbat spre un folder separat) și librăriile compilate.

Cuvinte pe care le vei întâlni

CuvântCe înseamnă
Link (legare)Ultimul pas al compilării: toate bucățile .o și librăriile .a sunt lipite într-un singur program.
lddComandă care arată de ce librării ale sistemului are nevoie un program ca să pornească.
SHA-256O „amprentă” a unui fișier. Dacă se schimbă un singur bit, amprenta e alta.
CacheMemorie de lucru. db ține datele personajelor în memorie și le salvează periodic.

Pasul 1: Citește rețeta lui db

sh
cd /usr/home/sursa/db/src
grep -n "^CC\|^CFLAGS\|^LIBS\|^DBDIR\|^TARGET" Makefile

În sursa pe care am verificat-o, ce contează:

RândCe înseamnă
CC = clang++-develCompilatorul folosit (vezi lecția despre mediu).
LIBS = -lthecore -lmysqlclient -lsql -lpoly -lgame -lm -lzdb folosește patru din librăriile compilate deja, plus clientul MySQL din etc/.
TARGET = $(BINDIR)/dbProgramul se numește db și apare întâi în folderul db/.
DBDIR = ...Folderul în care e mutat la final. Trebuie să fie /usr/home/build, nu serverul pornit.

Verifică încă o dată rândul DBDIR. Dacă arată spre share/bin-ul unui server pornit, schimbă-l acum.

Pasul 2: Vezi ce va face, fără să facă

sh
gmake -n | head -20

-n înseamnă „arată-mi comenzile, dar nu le rula”. head -20 arată doar primele 20 de rânduri. E un fel de previzualizare: vezi dacă apar căile și compilatorul la care te aștepți.

Pasul 3: Compilează

sh
touch Depend
gmake dep
gmake clean
gmake 2>&1 | tee /usr/home/build/db-build.log

Sunt aceiași pași ca la librării: dependențe, curățare, compilare cu log salvat.

Ce ar trebui să vezi: câte un rând compile ...cpp pentru fiecare fișier, apoi:

text
linking ../db....
Moving ../db to /usr/home/build
All done! Your db file moved to your server directory.

Mesajul de final e scris în Makefile și spune „mutat în folderul serverului”. La tine, după pasul din lecția despre mediu, „folderul serverului” e de fapt /usr/home/build. Bine că e așa.

Pasul 4: Verifică programul rezultat

sh
cd /usr/home/build
file db
ldd db
sha256 db
  • file trebuie să arate aceeași arhitectură ca vechiul db (în pachetul verificat, ELF 32-bit ... Intel i386).
  • ldd arată librăriile de sistem. Dacă vreuna apare cu not found, programul nu va porni.
  • sha256 îți dă amprenta. Scrie-o în jurnalul tău de modificări, împreună cu data și ce sursă ai folosit.

Redenumește fișierul ca să știi ce e:

sh
mv db db-2026-11-02-test

Pasul 5: Testează pe serverul de test

  1. Oprește serverul de test cu scriptul lui (în pachetul verificat, close.sh). Detalii în oprire și restart.
  2. Din folderul serverului de test (de exemplu /usr/home/game), fă copie la vechiul db: cp -p share/bin/db share/bin/db.bak-2026-11-02.
  3. Copiază /usr/home/build/db-2026-11-02-test peste share/bin/db și pune aceleași permisiuni ca înainte (le vezi cu ls -l pe copie).
  4. Pornește întâi MySQL și așteaptă să fie gata, apoi db, apoi restul. Un db pornit înainte ca MySQL să termine de încărcat poate cădea imediat.
  5. Citește syserr din folderul db.

Apoi, în joc, cu un cont de test: intri, alegi personajul, muți un item, iei yang, ieși, intri din nou. Itemul și yang-ul trebuie să fie acolo.

Ce ar trebui să vezi: syserr gol sau fără erori noi, iar personajul exact cum l-ai lăsat după relogare.

Ce nu facem

  • Nu înlocuim db pe live cât timp rulează. Datele din memoria lui s-ar pierde.
  • Nu schimbăm în același timp și structura tabelelor MySQL. O schimbare o dată.
  • Nu combinăm un db dintr-o sursă cu un game din altă sursă. Cele două vorbesc între ele prin mesaje definite în folderul common/. Dacă diferă, apar erori ciudate sau date stricate.

Greșeli des întâlnite

  • Uiți de DBDIR și compilarea îți mută programul direct peste serverul pornit.
  • Testezi doar că pornește. Un db poate porni și totuși să salveze greșit. Testează relogarea.
  • Nu notezi amprenta și data. Peste o lună nu mai știi ce versiune rulează.
  • Ștergi vechiul db. Fără el nu mai poți reveni repede.

Întrebări frecvente

De ce nu are db opțiunea -m32 ca game?

În sursa verificată, CFLAGS pentru db nu conține -m32. Pe un sistem i386 nu contează, totul iese pe 32 de biți. Pe un sistem amd64 ar ieși pe 64 de biți. E unul dintre motivele pentru care recomandăm un sistem de test cu aceeași arhitectură ca binarele tale.

Ce fac dacă db cade imediat după pornire?

Revino la copia veche, pornește serverul și analizează pe test. Caută un fișier db.core în folderul db: îl poți citi cu gdb, ca în lecția despre depanarea unui crash.

Trebuie recompilat db când schimb doar game?

Nu, dacă nu ai atins nimic din common/ sau din mesajele dintre ele. Dacă ai atins, compilezi amândouă.

Ce urmează

Mergi la compilarea game. Toate lecțiile sunt în lista tutorialelor Metin2.

Server Metin2 gata de joc

Găzduire Metin2 în România, cu instalare de serverfiles, bază de date MySQL și protecție Anti-DDoS inclusă.

DiscordWhatsApp