Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara mendapatkan struktur tabel dari file .frm menggunakan PHP?

Ya itu mungkin untuk memulihkan setidaknya sebagian dari informasi. (Untuk kepentingan pembaca lain, pembuat pertanyaan sudah mengetahui bahwa ada cara yang lebih mudah untuk mendapatkan metadata kolom).

Tantangannya adalah file .frm tidak didokumentasikan dengan baik karena kebutuhan untuk menguraikannya oleh komunitas umum sangat jarang. Juga format file dapat bervariasi dengan sistem operasi.

Namun, dengan melihat file dengan hexdump atau utilitas serupa, Anda dapat melihat sebagian apa yang terjadi. Maka Anda sebaiknya membaca file dalam program PHP dan mendekode data biner mentah.

Saya melakukan ini sebagai latihan beberapa waktu lalu, dan saya dapat memulihkan jumlah kolom, nama kolom, dan jenis kolom.

Di bawah ini adalah contoh untuk menunjukkan cara mengekstrak nama kolom. .frm saya adalah untuk nama tabel "berhenti", tetapi Anda dapat mengganti .frm Anda sendiri.

<?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);

Ini seharusnya membuatmu memulai. Saya akan menambahkan ini ketika saya punya waktu dalam beberapa hari mendatang jika menurut Anda sedang menuju ke arah yang benar.

EDIT. Saya memperbarui kode sehingga harus berfungsi untuk file .frm apa pun (dari Tabel). Pastinya ada alat gratis untuk memulihkan mySQL (berdasarkan mesin innoDB) yang tersedia di https:// /github.com/twindb/undrop-for-innodb . Setelah membaca kode dan blog terkait, mereka tidak menggunakan file .FRM untuk pemulihan. Informasi tabel yang sama juga disimpan dalam kamus innoDB dan mereka menggunakan ini untuk memulihkan format tabel dll.

Ada juga cara untuk membaca konten file .FRM. Ini dijelaskan di sini https://twindb.com /how-to-recover-table-structure-from-frm-files-online/ . Namun, mereka menggunakan mySQL untuk membaca file .frm dan membuat ulang tabel dari sana.

Ada juga utilitas paket utilitas yang ditemukan di sini https://www .mysql.com/why-mysql/presentations/mysql-utilities/ yang berisi pembaca .frm. Ini dibuat oleh Oracle, yang merupakan satu-satunya orang yang mengetahui format file .frm! Utilitas ini gratis sehingga Anda dapat mengunduhnya.

Oracle mempublikasikan beberapa informasi tentang format file .frm https://dev.mysql.com/doc/internals/en/frm-file-format.html , tetapi tidak lengkap dan salah! Lihat pertanyaan Stack sebelumnya.https://dba.stackexchange.com/questions/208198/mysql-frm-file-format-how-to-extract-column-info

Sekarang setelah semua itu jika Anda masih ingin mencoba mengurai file .frm sendiri untuk bersenang-senang atau untuk belajar, maka Anda harus bersabar dan menghabiskan waktu mengungkap struktur yang cukup rumit. Jika Anda ingin terus mencoba tidak apa-apa, tetapi kirimkan file .FRM Anda ( ke contoh@sqldat3f"> .com ) jadi saya bisa memeriksanya dan saya akan mengirimkan beberapa kode PHP dalam beberapa hari yang akan mengekstrak beberapa informasi tambahan seperti tipe data dan ukuran tampilan.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Spring Boot JPA:Melewati Beberapa Nilai untuk Parameter yang Sama (JPQL)

  2. Masukkan bidang ID yang dihasilkan dari pemicu, tetapi tidak diteruskan

  3. Mysql:Atur format DATETIME ke 'DD-MM-YYYY HH:MM:SS' saat membuat tabel

  4. MySQL NULLIF() Dijelaskan

  5. bantu saya memahami sekarang () untuk waktu mysql saat ini dan zona waktunya