Schrödingers MySQL टेबल: मौजूद है, फिर भी ऐसा नहीं है


118

मैं सभी की अजीब त्रुटि कर रहा हूँ।

कभी-कभी, तालिकाओं को बनाते या बदलते समय, मुझे 'तालिका पहले से मौजूद है' त्रुटि मिलती है। हालाँकि, DROP TABLE '# 1051 - अज्ञात तालिका' लौटाता है। इसलिए मुझे एक तालिका मिली जिसे मैं नहीं बना सकता, नहीं छोड़ सकता।

जब मैं डेटाबेस को छोड़ने की कोशिश करता हूं, तो mysqld क्रैश हो जाता है। कभी-कभी यह अलग नाम के साथ एक और डीबी बनाने में मदद करता है, कभी-कभी ऐसा नहीं होता है।

मैं ~ 50 तालिकाओं के साथ DB का उपयोग करता हूं, सभी InnoDB। यह समस्या विभिन्न तालिकाओं के साथ होती है।

मैंने विंडोज, फेडोरा और उबंटू, MySQL 5.1 और 5.5 पर इसका अनुभव किया। पीडीओ, PHPMyAdmin या कमांडलाइन का उपयोग करते समय समान व्यवहार। मैं अपने स्कीमा को प्रबंधित करने के लिए MySQL वर्कबेंच का उपयोग करता हूं - मैंने कुछ संबंधित त्रुटियों (एंडलाइन और सामान) को देखा, हालांकि उनमें से कोई भी मेरे लिए प्रासंगिक नहीं था।

नहीं, यह एक दृश्य नहीं है, यह एक तालिका है। सभी नाम लोअरकेस हैं।

मैंने सब कुछ करने की कोशिश की जो मैं Google कर सकता था - टेबल को फ्लश करना, db से db तक .frm फाइलें, mysql लॉग पढ़ना, कुछ भी मदद नहीं की लेकिन पूरे लानत चीज को फिर से स्थापित करना।

'तालिका दिखाएँ' से कुछ नहीं पता चलता है, 'वर्णन' तालिका कहती है कि 'तालिका मौजूद नहीं है,' कोई .fr फ़ाइल नहीं है, फिर भी 'तालिका बनाएँ' अभी भी एक त्रुटि के साथ समाप्त होती है (और यदि मौजूद नहीं है तो तालिका बनाएँ) और ड्रॉपिंग डेटाबेस mysql को क्रैश करता है

संबंधित, अभी तक अनपेक्षित प्रश्न:

संपादित करें:

mysql> use askyou;
Database changed

mysql> show tables;
Empty set (0.00 sec)

mysql> create table users_has_friends (id int primary key);
ERROR 1050 (42S01): Table '`askyou`.`users_has_friends`' already exists

mysql> drop table users_has_friends;
ERROR 1051 (42S02): Unknown table 'users_has_friends'

और इस तरह, सभी समान: तालिका मौजूद नहीं है, फिर भी बनाया नहीं जा सकता है;

mysql> drop database askyou;
ERROR 2013 (HY000): Lost connection to MySQL server during query

नाम बदलते हैं, यह एकमात्र तालिका / डेटाबेस नहीं है जिसके साथ मैं समस्याओं में चला गया हूं


2
क्या आप एक MySQL क्लाइंट खोल सकते हैं, और समस्या को प्रदर्शित करने वाले कुछ कमांड टाइप कर सकते हैं, फिर यहाँ कमांड और आउटपुट की एक सटीक कॉपी कॉपी और पेस्ट कर सकते हैं। यह बहुत अच्छा है कि आपने अपनी समस्या का बहुत विस्तार से वर्णन किया है, लेकिन अगर आप सटीक कमांड और संदेश पोस्ट करते हैं तो यह और भी बेहतर होगा।
मार्क बायर्स

यदि निश्चित रूप से समान नाम का कोई दृश्य नहीं है, तो मैं MySQL की डेटा फ़ाइल संरचना को विजयी करूँगा।

3
आप के जवाब में क्या मिलता है SHOW FULL TABLES IN askyouऔर SELECT * FROM information_schema.TABLES WHERE TABLE_SCHEMA LIKE 'askyou'?
१२

1
क्या आप innodb_file_per_table का उपयोग कर रहे हैं?
ईएसजी

1
@ राफेलबेरोस: काफी सही। टाइपो। स्पष्टीकरण देने के लिए धन्यवाद।
एग्यगल

जवाबों:


19

जब डेटा फ़ाइल डेटा निर्देशिका में अनुपलब्ध है, तो मैंने यह समस्या देखी है, लेकिन तालिका परिभाषा फ़ाइल मौजूद है या vise-versa है। यदि आप innodb_file_per_table का उपयोग कर रहे हैं, तो यह सुनिश्चित करने के लिए डेटा निर्देशिका की जांच करें कि आपके पास .frmतालिका और विचाराधीन दोनों फ़ाइल के लिए फ़ाइल है। यदि यह MYISAM है, तो एक .frm, .MYIऔर एक .MYDफाइल होनी चाहिए ।

समस्या को आमतौर पर अनाथ फ़ाइल को मैन्युअल रूप से हटाकर हल किया जा सकता है।


3
मैं उपयोग नहीं कर रहा हूं innodb_file_per_table; हालाँकि, जब मैं इसे चालू करता हूं और तालिका को फिर से बनाने की कोशिश करता हूं, तो यह केवल .ibdफ़ाइल बनाता है । .frmकहीं नहीं मिला है। यह केवल एक निश्चित तालिका पर लागू होता है (10+ अन्य सही फ़ाइलों के साथ बनाए जाते हैं)। उस अनाथ ibd को हटाने से कुछ भी मदद नहीं मिलती है
Corkscreewe

1
मैं innodb_file_per_table का उपयोग कर रहा हूं; लेकिन अगर मैं अनाथ .fr को हटाता हूं, तो यह तब बनाया जाता है जब मैं क्रिएट स्टेटमेंट चलाता हूं (लेकिन क्रिएट स्टेटमेंट में कोई त्रुटि होती है, .ibd फाइल नहीं बनती है, और मैं अभी भी इसे नहीं हटा सकता)
andrew lorien

14

यहां एक जंगली अनुमान पर जा रहे हैं, लेकिन ऐसा लगता है कि निर्दोष अभी भी एक टेबलस्पेस में अपने टेबल के लिए एक प्रविष्टि है, शायद में ibdata। यदि आपको वास्तव में किसी भी डेटा की आवश्यकता नहीं है , या यदि आपके पास बैकअप है, तो निम्न प्रयास करें:

  1. सभी स्कीमा हटाएं (mysql को छोड़कर)
  2. डेटाबेस को बंद करें
  3. सुनिश्चित करें कि आपकी डेटा निर्देशिका के सभी फ़ोल्डर ठीक से हटा दिए गए हैं (फिर से, mysql को छोड़कर)
  4. ibdata और लॉग फ़ाइलों को हटा दें
  5. डेटाबेस को पुनरारंभ करें। यह खरोंच से टेबलस्पेस और लॉग को फिर से बनाना चाहिए।

2
शानदार: mysql को रोकना, 'ibdata1', 'ib_logfile1', 'ib_logfile0' को हटाना और mysql को पुनरारंभ करने से मेरी समस्या हल हो गई। आपका बहुत बहुत धन्यवाद!
21

4

फिक्स आसान हो जाता है; कम से कम मैंने जो काम किया, मेरे लिए काम किया। एक अन्य MySQL उदाहरण पर एक तालिका "zzz" बनाएं, जहां zzz समस्या तालिका नाम है। (यानी यदि तालिका को स्कॉलरिंग कहा जाता है, तो विकल्प जो ज़ज़ के लिए लिखा गया है।) यह मायने नहीं रखता कि तालिका की परिभाषा क्या है। यह एक अस्थायी डमी है; सर्वर पर डेटाबेस निर्देशिका में zzz.frm फ़ाइल की प्रतिलिपि बनाएँ जहाँ तालिका होनी चाहिए, सुनिश्चित करें कि फ़ाइल स्वामित्व और अनुमतियाँ अभी भी फ़ाइल पर सही हैं। MySQL पर, आप अब "शो टेबल" कर सकते हैं, और टेबल ज़ज़ होगा। mysql> ड्रॉप टेबल ज़ज़; ... अब काम करना चाहिए। यदि आवश्यक हो तो निर्देशिका में किसी भी zzz.MYD या ZZZ.MYI फ़ाइलों को साफ़ करें।


वास्तव में इस समाधान ने मेरी जान बचाई, धन्यवाद! मैंने दूसरे डेटाबेस से FRM और IDB फ़ाइल की प्रतिलिपि बनाई थी, लेकिन एक ही सर्वर (एक ही MySQL संस्करण आदि ...) पर और यह शान से काम करता है।
पियरे

मैं पुष्टि करता हूं, यह .frmफ़ाइल को दूसरे उदाहरण (मास्टर / दास) से कॉपी करने और निर्देशिका, ड्रॉप टेबल में डालने का तरीका है और आप फिर से तालिका बना पाएंगे।
१०:४३ पर juliangonzalez

3

मुझे संदेह है कि यह यहां प्रश्न मामले का एक सीधा जवाब है, लेकिन यहां बताया गया है कि मैंने अपने ओएस एक्स लायन सिस्टम पर इस सटीक कथित समस्या को कैसे हल किया ।

मेरे द्वारा निर्धारित कुछ एनालिटिक्स नौकरियों के लिए मैं अक्सर टेबल बनाता / छोड़ता हूं। कुछ बिंदु पर, मुझे अपनी स्क्रिप्ट के माध्यम से पहले से ही त्रुटियों के आधे-अधूरे होने की तालिका मिलनी शुरू हो गई। एक सर्वर रीस्टार्ट ने आम तौर पर समस्या को हल कर दिया, लेकिन वह भी एक समाधान से नाराज था।

फिर मैंने स्थानीय त्रुटि लॉग फ़ाइल में इस विशेष लाइन पर ध्यान दिया:

[Warning] Setting lower_case_table_names=2 because file system for /usr/local/mysql/data/ is case insensitive

इससे मुझे यह विचार आया कि शायद अगर मेरे टेबल में बड़े अक्षरों में समाहित है, तो MySQL को यह सोचकर बेवकूफ बनाया जाएगा कि मैं उन्हें गिराए जाने के बाद भी वहीं हूं। यह मामला निकला और तालिका नामों के लिए केवल लोअरकेस अक्षरों का उपयोग करने के लिए स्विच करने से समस्या दूर हो गई।

यह मेरे मामले में कुछ गलतफहमी का परिणाम है, लेकिन उम्मीद है कि यह त्रुटि मामला किसी को कम समय बर्बाद करने में मदद करेगा।


3

यह एक पुराना प्रश्न है, लेकिन मैंने सिर्फ एक ही मुद्दे को मारा है और शीर्ष पर जुड़े संबंधित मुद्दों में से एक में एक जवाब था, बस मुझे फाइलों और तालिकाओं को हटाने, सर्वर को बंद करने आदि की तुलना में बहुत कम कठोर था।

mysqladmin -uxxxxxx -pyyyyy flush-tables

1

मेरे मामले में आवेदन को चलाने वाले उपयोगकर्ता को mysql डेटा निर्देशिका के स्वामित्व को बदलकर समस्या को हल किया गया था। (मेरे मामले में यह एक जावा अनुप्रयोग था जो जेट्टी वेबसर्वर चल रहा था।)

भले ही mysql चल रहा था और अन्य ऐप इसे ठीक से उपयोग कर सकते थे, लेकिन इस ऐप में समस्या थी। डेटा निर्देशिका स्वामित्व को बदलने और उपयोगकर्ता के पासवर्ड को रीसेट करने के बाद, सब कुछ ठीक से काम किया।


1

यदि इस त्रुटि के साथ स्टॉक 1051 होगा और आप केवल डेटाबेस को हटाना चाहते हैं और इसे फिर से आयात करते हैं तो यह चरण करें और सभी ठीक होने वाले हैं ...।

यूनिक्स में जड़ के रूप में :

  • rm -rf / var / lib / mysql / your_DATABASE;
  • वैकल्पिक -> mysql_upgrad --force
  • mysqlcheck -uUSER -pPASS your_DATABASE
  • mysqladmin -uUSER -pPASS अपना_DATABASE ड्रॉप करें
  • mysqladmin -uUSER -pPASS your_DATABASE बनाएं
  • mysql-LUSER -pPASS YOUR_DATABASE <IMPORT_FILE

सादर, क्राइस्टस


0

मुझे यह समस्या थी और मुझे उम्मीद थी कि IBD फ़ाइल को हटाने से ऊपर पोस्ट करने में मदद मिलेगी लेकिन इससे कोई फर्क नहीं पड़ा। MySQL ने केवल एक नई IBD फाइल को फिर से बनाया है। मेरे मामले में, समान MySQL उदाहरण में अन्य डेटाबेस में वास्तव में समान तालिकाओं हैं। चूंकि FRM फ़ाइल गायब थी, इसलिए मैंने उसी डेटाबेस में उसी तालिका से FRM फ़ाइल की प्रतिलिपि बनाई, MySQL को पुनरारंभ किया और तालिका ने सही तरीके से काम किया।


0

तालिका बनाने और उसे हटाने के बाद मैं इस त्रुटि में भाग गया, फिर इसे बनाना चाहता था। मेरे मामले में, मेरे पास एक स्व-निहित डंप फ़ाइल थी इसलिए मैंने अपना स्कीमा गिरा दिया, इसे पुनः बनाया और डंप फ़ाइल का उपयोग करके तालिकाओं और डेटा को आयात किया।


0

यह हमारी साइट पर होता है (लेकिन शायद ही कभी) जब कुछ स्क्रिप्ट को चलाने के दौरान "घटना" होती है, जो बहुत सारे पुनर्निर्माण करते हैं। घटनाओं में नेटवर्क आउटेज या बिजली की समस्याएं शामिल हैं।
मैं इसके लिए बहुत ही कम मौकों पर ऐसा करता हूं - मैं भारी-भरकम दृष्टिकोण का उपयोग करता हूं:

  • मुझे केवल विशेष तालिका से छुटकारा पाने और पुन: निर्माण करने की आवश्यकता थी। मैं आमतौर पर इस स्थिति में हूं कि तालिका के निर्माण के बाद से यह ठीक है। (डेटा पुनर्प्राप्त करने की आवश्यकता होने पर आपकी स्थिति भिन्न हो सकती है)
  • एक व्यवस्थापक के रूप में, mysql इंस्टालेशन में जाएं (विंडोज़ पर यह हो सकता है "... प्रोग्राम फाइल्स / mysql / MySQL सर्वर xx / data / <schemaname>
  • <Schemaname> फ़ोल्डर में तालिका नाम के साथ अपमानजनक फ़ाइल ढूंढें - और इसे हटा दें।
  • अनाथ अस्थायी फ़ाइलों की जाँच करें और उन्हें भी हटा दें। # - अगर वे वहाँ होने के लिए फ़ाइलें frm।
  • MySQL आपको टेबल को फिर से बनाने देगा

मैं एक लंबे समय (वर्षों) में विभिन्न डेटाबेस के एक जोड़े पर यह समस्या है। यह एक स्टम्पर था क्योंकि विरोधाभासी संदेश। पहली बार जब मैंने डेटाबेस को हटाने / पुनर्निर्माण / नाम बदलने का बदलाव किया जैसा कि अन्य उत्तरों में वर्णित है और चीजों को प्राप्त करने में कामयाब रहा है, लेकिन यह निश्चित रूप से उस तरह से लंबा होता है। मेरे लिए भाग्यशाली यह हमेशा उन संदर्भ तालिकाओं के लिए हुआ है जिन्हें फिर से बनाया जा रहा है - DROP'd और CREATEd - आमतौर पर सुबह में। शायद ही कभी समस्या हुई लेकिन इसे एक विशेष विचित्र मामले के रूप में पहचाना गया। (मैं आराम करूँगा: यदि आपको अन्य समाधानों के लिए डेटा लुक को पुनर्प्राप्त करने की आवश्यकता है।)

  • यह किसी अन्य उपयोगकर्ता या किसी अन्य डेटाबेस से संबंधित तालिका नहीं है
  • यह ऊपरी / निचले मामले का मुद्दा नहीं है, मैं सभी निचले मामलों का उपयोग करता हूं, लेकिन यह एक दिलचस्प मुद्दा था!
  • यह अतिरिक्त रूप से निराशाजनक था, "यह निश्चित रूप से था </ भिन्न-भिन्न / उपयोगकर्ता-तालिका-केस> के परिवर्तनों के साथ प्रतिक्रियाओं को देखकर और आप इसे सही नहीं कर रहे हैं" :)
  • टेबल "शो टेबल" पर नहीं दिखा
  • तालिका एक INNODB तालिका (हमेशा / थी) थी।
  • DROP को तालिका में लाने के प्रयास में त्रुटि संदेश दिया गया कि तालिका मौजूद नहीं है।
  • लेकिन तालिका बनाने की कोशिश में त्रुटि संदेश दिया गया कि तालिका पहले से मौजूद है।
  • mysql 5.0 या 5.1 का उपयोग करना
  • REPAIR इस समस्या के लिए अप्रभावी है

-1

मुझे एक विशेष तालिका के साथ यह समस्या आ रही थी। संभावित समाधानों को पढ़कर मैंने कुछ कदम उठाए जैसे:

  • अनाथ फ़ाइलों के लिए खोजें: किसी का अस्तित्व नहीं था;
  • निष्पादित:: show full tables in database;समस्याग्रस्त एक नहीं देखा;
  • निष्पादित:: describe table;लौटा table doesn't exist;
  • निष्पादित:: SELECT * FROM information_schema.TABLES WHERE TABLE_NAME='table';लौटा Empty set;
  • PhpMyAdmin द्वारा मैन्युअल रूप से ऊपर की क्वेरी खोजें: मौजूद नहीं था;

और, उन चरणों के बाद, मैं फिर से show tables;जाँचता हूँ और ... vualá! समस्याग्रस्त तालिका चली गई थी। मैं इसे बना सकता हूं और इसे बिना किसी समस्या के एक ही समस्याग्रस्त नाम से छोड़ सकता हूं, और मेरे पास सर्वर को पुनरारंभ करने के लिए भी नहीं था! अजीब...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.