Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Dlaczego ten wyzwalacz MySQL powoduje przepełnienie stosu?

Wpadłem na ten sam problem dzisiaj, każdy wyzwalacz powoduje przepełnienie stosu. Okazało się, że moja instalacja Zend Community Server zawiera domyślny plik my.cnf, w którym rozmiar stosu_wątków został ustawiony na 128K, co skutkowało 131072 bajtami dostępnymi dla stosu w każdym wątku:

mysql> show variables where `Variable_name` = 'thread_stack';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| thread_stack  | 131072 |
+---------------+--------+

Skomentowałem więc wiersz w /usr/local/zend/mysql/data/my.cnf, zrestartowałem demona mysql i voila! domyślny 192K to

mysql> show variables where `Variable_name` = 'thread_stack';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| thread_stack  | 196608 |
+---------------+--------+

Teraz wyzwalacz Twojego stołu i Tchestera działa idealnie :) (zwróć jednak uwagę na ogranicznik)

mysql> CREATE TABLE `job_title` (
    ->   `job_id` int(11) NOT NULL AUTO_INCREMENT,
    ->   `position_id` int(11) DEFAULT NULL,
    ->   `title` varchar(255) COLLATE latin1_general_cs NOT NULL,
    ->   `selectable` tinyint(4) NOT NULL DEFAULT '0',
    ->   PRIMARY KEY (`job_id`),
    ->   UNIQUE KEY `title` (`title`)
    -> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.14 sec)

mysql> DELIMITER &&
mysql> create trigger job_position_trigger   
    ->   before insert on job_title for each row  
    -> begin    
    ->     if new.position_id is null then       
    ->        set @position = (select max(position_id)+1 from job_title);
    ->        if @position is null then set @position = 1; end if;
    ->        set new.position_id = @position;    
    ->     end if;  
    -> end; 
    -> &&
Query OK, 0 rows affected (0.29 sec)

mysql> DELIMITER ;
mysql> insert into job_title (title, selectable) values ("test", 1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into job_title (title, selectable) values ("test2", 3);
Query OK, 1 row affected (0.00 sec)

mysql> select * from job_title;
+--------+-------------+-------+------------+
| job_id | position_id | title | selectable |
+--------+-------------+-------+------------+
|      1 |           1 | test  |          1 |
|      2 |           2 | test2 |          3 |
+--------+-------------+-------+------------+
2 rows in set (0.00 sec)

Otrzymany błąd, 9024 bajty użyte ze stosu 131072 bajtów i potrzebne 128000 bajtów, ma sens:9024 + 128000> 131072.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tworzenie bezpiecznego skryptu logowania w PHP i MySQL bez HTTPS

  2. jakie są zmiany w przypadku mysql 8 wyniku zestawu wierszy?

  3. przypisz wszystkie wyniki while do zmiennej

  4. Gdzie przechowywać dane uwierzytelniające MySQL w skryptach PHP?

  5. FORMAT() Przykłady w MySQL