Szeretném kideríteni, hogy a MySQL a fájlrendszeren hol tárolja az adatait, illetve milyen fájlokat használ.
Egészen pontosan azt szeretném megtudni, hogy egy adatbázis módosításakor mely fájlokban (azaz táblákban) történt változás.
Erre azt találtam ki, hogy beugrom a /var/lib/mysql/adatbázisnév-be, nyomok neki egy MD5sum-ot, és szépen kiadja nekem a diff a különbséget.
De nem így történt :)
Miután a szerver elvégzett egy halom INSERT, UPDATE, SELECT parancsot, az összes fájlnak ugyanaz maradt az MD5 és az SHA1 összege is. Sőt, még a módosítási dátum is vagy két hónappal korábbi volt.
Gondoltam, hogy valahol máshol tárolja az adatokat, ezért elkezdtem kutakodni a mysql* programok között, és lefuttattam egy optimalizációt (mysqlcheck -Aovp -u root). Erre meg az összes, ott lévő fájl módosítási dátuma átállt mára.
Szerver újraindít, hátha akkor kiír valamit (ha már két hónapig nem tette), de semmi haszna.
Tudja valaki, hogyan lehet egyszerűen megnézni, melyik táblák/fájlok változtak egy oldalletöltés/etc hatására?
- 2069 megtekintés
Hozzászólások
Az /etc/mysql/my.cnf -ban a datadir= bejegyzés tartalmazza az adatbázisok helyét.
- A hozzászóláshoz be kell jelentkezni
Tudja valaki, hogyan lehet egyszerűen megnézni, melyik táblák/fájlok változtak egy oldalletöltés/etc hatására?
Belekukkantasz a php forrásba és megnézed mit használ. Vagy logoltatod a mysql -t egy fájlba (nagy terhelés mellett erős perfomancia visszaeséssel járhat!!), majd megnézed a logfájlt.
___________________________________________________________________
Lógnak a pálmafán a kókuszok .... :)
http://laszlo.co.hu/
- A hozzászóláshoz be kell jelentkezni
mysql> show variables like 'datadir';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| datadir | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.00 sec)
Amugy ha a valtozasok erdekelnek akkor erdemesebb a dblayer-rel logoltatni (mar ha van, ha nincs akkor van vmi php extension amivel felul tudod definialni a php default fuggvenyeit es irhatsz wrappert hozza).
- A hozzászóláshoz be kell jelentkezni
A halom dml után tolj egy flush tables -t, doksi szerint (:D) ez a buffereket kiiratja a vinyora. A mysql is jelentos belso bufferezessel megy(!=== mysql query cache!!), de lehet, hogy csak ugyesen a modify date-et allitgatja :D:D
--
"SzAM-7 -es, tudjátok amivel a Mirage-okat szokták lelőni" - Robi.
- A hozzászóláshoz be kell jelentkezni
Írta, hogy újraindíttta a mysql szervert. Akkor ugye a bufferek a lemezre íródnak.
___________________________________________________________________
Lógnak a pálmafán a kókuszok .... :)
http://laszlo.co.hu/
- A hozzászóláshoz be kell jelentkezni
Köszönöm szépen a javaslatokat, kipróbáltam mindent:
/etc/mysql/my.cnf-ben nem volt datadir változó, de a "SHOW VARIABLES LIKE 'datadir';" parancsra valóban a /var/lib/mysql választ kaptam.
A "FLUSH tables;" azt írta, hogy 0 rows affected, és ezután sem volt MD5 változás.
A megoldás úgy érzem, az lesz, hogy a my.cnf fájlba beviszem a "log=/var/lib/mysqld.log" sort, és így minden query-t naplóz, addig, amíg meg nem találom, hogy mik kellenek nekem pontosan.
Szóval a probléma megoldva, köszönöm még egyszer.
Bár azt nem értem, hogy hogy ír a fájlokba úgy, hogy nem változik az MD5 összeg sem, sem pedig a módosítási dátum.
- A hozzászóláshoz be kell jelentkezni
Esetleg InnoDB, es nem MyISAM a storage engine? Akkor /var/lib/mysql/ibdata*
- A hozzászóláshoz be kell jelentkezni
Ott a pont :)
Eddig bele sem gondoltam, hogy ez különbség lehet, de valóban ezért nem módosul a többi tábla.
Az InnoDB az ibdata* fájlban tárolja a dolgait.
A könyvtárban pedig csak *.frm fájlok vannak, így azért nem változtak a különböző SQL utasítások hatására, mivel csak leíró szerepük van.
Na, ma is tanultam valamit :)
- A hozzászóláshoz be kell jelentkezni
information_schema db TABLES tablaja nem pont erre valo?
irja, hogy melyik tabla mikor jott letre, mikor modosult, satobbi.
en ebben a db-ben neznek korul.
Tyrael
- A hozzászóláshoz be kell jelentkezni
Erről eddig nem is tudtam, de megnéztem, természetesen.
Az eredmény:
Azon a táblának oszlopai (CREATE_TIME, UPDATE_TIME, CHECK_TIME), amiben biztosan van változás, mind NULL-al vannak kitöltve. Kivéve az elsőt, mivel ott az ellenőrzés ideje van beírva (ami a CHECK_TIME-ban kéne, hogy szerepeljen).
- A hozzászóláshoz be kell jelentkezni
akkor lehet, hogy a mysql server configjaban kell bekapcsolni ezt a fajta naplozast.
Tyrael
- A hozzászóláshoz be kell jelentkezni