sql >> Databáze >  >> RDS >> Mysql

Jak získat struktury tabulek ze souboru .frm pomocí PHP?

Ano, je možné obnovit alespoň část informací. (Ve prospěch ostatních čtenářů si autor otázky již uvědomuje, že existují jednodušší způsoby, jak získat metadata sloupce).

Problém je v tom, že soubory .frm nejsou tak dobře zdokumentovány, protože jakákoli potřeba je dešifrovat obecnou komunitou je velmi vzácná. Také formát souborů se může lišit v závislosti na operačním systému.

Nicméně prohlížením souborů pomocí hexdump nebo podobného nástroje můžete částečně vidět, co se děje. Pak byste měli být lépe informováni o čtení souborů v programu PHP a dekódování nezpracovaných binárních dat.

Udělal jsem to jako cvičení před časem a podařilo se mi obnovit počet sloupců, názvy sloupců a typy sloupců.

Níže je ukázka, která ukazuje, jak extrahovat názvy sloupců. Můj .frm byl pro názvy tabulek „stop“, ale můžete je nahradit vlastním .frm.

<?php
$fileName = "stops.frm";

// read file into an array of char
//---------------------------------
$handle = fopen($fileName, "rb");
$contents = fread($handle, filesize($fileName));
fclose($handle);
$fileSize=strlen($contents);  // save the filesize fot later printing

// locate the column data near the end of the file
//-------------------------------------------------
$index = 6;    // location of io_size
$io_size_lo = ord($contents[$index]);  
$io_size_hi = ord($contents[$index+1]);
$io_size = $io_size_hi *0x100 + $io_size_lo; // read IO_SIZE

$index = 10;  // location of record length
$rec_len_lo = ord($contents[$index]);
$rec_len_hi = ord($contents[$index+1]);
$rec_len = $rec_len_hi * 0x100 + $rec_len_lo; // read rec_length

// this formula uses io_size and rec_length to get to column data
$colIndex = ( (  (($io_size + $rec_len)/$io_size)   + 1) * $io_size ) + 258;
$colIndex -= 0x3000;   // this is not documented but seems to work!

// find number of columns in the table
//------------------------------------------------- 
echo PHP_EOL."Col data at 0x".dechex($colIndex).PHP_EOL;
$numCols = ord($contents[$colIndex]);

//Extract the column names
//--------------------------------------
$colNameIndex = $colIndex+0x50;   //0X50 by inspection
echo "Col names at 0x".dechex($colNameIndex).PHP_EOL;
$cols=array();
for ($col = 0; $col < $numCols; $col++){
    $nameLen = ord($contents[$colNameIndex++]);          // name length is at ist posn
    $cols[]['ColumnName']= substr($contents,$colNameIndex,$nameLen-1); // read the name
    $colNameIndex+=$nameLen+2;        // skip ahead to next name (2 byte gap after \0)
}
print_r($cols);

Tohle by vás mělo nastartovat. Pokud si myslíte, že to jde správným směrem, doplním to, až budu mít v nadcházejících dnech čas.

UPRAVIT. Aktualizoval jsem kód, takže by měl fungovat pro jakýkoli soubor .frm (z tabulky). Určitě existuje bezplatný nástroj pro obnovu mySQL (založený na enginu innoDB) dostupný na https:/ /github.com/twindb/undrop-for-innodb . Po přečtení kódu a souvisejících blogů nepoužívají k obnově soubory .FRM. Stejné informace o tabulce jsou také uloženy ve slovníku innoDB a používají je k obnově formátů tabulek atd.

Existuje také způsob, jak číst obsah souborů .FRM. Toto je popsáno zde https://twindb.com /how-to-recover-table-structure-from-frm-files-online/ . Používají však mySQL ke čtení souborů .frm a vytváření tabulek odtud.

Existuje také nástroj, balíček nástrojů, který najdete zde https://www .mysql.com/why-mysql/presentations/mysql-utilities/ který obsahuje čtečku .frm. Toto vytvořila společnost Oracle, která jako jediní znají formát souborů .frm! Nástroj je zdarma, takže si ho můžete stáhnout.

Společnost Oracle zveřejnila některé informace o formátu souborů .frm https://dev.mysql.com/doc/internals/en/frm-file-format.html , ale je neúplný a nesprávný! Viz tato předchozí otázka o zásobníku.https://dba.stackexchange.com/questions/208198/mysql-frm-file-format-how-to-extract-column-info

Nyní po tom všem, pokud se stále chcete pokusit analyzovat soubory .frm sami pro zábavu nebo pro učení, musíte být trpěliví a věnovat čas rozkrývání poměrně komplikované struktury. Pokud to chcete zkoušet dál, je to v pořádku, ale pošlete mi svůj soubor .FRM (na adresu ldatex3f3333 .com ), abych to mohl zkontrolovat a za pár dní vám pošlu nějaký PHP kód, který vytáhne nějaké další informace, jako je datový typ a velikosti zobrazení.




  1. Porozumění transakcím pdo mysql

  2. Replikace a spouštěče MySQL

  3. LOAD DATA není povoleno v uložených procedurách

  4. Získejte počet záznamů ovlivněných INSERT nebo UPDATE v PostgreSQL