Pagina 1 din 2

SQL Error : 1114 The table 'phpbb_sessions' is full

Scris: 15-Mai-2004, 12:43:00
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.

Scris: 15-Mai-2004, 13:41:13
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.

Scris: 15-Mai-2004, 18:11:13
de seven
Multumesc pentru raspuns ;)
Sper ca maine sa rezolvam problema.

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

Scris: 03-Aug-2004, 16:45:44
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]

Scris: 04-Aug-2004, 14:07:18
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!

Eroare pe server platit: prohost

Scris: 01-Sep-2004, 12:31:47
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]

Scris: 01-Sep-2004, 15:25:07
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)

Scris: 01-Sep-2004, 19:36:24
de dorin
Codul este facut de tine ?

Scris: 02-Sep-2004, 00:57:37
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.

Cred ca am inteles

Scris: 02-Sep-2004, 13:08:32
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.