benötige SQL Code aus RepairBoards.php wegen Time Out

Started by Sven0, November 30, 2005, 07:10:51 AM

Previous topic - Next topic

Sven0

Hallo,

ich habe folgendes Problem: http://www.simplemachines.org/community/index.php?topic=38966.msg407589#msg407589

d.h. RepairBoards.php muss bei mir 20758 Threads reparieren was aber zu einem Time Out führt, d.h.:

Database Error
MySQL server has gone away
File: /usr/local/vhosts/httpd/htdocs/forum2/Sources/RepairBoards.php
Line: 626

Ich benötige den zutreffenden SQL Code damit ich die Reparatur manuell in Etappen im phpmyadmin ausführen kann oder alternativ ein gemoddetes RepairBoards.php welches in Schritten (um ein Time Out zu verhindern) ausgeführt wird.

Vielen Dank!

Sven0

komisch das dies hier als Feature für SMF 1.1 RC1 angepriesen wird:

>>>> ! New stepped forum error checking in repair - now works even on large forums reliably. (RepairBoards.php)

Das Problem ist doch das nicht nur der Error Check in Steps ausgeführt werden muss sondern auch anschließend die Reparatur!

BENÖTIGE HIIIIIIILFE....... PLEASE HELP........

Sven0

Der Database Error tritt nun nicht mehr auf sondern im IE tritt nach 3min Ladezeit der Seite /forum/index.php?action=repairboards;fixErrors;sesc=f4fe2900728ddd5ca356444e42090cdf ein Timeout auf (Server nicht gefunden Errorseite) und im Firefox nach derselbigen Zeit ein index.php Download(!) mit einer leeren Seite.

Wie kann ich das TimeOut verhindern?

Sven0

Wirklich niemand der eine Idee hat?

Ich habe noch folgende Idee: ich ziehe ein Backup des Topic Tables und lese nur die ersten 5000 Topics ein. Danach lasse ich "Fehler finden und reparieren" laufen im Adminbereich.

Der Haken dabei: das Script wird erkennen das die restlichen 15.000 Posts ohne Topic sind und wird versuchen diese zu löschen???

ディン1031

#4
ich übereg gerade...

eigentlich kann man den TimeOut nicht umgehen... Es scheint so das da einen Hund drin ist, weil soweit ich weiß arbeitet SMF 1.1 in 30 sekunden schritten nicht in größeren... hmmm es kann eigentlich nur sein das SQL entweder den befehl nicht zu ende bringt und php voher die verbindung kappt. Oder die execute time für das SQL den befehl abbricht und nix ausgibt... oder hmmm schwer XD.

Noch nicht mal in die RepairBoards.php hinein geschaut? Wegen query befehle... aber ich denke da wird der time out auch auftreten...

Aber wenn ich so den fehler sehe... server gone away... das kann nur heisen das dieser die verbindung von sich aus beendet hat :x, das passiert eigenltich nur bei zu langen queryies... (oder falsch eingestellt sql settings XD).
Support only via MOD Thread! NO PM Support!
My Forum: ayu][kult Forum
My Mods: My Small Mod Collection
My Parser: DIN1031's ModParser
Current Info: More away the next days, because i've to much work to do :x

Sven0

Quote from: din1031 on December 01, 2005, 04:44:00 AM
hmmm es kann eigentlich nur sein das SQL entweder den befehl nicht zu ende bringt und php voher die verbindung kappt.

Noch nicht mal in die RepairBoards.php hinein geschaut? Wegen query befehle... aber ich denke da wird der time out auch auftreten... vielleicht ist es ein fehler 1.1 schon mal in den englischen  board dazu geguckt?

Genau das ist ja das Problem, der SQL Code wird versucht mit einem Mal für 20.000 Threads auszuführen anstatt dies in Etappen mit sagen wir 3000 Threads auszuführen. Das mit den 20.000 Threads klappt natürlich nicht, es kommt zum Browser Time Out wegen der langen Ladezeit. Ob nun der Browser oder PHP die Verbindung unterbricht ist ja eigentlich unerheblich, es gibt nur 2 Lösungen entweder den Code manuell in phpmyadmin auszuführen (nur welcher? bin leider kein mySQL Profi) oder eine modifizierte RepairBoards.php welche den SQL Code in Etappen ausführt.

Da ersteres einfacher ist würde ich hier mal mySQL Profis bitten den entsprechenden Code hier zu veröffentlichen:

in der RepairBoards.php habe ich zum Thema "The subject of topic #2 is currently not stored in the subject cache." folgendes in Zeile 605 gefunden:


if (empty($to_fix) || in_array('missing_cached_subject', $to_fix))
{
$request = db_query("
SELECT t.ID_TOPIC, m.subject
FROM {$db_prefix}topics AS t, {$db_prefix}messages AS m
LEFT JOIN {$db_prefix}log_search_subjects AS lss ON (lss.ID_TOPIC = t.ID_TOPIC)
WHERE m.ID_MSG = t.ID_FIRST_MSG
AND lss.ID_TOPIC IS NULL", __FILE__, __LINE__);
$insertRows = array();
while ($row = mysql_fetch_assoc($request))
{
foreach (text2words($row['subject']) as $word)
$insertRows[] = "'$word', $row[ID_TOPIC]";
}
mysql_free_result($request);

if (!empty($insertRows))
db_query("
INSERT INTO {$db_prefix}log_search_subjects
(word, ID_TOPIC)
VALUES (" . implode('),
(', array_unique($insertRows)) . ")", __FILE__, __LINE__);
}


Beim bisherigen Time Out des Scriptes handelt es sich um diese Zeile 626 mit dem dazugehörigen Befehl:


db_query("
INSERT INTO {$db_prefix}log_search_subjects
(word, ID_TOPIC)
VALUES (" . implode('),
(', array_unique($insertRows)) . ")", __FILE__, __LINE__);



und weiter unten in Zeile 1383 findet sich:


if ($_GET['step'] <= 21)
{
$request = db_query("
SELECT t.ID_TOPIC, fm.subject
FROM {$db_prefix}topics AS t, {$db_prefix}messages AS fm
LEFT JOIN {$db_prefix}log_search_subjects AS lss ON (lss.ID_TOPIC = t.ID_TOPIC)
WHERE fm.ID_MSG = t.ID_FIRST_MSG
AND lss.ID_TOPIC IS NULL", __FILE__, __LINE__);
$found_error = false;
while ($row = mysql_fetch_assoc($request))
if (count(text2words($row['subject'])) != 0)
{
$context['repair_errors'][] = sprintf($txt['repair_missing_cached_subject'], $row['ID_TOPIC']);
$found_error = true;
}
mysql_free_result($request);

if ($found_error)
$to_fix[] = 'missing_cached_subject';

$_GET['step'] = 22;
$_GET['substep'] = 0;
pauseRepairProcess($to_fix);
}


Die Frage ist nun welchen SQL Code dieser Befehl ausführt?

PS: in den Ami-Foren habe ich bereits nachgefragt (und alles durchsucht) aber der User Compuart (welcher den Weg hier im Zitat http://www.simplemachines.org/community/index.php?topic=38966.msg407589#msg407589 vorgeschlagen hatte) antwortet einfach nicht.

Sven0

ODER MOMENT!!!

Ich hatte ja folgendes ausgeführt vor dem phpBB Import:
http://www.simplemachines.org/community/index.php?topic=38966.msg392282#msg392282

ALTER TABLE smf_topics
DROP INDEX lastMessage,
DROP INDEX firstMessage,
DROP INDEX poll,
ADD INDEX lastMessage (ID_LAST_MSG, ID_BOARD),
ADD INDEX firstMessage (ID_FIRST_MSG, ID_BOARD),
ADD INDEX poll (ID_POLL, ID_TOPIC)


Muss ich nun VOR oder NACH dem Ausführen von RepairBoards.php dieses hier http://www.simplemachines.org/community/index.php?topic=38966.msg392362#msg392362 ausführen?

ALTER TABLE smf_topics
DROP INDEX lastMessage,
DROP INDEX firstMessage,
DROP INDEX poll,
ADD UNIQUE lastMessage (ID_LAST_MSG, ID_BOARD),
ADD UNIQUE firstMessage (ID_FIRST_MSG, ID_BOARD),
ADD UNIQUE poll (ID_POLL, ID_TOPIC)


Ich frage deshalb weil ich im Time Out Bereiches der Zeile 626 etwas mit "unique" lese: (', array_unique($insertRows)) . ")", __FILE__, __LINE__); was ja bei mir nicht mehr vorhanden ist?

ディン1031

So auf anhieb hmmm *überleg*
Naja das problem ist diese es wird jedes wort des subject trennt einzeln gespeichert in dieses log...
also kann man keine eigenen sql befehlt daraus ableiten...

Hmmm wenn ich das aber so anschaue.... gna jetzt muß ich doch die orginal datei angucken ;).

Gruß
DIN1031


   
Support only via MOD Thread! NO PM Support!
My Forum: ayu][kult Forum
My Mods: My Small Mod Collection
My Parser: DIN1031's ModParser
Current Info: More away the next days, because i've to much work to do :x

Horseman

mal eine frage:
hast du zugriff auf php.ini und andere configurations files und kannst dann den apache wieder neu starten? also vollen server zugriff, oder hast du angemieteten webspace den du nicht beinflussen kannst?
Gruß Horseman
______________________________________________________

PhpOpenChat Support Portal: http://www.phpopenchat.de

ディン1031

#9
So ungetest ohne garantie das es geht... das ich gerade nicht verstehe warum das überhaupt gehen soll wenn ich nähmlich so durch den code schaue macht der alles auf einmal :X egal ob die auswertung in zwischenschritten geht, aber ich kann mich ja auch täuschen :-X ... da ich es nicht wirklich testen kann.

Keine Garantie, nicht probieren ohne Sicherung <<

Vom prinzip her sollte das gehen anstelle den anderen Step 21...<<.

if ($_GET['step'] <= 21)
{
$result = db_query("
SELECT MAX(ID_TOPIC)
FROM {$db_prefix}topics", __FILE__, __LINE__);
list ($topics) = mysql_fetch_row($result);
mysql_free_result($result);

for (; $_GET['substep'] < $topics; $_GET['substep'] += 500)
{
$request = db_query("
SELECT t.ID_TOPIC, fm.subject
FROM {$db_prefix}topics AS t, {$db_prefix}messages AS fm
LEFT JOIN {$db_prefix}log_search_subjects AS lss ON (lss.ID_TOPIC = t.ID_TOPIC)
WHERE fm.ID_MSG = t.ID_FIRST_MSG
AND lss.ID_TOPIC IS NULL
AND t.ID.TOPIC BETWEEN $_GET[substep] AND $_GET[substep] + 499", __FILE__, __LINE__);
$found_error = false;
while ($row = mysql_fetch_assoc($request))
if (count(text2words($row['subject'])) != 0)
{
$context['repair_errors'][] = sprintf($txt['repair_missing_cached_subject'], $row['ID_TOPIC']);
$found_error = true;
}
if ($found_error)
$to_fix[] = 'missing_cached_subject';

mysql_free_result($request);
pauseRepairProcess($to_fix, $topics);
}

$_GET['step'] = 22;
$_GET['substep'] = 0;
pauseRepairProcess($to_fix);
}
Support only via MOD Thread! NO PM Support!
My Forum: ayu][kult Forum
My Mods: My Small Mod Collection
My Parser: DIN1031's ModParser
Current Info: More away the next days, because i've to much work to do :x

Sven0

Hi,

der Einbau ergibt nach dem Error Check:

Datenbankfehler
Unknown table 't.ID' in where clause
Datei: /usr/local/vhosts/httpd/htdocs/forum/Sources/RepairBoards.php
Zeile: 1399 

Diese Zeile ist: AND t.ID.TOPIC BETWEEN $_GET[substep] AND $_GET[substep] + 499", __FILE__, __LINE__);

ディン1031

lol sorry hab mich da wohl vertippt...

AND t.ID.TOPIC BETWEEN $_GET[substep] AND $_GET[substep] + 499", __FILE__, __LINE__);

wird zu

AND t.ID_TOPIC BETWEEN $_GET[substep] AND $_GET[substep] + 499", __FILE__, __LINE__);

Gruß
DIN1031
Support only via MOD Thread! NO PM Support!
My Forum: ayu][kult Forum
My Mods: My Small Mod Collection
My Parser: DIN1031's ModParser
Current Info: More away the next days, because i've to much work to do :x

Sven0

Quote from: Horseman on December 01, 2005, 06:18:22 AM
mal eine frage:
hast du zugriff auf php.ini und andere configurations files und kannst dann den apache wieder neu starten? also vollen server zugriff, oder hast du angemieteten webspace den du nicht beinflussen kannst?


ich hab nen managed Server mit root zugriff per SSH. Zugriff auf die php.ini habe ich auch....

Ich habe den Server jetzt neu gestartet, jetzt taucht wieder beim Reparaturversuch nach ca. 2 Sekunden das bekannte Problem auf (nicht mehr der IE Timeout):

MySQL server has gone away
Datei: /usr/local/vhosts/httpd/htdocs/forum/Sources/RepairBoards.php
Zeile: 626

Komisch das der Error bereits nach 2 Sekunden gemeldet wird!!!!!!
Normalerweise taucht doch ein "MySQL server has gone away" erst nach sagen wir 40-60sek auf????

Sven0

Quote from: din1031 on December 01, 2005, 01:22:36 PM
lol sorry hab mich da wohl vertippt...

AND t.ID.TOPIC BETWEEN $_GET[substep] AND $_GET[substep] + 499", __FILE__, __LINE__);

wird zu

AND t.ID_TOPIC BETWEEN $_GET[substep] AND $_GET[substep] + 499", __FILE__, __LINE__);

Gruß
DIN1031

soeben ausgeführt, wieder nach 2sek:

Datenbankfehler
MySQL server has gone away
Datei: /usr/local/vhosts/httpd/htdocs/forum/Sources/RepairBoards.php
Zeile: 626

ディン1031

#14
Hmmm so haben sie eigentlich die ganzen skipte in schritten unterteilt... das ist schon sehr korius... :x

Aber ich hätte ne idee ;).

*malzusammenschreib*

Gruß
DIN1031
Support only via MOD Thread! NO PM Support!
My Forum: ayu][kult Forum
My Mods: My Small Mod Collection
My Parser: DIN1031's ModParser
Current Info: More away the next days, because i've to much work to do :x

Pitti

ich würde mir das ganze ding local spiegeln und dort reparieren.

da kammer bei bedarf auch an der php.ini bissi schrauben.
und mehr power haste in der regel zuhause auch.

wie kommt das eigentlich, daß du so viele fehler im forum hast?

gruß pitti

ディン1031

#16
--> Pittis Möglichkeit wäre auch ein idee ;) und dann einfach wieder das backup einspielen :).


So das ist nur eine Möglichkeit, von der logic her sollte es gehen :)

so dies fügst du am ende der RepairBoards an.


//This Function repair Step 21 in steps :)
function BoardRepair_Step21() {

global $db_prefix, $txt, $scripturl, $db_connection, $sc, $context, $sourcedir;
global $salvageCatID, $salvageBoardID;

//Admincheck :x
isAllowedTo('admin_forum');

//How many Topics maximum :)
$result = db_query("
SELECT MAX(ID_TOPIC)
FROM {$db_prefix}topics", __FILE__, __LINE__);
list ($topics) = mysql_fetch_row($result);
mysql_free_result($result);

//1000 more or new ;)
if(!isset($_GET['substep']))
$_GET['substep'] = 0;
else
$_GET['substep'] += 1000;

//Finished or not?
$finished = $_GET['substep'] > $topics;

if (!$finished) {

$request = db_query("
SELECT t.ID_TOPIC, m.subject
FROM {$db_prefix}topics AS t, {$db_prefix}messages AS m
LEFT JOIN {$db_prefix}log_search_subjects AS lss ON (lss.ID_TOPIC = t.ID_TOPIC)
WHERE m.ID_MSG = t.ID_FIRST_MSG
AND lss.ID_TOPIC IS NULL
AND t.ID_TOPIC BETWEEN $_GET[substep] AND $_GET[substep] + 999", __FILE__, __LINE__);

$insertRows = array();
while ($row = mysql_fetch_assoc($request)) {
foreach (text2words($row['subject']) as $word)
$insertRows[] = "'$word', $row[ID_TOPIC]";
}
mysql_free_result($request);

if (!empty($insertRows))
db_query("
INSERT INTO {$db_prefix}log_search_subjects
(word, ID_TOPIC)
VALUES (" . implode('),
(', array_unique($insertRows)) . ")", __FILE__, __LINE__);

}
//Okay finished or not?
if($finished)
redirectexit('action=admin');
else
redirectexit('action=BoardRepairStep21&substep='.$_GET['substep']);

}


Dann such in der index.php nach

'repairboards' => array('RepairBoards.php', 'RepairBoards'),


und schreibe danach oder davor, kannst machen wie du willst ;)


'BoardRepairStep21' => array('RepairBoards.php', 'BoardRepairStep21'),


So wenn du dies gemacht hast und vorher alles auch schön gesichert hast ;)

gibt forumsurl/index.php?action=BoardRepairStep21 ein nun sollte der browser immer wieder eine weiße seite aktuallisieren. Und wenn das skript fertig ist, wird dieses zum admin center wechseln :).

So was anderes fällt mir beim besten willen nicht ein was man machen könnte :x.

Gruß
DIN1031
Support only via MOD Thread! NO PM Support!
My Forum: ayu][kult Forum
My Mods: My Small Mod Collection
My Parser: DIN1031's ModParser
Current Info: More away the next days, because i've to much work to do :x

Sven0

Quote from: Pitti on December 02, 2005, 03:56:07 AM
ich würde mir das ganze ding local spiegeln und dort reparieren.

da kammer bei bedarf auch an der php.ini bissi schrauben.
und mehr power haste in der regel zuhause auch.

wie kommt das eigentlich, daß du so viele fehler im forum hast?

gruß pitti

Kann ich mir selbst nicht erklären, es ging nicht anders aus dem phpBB zu importieren....
Es kam sonst im Konverter dieser Error: http://www.simplemachines.org/community/index.php?topic=38966.msg391995#msg391995
also:

Converting topics... Unsuccessful!
This query:

    INSERT INTO `xxxx_xxxxxx`.smf_topics
    (ID_TOPIC, isSticky, ID_FIRST_MSG, ID_LAST_MSG, ID_MEMBER_STARTED, ID_MEMBER_UPDATED, ID_BOARD, ID_POLL, locked, numReplies, numViews)

Caused the error:
    Duplicate entry '3234' for key 1

....... nahezu alle Themen ab 3234 aufwärts betroffen....


Das SMF Forum selbst läuft gut - man kann auch auf ALLE Themen ohne jegliche Errormeldung zugreifen...

Nur wenn ich "Zeige URLs ohne "?"" aktiviere kommt es zum Apache-Crash was ich auf diese nicht reparierten Topics zurückführe.
Der Crash verläuft wie folgt.

Ich mache ein Häkchen rein bei "Zeige URLs ohne "?"" was auch ohne Probleme klappt.
Wenn ich die Forumindexseite aufrufe lädt diese schnell durch, aber der Ladebalken bleibt stehen und will irgendwas mit unendlicher Zeit laden...
Je öfter ich nun die Seite reloade oder auf ein Thema klicke wird der Server immer langsamer, nach ca. 3-4 Seiten ist Schluß und es geht gar nix mehr, der Server ist unerreichbar und ich muss den Apache restarten.

Es kann auch an der Joomla htaccess liegen welche 1 Ordner über dem Forumordner liegt, ich habe im Forumordner eine leere htaccess reingelegt um die Joomla htaccess für den Forumordner zu deaktivieren.

PS: Sorry habe leider keine Ahnung wie man nen Datenbank-Server local betreibt, ich hab zwar nen KF Webserver hier lokal laufen aber alles nur html ohne PHP/mySQL.

Sven0

Quote from: din1031 on December 02, 2005, 04:57:52 AM


So was anderes fällt mir beim besten willen nicht ein was man machen könnte :x.

Gruß
DIN1031

Wenn das klappt werde ich zu deinem persönlichen Forumsklaven hier im Forum und werde dich immer auf Händen tragen...  ;D

Pitti

QuotePS: Sorry habe leider keine Ahnung wie man nen Datenbank-Server local betreibt, ich hab zwar nen KF Webserver hier lokal laufen aber alles nur html ohne PHP/mySQL.
na genauso wie online auch.

http://www.apachefriends.org/de/index.html  <<< die gehört in die boockmarks eines jeden webmasters ganz oben hin ;)

Sven0

Quote from: din1031 on December 02, 2005, 04:57:52 AM

So wenn du dies gemacht hast und vorher alles auch schön gesichert hast ;)

gibt forumsurl/index.php?action=BoardRepairStep21 ein nun sollte der browser immer wieder eine weiße seite aktuallisieren. Und wenn das skript fertig ist, wird dieses zum admin center wechseln :).

So was anderes fällt mir beim besten willen nicht ein was man machen könnte :x.

Gruß
DIN1031

Es kommt folgendes:

Ein Fehler ist aufgetreten!
Kann das 'main' Template nicht laden.

im Fehlerprotokoll findet man folgendes:

2: call_user_func() expects first argument, 'BoardRepairStep21', to be a valid callback
Datei: /usr/local/vhosts/httpd/htdocs/forum/index.php
Zeile: 125

sowie zur selben Zeit:

Kann das 'main' Template nicht laden

ディン1031

Gna ich bin ein idiot...


'BoardRepairStep21' => array('RepairBoards.php', 'BoardRepair_Step21'),


So sollte das heisen ;) oder du mach den unterstrich bei function BoardRepair_Step21 raus :X.

Warum habe ich nur da ein _ rein gemacht XD.

Sumimasen ;)...

Aber wenn man z.B. XAMPP installiert ist das ohne probleme möglich einen lokalen server zu installieren... das sollte normalerweiße jeder schaffen nur so als tip XD.

Gruß
DIN1031
Support only via MOD Thread! NO PM Support!
My Forum: ayu][kult Forum
My Mods: My Small Mod Collection
My Parser: DIN1031's ModParser
Current Info: More away the next days, because i've to much work to do :x

Sven0

YIPPIEEEE!!!!!!!!! ES HAT FUNKTIONIERT!!!!!
VIELEN HERZLICHEN DANK, DU BIST DER WAHRE SMF GOTT IM DEUTSCHEN SMF FORUM!!!

Vielleicht kannst du mir ja noch in meinen anderen Threads weiterhelfen, aktuell habe ich noch das Problem des ständigen Ladebalkens im Firefox 1.4 und 1.5 wenn "Zeige URLs ohne "?"" aktiviert ist (was natürlich den Server beansprucht und dadurch langsamer macht). Im IE hingegen klappt alles 1a!

dieter4

es gibt keinen Firefox 1.4 nur 1.5 und 1.0.4 und acuh 1.0.5... achtet da eigentlich niemand drauf?

ich kann mir echt keinen grud vorstellen, warum das langsamer sein sollte. ich habe es selber ausprobiert und nix mit langsamer... es könnte nur sein, dass vllt. die alten firefox versionen nicht so gut mit der form der links zurechtkommen...

Sven0

schau mal bitte hier: http://www.simplemachines.org/community/index.php?topic=59117.0

der Apache wird so extrem langsam das man keine Seiten mehr erreichen kann wenn ich SEF aktiviere.

Alles weitere dann im obigen Link....

Pitti

das hat mit den browsern nix zutun, an deinem apachen is was falsch.

Pitti

übrigens steht im smf-code dazu folgender hinweiß:
// This should work even in 4.2.x, just not CGI without cgi.fix_pathinfo.

evtl hilft dir das bei der ursachensuche

Advertisement: