Zum Inhalt springen

Mehrere T3-Projekte auf einer Installation zusammenführen

Erstellt am 10. April 2008 · 7 Antworten · letzte Antwort am 14. April 2008

Tags: Frage

pietbonn ·

Hallo,

ich stehe gerade vor einer etwas anspruchsvolleren Aufgabe und würde gerne mal hören, ob ihr einen Ansatz dafür habt.

Ich möchte gerne 7 verschiedene Projekte, die auf verschiedenen Servern in Typo3 angelegt sind, auf einem neuen, zentralen Server zusammenziehen. Das erste Projekt ist nicht das Problem, per Datenbankdump und Kopieren der fileadmin- und uploads-Dateien konnte ich das Projekt ins neue System einspielen.

Das Problem ist nun folgendes: Die Projekte sind für einen t3d-Export zu groß, daher müsste ich wohl die weiteren Projekte ebenfalls per Dump und Daten-Kopie auf den neuen Server übernehmen. Dabei werde ich aber wohl Probleme mit den IDs bekommen, die dann ja mehrfach vorhanden sind.

Hat jemand eine Idee, wie man das am Besten lösen könnte? Vielleicht gibt es eine Möglichkeit, große t3d-Ex- und Importe durchzuführen (Typo3 regelt das ID-Problem beim Import dann imho selbständig)? Oder eine Möglichkeit, alle IDs in einem DB-Dump durch IDs ab x zu ersetzen ohne dass dabei Verknüpfungen etc verloren gehen?

Ich hatte über die letzte Variante nachgedacht: Dump in Extra-DB einspielen und dort per PHP-Skript alle IDs austauschen, dann wieder Dump und schliesslich Import in die "richtige" DB. Ich bin mir aber unsicher, wie ich alle IDs finden und ersetzen kann.

pietbonn ·

Die Projekte sind jeweils um die 6-10 GB groß, vor allem aufgrund umfangreicher Grafiken und Videos, die hinterlegt sind. Kann ich bei dieser Größe etwas durch die Änderung von memory-limits und Skriptlaufzeiten erreichen? Ich kann mir das irgendwie nur schwer vorstellen.

just2b ·

Hallo,

da kannst du natürlich den t3d-Import-Export vergessen! Egal wie hoch das memory-limit ist!

Ich habe folgenden Ansatz:
Erstell von jedem projekt eine Kopie, modifizier die IDs und fang immer bei 10.000 , 40.000 usw an, dann kannst du das später zusammenfügen. Je komplexer natürlich die struktur, desto schwerer wirds und bei mm_tabellen usw wirst du es ziemlich vergessen können. IMO getrennt dann lassen

georg

pietbonn ·

Gibt es für die Änderung von IDs vielleicht ein Skript/ eine Extension? Typo3 macht beim Import ja eigentlich nichts anderes - dort werden die IDs ebenfalls neu gesetzt. Ich sträube mich ehrlich gesagt etwas, ein eigenes Skript zu schreiben. Die Gefahr, dass ich eine Spalte oder gar ganze Tabelle in der DB vergesse, ist ja relativ hoch.

Oder gibt es evtl. eine Möglichkeit, beim t3d-Export möglichst einfach Bilder/Dokumente/Videos, also alles unter fileadmin, auszuschliessen? Ich sehe dort nur die Möglichkeit, dies jeweils einzeln pro Datensatz zu entscheiden, aber da bin ich ja ewig dran. Sonst hätte ich ja die Möglichkeit, den fileadmin-Ordner per FTP zu überspielen und nur die Datenbank-Inhalte per t3d zu sichern.

Notfalls überlege ich noch, einzelne Teilbäume nacheinander zu exportieren und im Zielsystem wieder zusammenzusetzen. Macht aber keinen Spaß 🙂

just2b ·

ich kenne dazu kein skript, du kannst natürlich mal in den sourcen wühlen und so eines dann erstellen, da wären dir sicher einige sehr dankbar.

teilbäume exportieren hört sich nicht toll an..

georg

pietbonn ·

Ich habe gerade eine Einstellung beim t3d-Export gefunden, die das Problem des riesigen t3d-Files deutlich verringert. Nach Auswahl des t3d-Exports gibt es im Reiter "Datei & Voreinstellungen" den Punkt "Dateiformat -> Größenbeschränkung für Dateien" - standardmäßig sind hier 1000kb eingetragen - ich habe diesen Wert auf 1kb geändert. Das entstehende t3d-File ist damit nur noch ca. 2,8M groß, da alle großen Dateien ausgeschlossen werden. Diese kann ich dann später per FTP rüberziehen.

Aktuell habe ich leider noch einen 500er-Fehler beim Import. Die Skriptlaufzeiten und Speicherlimits auf dem Import-Server hatte ich temporär deaktiviert, um diesen Fehler zu vermeiden - leider ohne Erfolg. Punkt ist aber, daß die Daten trotzdem importiert wurden - und auf den ersten und zweiten Blick scheinbar auch vollständig. Zur Not mache ich das Ganze mit Teilbäumen.

Falls nochjemand ein ähnliches Problem hat, hier noch mein weiterer Weg: Da jedes Projekt einen eigenen Unterordner im /fileadmin/ bekommen soll, muss ich alle jeweiligen Daten/Verzeichnisse eine Ebene tiefer auf z.B. /fileadmin/projekt1/ schieben. Das sollte per Konsole/ssh easy gehen. Dann lasse ich noch ein PHP-Skript laufen, das ab einer definierten Seiten-ID rekursiv die entsprechenden DB-Felder durchläuft und alle Links von /fileadmin/bla auf /fileadmin/projekt1/bla ändert.

Ich hoffe, ich bin damit durch und es treten keine weiteren Probleme auf. Falls jemand noch einen anderen Lösungsweg oder Verbesserungsvorschläge hat: immer her damit 🙂

pietbonn ·

Anbei mein kleines Skript, das mit hilft, Pfadänderungen unterhalb fileadmin manuell mit der Datenbank abzugleichen. Es können beliebig Tabellenspalten im Array angegeben werden, um auch in eventuell installierten Extensions die Pfade zu aktualisieren. Die Änderungen werden rekursiv nur in Seiteninhalten durchgeführt, die unterhalb des Startpunkts liegen.

Achtung: keine Garantie für die Funktionsweise des Skripts, Einssatz auf eigenes Risiko.

<?php

// Info:
// Rekursives "Suchen/Ersetzen"-Skript in einem definierbaren Seitenbaum für beliebige Begriffe in beliebigen Tabellen 

// Hinweis:
// Die zu bearbeitenden DB-Tabellen müssen die Spalten uid und pid enthalten!

// Konfiguration:
  
  $db_host      = 'localhost';
  $db_name      = 'name';
  $db_user      = 'user';
  $db_pw        = 'pass';
  
  $startpunkt   = 1; // ID der obersten zu bearbeitenden Seite
  $suchen       = 'fileadmin/user_upload/';
  $ersetzen     = 'fileadmin/user_upload/projekt1/';
  
  $work_on    = array(
                    array(  "tabelle" => "tt_content",
                            "spalte" => "bodytext")
                );
                    
                    
// DB-Verbindung:
  $connect = mysql_connect($db_host, $db_user, $db_pw);
  mysql_select_db($db_name, $connect);


// Funktionen:
  function get_sql($var) {
    global $seitenzahl;
    global $connect;
    global $uid_array;
    $pages_sql = mysql_query("  SELECT 
                                  uid 
                                FROM 
                                  pages 
                                WHERE 
                                  pid = '$var' &&
                                  deleted = 0", $connect);
    while ($pages_row = mysql_fetch_array($pages_sql)) {
      $seitenzahl++;
      $uid_array[] = $pages_row[uid];
      get_sql($pages_row[uid]); 
    }
  }


  function arrayReplace ( $mSearch, $mReplace,
                          $arDestination, $bTarget = TRUE ) {
    $arModified = array ();
    foreach ( $arDestination as $strKey => $strValue ) {
      if ( $bTarget ) { // In Array-Werten suchen und ersetzen
        $strValue = str_replace ( $mSearch, $mReplace, $strValue );
      }
      else { // In Array-Schlüsseln suchen und ersetzen
        $strKey = str_replace ( $mSearch, $mReplace, $strKey );
      }
      $arModified[$strKey] = $strValue;
    }
    return $arModified;
  } 

// Seiten ab $startpunkt rekursiv suchen:
   get_sql($startpunkt);  
   
   $uid_list = implode(',',$uid_array);
   echo 'Seiten unterhalb der ID ' . $startpunkt . ': ' . $seitenzahl . '<br><hr>';
   
   
// Inhaltselemente suchen und Ersetzung vornehmen:
  foreach ($work_on as $work_detailed_on) {
    
    
    echo 'Ersetze in Tabelle ' . $work_detailed_on[tabelle] . ' in der Spalte ' . $work_detailed_on[spalte] . ' den Begriff "' . $suchen . '" durch "' . $ersetzen . '"... ';
    $tt_content_sql = mysql_query(" SELECT 
                                      pid,
                                      uid, 
                                      " . $work_detailed_on[spalte] . " as db_wert
                                    FROM 
                                      " . $work_detailed_on[tabelle] . " 
                                    WHERE 
                                      pid in ($uid_list)
                                      ", $connect);
    while ($tt_content_row = mysql_fetch_array($tt_content_sql)) {
      if (strpos($tt_content_row[db_wert],$ersetzen) !== false) {
              $suchstring_in[] = $tt_content_row[pid];
              $done++;
      } 
      
      else  
        $content_array[$tt_content_row[uid]] = $tt_content_row[db_wert];      
    }
    $content_array_done = arrayReplace ($suchen, $ersetzen, $content_array);
    
    echo '<br><b>Daten gelesen, Ersetzungen vorgenommen, Speichern...</b><br><br>';
    
    // Aktualisierte Daten in DB speichern
    foreach($content_array_done as $to_uid => $to_dbrow) {
      
      $updater = mysql_query("  UPDATE
                                  " . $work_detailed_on[tabelle] . " 
                                SET
                                  " . $work_detailed_on[spalte] . " = '" . $to_dbrow . "'
                                WHERE 
                                  uid = " . $to_uid
                                ,$connect);
      $todo++;
    }    
    echo "<br>DONE - $done Datensätze bereits ersetzt, $todo gerade geupdatet";
  }
?>

Vielleicht hilfts jemandem..