Mysql
 sql >> база данни >  >> RDS >> Mysql

Защо този MySQL тригер причинява препълване на стека?

Днес се сблъсках със същия проблем, всеки тригер причиняваше препълване на стека. Оказа се, че моята инсталация на Zend Community Server идва с файл my.cnf по подразбиране, в който размерът на thread_stack е зададен на 128K, което води до 131072 байта, налични за стека във всяка нишка:

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

Затова коментирах реда в /usr/local/zend/mysql/data/my.cnf, рестартирах демона на mysql и воала! по подразбиране 192K е

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

Сега вашата маса и тригерът на tchester работят перфектно :) (все пак обърнете внимание на разделителя)

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)

Грешката, която получихте, 9024 байта използвани от стек от 131072 байта и необходими 128000 байта, има смисъл: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. Как да видя всички външни ключове към таблица или колона?

  2. Zend Db / Mysql - Вмъкване с Select

  3. Елиминиране на MySQL Split-Brain в многооблачни бази данни

  4. Как да се свържете с MySQL сървър след инсталиране на XAMPP на Mac OS

  5. Как да използвам подзаявка за дефиниране на изместване на Mysql SELECT LIMIT?