2018. június 12., kedd

MySQL adatbázis helyreállítása .frm és .idb fájlokból

Induló szituáció: a MySQL szerver kissé elhamarkodott inaktiválása (új gépre költözés során); az adatbázis kellene, a fájlok meg is maradtak a mappájukban.
Az új gépen új szervert kell telepíteni, aztán az elmentett .frm és .idb fájlokból (Innodb táblákról van szó) helyreállítani az adatbázist.

Ilyenkor a zember körülnéz a keresőben, hiszen mások már valószínűleg próbálkoztak ilyesmivel. Így is lőn, de persze többféle megoldási leírással. Az első, amit kiválasztottam, nem működött. A második némi kiegészítéssel igen. Íme:
A táblák szerkezete a .frm fájlokban található. Innen a mysqlfrm segédprogrammal lehet sql szkriptté alakítani. Ehhez szükséges a mysql-utilities csomag telepített volta. A parancs:
mysqlfrm –server=root:jelszó@localhost –port=3311 “<elérési út>/table.frm” > “<elérési út>/table.sql”A port nem a szerveré; tetszőleges elérhető portszám lehet.
Az új szerveren létre kell hozni az adatbázist. Ezután a fenti úton nyert sql szkriptek futtatásával a táblákat. Minden táblához létrejön egy neve.frm és neve.idb állomány. A következő lépésben az *.idb állományokat ALTER TABLE neve DISCARD TABLESPACE utasításokkal kivonjuk a forgalomból. A helyükre suttyomban bemásoljuk a régi táblák *.idb állományait. Ezekre Linuxban szükséges a tulajdonos és jogosultságok beállítása - a *.frm fájlokról le lehet lesni. A táblák adatait ALTER TABLE neve IMPORT TABLESPACE utasításokkal hozzuk a rendszer tudomására.
Nekem első kísérletre panaszkodott, hogy a row_format eltér. Másodszorra előbb módosítottam a tábla-létrehozó szkripteket, hogy stimmeljen.

A leírtak szerint visszaállított adatbázis a phpMyAdmin-ban minden megjelenítési kísérletre hatalmas hibaözönnel reagált, de ezek mellőzését követően hajlandó volt sql-be exportálódni. Az abból létrehozott újabb példánynak már nem volt efféle bánata. Nem nyomoztam utána, lehet, hogy az volt a hibák forrása, hogy a régi adatbázis Windowsos gépen élt, én pedig Linuxban igyekeztem új életre lehelni.