Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да получите структури на таблици от .frm файл с помощта на PHP?

Да, възможно е да се възстанови поне част от информацията. (В полза на други читатели, авторът на въпроса вече е наясно, че има по-лесни начини за получаване на метаданни на колоната).

Предизвикателството е, че .frm файловете не са толкова добре документирани, защото всяка нужда от дешифрирането им от широката общност е доста рядка. Също така форматът на файловете може да варира в зависимост от операционната система.

Въпреки това, като преглеждате файловете с hexdump или подобна помощна програма, можете да видите отчасти какво се случва. Тогава сте по-добре информирани да прочетете файловете в PHP програма и да декодирате необработените двоични данни.

Направих това като упражнение преди известно време и успях да възстановя брой колони, имена на колони и типове колони.

По-долу е дадена проба, която показва как да извлечете имена на колони. Моят .frm беше за имена на таблица "стоп", но можете да замените свой собствен .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);

Това трябва да ви помогне да започнете. Ще добавя към това, когато имам време през следващите дни, ако смятате, че се движите в правилната посока.

РЕДАКТИРАНЕ. Актуализирах кода, така че трябва да работи за всеки .frm файл (от таблицата). Със сигурност има безплатен инструмент за възстановяване на mySQL (базиран на innoDB двигателя), наличен на https:/ /github.com/twindb/undrop-for-innodb . След като са прочели кода и свързаните блогове, те не използват .FRM файловете за възстановяване. Същата информация за таблицата се съхранява и в речника innoDB и те я използват за възстановяване на формати на таблици и т.н.

Има и начин да прочетете съдържанието на .FRM файловете. Това е описано тук https://twindb.com /how-to-recover-table-structure-from-frm-files-online/ . Те обаче използват mySQL, за да четат .frm файловете и да пресъздават таблици от там.

Има и помощна програма, пакет от помощни програми, намерен тук https://www .mysql.com/why-mysql/presentations/mysql-utilities/ който съдържа четец на .frm. Това е направено от Oracle, които са единствените хора, които знаят формата на .frm файловете! Помощната програма е безплатна, така че можете да я изтеглите.

Oracle публикува известна информация за формата на .frm файлове https://dev.mysql.com/doc/internals/en/frm-file-format.html , но е и непълен, и неправилен! Вижте този предишен въпрос за стека.https://dba.stackexchange.com/questions/208198/mysql-frm-file-format-how-to-extract-column-info

Сега, след всичко това, ако все пак искате да опитате сами да анализирате .frm файловете за забавление или за учене, тогава трябва да бъдете търпеливи и да отделите време за разкриване на доста сложна структура. Ако искате да продължите да опитвате, това е наред, но ми изпратете вашия .FRM файл (до

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Предупреждение:mysqli_connect():(HY000/1045):Достъпът е отказан за потребител 'root'@'localhost' (използвайки парола:НЕ)

  2. Как да обедините две mySQL база данни в една?

  3. Проблеми със синтаксиса на локалния файл за зареждане на mysql със зададени полета

  4. JDBC PreparedStatement води до синтактична грешка на MySQL

  5. Как да включите mysql в урока за бърз старт на Jboss