MySQL, nach Partitionierung fehlen Daten

Lord Gurke

Nur echt mit 32 Zähnen
Hallo,

ich habe hier ein obskures Phänomen, dem ich irgendwie nicht hinterhergestiegen komme:

Es gibt eine Tabelle:
Code:
mysql> DESCRIBE `images`;
+----------------------+--------------+------+-----+---------+----------------+
| Field                | Type         | Null | Key | Default | Extra          |
+----------------------+--------------+------+-----+---------+----------------+
| ID                   | int(11)      | NO   | PRI | NULL    | auto_increment |
| BaseName             | varchar(128) | NO   | MUL | NULL    |                |
| FileNameOnServer     | varchar(96)  | NO   | MUL | NULL    |                |
| Width                | int(11)      | NO   |     | NULL    |                |
| Height               | int(11)      | NO   |     | NULL    |                |
| Photographer         | varchar(255) | NO   | MUL | NULL    |                |
| Album                | int(11)      | NO   | MUL | NULL    |                |
| ShotDate             | datetime     | NO   | MUL | NULL    |                |
| Deleted              | tinyint(1)   | NO   | MUL | 0       |                |
| MD5Hash              | varchar(48)  | YES  | MUL | NULL    |                |
| EXIFData             | blob         | YES  |     | NULL    |                |
| BaseRight            | int(11)      | NO   |     | 0       |                |
| OwnerID              | int(11)      | YES  | MUL | NULL    |                |
| OrderPrio            | int(11)      | NO   | MUL | 1       |                |
| OrigFileDownloadable | tinyint(1)   | NO   |     | 1       |                |
| ThumbOnS3            | tinyint(1)   | NO   |     | 0       |                |
| MidsizeOnS3          | tinyint(1)   | NO   |     | 0       |                |
| OriginalOnS3         | tinyint(1)   | NO   |     | 0       |                |
+----------------------+--------------+------+-----+---------+----------------+
18 rows in set (0.03 sec)


mysql> SHOW TABLE STATUS LIKE "images" \G
*************************** 1. row ***************************
           Name: images
         Engine: InnoDB
        Version: 10
     Row_format: Compact
           Rows: 5480
 Avg_row_length: 46213
    Data_length: 253247488
Max_data_length: 0
   Index_length: 3407872
      Data_free: 6291456
 Auto_increment: 6028
    Create_time: 2014-06-15 19:47:19
    Update_time: NULL
     Check_time: NULL
      Collation: latin1_swedish_ci
       Checksum: NULL
 Create_options: pack_keys=1 delay_key_write=1
        Comment:
1 row in set (0.00 sec)
Wenn ich da nun z.B. Fotos aus einem Album abrufe, die nicht als gelöscht markiert sind:
Code:
mysql> SELECT `ID`, `BaseName`, `Deleted` FROM `images` WHERE `Album` = 1 AND `Deleted` = 0 ORDER BY `ID` ASC;
+-----+--------------+---------+
| ID  | BaseName     | Deleted |
+-----+--------------+---------+
| 214 | DSCF0960.JPG |       0 |
| 215 | DSCF0741.JPG |       0 |
| 216 | DSCF0936.JPG |       0 |
| 217 | DSCF0894.JPG |       0 |
| 218 | DSCF0873.JPG |       0 |
| 220 | DSCF0857.JPG |       0 |
| 222 | DSCF0867.JPG |       0 |
| 223 | DSCF0716.JPG |       0 |
| 224 | DSCF0667.JPG |       0 |
| 225 | DSCF0820.JPG |       0 |
| 226 | DSCF0791.JPG |       0 |
| 227 | DSCF0889.JPG |       0 |
| 228 | DSCF0817.JPG |       0 |
| 229 | DSCF0781.JPG |       0 |
| 230 | DSCF0750.JPG |       0 |
| 231 | DSCF0923.JPG |       0 |
| 232 | DSCF0743.JPG |       0 |
| 233 | DSCF0992.JPG |       0 |
| 234 | DSCF0948.JPG |       0 |
| 235 | DSCF0865.JPG |       0 |
| 236 | DSCF0828.JPG |       0 |
| 238 | DSCF0710.JPG |       0 |
........
| 552 | DSC_1324.JPG |       0 |
| 553 | DSC_1339.JPG |       0 |
| 554 | DSC_1334.JPG |       0 |
| 555 | DSC_1338.JPG |       0 |
+-----+--------------+---------+
291 rows in set (0.00 sec)
Nun ist die Festplatte manchmal ein wenig träge und ich wollte der Geschwindigkeit wegen die Tabelle partitionieren:

Code:
mysql> ALTER TABLE `images` PARTITION BY HASH(`ID`) PARTITIONS 6;
Die gute Nachricht ist: Die Abfragen *SIND* danach in der Tat schneller.
Die schlechte Nachricht: Es werden auch nicht mehr alle Daten zurückgeliefert, obwohl sie weiterhin in der Tabelle enthalten sind:

Code:
mysql> SELECT `ID`, `BaseName`, `Deleted` FROM `images` WHERE `Album` = 1 AND `Deleted` = 0 ORDER BY `ID` ASC;
+-----+--------------+---------+
| ID  | BaseName     | Deleted |
+-----+--------------+---------+
| 216 | DSCF0936.JPG |       0 |
| 222 | DSCF0867.JPG |       0 |
| 228 | DSCF0817.JPG |       0 |
| 234 | DSCF0948.JPG |       0 |
| 240 | DSCF0701.JPG |       0 |
| 246 | DSCF0664.JPG |       0 |
| 252 | DSCF0886.JPG |       0 |
| 264 | DSCF0816.JPG |       0 |
| 270 | DSCF0840.JPG |       0 |
| 282 | DSCF0660.JPG |       0 |
| 288 | DSCF0930.JPG |       0 |
| 294 | DSCF0775.JPG |       0 |
| 300 | DSCF0774.JPG |       0 |
| 306 | DSCF0917.JPG |       0 |
| 312 | DSCF0808.JPG |       0 |
| 318 | DSCF0915.JPG |       0 |
| 324 | DSCF0993.JPG |       0 |
| 342 | DSCF0715.JPG |       0 |
| 348 | DSCF0778.JPG |       0 |
| 354 | DSCF0961.JPG |       0 |
| 360 | DSCF0928.JPG |       0 |
| 366 | DSCF0809.JPG |       0 |
| 372 | DSCF0962.JPG |       0 |
| 378 | DSCF0679.JPG |       0 |
| 384 | DSCF0671.JPG |       0 |
| 396 | DSCF0659.JPG |       0 |
| 402 | DSCF0702.JPG |       0 |
| 408 | DSCF0698.JPG |       0 |
| 414 | DSCF0988.JPG |       0 |
| 426 | DSCF0929.JPG |       0 |
| 432 | DSCF0951.JPG |       0 |
| 444 | DSCF0866.JPG |       0 |
| 450 | DSCF0784.JPG |       0 |
| 456 | DSCF0677.JPG |       0 |
| 462 | DSCF0692.JPG |       0 |
| 468 | DSCF0682.JPG |       0 |
| 474 | DSCF0906.JPG |       0 |
| 480 | DSCF0685.JPG |       0 |
| 492 | DSCF0834.JPG |       0 |
| 498 | DSCF0680.JPG |       0 |
| 504 | DSCF0877.JPG |       0 |
| 510 | DSCF0711.JPG |       0 |
| 522 | DSCF0831.JPG |       0 |
| 528 | DSCF0844.JPG |       0 |
| 534 | DSC_1329.JPG |       0 |
| 540 | DSC_1318.JPG |       0 |
| 546 | DSC_1328.JPG |       0 |
| 552 | DSC_1324.JPG |       0 |
+-----+--------------+---------+
48 rows in set (0.01 sec)
Frage ich ohne "WHERE `Deleted` = 0" ab, erhalte ich scheinbar alle Datensätze zurück:
Code:
mysql> SELECT `ID`, `BaseName`, `Deleted` FROM `images` WHERE `Album` = 1 ORDER BY `ID` ASC;
+-----+--------------+---------+
| ID  | BaseName     | Deleted |
+-----+--------------+---------+
|  74 | DSCF0979.JPG |       1 |
|  75 | DSCF0960.JPG |       1 |
|  76 | DSCF0741.JPG |       1 |
|  77 | DSCF0936.JPG |       1 |
|  78 | DSCF0894.JPG |       1 |
|  79 | DSCF0873.JPG |       1 |
|  80 | DSCF0697.JPG |       1 |
|  81 | DSCF0857.JPG |       1 |
|  82 | DSCF0830.JPG |       1 |
|  83 | DSCF0867.JPG |       1 |
|  84 | DSCF0716.JPG |       1 |
|  85 | DSCF0667.JPG |       1 |
|  86 | DSCF0820.JPG |       1 |
|  87 | DSCF0791.JPG |       1 |
|  88 | DSCF0889.JPG |       1 |
......
| 548 | DSC_1326.JPG |       0 |
| 549 | DSC_1335.JPG |       0 |
| 550 | DSC_1327.JPG |       0 |
| 551 | DSC_1323.JPG |       0 |
| 552 | DSC_1324.JPG |       0 |
| 553 | DSC_1339.JPG |       0 |
| 554 | DSC_1334.JPG |       0 |
| 555 | DSC_1338.JPG |       0 |
+-----+--------------+---------+
482 rows in set (0.00 sec)
Man beachte z.B. die Datensatz-ID 553, die in der vorherigen Abfrage hätte auftauchen müssen!


Ich habe die Tabelle bereits geprüft, repariert, optimiert, mit einem NULL-Alter neu bauen lassen...
Angeblich ist die Tabelle und der Index fehlerfrei.
Jetzt frage ich mich: Was könnte ich noch tun, um die Tabelle zwar partitioniert zu lassen, aber wieder alle Datensätze zu erhalten?

Ich verwende die aktuellste MySQL-Version aus Debian 7 (heute Upgrade gemacht, das Problem bestand aber schon vorher):

Code:
mysql> SHOW VARIABLES LIKE "%version%";
+-------------------------+----------------------+
| Variable_name           | Value                |
+-------------------------+----------------------+
| innodb_version          | 5.5.37               |
| protocol_version        | 10                   |
| slave_type_conversions  |                      |
| version                 | 5.5.37-0+wheezy1-log |
| version_comment         | (Debian)             |
| version_compile_machine | x86_64               |
| version_compile_os      | debian-linux-gnu     |
+-------------------------+----------------------+
7 rows in set (0.02 sec)
Hat jemand eine Idee, was da schiefläuft?
Danke!


NACHTRAG:
Nach einem "REMOVE PARTITIONS" funktionieren die Abfragen wieder wie gehabt - die Daten scheinen tatsächlich nicht wirklich verloren zu gehen, MySQL unterschlägt sie mir bloß.
 
Last edited by a moderator:
Back
Top