Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Mengapa pemicu MySQL ini menyebabkan stack overflow?

Saya mengalami masalah yang sama hari ini, setiap pemicu menyebabkan tumpukan dibanjiri. Ternyata instalasi Server Komunitas Zend saya dilengkapi dengan file my.cnf default di mana ukuran thread_stack diatur ke 128K, yang menghasilkan 131072 byte yang tersedia untuk tumpukan di setiap thread:

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

Jadi saya mengomentari baris di /usr/local/zend/mysql/data/my.cnf, me-restart daemon mysql, dan voila! default 192K adalah

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

Sekarang pemicu meja &tchester Anda bekerja dengan sempurna :) (perhatikan pembatasnya)

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)

Kesalahan yang Anda dapatkan, 9024 byte yang digunakan dari tumpukan 131072 byte, dan diperlukan 128000 byte, masuk akal: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. Bagaimana cara mengonfigurasi Java Hibernate untuk Google Cloud SQL?

  2. Cara memetakan tipe Enum di mybatis menggunakan typeHandler saat disisipkan

  3. Cara menampilkan data yang difilter di JFreeChart

  4. PHP untuk menyimpan gambar di MySQL atau tidak?

  5. Pentingnya panjang varchar di tabel MySQL