SQL Error : 1114 The table 'phpbb_sessions' is full

Folosiţi acest forum pentru a discuta problemele apărute în timpul folosirii forumului phpBB 2.0.x.
seven
Utilizator înregistrat
Mesaje: 93
Membru din: 12-Feb-2003, 11:49:36
Ext: Nu
Server: Windows
Nivel phpBB: Mediu
Nivel php: Mediu
Localitate: Brasov
Contact:

SQL Error : 1114 The table 'phpbb_sessions' is full

Mesaj de seven »

In doua saptamani aceasta eroare a aparut de vreo 4 ori.
Ultima oara a fost vineri dimineata si ete ca astazi sambata iarasi se intampla. :cry:
Aveti idee despre ce este vorba?
Sa fie o limitare de la host la numarul de inregistrari in db si din aceasta cauza acea tabela sa ajunga la limita?
phpBB : Critical Error

Error creating new session

DEBUG MODE

SQL Error : 1114 The table 'phpbb_sessions' is full

INSERT INTO phpbb_sessions (session_id, session_user_id, session_start, session_time, session_ip, session_page, session_logged_in) VALUES ('f579b1636a343f032a7c1cd96dbbebd2', 3, 1084613546, 1084613546, 'd59dab2a', 0, 1)

Line : 152
File : /home/designro/public_html/community/includes/sessions.php
In prima faza am sters inregistrarile si totul a revenit la normal.
Totusi forum-ul functioneaza de ceva vreme, cam 16 luni si pana acum nu am mai avut aceasta eroare.
Foarte simplu pot sa golesc tabela dar este deranjant pentru vizitator si automat cu oarecare repercursiuni asupra site-ului.
Mentionez ca in db nu a fost facuta nici o modificare de multa vreme.
Ma puteti ajuta? :)

PS: ar regolit tabela dar sunt sigur ca iarasi va aparea problema.
Avatar utilizator
BuGsY
Fost coleg
Mesaje: 1193
Membru din: 19-Iun-2003, 15:24:49
Ext: Nu
Server: Windows
Nivel phpBB: Mediu
Nivel php: Mediu
Localitate: Constanţa
Contact:

Mesaj de BuGsY »

Este o eroare la crearea unei noi sesiuni. Sesiunile nu sunt altceva decât informaţii care urmăresc incursiunile utilizatorilor in forum. Acestea pot oferii informaţii despre permisiunile unui utilizator într-un forum, despre paginile pe care le vizualizează sau despre IP-ul acestuia (din Panoul de Control al Administratorului). Aceste sesiuni se gasesc în doua locuri:
1) client - este localizată în computer-ul utilizatorului într-un cookie.
2) server – este localizată pe server, într-o bază de date generând tabelul phpbb_sessions (standard). Aici apar toate problemele :)

Tabele phpBB sunt de tip HEAP, nu MyISAM; avantajul primului tip este ca se folosesc de memoria serverului nu de hard-disc-ul acestora - pentru a fi stocate - fiind mult mai rapide. Singurele părţi ale tabelelor HEAP stocate pe server sunt coloanele şi definiţiile acestora, stocate într-un fişier cu extensia *.frm. Un alt punc important al acestor tipuri de bază de date este aceela că atunci când MySQL-lul este “pierdut” sau restartat informaţiile HEAP sunt pierdute pe când cele MyISAM sunt păstrate pe hard.

Sunt câteva tipuri de rezolvare ale acestei probleme.
1) Îţi faci backup la baza de date şi la fişiere
Deschizi într-un editor text fişierul includes/sessions.php şi cauţi linia:

Cod: Selectaţi tot

message_die(CRITICAL_ERROR, 'Error creating new session', '', __LINE__, __FILE__, $sql); 
această linie o vei înlocui cu:

Cod: Selectaţi tot

$error = TRUE; 
if (SQL_LAYER == "mysql" || SQL_LAYER == "mysql4") 
{ 
    $sql_error = $db->sql_error($result); 
    if ($sql_error["code"] == 1114) 
    { 
        $result = $db->sql_query('SHOW TABLE STATUS LIKE "'.SESSIONS_TABLE.'"'); 
        $row = $db->sql_fetchrow($result); 
        if ($row["Type"] == "HEAP") 
        { 
            if ($row["Rows"] > 2500) 
            { 
                $delete_order = (SQL_LAYER=="mysql4") ? " ORDER BY session_time ASC" : ""; 
                $db->sql_query("DELETE QUICK FROM ".SESSIONS_TABLE."$delete_order LIMIT 50"); 
            } 
            else 
            { 
                $db->sql_query("ALTER TABLE ".SESSIONS_TABLE." MAX_ROWS=".($row["Rows"]+50)); 
            } 
            if ($db->sql_query($sql)) 
            { 
                $error = FALSE; 
            } 
        } 
    } 
} 
if ($error) 
{ 
    message_die(CRITICAL_ERROR, "Error creating new session", "", __LINE__, __FILE__, $sql); 
} 
Acest script va şterge cele mai vechi 50 de rânduri.

2) Stergi tot tabelul phpbb_sessions (standard)
Pentru a executa această operaţiune din SQL:

Cod: Selectaţi tot

DELETE FROM phpbb_sessions; 
3) Sa limitezi numărul de sesiuni per IP
Deschizi includes/sessions.php cu un editor text cauţi liniile:

Cod: Selectaţi tot

// 
    // Create or update the session 
    // 
    $sql = "UPDATE " . SESSIONS_TABLE . " 
        SET session_user_id = $user_id, session_start = $current_time, session_time = $current_time, session_page = $page_id, session_logged_in = $login 
        WHERE session_id = '" . $session_id . "' 
            AND session_ip = '$user_ip'"; 
    if ( !$db->sql_query($sql) || !$db->sql_affectedrows() ) 
    { 
        $session_id = md5(uniqid($user_ip));
După aceasta adaugă:
$sql = "SELECT COUNT(*) as numrows FROM ". SESSIONS_TABLE ." WHERE session_ip = '$user_ip'"; 
        $result = $db->sql_query($sql); 
        if ( !$result ) 
        { 
            message_die(CRITICAL_ERROR, 'Error checking existing sessions', '', __LINE__, __FILE__, $sql); 
        } 
        
        $numrows = $db->sql_fetchrow($result); 
        if($numrows['numrows'] > 4) 
        { 
            $delete_limit = $numrows['numrows'] - 4; 
            switch( SQL_LAYER ) 
            { 
                case 'mysql4': 
                    $sql = "DELETE FROM ". SESSIONS_TABLE ." WHERE session_ip = '$user_ip' ORDER BY session_start ASC LIMIT $delete_limit"; 
                    break; 
                default: 
                    $sql = "SELECT session_start FROM ". SESSIONS_TABLE ." WHERE session_ip = '$user_ip' ORDER BY session_start DESC LIMIT 4"; 
                    $result = $db->sql_query($sql); 
                    
                    if ( !$db->sql_query($sql) ) 
                    { 
                        message_die(CRITICAL_ERROR, 'Error select session data', '', __LINE__, __FILE__, $sql); 
                    } 
                    
                    $session_rows = $db->sql_fetchrowset($result); 
                    
                    $sql = "DELETE FROM ". SESSIONS_TABLE ." WHERE session_ip = '$user_ip' AND session_start < ".$session_rows[3]['session_start']; 
            } 
                    
            if ( !$db->sql_query($sql) ) 
            { 
                message_die(CRITICAL_ERROR, 'Error deleting old sessions', '', __LINE__, __FILE__, $sql); 
            } 
        } 
4) Ultimul lucru pe care ar trebui să îl faci este să transformi phpbb_sessions în MYISAM
Fişierele se vor crea pe server, ele ocupând undeva pe la 2 - 4Gb standard.
Din SQL execută:

Cod: Selectaţi tot

ALTER TABLE phpbb_sessions TYPE = MYISAM; 
MySQL: tabelele HEAP - Documentaţie despre tipul HEAP al tabelelor MySQL.
MySQL: The table is full Error - all the possible reasons for receiving a 'table is full' error.
seven
Utilizator înregistrat
Mesaje: 93
Membru din: 12-Feb-2003, 11:49:36
Ext: Nu
Server: Windows
Nivel phpBB: Mediu
Nivel php: Mediu
Localitate: Brasov
Contact:

Mesaj de seven »

Multumesc pentru raspuns ;)
Sper ca maine sa rezolvam problema.
bidoi
Nou venit
Mesaje: 1
Membru din: 03-Aug-2004, 16:30:49

Solutie: SQL Error : 1114 The table 'phpbb_sessions' is full

Mesaj de bidoi »

Am creat acest topic ca urmare a unei probleme gasite in phpBB, semnalata dealtfel in: viewtopic.php?t=1254&highlight=sessions

Trebuie inlocuita linia :
message_die(CRITICAL_ERROR, 'Error creating new session', '', __LINE__, __FILE__, $sql);

din fisierul "includes/sessions.php" cu urmatoarea secventa de cod:

$strTmpSql = "repair table ".SESSIONS_TABLE;
if ( !$db->sql_query($sql) ){
$strTmpSql = "delete from table ".SESSIONS_TABLE;
if ( !$db->sql_query($sql) ){
message_die(CRITICAL_ERROR, 'Error creating new session', '', __LINE__, __FILE__, $sql);
}
if ( !$db->sql_query($sql) ){
message_die(CRITICAL_ERROR, 'Error creating new session', '', __LINE__, __FILE__, $sql);
}
}


-----------------------------------------------------------------------------
in prima faza se va incerca repararea tabelului astfel incit sa nu se piarda datele deja existente, si abia pe urma, in cazul in care incercarea de a repara tabelul a esuat, se recurge la o solutie "extrema" respectiv stergerea datelor din tabel.

[edit="BuGsY"]Subiect lipit cu un altul care dezbate aceaşi problemă.[/edit]
seven
Utilizator înregistrat
Mesaje: 93
Membru din: 12-Feb-2003, 11:49:36
Ext: Nu
Server: Windows
Nivel phpBB: Mediu
Nivel php: Mediu
Localitate: Brasov
Contact:

Mesaj de seven »

cred ca merita sa te adresezi echipei phpbb.com cu aceasta solutie pentru ca este o solutie pentru o problema atipica. Problema mea apare la intervale de timp diferite si tind sa cred ca este o problema de la host. Oricum am sa implemenmtez rezolvarea ta, asta pt ca te cunosc :D

SPOR!
dylo
Utilizator înregistrat
Mesaje: 13
Membru din: 21-Iul-2004, 12:10:26
Ext: Nu
Server: Windows
Nivel phpBB: Mediu
Nivel php: Mediu
Localitate: Barlad
Contact:

Eroare pe server platit: prohost

Mesaj de dylo »

M-am lovit de o problema. Am intrat pe forum si am eroarea de mai jos.
phpBB : Critical Error

Error creating new session

DEBUG MODE

SQL Error : 1030 Got error 122 from table handler

INSERT INTO phpbb_sessions (session_id, session_user_id, session_start, session_time, session_ip, session_page, session_logged_in) VALUES ('49a3b8ee46b36d1e30c9acf92a8cfec3', -1, 1094029882, 1094029882, '524f3b76', 0, 0)

Line : 152
File : /home/virtual/site63/fst/var/www/html/forum/includes/sessions.php

Incerc sa intru in sectiunea de administrare si vad aceasta eroare:
phpBB : Critical Error

Error creating new session

DEBUG MODE

SQL Error : 1016 Can't open file: 'phpbb_sessions.MYD'. (errno: 145)

INSERT INTO phpbb_sessions (session_id, session_user_id, session_start, session_time, session_ip, session_page, session_logged_in) VALUES ('881e1ac0493d84e8d6570b418ac66107', -1, 1094030080, 1094030080, '524f3b76', 0, 0)

Line : 152
File : /home/virtual/site63/fst/var/www/html/forum/includes/sessions.php
Daca e de la serverul sql cred ca e complicat, mentionez ca pana zilele trecute nu era nici o problema, exceptie facand interzicerea unui utilizator de a se loga iar cand am incercat din admin sa-i editez banlist-ul am avut o eroare...nu mai tin minte ce era.
Multumesc anticipat.
Toate bune

[edit="BuGsY"]Subiect lipit cu un altul care dezbate aceeaşi problemă.[/edit]
Avatar utilizator
BuGsY
Fost coleg
Mesaje: 1193
Membru din: 19-Iun-2003, 15:24:49
Ext: Nu
Server: Windows
Nivel phpBB: Mediu
Nivel php: Mediu
Localitate: Constanţa
Contact:

Mesaj de BuGsY »

viewtopic.php?p=7594#7594

Ai mai putea să limitezi numărul de sesiuni pe IP.
Deschide fişierul includes/sessions.php cu un editor şi caută (aproximativ liniile 136-145)

Cod: Selectaţi tot

// 
    // Create or update the session 
    // 
    $sql = "UPDATE " . SESSIONS_TABLE . " 
        SET session_user_id = $user_id, session_start = $current_time, session_time = $current_time, session_page = $page_id, session_logged_in = $login 
        WHERE session_id = '" . $session_id . "' 
            AND session_ip = '$user_ip'"; 
    if ( !$db->sql_query($sql) || !$db->sql_affectedrows() ) 
    { 
        $session_id = md5(uniqid($user_ip));
Apoi adaugă acest cod:

Cod: Selectaţi tot

$sql = "SELECT COUNT(*) as numrows FROM ". SESSIONS_TABLE ." WHERE session_ip = '$user_ip'"; 
        $result = $db->sql_query($sql); 
        if ( !$result ) 
        { 
            message_die(CRITICAL_ERROR, 'Error checking existing sessions', '', __LINE__, __FILE__, $sql); 
        } 
        
        $numrows = $db->sql_fetchrow($result); 
        if($numrows['numrows'] > 4) 
        { 
            $delete_limit = $numrows['numrows'] - 4; 
            switch( SQL_LAYER ) 
            { 
                case 'mysql4': 
                    $sql = "DELETE FROM ". SESSIONS_TABLE ." WHERE session_ip = '$user_ip' ORDER BY session_start ASC LIMIT $delete_limit"; 
                    break; 
                default: 
                    $sql = "SELECT session_start FROM ". SESSIONS_TABLE ." WHERE session_ip = '$user_ip' ORDER BY session_start DESC LIMIT 4"; 
                    $result = $db->sql_query($sql); 
                    
                    if ( !$db->sql_query($sql) ) 
                    { 
                        message_die(CRITICAL_ERROR, 'Error select session data', '', __LINE__, __FILE__, $sql); 
                    } 
                    
                    $session_rows = $db->sql_fetchrowset($result); 
                    
                    $sql = "DELETE FROM ". SESSIONS_TABLE ." WHERE session_ip = '$user_ip' AND session_start < ".$session_rows[3]['session_start']; 
            } 
                    
            if ( !$db->sql_query($sql) ) 
            { 
                message_die(CRITICAL_ERROR, 'Error deleting old sessions', '', __LINE__, __FILE__, $sql); 
            } 
        }
Aceast cod calculează numărul de sesiuni, dacă găseşte mai mult de 5 sesiuni aparţinănd aceluiaşi IP atunci acestea sunt şterse, pentru a face loc altelor noi.
Pentru a schimba numărul de sesiuni pe IP editează includes/sessions.php
includes/sessions.php scrie:if($numrows['numrows'] > 4)
Avatar utilizator
dorin
Fost coleg
Mesaje: 4620
Membru din: 24-Iun-2003, 23:23:29
Versiune: 3.1.10
Ext: Da
Server: UNIX/Linux
Nivel phpBB: Mediu
Nivel php: Puţin experimentat
Contact:

Mesaj de dorin »

Codul este facut de tine ?
Avatar utilizator
BuGsY
Fost coleg
Mesaje: 1193
Membru din: 19-Iun-2003, 15:24:49
Ext: Nu
Server: Windows
Nivel phpBB: Mediu
Nivel php: Mediu
Localitate: Constanţa
Contact:

Mesaj de BuGsY »

dorin scrie:Codul este facut de tine ?
Nu, l-am luat de la phpBB.com
Nu găsesc acum link-ul către mesaj.
dylo
Utilizator înregistrat
Mesaje: 13
Membru din: 21-Iul-2004, 12:10:26
Ext: Nu
Server: Windows
Nivel phpBB: Mediu
Nivel php: Mediu
Localitate: Barlad
Contact:

Cred ca am inteles

Mesaj de dylo »

Multumesc mult pentru explicatii. Sper sa fie OK daca am stabilit un numar de 2 sesiuni (asta in v.2.0.10).
Cat despre fisiere de 2-4Gb :o mi se pare putin cam exagerat, e vorba de hosting pe prohost care e destul de scump (pentru un ONG).
Sper ca pe viitor (o luna cel mult) sa rezolv problema aducerii hostului pe un server local ca e teapa imensa cu astea (10 Gb trafic, 100 Mb spatiu pe server)....
Pana atunci toate bune si ... succes in activitate.
Multumesc inca o data.


P.S. Sper sa nu se stearga mesajele astea, vreau sa arat cuiva cu care am o disputa groaznica.
Închis

Înapoi la “2.0.x Funcţionare”

Cine este conectat

Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 1 vizitator