Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

यह MySQL ट्रिगर स्टैक ओवरफ़्लो का कारण क्यों बनता है?

मैं आज एक ही समस्या में भाग गया, हर ट्रिगर एक स्टैक ओवररन का कारण बनता है। मेरा Zend कम्युनिटी सर्वर इंस्टॉलेशन एक डिफ़ॉल्ट my.cnf फ़ाइल के साथ आता है जिसमें थ्रेड_स्टैक का आकार 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 |
+---------------+--------+

अब आपकी टेबल और चेस्टर का ट्रिगर पूरी तरह से काम करता है :) (हालांकि डिलीमीटर नोट करें)

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql रूट पासवर्ड कैसे रीसेट करें?

  2. एयरफ्लो का उपयोग करके mysql रिकॉर्ड कैसे प्राप्त करें और संसाधित करें?

  3. रेल 4+ ऐप के डिफ़ॉल्ट डीबी अलगाव स्तर पर रूबी कैसे सेट करें?

  4. बड़े पैमाने पर सम्मिलन से पहले .csv फ़ाइल में दिनांक को SQL प्रारूप में कैसे बदलें

  5. MySQL का उपयोग करके टाइमस्टैम्प प्राप्त करना