Tags voor dit FAQ item:
Drupal InnoDB MySQL

Help ons door dit artikel te beoordelen!

Score van 0 sterren, gebaseerd op 1 beoordelingen

Drupal database fout Table cache_rules does not exist

Laatste bijgewerkt: 14/01/2016

Helaas sleept het cache systeem van Drupal een vervelende bug mee. De Drupal database structuur maakt gebruik van de transactionele InnoDB storage engine. Deze biedt voordelen ten opzichte van MyISAM maar een van de grotere nadelen aan InnoDB is het trachten recoveren van gegevens in geval van een database crash.

Binnen Drupal kan dit de beruchte PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'cache_rules' doesn't exist fout geven.

Meer informatie over deze fout vindt u op https://www.drupal.org/node/2160645

Er zijn verschillende redenen waarom een InnoDB database kan crashen, maar een van de meest voorkomende en helaas meest fatale is een gebrek aan diskruimte. Dit zorgt er voor dat de data die weg geschreven moet worden zowel in tabel als transaction bestanden niet correct is, met als gevolg een corrupte tabel die mogelijks zelfs niet zichtbaar is in phpMyAdmin of via de MySQL client.

Wie in het geval van bovenstaande error eenvoudig de 'cache_rules' tabel wil aanmaken krijgt al gauw volgende foutmelding:

ERROR 1005 (HY000): Can't create table 'cache_rules' (errno: -1)

De reden waarom deze fout getriggered wordt is omdat op schijf een cache_rules.idb bestand aanwezig is, maar geen table metadata. Het eenvoudig verwijderen van de cache_rules.idb file geeft geen oplossing, en de suggestie om een mysqlcheck -r uit te voeren op de desbetreffende database helpt uiteraard niet aangezien MySQL database repair functies enkel werken op de MyISAM storage engine!

Om succesvol de cache_rules tabel opnieuw aan te maken zijn helaas enkele stappen nodig:

  1. Een backup maken van de huidige database (zowel data als structuur)
  2. Een nieuwe MySQL databank aanmaken
  3. Een import doen van de backup naar de nieuwe databank
  4. De cache_rules tabel aanmaken in de nieuwe database

En tenslotte: 

  1. De database connectie instellingen aanpassen in Drupal zodat u de nieuwe database gebruikt
  2. De oude database verwijderen

Dit is inderdaad veel werk, maar helaas de enige werkbare, en snelste optie.

De snelste manier om een backup van een MySAQL databank te maken is via het mysqldump commando, maar dan heeft u wel SSH toegang nodig tot uw hosting / database server:

[~]#  mysqldump -u username -p myolddatabase > mydatabasebackup.sql

Als u geen SSH toegang heeft kan u een export genereren via phpMyAdmin, vergeet dan niet zowel structuur als data mee te nemen!

De snelste manier om een nieuwe databank aan te maken is via de Mijn Kinamo website. Indien u werkt via SSH kan dit als volgt:

[~]# mysql -u username -p
mysql> CREATE DATABASE IF NOT EXISTS yournewdatabase;

De import kan gebeuren via SSH, of via phpMyAdmin. Via SSH (command line) kan dit als volgt:

[~]# mysql -u username -p yournewdatabase < yourdatabasebackup.sql

De 'cache_rules' tabel kan u aanmaken via volgende query, deze kan u uitvoeren via de mysql client, of phpMyAdmin.

CREATE TABLE IF NOT EXISTS `cache_rules` (
  `cid` varchar(255) NOT NULL DEFAULT '' COMMENT 'Primary Key: Unique cache ID.',
  `data` longblob COMMENT 'A collection of data to cache.',
  `expire` int(11) NOT NULL DEFAULT '0' COMMENT 'A Unix timestamp indicating when the cache entry should expire, or 0 for never.',
  `created` int(11) NOT NULL DEFAULT '0' COMMENT 'A Unix timestamp indicating when the cache entry was created.',
  `serialized` smallint(6) NOT NULL DEFAULT '0' COMMENT 'A flag to indicate whether content is serialized (1) or not (0).',
  PRIMARY KEY (`cid`),
  KEY `expire` (`expire`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Cache table for the rules engine to store configured items.';

De laatste stap is de connectie aanpassen in het settings.php bestand, en het verwijderen van de oude database.