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 TABLE
Befehl gibt einen identischen Fehler aus. Und Addresses.ibd
wird 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_live
scheint sich behoben zu haben, was noch verwirrender ist. Aber das Problem besteht immer noch anderswo. In der Datenbank test
zum 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 .ibd
Datei 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_schema
erhalte 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.Addresses
existiert. Jede Abfrage information_schema.TABLES
schlä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)
information_schema
Datenbank abfragen. Können Sie hier Ergebnisse veröffentlichen? Zum Beispiel Tabellen INNODB_SYS_TABLES
, TABLES
,TABLESPACES
camera_main_live
sich 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_live
hat sich anscheinend wieder selbst gebrochen. Gah! Wie auch immer, die Informationen, von denen Sie angefordert haben, information_schema
sind jetzt vorhanden.
ibd
Datei 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.