Wie kann ich einen Tablespace vollständig aus MySQL entfernen? [geschlossen]

8

Ich habe eine MySQL-Datenbank namens camera_main_live, die ich mit Adminer verwalte . Es ist anscheinend leer. Wenn ich also Inhalte hinzufügen möchte, starte ich zunächst dieses Skript (wobei Adminer so eingestellt ist, dass es bei einem Fehler stoppt):

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;

Fehler in Abfrage (1813): Tabellenbereich für Tabelle '`camera_main_live`.`Addresses`' existiert. Bitte verwerfen Sie den Tablespace vor IMPORT.

Okay, versuchen wir das zu klären.

ALTER TABLE `Addresses` DROP TABLESPACE;

Fehler in Abfrage (1146): Tabelle 'camera_main_live.Addresses' existiert nicht

Wir scheinen in einer Sackgasse zu sein.

An diesem Punkt geben wir die SQL-Befehle auf und versuchen etwas anderes:

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

Ah, da ist also das Problem!

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

Aber nein! Der CREATE TABLEBefehl gibt einen identischen Fehler aus. Und Addresses.ibdwird neu erstellt. Versuchen wir etwas drastischeres.

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/

Und dann,

CREATE DATABASE `camera_main_live` COLLATE 'utf8_unicode_ci';

Brandneue Datenbank. Es muss sauber und leer sein, oder? Nein, ist es nicht. Ich erhalte wieder den gleichen Fehler: Der Tablespace existiert noch. Wo ist der Flip und wie kann ich ihn loswerden?

# 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

Ich habe dies in einigen verschiedenen lokalen Datenbanken gesehen: jedes Mal in verschiedenen Tabellen. Ab heute camera_main_livescheint sich behoben zu haben, was noch verwirrender ist. Aber das Problem besteht immer noch anderswo. In der Datenbank testzum Beispiel

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

Fehler in Abfrage (1813): Tabellenbereich für Tabelle '`test`.`ProductsRelatedTypes`' existiert. Bitte verwerfen Sie den Tablespace vor IMPORT.

DESC `ProductsRelatedTypes`

Fehler in Abfrage (1146): Tabelle 'test.ProductsRelatedTypes' existiert nicht

SELECT * FROM `ProductsRelatedTypes`

Fehler in Abfrage (1146): Tabelle 'test.ProductsRelatedTypes' existiert nicht

SHOW TABLES LIKE "ProductsRelatedTypes"

Keine Zeilen.

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

Fehler in Abfrage (1050): Tabelle '`test`.`ProductsRelatedTypes`' existiert bereits

Huh?

DESC `ProductsRelatedTypes`

Fehler in Abfrage (1146): Tabelle 'test.ProductsRelatedTypes' existiert nicht

SELECT * FROM `ProductsRelatedTypes`

Fehler in Abfrage (1146): Tabelle 'test.ProductsRelatedTypes' existiert nicht

SHOW TABLES LIKE "ProductsRelatedTypes"

Keine Zeilen.

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

Wenn die .ibdDatei existiert, wird mir gesagt, dass der Tablespace bereits existiert. Wenn ich das entferne, wird mir gesagt, dass die Tabelle bereits existiert, obwohl dies eindeutig nicht der Fall ist. Färbe mich verwirrt.


Bei der Abfrage information_schemaerhalte ich folgende Informationen:

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)

In keinem von diesen gibt es einen Hinweis, der camera_main_live.Addressesexistiert. Jede Abfrage information_schema.TABLESschlägt fehl:

Fehler in Abfrage (1018): Verzeichnis von '.' Kann nicht gelesen werden. (errno: 24 - Zu viele geöffnete Dateien)

Jetzt, nach dem Neustart meines Computers,

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)

Versuch, eine Tabelle über die Eingabeaufforderung zu erstellen:

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)
TRiG
quelle
Wenn Sie die ibdDatei oder das Verzeichnis entfernen , ist sie im MySQL-Prozess immer noch geöffnet, sodass sich nichts ändert. Wenn MySQL später dieses Dateihandle schließt, "repariert" es sich selbst, da die Datei / das Verzeichnis beim anschließenden Öffnen nicht vorhanden ist.
Marki555
Sie können überprüfen, welche Tabellen / Tablespaces vorhanden sind, indem Sie die information_schemaDatenbank abfragen. Können Sie hier Ergebnisse veröffentlichen? Zum Beispiel Tabellen INNODB_SYS_TABLES, TABLES,TABLESPACES
Marki555
Ich habe früher berichtet, dass camera_main_livesich das selbst behoben hatte. Als ich jedoch versuchte, diese ursprüngliche Abfrage erneut auszuführen, wurde die Tabelle erwartungsgemäß gelöscht, konnte sie jedoch nicht neu erstellen. Also camera_main_livehat sich anscheinend wieder selbst gebrochen. Gah! Wie auch immer, die Informationen, von denen Sie angefordert haben, information_schemasind jetzt vorhanden.
TRiG
Ah. Habe gerade deinen ersten Kommentar bemerkt. Versuchen Sie, die Datenbank von Hand zu leeren und anschließend MySQL neu zu starten.
TRiG
Das hat vorerst funktioniert. Vielleicht ist es das auch. Ich bin mir immer noch nicht sicher, warum dieses Problem überhaupt aufgetreten ist.
TRiG

Antworten:

2

Schritte zur Behebung dieses Problems (zumindest unter Windows):

  1. Stoppen Sie den MySQL-Dienst
  2. table.ibdDatei löschen
  3. Verschieben Sie alle Dateien aus dem MySQL-Datenordner in einen Sicherungsordner
  4. Starten Sie den MySQL-Dienst (alle Hauptdateien werden erneut erstellt)
  5. Erstellen Sie die Tabelle, die Sie benötigen
Marco Aurélio
quelle
WARNUNG: Diese Schritte funktionieren nicht in allen Fällen sehr gut ... Entschuldigung! Wenn Sie so vorgegangen sind, kopieren Sie einfach Ihre Dateien aus dem Sicherungsordner in den Originalordner.
Marco Aurélio
Ja, lösche meine SQL-Dateien verdammt noch mal nicht, es sei denn, du willst nur das verdammte Schema löschen und verdammt noch mal alles neu installieren!
Alex Barker