Mehrere PHPBB Installationen zu einer migrieren.

Eine Neuinstallation von phpBB 2.0 wird auf phpBB.de nicht mehr unterstützt.
Siehe auch Entwicklungs-Ende von phpBB 2.0 - Auswirkungen auf phpBB.de
Forumsregeln
phpBB 2.0 hat das Ende seiner Lebenszeit überschritten
phpBB 2.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 2.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf phpBB 3.1, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.

Eine Neuinstallation von phpBB 2.0 wird auf phpBB.de nicht mehr unterstützt.
Siehe auch Entwicklungs-Ende von phpBB 2.0 - Auswirkungen auf phpBB.de
moellers_oma
Mitglied
Beiträge: 3
Registriert: 30.05.2005 16:45

Mehrere PHPBB Installationen zu einer migrieren.

Beitrag von moellers_oma »

Hallo,

folgendes Problem:
ich habe mehrere PHPBB Installationen für verschiedene Unterkategorien auf unserer Page. Wir wollen jetzt aber ein Community Projekt starten und haben uns überlegt dazu alle Installationen in eine einzige Installation zu migrieren.

Ich habe auch schon relativ viel gegoogled und eine Weile lang dieses Forum abgesucht. Ich lese jedoch immer nur von Migrationen andere Boards nach PHPBB bzw. von Migrationen vom einen Webspace zum andern.

Wie kann ich also mehrere existierende PHPBB-Foren zu einer migrieren?
Kennt da jemand vielleicht fertige Tools, die dies übernehmen, hat PHPBB vielleicht sogar Boardmittel um dies zu erledigen.

Sollte ich mir vielleicht selbst ein Skript schreiben müssen, wird das mit Sicherheit nicht sehr trivial, wegen der ganzen ID-Umbiegerei.

Ich hoffe doch dass schon jemand vor dem selben Problem stand und eine Lösung für mich parat hat.

Danke schon mal im Voraus für die Meldungen/Tipps.
moellers_oma
Mitglied
Beiträge: 3
Registriert: 30.05.2005 16:45

Beitrag von moellers_oma »

Hi nochmal,

hab noch ein bisschen weiter gesucht und bin dann doch auf 3 sehr nützliche Links gestoßen:
1. http://www.phpbb.de/viewtopic.php?t=53866
2. http://www.phpbb.com/phpBB/viewtopic.php?t=203648
3. http://www.typo.nl/misc/merge_phpbb.phps

Hab die Funktionalität dieser Skripts allerdings noch nicht getestet. Werde ich aber heute abend noch machen und meine Erfahrungen hier melden.

Ich bin trotzdem sehr gespannt, ob jemand vielleicht noch weitere Alternativen zu dieser Problematik kennt. Wäre also trotzdem nett, wenn erfahrene Benutzer weitere Informationen zu diesem Thema hier posten könnten.
Patrik
Mitglied
Beiträge: 208
Registriert: 23.04.2005 13:30
Wohnort: Hallein

Beitrag von Patrik »

moellers_oma hat geschrieben:Hab die Funktionalität dieser Skripts allerdings noch nicht getestet. Werde ich aber heute abend noch machen und meine Erfahrungen hier melden.
ein kleiner tipp am rande:
mach vorher ein backup der DB
moellers_oma
Mitglied
Beiträge: 3
Registriert: 30.05.2005 16:45

Beitrag von moellers_oma »

Hi nochmal,

hab gestern abend alle Foren erfolgreich migriert.
Mit dem modfizierten Skript von phpbb.com hat alles wunderbar geklappt.

!!VORSICHT!!
Laut vielen Aussagen funktioniert das Originalskript von http://www.typo.nl/misc/merge_phpbb.phps nicht richtig.

Besser ist also das hier, was wie gesagt bei mir gut funktioniert hat.
http://www.phpbb.com/phpBB/viewtopic.php?t=203648 (der 3. Post von Flashweb enthält das Skript.

Wie bin ich vorgegangen?
Um meine Originaldaten nicht zu zerschießen habe ich ein weiteres Board installiert und alle Foren darin (Testforum ...) gelöscht.

Dann habe ich das merge Skript an meine Datenbankumgebung angepasst und auf meinen Webspace geladen.
Ich habe das Skript in mein Basisverzeichnis des neuen Forums kopiert und die Variable $root_path auf './' angepasst.
Dann einfach die Datei im Browser aufrufen.
Jetzt erscheinen ein paar Logging Infos an denen man sehen kann obs funktioniert hat.

Dies habe ich dann insgesamt 4 mal gemacht weil ich 4 Boards migriert habe.

Danach habe ich ein paar Postings gechecked und die Foren überprüft.
Sah alles gut aus. Die Daten wurden sauber übernommen.

Leider baut das Skript die Suchindex-Tabellen (*prefix_search_wordlist, *prefix_search_wordmatch, *prefix_search_results) nicht auf.

Aber auch dazu habe ich eine Lösung gefunden:
http://www.phpbbhacks.com/viewhack.php?id=434
Dieser Hack bindet einen Menüpunkt Rebuild Index in das Adminpanel ein.
Die Ausführung des Skripts kann sehr lange dauern und ist logischerweise abhängig von der Anzahl an Postings im Board.

Anschließend war auch der Search Index neu aufgebaut und die Suche funktionierte wieder.

Alles in allem bin ich heilfroh, dass das alles so gut geklappt hat. Ob es bei allen funktioniert kann man leider nicht beantworten.

UPDATE (09.06.2005):
Man sollte nach der Migration noch ein Resync für alle Foren machen, damit die Anzahl an Postings, so wie die Last-Posts ... wieder überall stimmen.
Zuletzt geändert von moellers_oma am 09.06.2005 14:24, insgesamt 1-mal geändert.
Benutzeravatar
Anardil
Mitglied
Beiträge: 48
Registriert: 18.05.2001 02:00
Kontaktdaten:

Beitrag von Anardil »

Spitzenmaessig! Es hat doch glatt geklappt :-) Vielen, vielen Dank
Benutzeravatar
Ice-Tee
Mitglied
Beiträge: 64
Registriert: 10.07.2003 20:20

Beitrag von Ice-Tee »

Hi,

ich habe das mal auf localhost mit einer V 2.0.18 versucht.
Damit geht es nicht!
Kann hier vielleicht jemand nachbessern?
Das wäre mächtig klasse :D

Code: Alles auswählen

<?

$dbms = 'mysql';
$phpbb_root_path = '../phpBB/';

$dbhost = 'localhost';
$dbuser = 'user';
$dbpasswd = 'secret';


// Name and prefix for the database that should keep the original IDs
$dbname1 = 'database1';
$table_prefix1 = '';

// Name and prefix for the database that is going to be added
// to DB1.
$dbname2 = 'database2';
$table_prefix2 = 'phpbb_';

define('IN_PHPBB', true);
// Use DB1 for the initial config table etc.
$dbname = $dbname1;
$table_prefix = $table_prefix1;
include($phpbb_root_path . 'extension.inc');
include($phpbb_root_path . 'includes/constants.'.$phpEx);
include($phpbb_root_path . 'includes/db.'.$phpEx);


// These tables can be dropped from DB2 (not used in this script)
$drop_tables = array(
    "config",
    "banlist", // This one could be converted
    "disallow",
    "search_results",
    "search_wordlist",
    "search_wordmatch",
    "sessions",
    "smilies",
    "themes",
    "themes_name",
    "words"
    );
    
// All tables in DB2 that should shift ID.
//  - table that needs shifting (categories)
//  - id in table (cat_id)
//    nested array:
//    - table that depends on id (forums)
//    - id that corresponds to id in original table (cat_id)
$shift_tables = array(
    "categories" => array(
        "cat_id", 
        array(
            array("forums", "cat_id")
        )
    ),
    "forums" => array(
        "forum_id",
        array(
            array("posts", "forum_id"),
            array("topics", "forum_id"),
            array("forum_prune", "forum_id"),
            array("auth_access", "forum_id")
        )
    ),
    "forum_prune" => array(
        "prune_id",
        array()
    ),
    "groups" => array(
        "group_id",
        array(
            array("user_group", "group_id"),
            array("auth_access", "group_id")
        )
    ),
    "posts" => array(
        "post_id",
        array(
            array("posts_text", "post_id"),
            array("topics", "topic_first_post_id"),
            array("topics", "topic_last_post_id")
        )
    ),
    "privmsgs" => array(
        "privmsgs_id",
        array(
            array("privmsgs_text", "privmsgs_text_id"),
            array("users", "user_last_privmsg")
        )
    ),
    "topics" => array(
        "topic_id",
        array(
            array("posts", "topic_id"),
            array("topics_watch", "topic_id"),
            array("vote_desc", "topic_id")
        )
    ),
    "users" => array(
        "user_id",
        array(
            array("user_group", "user_id"),
            array("groups", "group_moderator"),
            array("posts", "poster_id"),
            array("topics", "topic_poster"),
            array("privmsgs", "privmsgs_to_userid"),
            array("privmsgs", "privmsgs_from_userid"),
            array("topics_watch", "user_id"),
            array("vote_voters", "vote_user_id")
        )
    ),
    "ranks" => array(
        "rank_id",
        array(
            array("users", "user_rank")
        )
    ),
    "vote_desc" => array(
        "vote_id",
        array(
            array("vote_voters", "vote_id"),
            array("vote_results", "vote_id")
        )
    )
);

$bla_tables = array(
    "auth_access",
    "user_group",
    "posts_text",
    "privmsgs_text",
    "topics_watch",
    "vote_results",
    "vote_voters"
    );

// Traverse the shift_tables array
foreach($shift_tables as $key => $value)
{
    $table = $key;
    $merge_tables[$table] = 0; // keep an array with all tables that need merging
    $column = $value[0]; // Column with ID that needs to be shifted
    $ref = $value[1]; // Tables that are using the mentioned ID.
    print "Shifting IDs in table $table<br />\n";
    $max = shift_ids($table, $column);
    flush();
    // Do the dependent tables
    foreach($ref as $key => $value)
    {
        $d_table = $value[0];
        $merge_tables[$d_table] = 0;
        $d_column = $value[1];
        print "&nbsp; Altering dependent table: $d_table : $d_column (offset = $max)<br />\n";
        flush();
        shift_ids($d_table, $d_column, $max);
    }
    
    print "<br />\n";
    flush();
}

foreach($merge_tables as $table => $value)
{
    print "Merging $table table: ";
    if(merge_tables($table_prefix1 . $table))
    {
        print " OK<br />\n";
    }
    else
    {
        print " FAILED!<br />\n";
    }
}

print "Merging users (username and either password or email are the same).<br />";
$sql = "
    SELECT
        u1.user_id as id1, 
        u2.user_id as id2, 
        u1.username
    FROM
        " . USERS_TABLE . " u1,
        " . USERS_TABLE . " u2
    WHERE
        u1.username = u2.username
        && (u1.user_password = u2.user_password
            || u1.user_email = u2.user_email)
        && u1.user_id != u2.user_id
        && u1.user_id < u2.user_id";
if(!$result = $db->sql_query($sql))
{
     message_die(GENERAL_ERROR, 'Could not query for double user records.', '', __LINE__, __FILE__, $sql);
}

print "<table cellpadding='0' cellspacing='0'>";
while($row = $db->sql_fetchrow($result))
{
    print "<tr><td> ".$row['id1']."&nbsp;</td><td> ".$row['id2']."&nbsp;</td><td> ".$row['username']."&nbsp;</td><td> ";
    merge_users($row['id1'], $row['id2']);
    print " </td></tr>\n";
}
print "</table>";


function merge_users($user_id1, $user_id2)
{
    global $db;
    global $shift_tables;
    global $table_prefix1;
    
    $user_deps = $shift_tables['users'][1];

    // The users table should be skipped and the user_posts column should be updated.
    
    foreach($user_deps as $key => $value)
    {
        $d_table = $value[0];
        $d_column = $value[1];
        $sql = "UPDATE $table_prefix1$d_table SET $d_column = $user_id1 WHERE $d_column = $user_id2";
        if(!$result = $db->sql_query($sql))
        {
             message_die(GENERAL_ERROR, 'Could not update user_id.', '', __LINE__, __FILE__, $sql);
        }
    }
    
    $sql = "DELETE FROM " . $table_prefix1 . "users WHERE user_id = $user_id2";
    if(!$result = $db->sql_query($sql))
    {
         message_die(GENERAL_ERROR, 'Could not delete user2.', '', __LINE__, __FILE__, $sql);
    }

    print "OK";
    return;
}

function double_users()
{
    global $db;
    global $table_prefix1;

    $users_table = $table_prefix1 . "users";

    $sql = "SELECT user_id, ";
}

function merge_tables($table)
{
    global $db;
    global $dbname1, $table_prefix1, $dbname2, $table_prefix2;
    
    $sql = "SHOW FIELDS FROM $table_prefix$table";
    if(!$result = $db->sql_query($sql))
    {
         message_die(GENERAL_ERROR, 'Could not get field info from $table.', '', __LINE__, __FILE__, $sql);
    }
    
    $fields = array();
    while($row = $db->sql_fetchrow($result))
    {
        $fields[] = $row['Field'];
    }
    $fieldlist = implode($fields, ', ');
    
    if($table == 'users')
    {
        $where = " WHERE $dbname2.$table_prefix2" . $table . ".user_id > 0";
    }
    else
    {
        $where = '';
    }
    
    $sql = "INSERT INTO $dbname1.$table_prefix1".$table." ($fieldlist) SELECT $fieldlist from $dbname2.$table_prefix2" . $table . $where;
    if(!$db->sql_query($sql))
    {
         message_die(GENERAL_ERROR, 'Could not merge $table.', '', __LINE__, __FILE__, $sql);
    }

    return TRUE;
}


// Shift all ID's in column $id in table $table in 
// database 2 by MAX($id) or (if not 0) by $offset
function shift_ids($table, $id, $offset = 0)
{
    global $db;
    global $dbname1, $table_prefix1;
    global $dbname2, $table_prefix2;

    // Offset hasn't been given, we're going to figure it out ourselfs
    if($offset == 0)
    {
        if(!$offset = getmax($dbname1, $table_prefix1.$table, $id))
        {
            // Empty table, no need to shift IDs
            print "Empty table? Skipping...<br />\n";
            return;
        }
    }

    // What's the max_id in the current table?
    $max2 = getmax($dbname2, $table_prefix2.$table, $id);
    $max2 = intval($max2); // Make sure that max2 contains a number, make it 0 if this table is empty.
    
    
    // First we add the offset + the max of the current table
    // Treat values of 0 and lower as special values.
    $sql = "UPDATE $dbname2." . $table_prefix2 . $table . " SET $id = $id + $max2 + $offset WHERE $id > 0";
    print "$sql<br />\n";
    if(!$result = $db->sql_query($sql) )
    {
         message_die(GENERAL_ERROR, 'Could not fetch max(id).', '', __LINE__, __FILE__, $sql);
    }
    
    // Then we subtract the max of the current table again.
    // We do this to prevent problems with key constrains from happening
    // i.e. if we do id=id+20 on key 1 when key 21 already exists we would get an error
    $sql = "UPDATE $dbname2." . $table_prefix2 . $table . " SET $id = $id - $max2 WHERE $id > 0";
    print "$sql<br />\n";
    if(!$result = $db->sql_query($sql) )
    {
         message_die(GENERAL_ERROR, 'Could not fetch max(id).', '', __LINE__, __FILE__, $sql);
    }

    return $offset;
}

function getmax($dbname, $table, $id)
{
    global $db;
        $sql = "SELECT MAX($id) as max_id FROM $dbname." . $table;
        if(!$result = $db->sql_query($sql) )
        {
             message_die(GENERAL_ERROR, 'Could not fetch max(id).', '', __LINE__, __FILE__, $sql);
        }
        if($max = $db->sql_fetchrow($result))
        {
            return($max['max_id']);
        }
        else
        {
            // Probably no rows where returned.. Empty table.
            return FALSE;
        }
}


function message_die($msg_code, $msg_text = '', $msg_title = '', $err_line = '', $err_file = '', $sql = '')
{
    global $db, $template, $board_config, $theme, $lang, $phpEx, $phpbb_root_path, $nav_links, $gen_simple_header;
    global $userdata, $user_ip, $session_length;
    global $starttime;

    $sql_store = $sql;
    
    //
    // Get SQL error if we are debugging. Do this as soon as possible to prevent 
    // subsequent queries from overwriting the status of sql_error()
    //
    $sql_error = $db->sql_error();

    $debug_text = '';

    if ( $sql_error['message'] != '' )
    {
        $debug_text .= '<br /><br />SQL Error : ' . $sql_error['code'] . ' ' . $sql_error['message'];
    }

    if ( $sql_store != '' )
    {
        $debug_text .= "<br /><br />$sql_store";
    }

    if ( $err_line != '' && $err_file != '' )
    {
        $debug_text .= '</br /><br />Line : ' . $err_line . '<br />File : ' . $err_file;
    }

    print $debug_text;

    exit;
}

?>
Have a nice day ...
Windows-Vista Forum: http://www.forum.vista-infos.de
LPI (Linux) Community: http://www.lpi-test.de
Zortex
Mitglied
Beiträge: 3
Registriert: 23.03.2006 12:01

Beitrag von Zortex »

Hallo :)

Also, ich habe in dem o.g. Threadmal nen bisschen weitergelesen und das so gemacht, wie moellers_oma.

1. Leeres Board aufgesetzt. Alles Boards, auf die gleiche (sinnvoll: aktuelle) Version gebracht (im Moment 2.0.19)
2. In dem neuen Board alle Posts, Threads und Foren gelöscht.
3. Das Skript angepasst (dbname, username, passes..) und hochgeladen (ins Root-Verzeichniss von dem neuen Board
4. Das Skript aufgerufen. Alle Eines der alten Board wurde damit in das neue Board "kopiert"
5. Das Skript angepasst, auf das 2. Board, das integriert werden sollte.
6. Wieder aufgerufen. Das zweite Board wurde in das neu aufgesetzte eingebaut, und alle IDs (Posts, user) etc angepasst.

Danach habe ich, wie moellers_oma das Skript zum Wiederherstellen der Suchdantenbank auzsgeführt.
Das braucht dann ein bischen, auf meinem Webspace lief das bei 600 Posts knapp ne Minute.

Dann habe ich nochmal alles gecheckt, einige Users gab es nachher doppelt (meinem Admin-Account zum Bsp)
Desweiteren schien meine auth_access Tabelle in der Datenbank etwas fehlerhaft zu sein.
(Für Interessierte: Manche User hatten plötzlich 2 "Personal User-Groups", wenn aber die mit der höheren ID bestimmte rechte im Board hatte, konnte ich die vom Adminpanel nicht editieren, ich habe User mit 2 Personal User-Groupss rausgesucht und die Personal User-Group mit der höheren ID gelöscht!
Dazu musste ich direkt z.b. mit phpmyadmin in die DB und dan den Tabellen

phpbb_user_group (zweite Gruppenzugehörigkeit gelöscht)
phpb_groups ( Manche Personal User-Groups haben ja jetzt keinen User mehr ;-) -->löschen
phpbb_auth_access (Und hier stehen die Rechte der Gruppen, ich habe ja Gruppen gelöscht, also auch die Rechte löschen, wegen der DB-Konsistenz...)

Und jetzt läuft alles Prima,, die User haben sich auch noch nicht beschwert, dass es irgendwo Fehler gibt...
Achja, hier der Link zu der von mir verwendeten Version

Achja, ich habe das übrigens mit der aktuellen phpbb Version gemacht (.19)
Benutzeravatar
Martin Truckenbrodt
Mitglied
Beiträge: 1143
Registriert: 15.08.2003 23:16
Wohnort: Südthüringen
Kontaktdaten:

Beitrag von Martin Truckenbrodt »

Hallo,
ich würde nach solchen Aktionen den DB Maintenance MOD zum Search Index erstellen und ähnlichen Maßnahmen nutzen: http://phpbb.kordowich.net/index.php?pgid=8

Ich arbeite seit ein paar Monaten an einem Merge Skript, welches komplett anders arbeitet: http://www.phpbb.com/phpBB/viewtopic.php?t=356149

Es ist, denke ich, deutlich einfacher programmiert, arbeitet die Aktionen schrittweise ab und benutzt temporäre Tabellen zum Speichern der Angaben wie id im neuen und id im alten Forum. Auch kann man bei manchen Aktionen in das Umzugsverhalten eingreifen.

Nach fast zweimonatiger Pause habe ich vor ein paar Tagen das Projekt wieder aufgegriffen. Gestern habe ich den Umzug der Gruppen fertiggestellt.
Als Nächstes kommen die Kategorien und Foren dran. Sollte ich irgendwann nächste Woche fertig haben. Die Topics und Posts sind dann nur noch eine Kleinigkeit.

Gruß Martin
Advanced Block MOD 1.1.4 ist released! - Verhindere Spam auf Deinem phpBB3 Board mit Stop Forum Spam, BotScout, Akismet, Project Honey Pot und verschiedenen IP-RBL und Domain-RBL DNS Blacklisten! - Meine MODs - phpBB Complete Core
Zortex
Mitglied
Beiträge: 3
Registriert: 23.03.2006 12:01

Beitrag von Zortex »

Das hört sich ja nicht schlecht an :)

Wenn du noch jemanden brauchst, der das Testen soll, meine Testumgebung ist noch vorhanden!!

Achja, noch nen Vorschlag dazu:
Ich hatte das Problem, dass die Skripte zwar auf demselben Server, aber alle in verschiedenen Datenbanken lagen.
Ich musste die Datenbank also zunächst exportieren, und dann mit nem Editor die Prefixes ersetzen(aus phpbb_ mach h_phpbb_), um dann die Tabellen in die zusammen in eine Datenbank kopieren.
Es wäre also Toll, wenn dein Skript es auch hinbekommt, die Tabellen von verschiedenen Servern (Datenbanken) auszulesen ;-)

Ist kein Must-have, ich denke dass jeder, der 2 Foren verschmelzen will, auch auf die Idee mit dem renamen kommt :))
Benutzeravatar
Martin Truckenbrodt
Mitglied
Beiträge: 1143
Registriert: 15.08.2003 23:16
Wohnort: Südthüringen
Kontaktdaten:

Beitrag von Martin Truckenbrodt »

Hallo,
die aktuelle Version kann unter obigem Link heruntergeladen werden. Ich freue mich über jedes Feedback!

Gruß Martin
Advanced Block MOD 1.1.4 ist released! - Verhindere Spam auf Deinem phpBB3 Board mit Stop Forum Spam, BotScout, Akismet, Project Honey Pot und verschiedenen IP-RBL und Domain-RBL DNS Blacklisten! - Meine MODs - phpBB Complete Core
Gesperrt

Zurück zu „phpBB 2.0: Installation und Update“