মাইএসকিউএল InnoDB টেবিলগুলি হারিয়েছে তবে ফাইলগুলি বিদ্যমান


33

আমার কাছে একটি মাইএসকিউএল ইনোডিবি রয়েছে যাতে সমস্ত ডাটাবেস টেবিল ফাইল রয়েছে তবে মাইএসকিউএল সেগুলি দেখতে পাচ্ছে না এবং সেগুলি লোড করছে না।

সমস্যা ঘটেছে কারণ আমি এই তিনটি ফাইল মোছা হয়েছে: ibdata1, ib_logfile0এবংib_logfile1

কারণ মাইএসকিএল শুরু হওয়ার সাথে আমার সমস্যা ছিল এবং আমি যা পড়ি তা হ'ল এগুলি সরিয়ে ফেলা কারণ মাইএসকিউএল কেবল এগুলি পুনরুত্থিত করবে (আমি জানি আমার তাদের ব্যাকআপ নেওয়া উচিত ছিল তবে হয়নি)।

টেবিলগুলি আবার দেখতে মাইএসকিউএল পাওয়ার জন্য আমি কী করতে পারি?

about_member.frm                              site_stories.frm
about_member.ibd                              site_stories.ibd
db.opt                                        stories.frm
FTS_00000000000000bb_BEING_DELETED_CACHE.ibd  stories.ibd
FTS_00000000000000bb_BEING_DELETED.ibd        story_comments.frm
FTS_00000000000000bb_CONFIG.ibd               story_comments.ibd
FTS_00000000000000bb_DELETED_CACHE.ibd        story_likes.frm
FTS_00000000000000bb_DELETED.ibd              story_likes.ibd
FTS_00000000000000f5_BEING_DELETED_CACHE.ibd  story_tags.frm
FTS_00000000000000f5_BEING_DELETED.ibd        story_tags.ibd
FTS_00000000000000f5_CONFIG.ibd               story_views.frm
FTS_00000000000000f5_DELETED_CACHE.ibd        story_views.ibd
FTS_00000000000000f5_DELETED.ibd              story_view_totals.frm
member_favorites.frm                          story_view_totals.ibd
member_favorites.ibd                          tags.frm
members.frm                                   tags.ibd
members.ibd

আপনি কি এই ফাইলগুলি পুনরুদ্ধার করার চেষ্টা করেছেন? লগ ফাইল মুছে ফেলা যেতে পারে। আপনার সত্যিই আইবডটা 1
রামহাউন্ড

আমি পুরানো মাইএসকিএল সংস্করণ থেকে ফাইলটি অনুলিপি করেছি যেখানে ফাইলটি ছিল তবে টেবিলগুলি প্রদর্শিত হয় না।
আমার

উত্তর:


36

মাইএসকিউএল কেন এই ফাইলগুলি দেখতে পারে না তা এখানে রয়েছে: সিস্টেম টেবিল স্পেসে (আইবডাটা 1) একটি স্টোরেজ-ইঞ্জিন নির্দিষ্ট ডেটা ডিকশনারি রয়েছে যা ইনোডিবিএকে সম্ভাব্য সারণীর ব্যবহারের মানচিত্রটি দেয়:

InnoDB আর্কিটেকচার

InnoDB টেবিলগুলি এক জায়গা থেকে অন্য জায়গায় সরিয়ে নিতে যেমন কমান্ডের প্রয়োজন হয়

ALTER TABLE tblname DISCARD TABLESPACE;
ALTER TABLE tblname IMPORT TABLESPACE;

এখানে কী বিবেচনা করা উচিত তা ব্যাখ্যা করে মাইএসকিউএল 5.5 ডকুমেন্টেশনের একটি অংশ রয়েছে

.Ibd ফাইলগুলির জন্য বহনযোগ্যতার বিবেচনা

আপনি মাইআইএসএএম টেবিল ফাইলগুলির সাহায্যে অবিচ্ছিন্নভাবে .ibd ফাইলগুলি ডাটাবেস ডিরেক্টরিগুলির মধ্যে স্থানান্তর করতে পারবেন না। InnoDB ভাগ করা টেবিল স্পেসে সারণী সংজ্ঞাটি ডাটাবেসের নাম অন্তর্ভুক্ত করে। টেবিলস্পেস ফাইলগুলিতে সঞ্চিত লেনদেন আইডি এবং লগ সিকোয়েন্স নম্বরগুলি ডাটাবেসের মধ্যেও পৃথক।

একটি .ibd ফাইল এবং সম্পর্কিত টেবিলটি একটি ডাটাবেস থেকে অন্য ডাটাবেসে স্থানান্তর করতে, একটি পুনরায় নাম টেবিল বিবৃতি ব্যবহার করুন:

পুনরায় নাম টেবিল db1.tbl_name TO db2.tbl_name; আপনার যদি একটি .আইবিডি ফাইলের "ক্লিন" ব্যাকআপ থাকে তবে আপনি এটিকে মাইএসকিউএল ইনস্টলেশনটিতে পুনরুদ্ধার করতে পারেন যা থেকে এটি নীচে সূচিত হয়েছিল:

আপনি .ibd ফাইলটি অনুলিপি করার পরে টেবিলটি অবশ্যই ফেলে দেওয়া বা কাটা উচিত নয়, কারণ এটি করার ফলে টেবিল স্পেসের ভিতরে থাকা সারণী আইডি পরিবর্তন হয়।

বর্তমান .ibd ফাইলটি মুছতে এই টেবিল স্টেটমেন্টটি জারি করুন:

টেবিলের পরিবর্তে tbl_name ডিস্কার্ড ট্যাবলেট স্পেস করুন; সঠিক ডাটাবেস ডিরেক্টরিতে ব্যাকআপ .ibd ফাইলটি অনুলিপি করুন।

InnoDB কে টেবিলের জন্য নতুন .ibd ফাইলটি ব্যবহার করতে বলার জন্য এই ALL TABLE বিবৃতিটি জারি করুন:

টেবিল পরিবর্তন করুন tbl_name আমদানি ট্যাবলেট স্পেস; এই প্রসঙ্গে, একটি "ক্লিন" .আইবিডি ফাইল ব্যাকআপ হ'ল যার জন্য নিম্নলিখিত প্রয়োজনীয়তাগুলি সন্তুষ্ট:

.Bd ফাইলে লেনদেনের মাধ্যমে কোনও আপত্তিজনক পরিবর্তন নেই।

.Ibd ফাইলে কোনও নিমজ্জিত sertোকানো বাফার এন্ট্রি নেই।

পুর্ব .ibd ফাইল থেকে মুছে ফেলা সমস্ত চিহ্নিত সূচি রেকর্ড সরিয়ে ফেলেছে।

mysqld বাফার পুল থেকে ফাইলটি .ibd ফাইলের সমস্ত পরিবর্তিত পৃষ্ঠাগুলি ফ্লাশ করেছে।

এই সাবধানতা এবং প্রোটোকল দেওয়া, এখানে কর্মের একটি প্রস্তাবিত কোর্স

এই উদাহরণস্বরূপ, আসুন ডাটাবেসে tagsটেবিলটি পুনরুদ্ধার করার চেষ্টা করিmydb

ধাপ 1

আপনার সেগুলিতে .frmএবং .ibdফাইলগুলির ব্যাকআপ রয়েছে তা নিশ্চিত করুন/tmp/innodb_data

ধাপ ২

CREATE TABLE tagsবিবৃতিটি পান এবং এটি কার্যকর করুন CREATE TABLE mydb.tags ...। নিশ্চিত করুন যে এটি আসলটির মতো একই কাঠামোtags.frm

ধাপ 3

tags.ibdমাইএসকিউএল ব্যবহার করে খালি মুছুন

ALTER TABLE mydb.tags DISCARD TABLESPACE;

পদক্ষেপ # 4

এর ব্যাকআপ কপিটি নিয়ে আসুন tags.ibd

cd /var/lib/mysql/mydb
cp /tmp/innodb_data.tags.ibd .
chown mysql:mysql tags.ibd

পদক্ষেপ # 5

tagsInnoDB ডেটা অভিধানে টেবিল যুক্ত করুন

ALTER TABLE mydb.tags IMPORT TABLESPACE;

পদক্ষেপ 6

টেবিলের অ্যাক্সেসযোগ্যতা পরীক্ষা করুন

SHOW CREATE TABLE mydb.tags\G
SELECT * FROM mydb.tags LIMIT 10;

আপনি যদি সাধারণ ফলাফল পান তবে অভিনন্দন আপনি একটি ইনোডিবি টেবিল আমদানি করেন।

পদক্ষেপ 7

ভবিষ্যতে, দয়া করে আইবডাটা 1 এবং এর লগগুলি মুছবেন না

একবার চেষ্টা করে দেখো !!!

আমি এর আগেও এরকম বিষয় নিয়ে আলোচনা করেছি

বিচারকার্য স্থগিত রাখার আদেশ

আপনি যদি টেবিলের কাঠামোটি জানেন না tags?

স্রেফ .frmফাইলটি ব্যবহার করে ক্রেট টেবিল স্টেটমেন্ট পাওয়ার সরঞ্জাম রয়েছে । আমি এ সম্পর্কে একটি পোস্টও লিখেছিলাম: কীভাবে কেবল .frm ফাইল থেকে টেবিলের স্কিমা বের করা যায়? । সেই পোস্টে, আমি একটি লিনাক্স বাক্স থেকে একটি উইন্ডোজ মেশিনে .frm ফাইলটি অনুলিপি করেছিলাম, উইন্ডোজ সরঞ্জামটি চালিয়েছিলাম এবং CREATE TABLEবিবৃতি পেয়েছি ।


দুর্দান্ত উত্তরটির জন্য ধন্যবাদ! আমি এখনও একটি টেবিল আমদানি করার প্রক্রিয়াতে রয়েছি, কারণ আমি সমস্যা তৈরি করতে থাকি, তবে শেষ পর্যন্ত আমি সেখানে পৌঁছে যাব এবং আমি আপনাকে জানাব যে এটি কীভাবে কার্যকর হয়! ধন্যবাদ!
আমার লন

1
আমি যখন তৈরিটি চালাইweblyizetags আমি পাই: ERROR 1813 (HY000): টেবিলের জন্য টেবিল স্পেস 'বিদ্যমান। ইমপোর্টের আগে টেবিল স্পেসটি ডিস্কার্ড করুন। সুতরাং আমি প্রথমে পরিবর্তন টেবিল স্পেস চালানোর চেষ্টা করব এবং এই ত্রুটিটি পেয়েছি : ERROR 1146 (42S02): সারণী 'ওয়েবলাইজ.ট্যাগস' বিদ্যমান নেই । আমি কি করতে পারি?
আমার লন

ধন্যবাদ! আমার ত্রুটিটি ঠিক করতে আমি একটি নতুন ডাটাবেস তৈরি করেছি, ছুটে CREATE TABLE ...এসেছি আপনার পদক্ষেপগুলি অনুসরণ করে! আপনি তাদের নতুন করে লিখতে থেকে আমাকে বাঁচিয়েছেন 100% স্ক্র্যাচ থেকে! এটি বিদেশী কীগুলি আমদানি করে নি তবে এটি ঠিক আছে আমি নিজেও এটি করতে পারি! আবার ধন্যবাদ!
আমার লন

আমার যদি 100 টি টেবিল থাকে যা এইভাবে ঠিক করা উচিত। আমি প্রতিটি টেবিলে হাতে হাতে অপারেশন করব না। কীভাবে এটি স্বয়ংক্রিয় করা যায়?
ওলেগ আবরাজাইভ

10

আমার একই অবস্থা, নির্দিষ্ট টিবিএল নামটি ফেলে বা তৈরি করতে পারি না। আমার স্থির পদ্ধতিটি হ'ল:

  1. মাইএসকিউএল বন্ধ করুন।

    service mysql stop
    
  2. Ib_logfile0 এবং ib_logfile1 সরান।

    cd /var/lib/mysql;
    rm ib_logfile0 ib_logfile1
    
  3. Tblname ফাইলগুলি সরান। সতর্কতা: এটি স্থায়ীভাবে আপনার ডেটা মুছে ফেলবে

    cd /var/lib/mysql/dbname;
    rm tblname*
    
  4. মাইএসকিউএল শুরু করুন।

    service mysql start
    

1
ধন্যবাদ এটির ফলে আমার সমস্যাটি স্থির হয়ে গেছে, আমি পদক্ষেপ 3 করিনি, আমি কেবল লগফাইলগুলি সরিয়েছি এবং মাইএসকিএল ব্যাক আপ শুরু করেছি।
জেফ উইলবার্ট

আপনি একেবারে দুর্দান্ত! আমার সমস্যা সমাধান।
অ্যালেক্স জিপি

2

আমারও এই সমস্যা ছিল আমি ibdata1দুর্ঘটনাক্রমে মুছে ফেলেছিলাম এবং আমার সমস্ত ডেটা হারিয়ে গেছে।

গুগল এবং এসও-তে 1-2 দিনের অনুসন্ধানের পরে, অবশেষে আমি একটি সমাধান পেয়েছিলাম যা এটি আমার জীবন বাঁচিয়েছিল (আমার কাছে প্রচুর রেকর্ড সহ অনেকগুলি ডাটাবেস এবং টেবিল ছিল)।

  1. থেকে একটি ব্যাকআপ নিতে /var/lib/mysql

  2. dbsake.frm সহ ফাইল থেকে টেবিল স্কিমা পুনরুদ্ধার করুন (অন্য বিকল্প ছিল! mysqlfrm । তবে এটি আমার পক্ষে কার্যকর হয়নি)

dbsake frmdump --type-codes /var/lib/mysql/database-name/tbl.frm
  1. এক্সপোর্টেড স্কিমা সহ নতুন টেবিল তৈরি করুন (নতুন নাম সহ)।

  2. এই কমান্ডটি সহ নতুন সারণী ডেটা বাতিল করুন:

ALTER TABLE `tbl-new` DISCARD TABLESPACE;
  1. পুরানো টেবিলের ডেটা অনুলিপি করুন এবং নতুনটির পরিবর্তে এটি পেস্ট করুন এবং এর জন্য সঠিক অনুমতি সেট করুন।
cp tbl.ibd tbl@002dnew.ibd && chown mysql:mysql tbl@002dnew.ibd
  1. নতুন টেবিলে ডেটা আমদানি করুন।
ALTER TABLE `tbl-new` IMPORT TABLESPACE;
  1. ঠিক আছে! নতুন টেবিলে আমাদের ডেটা রয়েছে এবং আমরা পুরানোটি বাদ দিতে পারি।
DROP TABLE `tbl`;
  1. পুরানো টেবিলের জন্য /var/lib/mysql/database-nameযদি ডেটা ( .ibdফাইল) থাকে তবে তা পরীক্ষা করে দেখুন।
rm tbl.ibd
  1. এবং অবশেষে নতুন টেবিলটির মূল নামকরণ করুন
ALTER TABLE `tbl-new` RENAME `tbl`;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.