ورود

View Full Version : آموزش: بازیابی جداول از دست رفته از روی فایل ها .frm و .idb



mhd-kvn
جمعه 22 خرداد 1394, 16:58 عصر
شاید برای بعضی ها این مشکل به وجود آمده باشه که پایگاه داده ای رو ایجاد کرده بودین و حالا به هر دلیلی دیگه نمی تونین به جداولش دسترسی داشته باشین. مثلا در phpMyadmin اسم پایگاه داده مورد نظرتون هست ولی وقتی واردش میشین می بینین که هیچ جدولی وجود نداره!!! حتی وقتی که کوئری SHOW TABLES رو اجرا میکنین متوجه میشین که اسم جداولتون رو میاره ولی با این حال جداول رو نشون نمیده حتی اگه بخواین سطری رو از جدول واکشی کنین پیغام میده که جدول مورد نظر شما وجود نداره ولی اگه بخواین در همون دیتابیس جدولی به نام یکی از جداولی که دیگه در دسترس نیست ایجاد کنین بازم به شما اجازه نمیده و میگه اون جدول وجود داره!!!!!!!!

وضعیت عجیبیه چون جداول وجود دارن در حالی که به نظر می رسه که وجود ندارن حال آنکه واقعا وجود دارن(چی گفتم!!!!!!!!!!!!!!!!!!) و شما درک نمی کنین که چرا نمی تونه جداول رو نشون بده. من چند روز پیش به این مشکل برخوردم و حتی الان که تونستم مشکلم رو حل کنم نتونستم بفهمم که چرا چنین اتفاقی افتاد.!! چرا phpMyadmin نمیتونست جداول رو پیدا کنه!!!!؟؟؟؟؟(اگه کسی میدونه دلیلش رو به ما هم بگه)

اما بهتون توصیه میکنم که اگه دارین روی پروژه ای کار می کنین حتما از دیتابیس بک آپ بگیرین تا مثل من دو سه روز گیر نیوفتین. اگه من export کرده بودم به این همه دردسر نمی افتادم.

اما بریم سراغ روشی که من استفاده کردم تا داده های از دست رفته رو دوباره برگردونم:
اگر wamp server نصب کرده باشین شما با مراجعه ی به آدرس زیر می تونین فایل های مربوط به دیتابیستون رو مشاهده کنین:(من در درایو G نصب کردم)
G:\wamp\bin\mysql\mysql5.6.12\data
در این پوشه، پوشه های وجود داره که دقیقا همنام با دیتابیس هاتونه. وقتی که وارد پوشه مورد نطرتون بشین(همون دیتابیسی که جداولش از دست رفتن) فایل های با فرمت های frm. و idb. می بینین که اسم هاشون همنام با جداول دیتابیس هست. فایل های frm. شامل شِما یا ساختار جداوله و idb. هم داده های موجود در جداول(پس مطمئن شدیم که جداول هستن ولی نشون داده نمیشن) راه حلی که من تونستم برای بازیابی جداول به دست بیارم مراحلش به ترتیب زیره:
برای بازیابی جداول mysql از فایل های .frm و .ibd مراحل زیر را داریم:

1. نصب MySQL Utilities از طریق لینک زیر:(برای دانلود باید عضو بشین و زمانی که می خواین عضو بشین به کاربران داخل ایران این اجازه رو نمیده دلیلش هم به خاطر تحریمه اما شما میتونین با کمک ف.ی.ل.ت.ر ش.ک.ن تحریم ها رو دور بزنین و به راحتی عضو بشین)

http://dev.mysql.com/downloads/tools/utilities/

2. به دست آوردن ساختار جداول به کمک MySQL Utilities به این صورت که به محلی که فایل های .frm و .ibd وجود دارند رفته و از طریق Command Prompt دستور زیر را وارد کرده:



mysqlfrm --server=root@127.0.0.1 --port 3307 ./table_name.frm


که در این دستور به جای table_name نام جدول مورد نظر خود را قرار دهید. بعد از اجرای این دستور باید خروجی به شکل زیر ظاهر شود:

Source on 127.0.0.1: ... connected.#
Starting the spawned server on port 3307 ... done.#
Reading .frm files#
#
Reading the table_name.frm file.#
#
CREATE statement for ./ table_name.frm:#
#
`)CREATE TABLE ` table_name
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(45) DEFAULT NULL,
`age` tinyint(4) NOT NULL,
,(`PRIMARY KEY (`id
(`KEY `name_idx` (`name
ENGINE=InnoDB DEFAULT CHARSET=utf8(

در اینجا فرض بر این است که جدول مورد نظر ما دارای سه ستون id، name و age است.

3. حال باید یک پایگاه داده جدید ساخته و جداول آن را با توجه به ساختاری که در قسمت قبل به دست آوردیم بسازیم. اینکار را باید کاملا دقیق انجام داد و ترتیب ستون ها مهم هستند.

4. حال زمان آن رسیده است تا داده های جدول پیشین را وارد جداول جدیدی که دقیقا ساختاری مانند جداول اصلی دارند، نماییم. برای اینکار ابتدا Query زیر را در پایگاه داده ی جدیدی که ایجاد کردیم، اجرا می کنیم:


ALTER TABLE table_name DISCARD TABLESPACE

5. حال به مسیر پایگاه داده قبلی رفته و فایل .idb(مثلا جدول دانشکده: college.idb) مربوط به جدول مورد نظر را کپی و به مسیر پایگاه داده جدید انتقال می دهیم و اسم آن را همنام با جدول جدید می کنیم.

6. در آخرین مرحله Query زیر را در پایگاه داده جدید اجرا می کنیم تا داده ها به آن جدول منتقل شوند:

ALTER TABLE table_Name IMPORT TABLESPACE

به این ترتیب جداول از دست رفته دوباره بازیابی می شوند. البته اگر می خواهید تا هم اسم جداول و هم اسم پایگاه داده اصلی به پایگاه داده جدید منتقل شود پایگاه داده قبلی را حذف کنید تا بعد از آن بتوانید نام های اصلی را به جدول جدید منتصب کنید.

البته اگه کسی کمی سرچ کنه راه های دیگه ای هم پیدا میکنه ولی این راهی بود که من تونستم جواب بگیرم