Làm thế nào tôi có thể loại bỏ hoàn toàn một vùng bảng khỏi MySQL? [đóng cửa]


8

Tôi có một cơ sở dữ liệu MySQL được gọi camera_main_live, mà tôi quản trị bằng Adminer . Đó là, tất cả sự xuất hiện, trống rỗng. Vì vậy, khi tôi muốn thêm một số nội dung, tôi bắt đầu bằng cách chạy tập lệnh này (với Quản trị viên được đặt thành dừng do lỗi):

DROP TABLE IF EXISTS `Addresses`;

CREATE TABLE `Addresses` (
  `Id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `UserId` int(10) unsigned NOT NULL,
  `FirstName` char(30) COLLATE utf8_unicode_ci DEFAULT NULL,
  `LastName` char(30) COLLATE utf8_unicode_ci DEFAULT NULL,
  `Address` char(30) COLLATE utf8_unicode_ci DEFAULT NULL,
  `Street` char(30) COLLATE utf8_unicode_ci DEFAULT NULL,
  `Town` char(30) COLLATE utf8_unicode_ci DEFAULT NULL,
  `State` char(30) COLLATE utf8_unicode_ci DEFAULT NULL,
  `Code` char(30) COLLATE utf8_unicode_ci DEFAULT NULL,
  `Country` char(50) COLLATE utf8_unicode_ci DEFAULT 'Ireland',
  `Billing` tinyint(3) unsigned DEFAULT '0',
  `Shipping` tinyint(3) unsigned DEFAULT '0',
  PRIMARY KEY (`Id`),
  KEY `IndexUserId` (`UserId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=FIXED;

Lỗi trong truy vấn (1813): Không gian bảng cho bảng '`camera_main_live`.`Addresses`' tồn tại. Vui lòng KHÁM PHÁ không gian bảng trước khi nhập.

Được rồi, chúng ta hãy cố gắng để làm rõ điều đó.

ALTER TABLE `Addresses` DROP TABLESPACE;

Lỗi trong truy vấn (1146): Bảng 'camera_main_live.Addresses' không tồn tại

Chúng tôi sẽ xuất hiện ở một bế tắc.

Tại thời điểm này, chúng tôi từ bỏ các lệnh SQL và thử một cái gì đó khác nhau:

root@Web-Dev-HP-ProDesk:/var/lib/mysql/camera_main_live# ll
total 76
drwx------  2 mysql mysql  4096 Jun 23 14:44 ./
drwx------ 13 mysql mysql  4096 Jun 23 11:12 ../
-rw-rw----  1 mysql mysql 65536 Jun 10 14:09 Addresses.ibd
-rw-rw----  1 mysql mysql    61 Jun 16 12:43 db.opt

À, vậy là có vấn đề!

root@Web-Dev-HP-ProDesk:/var/lib/mysql/camera_main_live# rm Addresses.ibd 
root@Web-Dev-HP-ProDesk:/var/lib/mysql/camera_main_live# ll
total 12
drwx------  2 mysql mysql 4096 Jun 23 14:48 ./
drwx------ 13 mysql mysql 4096 Jun 23 11:12 ../
-rw-rw----  1 mysql mysql   61 Jun 16 12:43 db.opt

Nhưng không! Các CREATE TABLElệnh ném một lỗi giống hệt nhau. Và Addresses.ibdđược tái tạo. Hãy thử một cái gì đó quyết liệt hơn.

root@Web-Dev-HP-ProDesk:/var/lib/mysql/camera_main_live# cd ..
root@Web-Dev-HP-ProDesk:/var/lib/mysql# rm -r camera_main_live/

Và sau đó,

CREATE DATABASE `camera_main_live` COLLATE 'utf8_unicode_ci';

Cơ sở dữ liệu hoàn toàn mới. Nó phải sạch sẽ và trống rỗng, phải không? Không. Không. Tôi lại gặp lỗi tương tự: không gian bảng vẫn tồn tại. Nó nằm ở đâu, và làm thế nào tôi có thể thoát khỏi nó?

# mysql --version
mysql  Ver 14.14 Distrib 5.6.24, for debian-linux-gnu (x86_64) using  EditLine wrapper
# uname --all
Linux Web-Dev-HP-ProDesk 3.19.0-21-generic #21-Ubuntu SMP Sun Jun 14 18:31:11 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 15.04
Release:        15.04
Codename:       vivid

Tôi đã thấy điều này trên một vài cơ sở dữ liệu cục bộ khác nhau: mỗi bảng khác nhau. Cho đến hôm nay, camera_main_livedường như đã tự sửa, điều này thậm chí còn khó hiểu hơn. Nhưng vấn đề vẫn tồn tại ở nơi khác. Trên cơ sở dữ liệu test, ví dụ,

CREATE TABLE `ProductsRelatedTypes` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`Position` int(11) NOT NULL,
`Title` char(100) COLLATE utf8_unicode_ci NOT NULL,
`Alert` tinyint(4) NOT NULL DEFAULT '0',
PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

Lỗi trong truy vấn (1813): Không gian bảng cho bảng '`test`.` ProductsRelatedTypes`' tồn tại. Vui lòng KHÁM PHÁ không gian bảng trước khi nhập.

DESC `ProductsRelatedTypes`

Lỗi trong truy vấn (1146): Bảng 'test. ProductsRelatedTypes' không tồn tại

SELECT * FROM `ProductsRelatedTypes`

Lỗi trong truy vấn (1146): Bảng 'test. ProductsRelatedTypes' không tồn tại

SHOW TABLES LIKE "ProductsRelatedTypes"

Không có hàng.

root@Web-Dev-HP-ProDesk:/var/lib/mysql/test# ll | grep Related
-rw-rw----  1 mysql mysql  8610 Jun 29 15:06 ProductsRelated.frm
-rw-rw----  1 mysql mysql     0 Jun 29 15:06 ProductsRelated.MYD
-rw-rw----  1 mysql mysql  1024 Jun 29 15:06 ProductsRelated.MYI
-rw-rw----  1 mysql mysql 65536 Jun 29 11:12 ProductsRelatedTypes.ibd
root@Web-Dev-HP-ProDesk:/var/lib/mysql/test# rm ProductsRelatedTypes.ibd 

CREATE TABLE `ProductsRelatedTypes` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`Position` int(11) NOT NULL,
`Title` char(100) COLLATE utf8_unicode_ci NOT NULL,
`Alert` tinyint(4) NOT NULL DEFAULT '0',
PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

Lỗi trong truy vấn (1050): Bảng '`test`.` ProductsRelatedTypes`' đã tồn tại

Huh?

DESC `ProductsRelatedTypes`

Lỗi trong truy vấn (1146): Bảng 'test. ProductsRelatedTypes' không tồn tại

SELECT * FROM `ProductsRelatedTypes`

Lỗi trong truy vấn (1146): Bảng 'test. ProductsRelatedTypes' không tồn tại

SHOW TABLES LIKE "ProductsRelatedTypes"

Không có hàng.

root@Web-Dev-HP-ProDesk:/var/lib/mysql/test# ll | grep Related
-rw-rw----  1 mysql mysql  8610 Jun 29 15:06 ProductsRelated.frm
-rw-rw----  1 mysql mysql     0 Jun 29 15:06 ProductsRelated.MYD
-rw-rw----  1 mysql mysql  1024 Jun 29 15:06 ProductsRelated.MYI
-rw-rw----  1 mysql mysql 65536 Jun 29 15:13 ProductsRelatedTypes.ibd

Vì vậy, khi .ibdtệp tồn tại, tôi được bảo rằng không gian bảng đã tồn tại. Khi tôi loại bỏ điều đó, tôi được thông báo rằng bảng đã tồn tại, mặc dù rõ ràng là không có. Màu tôi bối rối.


Truy vấn information_schema, tôi nhận được thông tin này:

mysql> SELECT * FROM `INNODB_SYS_TABLES` WHERE `Name` LIKE "%Address%";
+----------+--------------------------------------+------+--------+-------+-------------+------------+---------------+
| TABLE_ID | NAME                                 | FLAG | N_COLS | SPACE | FILE_FORMAT | ROW_FORMAT | ZIP_PAGE_SIZE |
+----------+--------------------------------------+------+--------+-------+-------------+------------+---------------+
|     2826 | camera_main_live2/Addresses          |    1 |     15 |  2812 | Antelope    | Compact    |             0 |
|     3789 | ronayne_mytools_main_live2/Addresses |    1 |     16 |  3775 | Antelope    | Compact    |             0 |
|     1312 | test/Addresses                       |    1 |     15 |  1298 | Antelope    | Compact    |             0 |
+----------+--------------------------------------+------+--------+-------+-------------+------------+---------------+
3 rows in set (0.01 sec)

mysql> SELECT * FROM `INNODB_SYS_TABLESPACES` WHERE `Name` LIKE "%Address%";
+-------+--------------------------------------+------+-------------+----------------------+-----------+---------------+
| SPACE | NAME                                 | FLAG | FILE_FORMAT | ROW_FORMAT           | PAGE_SIZE | ZIP_PAGE_SIZE |
+-------+--------------------------------------+------+-------------+----------------------+-----------+---------------+
|  1298 | test/Addresses                       |    0 | Antelope    | Compact or Redundant |     16384 |             0 |
|  2812 | camera_main_live2/Addresses          |    0 | Antelope    | Compact or Redundant |     16384 |             0 |
|  3775 | ronayne_mytools_main_live2/Addresses |    0 | Antelope    | Compact or Redundant |     16384 |             0 |
+-------+--------------------------------------+------+-------------+----------------------+-----------+---------------+
3 rows in set (0.00 sec)

mysql> SELECT * FROM `TABLESPACES`;
Empty set (0.00 sec)

Không ai trong số này có bất kỳ dấu hiệu nào camera_main_live.Addressestồn tại. Bất kỳ truy vấn nào đều information_schema.TABLESthất bại:

Lỗi trong truy vấn (1018): Không thể đọc thư mục của '.' (errno: 24 - Quá nhiều tệp đang mở)

Bây giờ, sau khi khởi động lại máy tính của tôi,

mysql> SHOW STATUS LIKE 'open_%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| Open_files               | 61    |
| Open_streams             | 0     |
| Open_table_definitions   | 90    |
| Open_tables              | 84    |
| Opened_files             | 191   |
| Opened_table_definitions | 0     |
| Opened_tables            | 0     |
+--------------------------+-------+
7 rows in set (0.00 sec)

mysql> SHOW VARIABLES LIKE "table_open_cache";
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| table_open_cache | 431   |
+------------------+-------+
1 row in set (0.00 sec)

mysql> SHOW VARIABLES LIKE "innodb_open_files";
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| innodb_open_files | 431   |
+-------------------+-------+
1 row in set (0.00 sec)

mysql> SHOW VARIABLES LIKE "open_files_limit";
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| open_files_limit | 1024  |
+------------------+-------+
1 row in set (0.01 sec)

Đang cố gắng tạo bảng từ dấu nhắc lệnh:

mysql> CREATE TABLE `Addresses` (   `Id` int(10) unsigned NOT NULL AUTO_INCREMENT,   `UserId` int(10) unsigned NOT NULL,   `FirstName` char(30) COLLATE utf8_unicode_ci DEFAULT NULL,   `LastName` char(30) COLLATE utf8_unicode_ci DEFAULT NULL,   `Address` char(30) COLLATE utf8_unicode_ci DEFAULT NULL,   `Street` char(30) COLLATE utf8_unicode_ci DEFAULT NULL,   `Town` char(30) COLLATE utf8_unicode_ci DEFAULT NULL,   `State` char(30) COLLATE utf8_unicode_ci DEFAULT NULL,   `Code` char(30) COLLATE utf8_unicode_ci DEFAULT NULL,   `Country` char(50) COLLATE utf8_unicode_ci DEFAULT 'Ireland',   `Billing` tinyint(3) unsigned DEFAULT '0',   `Shipping` tinyint(3) unsigned DEFAULT '0',   PRIMARY KEY (`Id`),   KEY `IndexUserId` (`UserId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=FIXED;
ERROR 1813 (HY000): Tablespace for table '`test`.`Addresses`' exists. Please DISCARD the tablespace before IMPORT.
mysql> SHOW WARNINGS;                                                                                                                 +---------+------+------------------------------------------------------------------------------------------------+
| Level   | Code | Message                                                                                        |
+---------+------+------------------------------------------------------------------------------------------------+
| Warning | 1478 | InnoDB: assuming ROW_FORMAT=COMPACT.                                                           |
| Error   | 1813 | Tablespace for table '`test`.`Addresses`' exists. Please DISCARD the tablespace before IMPORT. |
| Error   | 1030 | Got error 184 from storage engine                                                              |
+---------+------+------------------------------------------------------------------------------------------------+
3 rows in set (0.00 sec)

Nếu bạn xóa ibdtệp hoặc thư mục, quy trình mysql vẫn mở, vì vậy không có gì thay đổi ... khi sau đó mysql đóng tệp xử lý đó, nó sẽ "tự sửa" vì lần mở tiếp theo, tệp / dir không có ở đó.
Marki555

Bạn có thể kiểm tra những bảng / không gian bảng nào tồn tại bằng cách truy vấn information_schemacơ sở dữ liệu ... bạn có thể đăng kết quả ở đây không? Đối với các bảng Ví dụ INNODB_SYS_TABLES, TABLES,TABLESPACES
Marki555

Tôi đã báo cáo trước đó camera_main_liveđã tự sửa. Tuy nhiên, khi tôi thử chạy lại truy vấn ban đầu đó, nó đã bỏ bảng, như mong đợi, nhưng không thể tạo lại nó. Vì vậy, rõ ràng camera_main_liveđã phá vỡ một lần nữa. Trời ạ! Dù sao, thông tin bạn yêu cầu information_schemahiện đang được đưa ra.
TRiG

Ah. Chỉ cần chú ý bình luận đầu tiên của bạn. Hãy thử làm trống cơ sở dữ liệu bằng tay và sau đó khởi động lại MySQL.
TRiG 8/07/2015

Điều đó đã làm việc, bây giờ. Có lẽ đó sẽ là nó. Vẫn không chắc chắn tại sao vấn đề này xảy ra ở nơi đầu tiên.
TRiG

Câu trả lời:


2

Các bước để giải quyết vấn đề này (ít nhất là trong HĐH Windows):

  1. dừng dịch vụ MySQL
  2. xóa table.ibdtập tin
  3. di chuyển tất cả các tệp từ thư mục Dữ liệu MySQL sang thư mục sao lưu
  4. bắt đầu dịch vụ MySQL (tất cả các tệp chính sẽ được tạo lại)
  5. tạo bảng bạn cần

CẢNH BÁO: các bước này không hoạt động tốt cho mọi trường hợp ... xin lỗi! Nếu bạn đã tiến hành theo cách đó, chỉ cần sao chép các tệp của bạn từ thư mục sao lưu vào thư mục gốc.
Marco Aurélio

Có, đừng có xóa các tập tin sql của tôi trừ khi bạn chỉ muốn bỏ lược đồ chết tiệt và cài đặt lại mọi thứ!
Alex Barker
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.