Tabelle con_art futsch: indizies neusetzen, oder was?

Gesperrt
conradius
Beiträge: 168
Registriert: Di 19. Jul 2005, 11:52
Wohnort: Wabern (Bern/CH)
Kontaktdaten:

Tabelle con_art futsch: indizies neusetzen, oder was?

Beitrag von conradius » Di 5. Dez 2006, 10:03

liebe Leute,
ich habe folgendes Problem: irgendwie ging "unsere" Tabelle con_art futsch (Serverproblem, zuviele Connections, inkonsitente Transaktion, was auch immer). Backup gibts kein aktuelles, das den Fehler nicht auch schon hat.
Nun versuche ich die con_art wiederherzustellen. Aber ein REPAIR TABLE funktioniert nicht, da die Tabelle wirklich verschossen ist (Prozess wartet endlos auf die Tabelle, MySQL-Front Client stürzt ab, oder phpMyAdmin erhält CGI-Timeout).
Meine Idee war nun, eine neue Tabelle con_art anzulegen und diese mit den idarts von art_lang zu füllen (client gibts nur einen, Artikel sind es knapp 90).

Ich ging vor wie folgt: Kopie der ganzen DB, ohne fehlerhafte con_art, con_art mit folgendem SQL-Dump erstellen:

Code: Alles auswählen

CREATE TABLE `con_art` (
  `idart` int(10) NOT NULL default '0',
  `idclient` int(10) NOT NULL default '0',
  PRIMARY KEY  (`idart`),
  KEY `idart` (`idart`),
  KEY `idclient` (`idclient`),
  KEY `idart_2` (`idart`),
  KEY `idclient_2` (`idclient`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
anschliessend habe ich ein kleines Skriptlein geschnipselt, das die Artikel-IDs von art_lang holt und in der DB in con_art einfüllt:

Code: Alles auswählen

<?php
include_once ('../config.php');
include_once ('../'.$contenido_path.'includes/config.php');

// DB-Objekt inititalisieren
if ( !is_object( $db1 ) ) {
	$db1 = new DB_Contenido;
	} // end if

$sql1 = "SELECT
			idart
		FROM
			con_art_lang";

$db1->query( $sql1 );
$id = 1;
while ( $db1->next_record() ) {
	// DB-Objekt inititalisieren
	if ( !is_object( $db2 ) ) {
		$db2 = new DB_Contenido;
		} // end if
	$sql = "INSERT INTO `con_art` VALUES ('".$db1->f('idart')."', '1')";
	$db2->query( $sql );
	$id++;
	} // end while

echo 'Es wurden '.$id.' Einträge eingefügt.';
?>
Super chic, alles da, im Backend komme ich wieder auf Content->Artikel, nur werden mir dort keine Artikel mehr angezeigt. Frontend läuft natürlich auch nicht. Die Tabelle con_art ist aber gefüllt.

Mein Versuch, nachdem ich hier im Forum nach "indizies" gesucht habe:

Code: Alles auswählen

Fehler
SQL-Befehl:

ALTER TABLE con_art ADD INDEX idart( idart ) ;

MySQL meldet: Dokumentation
#1061 - Duplicate key name 'idart' 
bringt also auch nix...

Meine Frage nun, wie fügt Contenido Artikel ein, welche Verkettungen bestehen, oder wie kann ich die Indizies korrekt wiederherstellen?

Ich bin Euch sehr sehr dankbar für Hilfe!
Conradius

MichFress
Beiträge: 750
Registriert: Mo 5. Jan 2004, 22:32
Wohnort: Bochum
Kontaktdaten:

Beitrag von MichFress » Di 5. Dez 2006, 10:26

http://www.contenido.org/opensourcecms/ ... a-104.html
da gibt's das Datenbank-Modell... Alternativ schau dir doch mal eine korrekte con_art an.
"Es wird keine Handlung geben, keine Geschichte mit ihrer Versprechung auf einen Anfang und ihrer Hoffnung auf ein Ende." (Andrzej Stasiuk)

conradius
Beiträge: 168
Registriert: Di 19. Jul 2005, 11:52
Wohnort: Wabern (Bern/CH)
Kontaktdaten:

Beitrag von conradius » Di 5. Dez 2006, 12:33

danke für die rasche Antwort,

die korrekte con_art habe ich von meiner lokalen Programmierumgebung, von da kommt auch der SQL-Dumb mit der Struktur. Da sind aber eben die aktuellen Daten nicht drin.

Im DB-Model sehe ich nur das, was ich schon weiss; dass die idart in con_art definiert wird und in den anderen Tabellen als Fremdschlüssel verwendet wird, und dass idclient als FK von con_clients drin ist.
...hm

Kann mir jemand sagen, was das mit folgendem SQL-Dump-Ausschnitt auf sich hat:

Code: Alles auswählen

PRIMARY KEY  (`idart`),
KEY `idart` (`idart`),
KEY `idclient` (`idclient`),
KEY `idart_2` (`idart`),
KEY `idclient_2` (`idclient`)
Bin nach wie vor dankbar für jegliche Tipps und Hilfe!
Conradius

emergence
Beiträge: 10641
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Di 5. Dez 2006, 14:36

*** make your own tools (wishlist :: thx)

knb
Beiträge: 224
Registriert: Fr 9. Sep 2005, 14:03
Wohnort: Potsdam
Kontaktdaten:

Beitrag von knb » Di 5. Dez 2006, 17:22

Versuch es mal damit, dann werden die Indizes nur einmal pro Spalte definiert.

Code: Alles auswählen

CREATE TABLE `con_art` (
  `idart` int(10) NOT NULL default '0',
  `idclient` int(10) NOT NULL default '0',
  PRIMARY KEY  (`idart`),
  KEY `idclient` (`idclient`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Ausserdem kannst Du wahrscheinlich direkt ein per insert statement die tabelle wieder auffüllen:

Code: Alles auswählen

INSERT INTO `con_art` (idart, idclient)
SELECT
         idart, 1
      FROM
         con_art_lang 
Dies habe ich selber nicht bei mir getestet sondern einfach so hingeschrieben ... also wie immer ohne Gewähr.
Gruss,
Knut

conradius
Beiträge: 168
Registriert: Di 19. Jul 2005, 11:52
Wohnort: Wabern (Bern/CH)
Kontaktdaten:

gelöst: Tabelle con_art futsch: indizies neusetzen, oder was

Beitrag von conradius » Di 5. Dez 2006, 17:28

Besten Dank für Eure Antworten, aber ich konnte das Problem anderweitig beheben lassen.

Die Tabelle con_art war einfach verschossen. Nachdem ich dann aber den Hoster (Webland/CH) soweit bringen konnte auch für einen Kunden der nur CHF 7.90/mt bezahlt ein kleines REPAIR TABLE con_art auszuführen, ging dann alles wieder! Ich konnte mit keinem MySQL-Client mehr korrekt auf die DB zugreifen, geschweige denn ein REPAIR TABLE ausführen!

Falls jemand anderes mal so ein Problem haben sollte: Einfach insistieren, die Hoster sitzen schlussendlich an den Servern. :)

Grüsse,
Conradius

PS: Webland ist sonst aber ganz okay - abgesehen vom Insistieren meine ich ;-)

Gesperrt