ตารางSchrödingers MySQL: มีอยู่ แต่ก็ไม่มี


118

ฉันมีข้อผิดพลาดที่แปลกประหลาดที่สุดของทั้งหมด

บางครั้งเมื่อสร้างหรือแก้ไขตารางฉันได้รับข้อผิดพลาด "มีตารางอยู่แล้ว" อย่างไรก็ตาม DROP TABLE จะส่งกลับ '# 1051 - Unknown table' ดังนั้นฉันจึงได้โต๊ะที่ฉันไม่สามารถสร้างไม่สามารถวางได้

เมื่อฉันพยายามปล่อยฐานข้อมูล mysqld ขัดข้อง บางครั้งก็ช่วยสร้างฐานข้อมูลอื่นที่มีชื่อต่างกันบางครั้งก็ไม่ได้

ฉันใช้ DB กับ ~ 50 ตารางทั้งหมด InnoDB ปัญหานี้เกิดขึ้นกับตารางที่แตกต่างกัน

ฉันพบสิ่งนี้บน Windows, Fedora และ Ubuntu, MySQL 5.1 และ 5.5 พฤติกรรมเดียวกันเมื่อใช้ PDO, PHPMyAdmin หรือ commandline ฉันใช้ MySQL Workbench เพื่อจัดการสคีมาของฉัน - ฉันเห็นข้อผิดพลาดที่เกี่ยวข้องบางอย่าง (endlines และสิ่งของ) แต่ไม่มีข้อผิดพลาดใดที่เกี่ยวข้องกับฉัน

ไม่มันไม่ใช่วิวมันเป็นตาราง ชื่อทั้งหมดเป็นตัวพิมพ์เล็ก

ฉันลองทุกอย่างที่ทำได้ใน Google - ล้างตารางย้ายไฟล์. fr จาก db ไปยัง db อ่านบันทึก 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 และพิมพ์คำสั่งบางอย่างแสดงให้เห็นถึงปัญหาที่เกิดขึ้นนั้นคัดลอกและวางที่แน่นอนสำเนาของคำสั่งและการส่งออกที่นี่ เป็นเรื่องดีที่คุณได้อธิบายปัญหาของคุณโดยละเอียด แต่จะดีกว่านี้ถ้าคุณโพสต์คำสั่งและข้อความที่แน่นอน
Mark Byers

หากไม่มีมุมมองที่มีชื่อเดียวกันอย่างแน่นอนฉันจะเดิมพันโครงสร้างไฟล์ข้อมูลของ MySQL ได้
eggyal

3
สิ่งที่คุณได้รับจากการตอบสนองSHOW FULL TABLES IN askyouและSELECT * FROM information_schema.TABLES WHERE TABLE_SCHEMA LIKE 'askyou'?
eggyal

1
คุณใช้ innodb_file_per_table หรือไม่
ESG

1
@RafaelBarros: ใช่เลย สะกดผิด ขอบคุณสำหรับความกระจ่าง
eggyal

คำตอบ:


19

ฉันพบปัญหานี้เมื่อไฟล์ข้อมูลหายไปในไดเร็กทอรีข้อมูล แต่มีไฟล์ข้อกำหนดตารางอยู่หรือในทางกลับกัน หากคุณใช้ innodb_file_per_table ให้ตรวจสอบไดเร็กทอรีข้อมูลเพื่อให้แน่ใจว่าคุณมีทั้ง.frmไฟล์และไฟล์. ibd สำหรับตารางที่เป็นปัญหา ถ้ามัน MyISAM มีควรจะเป็น.frm, .MYIและ.MYDไฟล์

โดยปกติปัญหาสามารถแก้ไขได้โดยการลบไฟล์ที่ไม่มีเจ้าของด้วยตนเอง


3
ฉันไม่ได้ใช้innodb_file_per_table; อย่างไรก็ตามเมื่อฉันเปิดและพยายามสร้างตารางขึ้นมาใหม่มันจะสร้าง.ibdไฟล์เท่านั้น .frmไม่มีที่ไหนที่จะพบ สิ่งนี้ใช้ได้กับตารางบางตารางเท่านั้น (10+ รายการอื่น ๆ ถูกสร้างขึ้นด้วยไฟล์ที่ถูกต้อง) การลบ ibd เด็กกำพร้านั้นไม่ได้ช่วยอะไรเลย
Corkscreewe

1
ฉันใช้ innodb_file_per_table; แต่ถ้าฉันลบ. frm ที่ไม่มีที่มามันจะถูกสร้างขึ้นใหม่เมื่อฉันเรียกใช้คำสั่ง create (แต่คำสั่ง create ส่งกลับข้อผิดพลาดไฟล์. ibd ไม่ได้ถูกสร้างขึ้นและฉันยังไม่สามารถวางได้)
andrew lorien

14

คาดเดาได้ยากที่นี่ แต่ดูเหมือนว่า innodb ยังคงมีรายการสำหรับตารางของคุณในช้อนโต๊ะอาจเป็นibdataได้ หากคุณไม่ต้องการข้อมูลใด ๆจริงๆหรือหากคุณมีข้อมูลสำรองให้ลองทำดังต่อไปนี้:

  1. ลบสกีมาทั้งหมด (ไม่รวม mysql)
  2. ปิดฐานข้อมูล
  3. ตรวจสอบให้แน่ใจว่าโฟลเดอร์ทั้งหมดในไดเร็กทอรีข้อมูลของคุณถูกลบอย่างถูกต้อง (อีกครั้งยกเว้น mysql)
  4. ลบ ibdata และล็อกไฟล์
  5. รีสตาร์ทฐานข้อมูล ควรสร้างพื้นที่ตารางและบันทึกใหม่ตั้งแต่ต้น

2
ยอดเยี่ยม: การหยุด mysql การลบ 'ibdata1', 'ib_logfile1', 'ib_logfile0' และการรีสตาร์ท mysql ช่วยแก้ปัญหาของฉันได้ ขอบคุณมาก!
Meilo

4

การแก้ไขกลายเป็นเรื่องง่าย อย่างน้อยสิ่งที่ฉันได้ทำก็ได้ผลสำหรับฉัน สร้างตาราง "zzz" บนอินสแตนซ์ MySQL อื่นโดยที่ zzz คือชื่อตารางปัญหา (เช่นถ้าตารางเรียกว่า schrodinger ให้แทนที่ด้วย zzz ที่เขียนไว้) ไม่สำคัญว่าคำจำกัดความของตารางคืออะไร มันเป็นหุ่นจำลองชั่วคราว คัดลอกไฟล์ zzz.frm ไปยังไดเร็กทอรีฐานข้อมูลบนเซิร์ฟเวอร์ที่ตารางควรอยู่ตรวจสอบให้แน่ใจว่าการเป็นเจ้าของไฟล์และสิทธิ์ยังคงถูกต้องบนไฟล์ ใน MySQL ตอนนี้คุณสามารถ "แสดงตาราง" ได้แล้วตาราง zzz จะอยู่ที่นั่น mysql> วางตาราง zzz; ... ควรใช้งานได้แล้ว ล้างไฟล์ zzz.MYD หรือ ZZZ.MYI ในไดเร็กทอรีหากจำเป็น


จริงๆแล้ววิธีนี้ช่วยชีวิตฉันได้ขอบคุณ! ฉันคัดลอกไฟล์ FRM และ IDB จากฐานข้อมูลอื่น แต่อยู่บนเซิร์ฟเวอร์เดียวกัน (เวอร์ชัน MySQL เดียวกัน ฯลฯ ... ) และดูเหมือนว่าจะทำงานได้อย่างสง่างาม
ปิแอร์

ฉันยืนยันว่านี่เป็นวิธีที่จะไปคัดลอก.frmไฟล์จากอินสแตนซ์อื่น (master / slave) และใส่ลงในไดเร็กทอรีวางตารางและคุณจะสามารถสร้างตารางได้อีกครั้ง
juliangonzalez

3

ฉันสงสัยว่านี่เป็นคำตอบโดยตรงสำหรับกรณีคำถามที่นี่ แต่นี่คือวิธีที่ฉันแก้ไขปัญหาการรับรู้ที่แน่นอนนี้ในระบบ OS X Lion ของฉัน

ฉันสร้าง / วางตารางบ่อยครั้งสำหรับงานการวิเคราะห์บางอย่างที่ฉันกำหนดไว้ ในบางครั้งฉันเริ่มรับตารางแล้วมีข้อผิดพลาดอยู่ครึ่งทางในสคริปต์ของฉัน โดยทั่วไปการรีสตาร์ทเซิร์ฟเวอร์จะช่วยแก้ปัญหาได้ แต่วิธีแก้ปัญหานั้นน่ารำคาญเกินไป

จากนั้นฉันสังเกตเห็นในไฟล์บันทึกข้อผิดพลาดในเครื่องบรรทัดนี้:

[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 ให้กับผู้ใช้ที่รันแอปพลิเคชัน (ในกรณีของฉันมันเป็นแอปพลิเคชัน Java ที่เรียกใช้เว็บเซิร์ฟเวอร์ของ Jetty)

แม้ว่า mysql จะทำงานอยู่และแอพอื่น ๆ ก็สามารถใช้งานได้อย่างถูกต้อง แต่แอพนี้ก็มีปัญหา หลังจากเปลี่ยนการเป็นเจ้าของไดเร็กทอรีข้อมูลและรีเซ็ตรหัสผ่านของผู้ใช้ทุกอย่างทำงานได้อย่างถูกต้อง


1

หากจะมีสต็อกพร้อมกับข้อผิดพลาด 1051 นี้และคุณต้องการลบฐานข้อมูลและนำเข้าอีกครั้งให้ทำตามขั้นตอนนี้และทั้งหมดจะดี ...

ใน Unix envoriment AS root :

  • rm -rf / var / lib / mysql / YOUR_DATABASE;
  • ไม่บังคับ -> mysql_upgrade --force
  • mysqlcheck -uUSER -pPASS YOUR_DATABASE
  • mysqladmin -uUSER -pPASS วาง YOUR_DATABASE
  • mysqladmin -uUSER -pPASS สร้าง YOUR_DATABASE
  • mysql -uUSER -pPASS YOUR_DATABASE <IMPORT_FILE

ขอแสดงความนับถือ Christus


0

ฉันมีปัญหานี้และหวังว่าการลบไฟล์ IBD จะช่วยได้ตามที่โพสต์ไว้ด้านบน แต่ก็ไม่แตกต่างกัน MySQL สร้างไฟล์ IBD ใหม่เท่านั้น ในกรณีของฉันมีตารางที่คล้ายกันในฐานข้อมูลอื่นในอินสแตนซ์ MySQL เดียวกัน เนื่องจากไฟล์ FRM หายไปฉันจึงคัดลอกไฟล์ FRM จากตารางที่คล้ายกันในฐานข้อมูลอื่นรีสตาร์ท MySQL และตารางทำงานได้อย่างถูกต้อง


0

ฉันพบข้อผิดพลาดนี้หลังจากสร้างตารางและลบไปแล้วจึงต้องการสร้างอีกครั้ง ในกรณีของฉันฉันมีไฟล์ดัมพ์ในตัวดังนั้นฉันจึงทิ้งสคีมาสร้างขึ้นใหม่และนำเข้าตารางและข้อมูลโดยใช้ไฟล์ดัมพ์


0

เหตุการณ์นี้เกิดขึ้นที่ไซต์ของเรา (แต่ไม่ค่อยเกิดขึ้น) โดยปกติเมื่อมี "เหตุการณ์" เกิดขึ้นในขณะที่เรียกใช้สคริปต์บางอย่าง เหตุการณ์ต่างๆรวมถึงเครือข่ายขัดข้องหรือปัญหาไฟฟ้า
สิ่งที่ฉันทำเพื่อสิ่งนี้ในโอกาสที่เกิดขึ้นน้อยมาก - ฉันใช้วิธีการมือหนัก:

  • ฉันต้องการเพียงแค่กำจัดและสร้างตารางนั้นขึ้นมาใหม่ ฉันมักจะอยู่ในตำแหน่งที่ใช้ได้เนื่องจากตารางกำลังถูกสร้างขึ้น (สถานการณ์ของคุณอาจแตกต่างออกไปหากคุณต้องการกู้คืนข้อมูล)
  • ในฐานะผู้ดูแลระบบให้เข้าไปที่การติดตั้ง mysql (บน windows อาจเป็น "... ไฟล์โปรแกรม / mysql / MySQL Server xx / data / <schemaname>
  • ค้นหาไฟล์ที่มีชื่อตารางในโฟลเดอร์ <schemaname> และลบออก
  • ตรวจหาไฟล์ชั่วคราวที่ไม่มีที่มาและลบออกด้วย # ... frm ไฟล์หากอยู่ที่นั่น
  • MySQL จะให้คุณสร้างตารางอีกครั้ง

ฉันมีปัญหานี้ในฐานข้อมูลที่แตกต่างกันสองสามฐานเป็นเวลานาน (ปี) มันสะดุดเพราะข้อความที่ขัดแย้งกัน ครั้งแรกที่ฉันทำการเปลี่ยนแปลงฐานข้อมูลการลบ / สร้างใหม่ / เปลี่ยนชื่อตามที่อธิบายไว้ในคำตอบอื่น ๆ และจัดการเพื่อให้สิ่งต่างๆดำเนินต่อไป แต่แน่นอนว่าต้องใช้เวลานานกว่านั้น โชคดีสำหรับฉันมันมักจะเกิดขึ้นกับตารางอ้างอิงที่ถูกสร้างขึ้นใหม่ - DROP'd และ CREATEd - โดยทั่วไปในตอนเช้า ไม่ค่อยมีปัญหา แต่มารับรู้ว่าเป็นกรณีพิเศษแปลก ๆ (ฉันจะอธิบายใหม่: หากคุณต้องการกู้คืนข้อมูลให้ดูวิธีแก้ไขปัญหาอื่น ๆ )

  • ไม่ใช่ตารางที่เป็นของผู้ใช้รายอื่นหรือในฐานข้อมูลอื่น
  • ไม่ใช่ปัญหาตัวพิมพ์ใหญ่ / เล็กฉันใช้ตัวพิมพ์เล็กทั้งหมด แต่นั่นเป็นปัญหาที่น่าสนใจ!
  • มันน่าผิดหวังเป็นพิเศษที่ได้เห็นการตอบกลับในรูปแบบต่างๆของ "มันเป็น <there / not-there / some-other-user-table-case> และคุณทำไม่ถูกต้อง" :)
  • ตารางไม่แสดงใน "แสดงตาราง"
  • ตารางคือ (เสมอ / เคยเป็น) เป็นตาราง INNODB
  • การพยายามวางตารางแสดงข้อความแสดงข้อผิดพลาดว่าไม่มีตาราง
  • แต่พยายามสร้างตารางให้ข้อความแสดงข้อผิดพลาดว่ามีตารางอยู่แล้ว
  • ใช้ mysql 5.0 หรือ 5.1
  • REPAIRไม่ได้ผลสำหรับปัญหานี้

-1

ฉันประสบปัญหานี้กับโต๊ะใดโต๊ะหนึ่ง การอ่านวิธีแก้ปัญหาที่เป็นไปได้ฉันได้ทำบางขั้นตอนเช่น:

  • ค้นหาไฟล์ orphan: ไม่มีใครอยู่เลย
  • ดำเนินการ:: 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á! ตารางที่มีปัญหาก็หายไป ฉันสามารถสร้างมันและวางด้วยชื่อที่มีปัญหาเดียวกันโดยไม่มีปัญหาและฉันไม่ได้รีสตาร์ทเซิร์ฟเวอร์ด้วยซ้ำ! แปลก...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.