sql >> データベース >  >> RDS >> Mysql

このMySQLトリガーがスタックオーバーフローを引き起こすのはなぜですか?

    私は今日同じ問題に遭遇しました。すべてのトリガーがスタックオーバーランを引き起こしました。 Zend Community Serverのインストールには、thread_stackサイズが128Kに設定されたデフォルトのmy.cnfファイルが付属していることが判明しました。これにより、各スレッドのスタックに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)
    

    発生したエラー、131072バイトスタックで使用された9024バイト、および必要な128000バイトは、理にかなっています:9024 +128000>131072。




    1. ScaleGridDBaaSの2要素認証の有効化

    2. MySQLクエリのWHERE句で列エイリアスを使用するとエラーが発生します

    3. mysqlからの移行後にpostgresデータベースが機能しない状態で続編

    4. PHPで2つの異なるデータベースに接続しますか?