• 6 odgovora
  • 2.132 pregleda
MySql cursor... ? 14.09.2010. u 11:29 · pre 196 meseci #1
Ovamo mi izgleda procedura, neki test.

Code:

DROP PROCEDURE IF EXISTS baza.konverzija;
CREATE PROCEDURE baza.`konverzija`()
BEGIN
   DECLARE a INT;
   DECLARE done INT DEFAULT 0;
   DECLARE C CURSOR FOR SELECT id FROM razred where id = 40;
   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

   OPEN C;
     REPEAT
      FETCH C INTO a;       
      
       select 1;
      
      UNTIL done END REPEAT;

    CLOSE C;
END;


Greska koju dobijam kada uradim call konverzija() je sledeca:

MySQL Database Error: Thread stack overrun: 4996 bytes used of a 131072 byte stack, and 128000 bytes needed. Use 'mysqld -O thread_stack=#' to specify a bigger stack.


Ne znam zasto ovo prekoraci thread_stack kada je samo jedan rekord... ?
Koliko sam razumeo guglajuci thread_stack i ne mogu da povecam, ali kako je moguce da ovako jednostavna stvar dovede do prekoracenja... ?

Zaboravih verzija MySql servera je 5.1.37
Potpis
Linkedin: http://www.linkedin.com/in/sladjannikolic
Twitter: https://twitter.com/_SladjanNikolic
Re: MySql cursor... ? 14.09.2010. u 13:14 · pre 196 meseci #2
thread_stack ces lako da povecas

a evo i probao sam nije mi bilo tesko

Code:

mysql> create table razred (id int ) engine=myisam;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> delimiter $                    
mysql> CREATE PROCEDURE `konverzija`()
    -> BEGIN
    ->    DECLARE a INT;
    ->    DECLARE done INT DEFAULT 0;
    ->    DECLARE C CURSOR FOR SELECT id FROM razred where id = 40;
    ->    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
    -> 
    ->    OPEN C;
    ->      REPEAT
    ->       FETCH C INTO a;       
    ->       
    ->        select 1;
    ->       
    ->       UNTIL done END REPEAT;
    -> 
    ->     CLOSE C;
    -> END;
    -> $
Query OK, 0 rows affected (0.09 sec)

mysql> delimiter ;
mysql> call konverzija();
+---+
| 1 |
+---+
| 1 | 
+---+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> insert into razred values (40);
Query OK, 1 row affected (0.00 sec)

mysql> call konverzija();
+---+
| 1 |
+---+
| 1 | 
+---+
1 row in set (0.00 sec)

+---+
| 1 |
+---+
| 1 | 
+---+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> insert into razred values (40), (10), (20), (40), (40);
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> call konverzija();
+---+
| 1 |
+---+
| 1 | 
+---+
1 row in set (0.00 sec)

+---+
| 1 |
+---+
| 1 | 
+---+
1 row in set (0.00 sec)

+---+
| 1 |
+---+
| 1 | 
+---+
1 row in set (0.00 sec)

+---+
| 1 |
+---+
| 1 | 
+---+
1 row in set (0.00 sec)

+---+
| 1 |
+---+
| 1 | 
+---+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> show global variables like 'thread_stack';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| thread_stack  | 262144 | 
+---------------+--------+
1 row in set (0.00 sec)



doduse ja imam default vrednost za thread stack koja je malo veca od te vrednosti koju ti imas ...

kada sam dodao thread_stack=131072 u my.cnf

Code:

mysql> show global variables like 'thread_stack';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| thread_stack  | 131072 | 
+---------------+--------+
1 row in set (0.00 sec)

mysql> use test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> call konverzija();
ERROR 1436 (HY000): Thread stack overrun:  8232 bytes used of a 131072 byte stack, and 128000 bytes needed.  Use 'mysqld -O thread_stack=#' to specify a bigger stack.



ne znam da li si sam smanjio thread stack ili je to uradio tvoj provajder (ako koristis shared hosting). ako si ti to uradio, valjda znas zasto - lako ces povecati, ako je provajder - oni to rade zato sto nemaju dovoljno resursa a imaju hiljade konekcija na bazu. tako da limitiraju sve sto mogu / koliko mogu. Kao sto vidis tu je thread stack smanjen na pola od onoga sto je po default-u

Potpis
arhimed
http://www.mysql.rs/ | http://elco.crsndoo.com/
Re: MySql cursor... ? 14.09.2010. u 15:03 · pre 196 meseci #6
lele ... (kazes lokalno a vidim pises sa windoze pa pretpostavio, nebitan je windoze, nije ms pravio build nego mi) ... ubuntu - verovatno koristis njihov default paket, oni (kao i vecina distribucija) filozofiraju i menjaju pakete shodno sa "svojim idejama" ... uvek koristi (u produkciji, za test je potpuno nebitno dobar je i taj) binary sa dev.mysql.com .. u svakom slucaju, zgodno znati..

a sto se tice "resavanja problema", resio ga je mysql sam, rekao ti je odma "gde je greska" i "sta da promenis" :)
Potpis
arhimed
http://www.mysql.rs/ | http://elco.crsndoo.com/
Re: MySql cursor... ? 14.09.2010. u 15:20 · pre 196 meseci #7


Da, koristim default paket... Hvala za sugestije...

Sto se tice problema, jeste sramota sve je lepo pisalo. Nego sam se nesto istripovao guglajuci da tu vrednost ne mogu da menjam, da se ona menjala s' verzijama mysql - a. Jos vise me je zacudilo jer je samo jedan record u kursoru u pitanju, nista komplikovano.
Potpis
Linkedin: http://www.linkedin.com/in/sladjannikolic
Twitter: https://twitter.com/_SladjanNikolic
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme