Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

PHP का उपयोग करके .frm फ़ाइल से तालिका संरचना कैसे प्राप्त करें?

हां, जानकारी के कम से कम हिस्से को पुनर्प्राप्त करना संभव है। (अन्य पाठकों के लाभ के लिए प्रश्नकर्ता पहले से ही जानता है कि कॉलम मेटाडेटा प्राप्त करने के आसान तरीके हैं)।

चुनौती यह है कि .frm फाइलें इतनी अच्छी तरह से प्रलेखित नहीं हैं क्योंकि सामान्य समुदाय द्वारा उन्हें समझने की कोई आवश्यकता बहुत दुर्लभ है। इसके अलावा फाइलों का प्रारूप ऑपरेटिंग सिस्टम के साथ भिन्न हो सकता है।

हालांकि, हेक्सडंप या इसी तरह की उपयोगिता वाली फाइलों को देखकर आप आंशिक रूप से देख सकते हैं कि क्या हो रहा है। फिर आपने 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 फ़ाइल (तालिका से) के लिए काम करना चाहिए। निश्चित रूप से https:/ पर mySQL (innoDB इंजन पर आधारित) को पुनर्प्राप्त करने के लिए एक निःशुल्क टूल उपलब्ध है। /github.com/twindb/undrop-for-innodb . कोड और संबद्ध ब्लॉगों को पढ़ने के बाद, वे पुनर्प्राप्ति के लिए .FRM फ़ाइलों का उपयोग नहीं कर रहे हैं। उसी तालिका की जानकारी को innoDB शब्दकोश में भी संग्रहीत किया जाता है और वे इसका उपयोग तालिका स्वरूपों आदि को पुनर्प्राप्त करने के लिए कर रहे हैं।

.FRM फ़ाइलों की सामग्री को पढ़ने का एक तरीका भी है। यह यहां बताया गया है https://twindb.com /कैसे-से-पुनर्प्राप्ति-तालिका-संरचना-से-एफआरएम-फ़ाइलें-ऑनलाइन/ . हालाँकि, वे mySQL का उपयोग .frm फ़ाइलों को पढ़ने और वहाँ से तालिकाओं को फिर से बनाने के लिए कर रहे हैं।

यहां उपयोगिताओं का एक पैकेज भी है https://www .mysql.com/why-mysql/presentations/mysql-utilities/ जिसमें एक .frm रीडर होता है। यह Oracle द्वारा बनाया गया था, जो .frm फ़ाइलों के प्रारूप को जानने वाले एकमात्र लोग हैं! उपयोगिता मुफ्त है इसलिए आप इसे डाउनलोड कर सकते हैं।

Oracle .frm फ़ाइलों के प्रारूप पर कुछ जानकारी प्रकाशित करता है https://dev.mysql.com/doc/internals/hi/frm-file-format.html , लेकिन यह अधूरा और गलत दोनों है! यह पिछला स्टैक प्रश्न देखें।https://dba.stackexchange.com/questions/208198/mysql-frm-file-format-how-to-extract-column-info

अब आखिरकार, यदि आप अभी भी मनोरंजन के लिए या सीखने के लिए .frm फ़ाइलों को स्वयं पार्स करने का प्रयास करना चाहते हैं, तो आपको धैर्य रखने और काफी जटिल संरचना को सुलझाने में समय व्यतीत करने की आवश्यकता है। अगर आप कोशिश करते रहना चाहते हैं तो यह ठीक है, लेकिन मुझे अपनी .FRM फ़ाइल (example@sqld3f पर भेजें .com ) इसलिए मैं इसे देख सकता हूं और मैं आपको कुछ दिनों में कुछ PHP कोड भेजूंगा जो डेटाटाइप और डिस्प्ले साइज जैसी कुछ अतिरिक्त जानकारी निकालेगा।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MYSQL डेटाबेस डेटा के साथ जावास्क्रिप्ट सरणी लोड करें

  2. रूबी ऑन रेल्स MySQL #08S01खराब हैंडशेक - MySQL को डाउनग्रेड करें?

  3. पीडीओ प्रारंभ करते समय - क्या मुझे यह करना चाहिए:वर्णसेट =यूटीएफ 8 या वर्णसेट =यूटीएफ 8 एमबी 4?

  4. mysql क्वेरी php . से सरणी बनाएं

  5. हाइबरनेट + MySQL:डेटाबेस और तालिकाओं के लिए एन्कोडिंग utf-8 कैसे सेट करें