আমি কীভাবে দূষিত ফায়ারফক্স প্লেস.সক্লাইট ডাটাবেসটি মেরামত করব?


15

আমার র‌্যাম (ব্লুজস্ক্রিন বেশ কয়েকবার, উইন্ডোজ এক্সপি) নিয়ে আমার কিছু সমস্যা ছিল এবং এখন আমার ফায়ারফক্স ডেটাবেসগুলি ক্ষতিগ্রস্থ হয়েছে। ফায়ারফক্স কাজ করছে, তবে আমার ইতিহাস চলে গেছে এবং এটি কার্যকর করার সময় বেশ কয়েকটি অসঙ্গতি এবং ত্রুটিগুলি রিপোর্ট pragma integrity_checkকরছে places.sqlite:

ডাটাবেস ডিস্ক চিত্রটি বিকৃত

এখন প্রশ্ন, কীভাবে আমি এসকিউএল-ডাটাবেসগুলি মেরামত করব?


2
ভবিষ্যতের রেফারেন্সের জন্য, FEBE (ফায়ারফক্স এনভায়রনমেন্ট ব্যাকআপ এক্সটেনশন) ভবিষ্যতে সহায়ক হতে পারে। সম্পূর্ণ প্রোফাইল অনুলিপি করে এবং একক ব্যাকআপ হিসাবে প্যাকেজ করে। আমি জানি এটি আপনার প্রশ্নের উত্তর দেয় না, তবে ভবিষ্যতে এটি জেনে রাখা সহায়ক হতে পারে। bit.ly/aumThw
Urda

গুগলারের এই প্রশ্নটি খুঁজে পেতে সহায়তা করা।
bwDraco

উত্তর:


22

বিঃদ্রঃ

এই প্রক্রিয়াটি সম্পাদন করতে ফায়ারফক্স অবশ্যই বন্ধ করতে হবে, অন্য ওয়েব ব্রাউজারে এই পৃষ্ঠাটি খুলতে ভুলবেন না বা এগিয়ে যাওয়ার আগে এটি মুদ্রণ করতে ভুলবেন না।


কয়েক ঘন্টা পরিশ্রম করার পরেও স্থানগুলি ডাটাবেস পুনরুদ্ধার করার চেষ্টা করেছে, এমনকি ফায়ারফক্সের উত্স কোডটি পড়ে, আমি সফল হতে পেরেছি। আমি এটি কীভাবে করেছি তা এখানে:

  • এসকিউএলাইট শেলের সর্বশেষতম সংস্করণটি ডাউনলোড করুন এবং এটি আপনার প্রোফাইল ফোল্ডারে বের করুন। উইন্ডোজ ভিস্তা এবং উইন্ডোজ 7 এ এটি C:\Users\<username>\AppData\Roaming\Mozilla\Firefox\Profiles\<code>.defaultফোল্ডারে রয়েছে।
  • ফায়ারফক্স চালু থাকলে বন্ধ করুন।
  • স্থান ডাটাবেস places.sqliteফাইল আছে। দুর্নীতির কারণে ফাইলটি প্রতিস্থাপন করা হলে places.sqlite.corruptপুনরুদ্ধারের জন্য ফাইলটি ব্যবহার করুন । ফাইল নাম একটি ব্যাকআপ অনুলিপি তৈরি করুন places.sqlite.bakবা places.sqlite.corrupt.bak
  • ডাটাবেস ফাইল ( sqlite3 places.sqliteবা sqlite3 places.sqlite.corrupt) খুলতে SQLite শেলটি ব্যবহার করুন , তারপরে প্রবেশ করুন:
.output dump.sql    -- sends output to file dump.sql
.dump               -- dumps database to file
  • ডাটাবেস দুর্নীতিগ্রস্থ হওয়ায় ফলাফল প্রাপ্ত ডাটাবেস ডাম্প সম্পূর্ণ হয়নি, এবং পুনরুদ্ধারযোগ্য সমস্ত ডেটা পুনরুদ্ধার করা হয়নি। ত্রুটিটি কোথায় ঘটেছে তা নির্ধারণ করতে, ERRORডাম্প ফাইলের ভিতরে একটি এসকিউএল মন্তব্যে (সমস্ত ক্যাপগুলি) শব্দটি অনুসন্ধান করুন dump.sql(আমি এটি করতে নোটপ্যাড ++ ব্যবহার করেছি ) INSERTএবং প্রশ্নের সারণী নির্ধারণ করতে এটির উপরে থাকা এসকিউএল কমান্ডটি পড়ুন । আমার ক্ষেত্রে, ক্ষতিগ্রস্থ টেবিলটি হ'ল moz_places। (স্থানের ডাটাবেসে সারণীগুলির বিবরণ এখানে পাওয়া যাবে , যার মধ্যে একটি পুরানো ER ডায়াগ্রাম অন্তর্ভুক্ত রয়েছে this) আমি কেবলমাত্র এই টেবিল থেকে কীভাবে অতিরিক্ত ডেটা পুনরুদ্ধার করব তা ব্যাখ্যা করব; নিম্নলিখিত পদ্ধতিটি সম্ভবত অন্যান্য টেবিলের জন্য প্রযোজ্য নয়, সুতরাং যদি কোনও টেবিল moz_placesজড়িত থাকে তবে এই সাব-পদক্ষেপগুলি এড়িয়ে যান ))

    • moz_placesটেবিলের প্রতিটি সারিতে একটি আইডি রয়েছে। সারণি এই আইডির আদেশ অনুসরণ করে টেবিল থেকে ফেলে দেওয়া হয়। 1INSERT বিবৃতিতে খোলার প্রথম বন্ধনীর পরে আইডি হ'ল প্রথম মান । ডাটাবেসটি যে অঞ্চলে ক্ষতিগ্রস্থ হয়েছে সে অঞ্চলটি সম্ভবত এই টেবিলের সারিগুলির একটি ছোট ব্লক হতে পারে; এখানে ধারণাটি হ'ল এই ক্ষতিগ্রস্ত অঞ্চলটি এড়ানো এবং যতটা সম্ভব ডেটা পুনরুদ্ধার করা। ERRORমন্তব্যটি উপস্থিত হওয়ার আগে এই জাতীয় ব্লকের প্রারম্ভিক অঞ্চলটি সারি হিসাবে ডাম্পে উপস্থাপন করা হয় । এই সারির আইডি ব্যবহার করে, আমরা নির্ধারণ করতে পারি যে কোথায় ডাটাবেস ক্ষতিগ্রস্থ হয়েছে। SELECTশর্ত হিসাবে আইডি সহ বিবৃতি ব্যবহার করে আমরা এটি করি ; এই প্রক্রিয়াটি কিছু পরীক্ষা এবং ত্রুটি নেয়। উদাহরণস্বরূপ, ত্রুটির আগে শেষ আইডিটি 49999 হয় এবং ত্রুটিটি অনুসরণ করে ক্ষতিগ্রস্ত ব্লকটি 50000 আইডি থেকে শুরু হয় statements বিবৃতি ব্যবহার করুন যেমন:

    - অপ্রয়োজনীয় আউটপুট দমন
    - নিম্নলিখিত কমান্ডটি উইন্ডোজ সিস্টেমগুলির জন্য
    - লিনাক্স এবং অন্যান্য ইউনিক্স এবং ইউনিক্স-মতো সিস্টেমের জন্য .output / dev / null ব্যবহার করুন
    .আউটপুট NUL
    
    মোড_প্লেসগুলি থেকে আইডি নির্বাচন করুন যেখানে আইডি> = 50100;
    
    • নিম্নলিখিতটি অনুসরণ করে মানটি সামঞ্জস্য করুন id >=এবং উপরের SELECTকমান্ডটি পুনরাবৃত্তি করুন যতক্ষণ না আপনি সর্বাধিকতম মান খুঁজে পান যা এসকিউএলাইটকে কোনও ত্রুটির আউটপুট তৈরি করে না। এটি সেই আইডি যা শুরু হওয়া সারিটিকে বোঝায় যা থেকে আমরা অতিরিক্ত ডেটা পুনরুদ্ধার করতে পারি। আসুন এই আইডিটি 50200 হিসাবে ধরে নেওয়া যাক this এই ডেটাটি ডাম্প করতে, প্রবেশ করুন:

    .output dump2.sql
    .মোড sertোকান
    নির্বাচন করুন * থেকে মোজ_প্লেসগুলি যেখানে আইডি> = 50200;
    
    - স্বাভাবিক আউটপুট আচরণ পুনরুদ্ধার করুন
    .আউটপুট stdout
    .মড তালিকা
    
    • নোট করুন যে ফাইলটির INSERTবিবৃতিগুলি dump2.sqlশুরু হয় INSERT INTO table VALUES, সুতরাং এই স্ট্রিংয়ের সমস্ত দৃষ্টান্ত প্রতিস্থাপন করতে আপনার পাঠ্য সম্পাদকটিতে বৈশিষ্ট্যটি সন্ধান করুন এবং প্রতিস্থাপন করুন INSERT INTO moz_places VALUES
    • dump2.sqlফাইলটির পুরো বিষয়বস্তু অনুলিপি করুন এবং dump.sqlযেখানে ফাইলটি ERRORমন্তব্য উপস্থিত হবে সেখানে এটি আটকে দিন ।
  • ROLLBACK; -- due to errorsফাইলটির শেষে এটিকে প্রতিস্থাপন করুন COMMIT;
  • নীচের কোডটি dump.sqlফাইলের শীর্ষে যুক্ত করুন। প্রতিস্থাপন <version>নিম্নরূপ (এই ফায়ারফক্স সোর্স ফাইল খুঁজে পাওয়া যেতে পারে, সঠিক মান, যা ফায়ারফক্স জন্য প্রয়োজন ডাটাবেসের স্কিমা Firefox এর সংস্করণের উপর ভিত্তি করে সংস্করণ নির্ধারণ সঙ্গে toolkit/components/places/Database.cpp):
    • ফায়ারফক্স 52: স্কিমা সংস্করণ 35
    • ফায়ারফক্স 53: স্কিমা সংস্করণ 36
    • ফায়ারফক্স 57: স্কিমা সংস্করণ 39
    • ফায়ারফক্স 58: স্কিমা সংস্করণ 41
    • ফায়ারফক্স 60: স্কিমা সংস্করণ 43
    • ফায়ারফক্স 61: স্কিমা সংস্করণ 47
    • ফায়ারফক্স 62: স্কিমা সংস্করণ 52
    • ফায়ারফক্স 69: স্কিমা সংস্করণ 53

PRAGMA user_version = <version>;
PRAGMA জার্নাল_মোড = কাটা;
PRAGMA পৃষ্ঠা_ আকার = 32768;
শূন্যস্থান;
PRAGMA জার্নাল_মোড = ওয়াল;
  • এসকিউএল শেল থেকে প্রস্থান করুন, মুছুন places.sqlite, তারপরে এসকিউএলাইট শেলটি খালি places.sqliteডাটাবেস ব্যবহার করে শুরু করুন sqlite3 places.sqlite.read dump.sqlডাটাবেসে এসকিউএল ডাম্প লোড করতে টাইপ করুন ।
  • ফায়ারফক্স শুরু করুন এবং নিশ্চিত করুন যে আপনার ইতিহাস এবং অবস্থান বারটি ইচ্ছাকৃতভাবে কাজ করছে। একবার আপনি নিশ্চিত হয়ে নিলেন যে সবকিছু ঠিক আছে, প্রোফাইল ফোল্ডার থেকে কার্যকর ডাটাবেস ডাম্প ফাইল এবং এসকিউএলাইট শেল সরিয়ে ফেলুন।

আরও প্রাসঙ্গিক তথ্য নিম্নলিখিত পৃষ্ঠাগুলিতে পাওয়া যাবে:

সরলীকৃত পদ্ধতিটি এই এমডিএন নিবন্ধে বর্ণিত হয়েছে তবে আমি এটি পরীক্ষা করে দেখিনি। তবুও, আমি PRAGMAনিবন্ধটি থেকে আপডেট করা আদেশগুলি অন্তর্ভুক্ত করেছি ।


1 এসকিউএল সাধারণত গ্যারান্টি দেয় না যে আপনি ORDER BYধারাটি ব্যবহার না করে কোনও ক্রমে ডাটাবেস আউটপুট দেওয়া হবে । তবে, ORDER BYকোনও দূষিত ডাটাবেসে কোনও আউটপুট উত্পাদন করতে ব্যর্থ হবে (এসকিউএলাইটের কোনও আউটপুট উত্পাদন করার আগে পুরো টেবিলটি পড়তে হবে)। যতদূর আমি জানি, ফায়ারফক্স সর্বদা moz_placesসিক্যুয়াল আইডি সহ টেবিল এন্ট্রি লিখেছে , তাই আমরা ধরে নিতে পারি যে সমস্ত আউটপুট আইডি দ্বারা অর্ডার করা হয়েছে।


3
এটি খাঁটি অসাধারণতা। দুর্নীতিযুক্ত জায়গাগুলি থেকে প্রায় সমস্ত ইতিহাস পুনরুদ্ধার করতে আমাকে সহায়তা করেছে q অনেক ধন্যবাদ!!
আশুতোষ জিন্দাল

এটি দুটি পরিবর্তনের সাহায্যে সাহায্য করেছিল: 1) একটি "যোগ করুন"; user_version লাইনে; 2) কোনও কারণে, আমার "দুর্নীতিগ্রস্থ" ফাইলটির একটি স্কিমা সংস্করণ ছিল যা প্রত্যাশার চেয়ে "এক কম" ছিল। আপনার পদ্ধতিটি প্রাথমিকভাবে কাজ না করার পরে, আমি 10MB নতুন ডাটাবেসে ডাম্প আমদানির চেষ্টা করেছি এবং ব্যর্থ হয়েছি কারণ পুরানো সারণীতে একটি কলাম কম ছিল। উত্স কোড লিঙ্কটি একবারে আমাকে বুঝতে পেরেছিল যে কী চলছে। দুর্দান্ত পোস্ট !!!
তিলমান হাউশার

@ টিলম্যানহৌশার: ঠিকানা। কলাম পরিবর্তন সম্পর্কিত সমস্যা এড়ানোর জন্য, দুর্নীতির নজরে আসার সাথে সাথে এবং ফায়ারফক্স আপডেট করার আগে এই উত্তরের পদক্ষেপগুলি অনুসরণ করতে ভুলবেন না যাতে ডাটাবেস স্কিমা পরিবর্তন হয় না। আপনি কোনও পুরানো স্কিমা সংস্করণও সেট করার চেষ্টা করতে পারেন — ফায়ারফক্স এটি নতুন সংস্করণে আপডেট করবে যখন আপনি ডাটাবেস পুনরুদ্ধার করবেন।
বিডব্লিউড্রাকো

পূর্ববর্তী স্কিমা সংস্করণটি সেট করা আমার প্রথম মন্তব্যটি লেখার সময় আমি যা করেছিলাম, অর্থাৎ আমি ইতিমধ্যে সফল ছিলাম :-) হ্যাঁ, আমি সন্দেহ করি যে আমি অবিলম্বে দুর্নীতিটি লক্ষ্য করি নি, আমি সাধারণত এটি কেবলমাত্র এমন অক্ষরগুলিতে প্রবেশ করার সময় লক্ষ্য করি যা একটি তৈরি করা উচিত "পুরানো ইউআরএল" উপস্থিত হয় এবং কিছুই ঘটে না।
তিলমান হাউশার

চমৎকার কাজ! আপনি খুশী হয়ে আপডেট করেছেন, এটি সক্রিয় প্রশ্নগুলিতে যেখানে আমি এটি স্পষ্ট করেছিলাম তা ফিরিয়ে দিয়েছে।
ফিক্সার 1234

4

ঠিক আছে, এটি কতটা ক্ষতিগ্রস্থ হয়েছে তার উপর নির্ভর করে মেরামত করা সম্ভব নাও হতে পারে। আপনার সেরা বেটটি সম্ভবত ডিবিটি ব্যবহার করে চেষ্টা করা এবং ডাম্প করা sqlite, তারপরে আপনি কী উদ্ধার করতে পারেন তা দেখুন।

যদি এটি ব্যর্থ হয়, আপনাকে সম্ভবত ব্যাকআপ থেকে পুনরুদ্ধার করতে হবে।

একটি ডাটাবেস ডাম্প এবং পুনরায় তৈরি করতে, কমান্ডটি ব্যবহার করুন .dump:

sqlite places.sqlite .dump | sqlite places-new.sqlite

1
ধন্যবাদ. এসও পোস্টটি কার্যকর না হওয়ায় এটি কার্যকর হয়নি, তবে লিঙ্কটিতে উল্লিখিত সমাধানটি কাজ করেছিল d:\sqlite3.exe d:\idimager.cat.db .dump | d:\sqlite3.exe d:\newdb.cat.db। সমস্ত ফ্যাভিকন এখন চলে গেছে, তবে সাইটগুলি দেখার সাথে সাথে আমি সেগুলি পুনর্নির্মাণ করছি। আবার ধন্যবাদ!
ববি

উপরের প্রশ্নের স্ট্যাকওভারফ্লো / প্রশ্ন / ২২৫৫৩০৫/২ লিঙ্কটি স্বেচ্ছায় এটির লেখক মুছে ফেলেছিলেননীচের উত্তরটি সহায়ক হতে পারে।
ব্যবহারকারী 66001

@ ব্যবহারকারী 66001: হ্যাঁ, ওপি তাদের প্রশ্নটি মুছে ফেলে। আমি প্রাসঙ্গিক কমান্ড অনুলিপি।
সেলসেকে

এটি আমার পক্ষে কার্যকর হয়নি এবং আমি একটি places.sqlite.corruptফাইল দিয়ে শেষ করেছি । আমি আমার সাথে কাজ করে এমন একটি সমাধান সহ আরও একটি উত্তর পোস্ট করেছি।
ড্যানিয়েল

2

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

কী ক্ষতিগ্রস্থ হয়েছে এবং কীভাবে এটি দূষিত হয়েছে তার উপর নির্ভর করে এক্সটেনশন স্থানগুলি রক্ষণাবেক্ষণ করে সমস্যাগুলি সমাধান করা সম্ভব হতে পারে । আমি কয়েকবার দূষিত জায়গাগুলি.স্ক্লাইট ফাইলটি দিয়ে শেষ করেছি। জায়গাগুলি রক্ষণাবেক্ষণ প্রতিবার বিভিন্ন চেক / ফিক্সগুলি চালিয়ে যা সমস্যার বিকল্পগুলির সংলাপটিতে এটি অপারেশন হিসাবে সরবরাহ করে সমস্যাটি সমাধান করতে সক্ষম হয়েছে। বিভিন্ন বিভিন্ন চেক এবং / অথবা রিপোর্টিংয়ের কয়েক মিনিট কয়েক মিনিট সময় নেওয়া উচিত।

যদি এটি কাজ না করে, তবে ড্রাগনলর্ড উপরে বর্ণিত অনুরূপভাবে ম্যানুয়ালি এটি ঠিক করার পথে যাওয়া প্রয়োজন হতে পারে।


1

এমডিএন-তে বর্ণিত এই প্রক্রিয়াটি আমাকে এমন একটি সমস্যার সমাধান করতে সহায়তা করেছে যেখানে আমি পরিদর্শন করা নতুন পৃষ্ঠাগুলি ব্রাউজারের ইতিহাসে রেকর্ড করা হয়নি। আমার কাছে কোনও places.sqlite.corrupt(বা places.sqlite-corrupt) ফাইল নেই, তবে আমার places.sqliteফাইলের অখণ্ডতা পরীক্ষা করে দেখা গেছে যে ডাটাবেস ডিস্ক চিত্রটি ত্রুটিযুক্ত।

ফায়ারফক্স থেকে প্রস্থান করুন এবং এখানে যাওয়ার আগে আপনার ফায়ারফক্স প্রোফাইলের একটি ব্যাকআপ তৈরি করুন।

$ cd /Users/<username>/Library/Application\ Support/Firefox/Profiles/<profile_dir>/
$ cp places.sqlite places.sqlite.bak  # for safety

$ sqlite3 places.sqlite
sqlite> PRAGMA integrity_check;
*** in database main ***
On tree page 2 cell 131: Rowid 20884 out of order
...
Error: database disk image is malformed
sqlite> .clone places-clone.sqlite
moz_places... done
moz_historyvisits... done
... more output like above plus a few errors (which I ignored) like
sqlite_sequence... Error: object name reserved for internal use: sqlite_sequence
SQL: [CREATE TABLE sqlite_sequence(name,seq)]
done
...
sqlite> PRAGMA user_version;
43  <----- TAKE NOTE OF THIS VALUE it may be different for you
sqlite> .exit

$ sqlite3 places-clone.sqlite
sqlite> PRAGMA integrity_check;
ok
sqlite> PRAGMA user_version = 43;  -- use the number you got from PRAGMA user_version; above
sqlite> PRAGMA journal_mode = truncate;
truncate
sqlite> PRAGMA page_size = 32768;
sqlite> VACUUM;
sqlite> PRAGMA journal_mode = wal;
wal
sqlite> .exit

$ mv places-clone.sqlite places.sqlite

ফায়ারফক্স শুরু করুন। ইতিহাস আবার কাজ করা উচিত।

আমি ফায়ারফক্স 60.0.1 এর সাথে একটি ম্যাক এ আছি on আপনার প্ল্যাটফর্মের জন্য আপনার আদেশগুলি সামঞ্জস্য করতে হতে পারে।


ধন্যবাদ ড্যানিয়েল, সর্বদা প্রকৃত কমান্ড পদ্ধতি দেখতে সহায়ক
not2qubit
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.