Bảng MySQL của Schrödingers: tồn tại, nhưng nó không


118

Tôi đang gặp lỗi kỳ lạ nhất trong tất cả.

Đôi khi, khi tạo hoặc thay đổi bảng, tôi gặp lỗi 'bảng đã tồn tại'. Tuy nhiên, DROP TABLE trả về '# 1051 - bảng không xác định'. Vì vậy, tôi có một bảng tôi không thể tạo, không thể thả.

Khi tôi cố gắng thả cơ sở dữ liệu, mysqld bị treo. Đôi khi nó hữu ích để tạo một db khác với tên khác, đôi khi nó không.

Tôi sử dụng một DB với ~ 50 bảng, tất cả là InnoDB. Sự cố này xảy ra với các bảng khác nhau.

Tôi đã trải nghiệm điều này trên Windows, Fedora và Ubuntu, MySQL 5.1 và 5.5. Hành vi tương tự, khi sử dụng PDO, PHPMyAdmin hoặc dòng lệnh. Tôi sử dụng MySQL Workbench để quản lý lược đồ của mình - tôi đã thấy một số lỗi liên quan (dòng cuối và nội dung), tuy nhiên không có lỗi nào trong số đó liên quan đến tôi.

Không, nó không phải là một cái nhìn, nó là một cái bàn. Tất cả các tên đều là chữ thường.

Tôi đã thử mọi thứ tôi có thể google - xóa bảng, di chuyển tệp .frm từ db sang db, đọc nhật ký mysql, không có gì giúp được ngoài việc cài đặt lại toàn bộ thứ chết tiệt.

'Hiển thị bảng' không hiển thị gì, bảng 'mô tả' cho biết 'bảng không tồn tại', không có tệp .frm, nhưng 'tạo bảng' vẫn kết thúc bằng lỗi (và 'tạo bảng nếu không tồn tại') và thả sập cơ sở dữ liệu mysql

Các câu hỏi liên quan nhưng không hữu ích:

Biên tập:

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'

Và như vậy, tất cả đều giống nhau: bảng không tồn tại, chưa thể tạo;

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

Tên thay đổi, đây không phải là bảng / cơ sở dữ liệu duy nhất tôi gặp sự cố


2
Bạn có thể mở một máy khách MySQL và nhập một số lệnh giải thích sự cố, sau đó sao chép và dán một bản sao chính xác của các lệnh và xuất ở đây. Thật tuyệt khi bạn đã mô tả vấn đề của mình rất chi tiết, nhưng sẽ tốt hơn nữa nếu bạn đăng các lệnh và thông báo chính xác.
Đánh dấu Byers

Nếu chắc chắn không có chế độ xem cùng tên, tôi đặt cược cấu trúc tệp dữ liệu của MySQL sẽ rất khó.
eggyal

3
Bạn nhận được gì để đáp lại SHOW FULL TABLES IN askyouSELECT * FROM information_schema.TABLES WHERE TABLE_SCHEMA LIKE 'askyou'?
eggyal

1
Bạn có đang sử dụng innodb_file_per_table không?
ESG

1
@RafaelBarros: Khá đúng. Lỗi đánh máy. Cảm ơn đã làm rõ.
eggyal

Câu trả lời:


19

Tôi đã gặp sự cố này khi tệp dữ liệu bị thiếu trong thư mục dữ liệu nhưng tệp định nghĩa bảng tồn tại hoặc ngược lại. Nếu bạn đang sử dụng innodb_file_per_table, hãy kiểm tra thư mục dữ liệu để đảm bảo rằng bạn có cả .frmtệp và tệp .ibd cho bảng được đề cập. Nếu đó là MyISAM, cần có một .frm, .MYIvà một .MYDtập tin.

Sự cố thường có thể được giải quyết bằng cách xóa tệp mồ côi theo cách thủ công.


3
Tôi không sử dụng innodb_file_per_table; tuy nhiên, khi tôi bật nó lên và cố gắng tạo lại bảng, nó chỉ tạo ra .ibdtệp. .frmkhông có nơi nào được tìm thấy. Điều này chỉ áp dụng cho một bảng nhất định (hơn 10 bảng khác được tạo bằng các tệp chính xác). Xóa ibd mồ côi đó dù sao cũng không giúp được gì
Corkscreewe

1
Tôi đang sử dụng innodb_file_per_table; nhưng nếu tôi xóa .frm mồ côi, nó sẽ được tạo lại khi tôi chạy câu lệnh create (nhưng câu lệnh create trả về lỗi, tệp .ibd không được tạo và tôi vẫn không thể
xóa

14

Tiếp tục phỏng đoán ở đây, nhưng có vẻ như innodb vẫn có một mục nhập cho các bảng của bạn trong một vùng bảng, có thể là trong ibdata. Nếu bạn thực sự không cần bất kỳ dữ liệu nào hoặc nếu bạn có bản sao lưu, hãy thử các cách sau:

  1. Xóa tất cả các lược đồ (ngoại trừ mysql)
  2. tắt cơ sở dữ liệu
  3. Đảm bảo rằng tất cả các thư mục trong thư mục dữ liệu của bạn đã được xóa đúng cách (một lần nữa, ngoại trừ mysql)
  4. xóa ibdata và các tệp nhật ký
  5. khởi động lại cơ sở dữ liệu. Nó sẽ tạo lại không gian bảng và nhật ký từ đầu.

2
Tuyệt vời: Dừng mysql, xóa 'ibdata1', 'ib_logfile1', 'ib_logfile0' và khởi động lại mysql đã giải quyết được vấn đề của tôi. Cảm ơn rất nhiều!
Meilo

4

Việc sửa chữa hóa ra rất dễ dàng; ít nhất là những gì tôi đã làm việc, làm việc cho tôi. Tạo một bảng "zzz" trên một phiên bản MySQL khác, trong đó zzz là tên bảng sự cố. (tức là nếu bảng được gọi là schrodinger, hãy thay thế bảng đó cho zzz whever được viết.) Không quan trọng định nghĩa của bảng là gì. Đó là một hình nộm tạm thời; Sao chép tệp zzz.frm vào thư mục cơ sở dữ liệu trên máy chủ nơi có bảng, đảm bảo quyền sở hữu tệp và quyền vẫn còn chính xác trên tệp. Trên MySQL, bây giờ bạn có thể thực hiện "hiển thị bảng;", và bảng zzz sẽ ở đó. mysql> thả bảng zzz; ... bây giờ sẽ hoạt động. Xóa mọi tệp zzz.MYD hoặc ZZZ.MYI trong thư mục nếu cần.


Thực sự giải pháp này đã cứu mạng tôi, cảm ơn bạn! Tôi đã sao chép tệp FRM và IDB từ một cơ sở dữ liệu khác nhưng trên cùng một máy chủ (cùng một phiên bản MySQL, v.v.) và nó có vẻ hoạt động tốt.
Pierre

Tôi xác nhận, đây là cách để sao chép .frmtệp từ phiên bản khác (master / slave) và đặt nó vào thư mục, bảng thả và bạn sẽ có thể tạo lại bảng.
juliangonzalez

3

Tôi nghi ngờ đây là câu trả lời trực tiếp cho trường hợp câu hỏi ở đây, nhưng đây là cách tôi giải quyết vấn đề được nhận thức chính xác này trên hệ thống OS X Lion của mình.

Tôi thường xuyên tạo / thả bảng cho một số công việc phân tích mà tôi đã lên lịch. Tại một số thời điểm, tôi bắt đầu nhận được bảng đã tồn tại lỗi nửa chừng trong tập lệnh của tôi. Khởi động lại máy chủ thường giải quyết được vấn đề, nhưng đó là một giải pháp quá khó chịu.

Sau đó, tôi nhận thấy trong tệp nhật ký lỗi cục bộ dòng cụ thể này:

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

Điều này cho tôi ý tưởng rằng có thể nếu các bảng của tôi chứa các chữ cái viết hoa, MySQL sẽ bị đánh lừa khi nghĩ rằng chúng vẫn ở đó ngay cả khi tôi đã bỏ chúng. Điều đó đã trở thành trường hợp và việc chuyển sang chỉ sử dụng các chữ cái thường cho tên bảng đã làm cho vấn đề biến mất.

Nó có thể là kết quả của một số cấu hình sai trong trường hợp của tôi, nhưng hy vọng trường hợp lỗi này sẽ giúp ai đó bớt lãng phí thời gian hơn khi cố gắng tìm ra giải pháp.


3

Đây là một câu hỏi cũ nhưng tôi chỉ gặp vấn đề tương tự và câu trả lời cho một trong những vấn đề liên quan được liên kết ở trên cùng là những gì tôi cần và ít quyết liệt hơn nhiều so với việc xóa tệp, bảng, tắt máy chủ, v.v.

mysqladmin -uxxxxxx -pyyyyy flush-tables

1

Trong trường hợp của tôi, vấn đề đã được giải quyết bằng cách thay đổi quyền sở hữu của thư mục dữ liệu mysql cho người dùng đã chạy ứng dụng. (Trong trường hợp của tôi, đó là một ứng dụng Java chạy máy chủ web Jetty.)

Mặc dù mysql đang chạy và các ứng dụng khác có thể sử dụng nó đúng cách, ứng dụng này đã gặp sự cố với điều đó. Sau khi thay đổi quyền sở hữu thư mục dữ liệu và đặt lại mật khẩu của người dùng, mọi thứ hoạt động bình thường.


1

Nếu sẽ có hàng với lỗi này 1051 và bạn chỉ muốn xóa cơ sở dữ liệu và nhập lại, hãy thực hiện các bước này và tất cả sẽ ổn thôi ....

trong Unix envoriment AS root :

  • rm -rf / var / lib / mysql / YOUR_DATABASE;
  • TÙY CHỌN -> mysql_upgrade --force
  • mysqlcheck -uUSER -pPASS YOUR_DATABASE
  • mysqladmin -uUSER -pPASS thả YOUR_DATABASE
  • mysqladmin -uUSER -pPASS tạo YOUR_DATABASE
  • mysql -uUSER -pPASS YOUR_DATABASE <IMPORT_FILE

Trân trọng, Christus


0

Tôi gặp sự cố này và hy vọng việc xóa tệp IBD sẽ hữu ích như đã đăng ở trên nhưng nó không có gì khác biệt. MySQL chỉ tạo lại một tệp IBD mới. Trong trường hợp của tôi, thực sự có các bảng tương tự trong các cơ sở dữ liệu khác trong cùng một phiên bản MySQL. Vì tệp FRM bị thiếu, tôi đã sao chép tệp FRM từ bảng tương tự trong cơ sở dữ liệu khác, khởi động lại MySQL và bảng hoạt động chính xác.


0

Tôi đã gặp lỗi này sau khi tạo bảng và xóa nó, sau đó muốn tạo lại. Trong trường hợp của tôi, tôi có một tệp kết xuất độc lập nên tôi đã xóa giản đồ của mình, tạo lại nó và nhập các bảng và dữ liệu bằng cách sử dụng tệp kết xuất.


0

Nó xảy ra tại trang web của chúng tôi (nhưng hiếm khi) thường là khi một "sự kiện" xảy ra trong khi chạy một số tập lệnh nhất định phải xây dựng lại rất nhiều. Các sự kiện bao gồm mất mạng hoặc sự cố nguồn điện.
Những gì tôi làm cho điều này trong những trường hợp rất hiếm khi nó xảy ra - tôi sử dụng cách tiếp cận nặng tay:

  • Tôi chỉ cần loại bỏ và xây dựng lại bảng cụ thể. Tôi thường ở một vị trí rằng điều này là ổn vì bảng đang được xây dựng. (Tình huống của bạn có thể khác nếu bạn cần khôi phục dữ liệu)
  • Với tư cách là quản trị viên, hãy vào cài đặt mysql (trên windows có thể là "... tệp chương trình / mysql / MySQL Server xx / data / <schemaname>
  • Tìm tệp vi phạm có tên bảng trong thư mục <schemaname> - và xóa nó.
  • Kiểm tra các tệp tạm thời mồ côi và xóa chúng. # ... tệp frm nếu chúng tình cờ có ở đó.
  • MySQL sẽ cho phép bạn TẠO bảng một lần nữa

Tôi đã gặp sự cố này trên một vài cơ sở dữ liệu khác nhau trong một thời gian dài (nhiều năm). Đó là một vấp ngã vì những thông điệp trái ngược nhau. Lần đầu tiên tôi thực hiện một biến thể của cơ sở dữ liệu xóa / xây dựng lại / đổi tên như được mô tả trong các câu trả lời khác và cố gắng để mọi thứ diễn ra, nhưng chắc chắn mất nhiều thời gian hơn theo cách đó. Thật may mắn cho tôi, nó luôn xảy ra với các bảng tham chiếu đang được xây dựng lại - DROP'd và CREATEd - thường vào buổi sáng. Hiếm khi gặp vấn đề nhưng đã nhận ra nó như một trường hợp kỳ quặc đặc biệt. (Tôi sẽ trình bày lại: nếu bạn cần khôi phục giao diện dữ liệu cho các giải pháp khác.)

  • nó không phải là một bảng thuộc về người dùng khác hoặc trong cơ sở dữ liệu khác
  • nó không phải là vấn đề viết hoa / thường, tôi sử dụng tất cả các chữ thường, nhưng đó là một vấn đề thú vị!
  • thật là khó chịu khi thấy các câu trả lời với các biến thể của "chắc chắn là <there / not-there / some-other-user-table-case> và bạn đang làm không đúng" :)
  • bảng không hiển thị trên "hiển thị bảng"
  • bảng là (luôn luôn là / đã được) một bảng INNODB.
  • cố gắng DROP bảng đã đưa ra thông báo lỗi rằng bảng không tồn tại.
  • nhưng cố gắng TẠO bảng đã đưa ra thông báo lỗi rằng bảng đã tồn tại.
  • sử dụng mysql 5.0 hoặc 5.1
  • REPAIR không hiệu quả cho sự cố này

-1

Tôi đã gặp vấn đề này với một bảng cụ thể. Đọc các giải pháp khả thi, tôi đã thực hiện một số bước như:

  • Tìm kiếm tệp mồ côi: không tồn tại bất kỳ ai;
  • thực thi:: show full tables in database;không thấy vấn đề;
  • thực thi describe table;:: trả về table doesn't exist;
  • thực thi SELECT * FROM information_schema.TABLES WHERE TABLE_NAME='table';:: trả về Empty set;
  • Tìm kiếm bằng phpMyAdmin theo cách thủ công truy vấn ở trên: không tồn tại;

Và, sau những bước đó, tôi kiểm tra lại với show tables;và ... vualá! bảng có vấn đề đã biến mất. Tôi có thể tạo nó và thả nó với cùng một tên có vấn đề mà không có vấn đề gì và thậm chí tôi không cần phải khởi động lại máy chủ! Kỳ dị...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.