2012-05-08 13 views
0

到目前爲止,我有一個MySQL存儲過程包含大約20個創建臨時表語句,並且沒有其他任何內容。但是當我跑步時,商店會發出一條消息「內存不足」。
這裏的店鋪代碼:MySQL在存儲過程中耗盡內存

CREATE DEFINER = 'thanhnt'@'192.168.6.31' PROCEDURE `test_out_of_memory`() 
    NOT DETERMINISTIC 
    CONTAINS SQL 
    SQL SECURITY DEFINER 
    COMMENT '' 
BEGIN 

SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; 

#SET max tmp size 
SET @@tmp_table_size = 1073741824; 

drop table if exists tbllogging; 
create TABLE tbllogging(t TIMESTAMP, step int) ENGINE=INNODB; 

DROP TABLE IF EXISTS norep_campaigntmp; 
CREATE TEMPORARY TABLE `norep_campaigntmp` (
    `campaignid` MEDIUMINT(9) NOT NULL DEFAULT '0' , 
    `num` MEDIUMINT(9) NOT NULL DEFAULT '0'   
)ENGINE=INNODB; 

INSERT INTO tbllogging SELECT CURRENT_TIMESTAMP,0; 
DROP TABLE IF EXISTS norep_campaign_NB_tmp; 
CREATE TEMPORARY TABLE `norep_campaign_NB_tmp` (
    `campaignid` MEDIUMINT(9) NOT NULL DEFAULT '0' , 
    `num` MEDIUMINT(9) NOT NULL DEFAULT '0'   
)ENGINE=INNODB; 

INSERT INTO tbllogging SELECT CURRENT_TIMESTAMP,1; 
DROP TABLE IF EXISTS norep_zonebannertmp; 
CREATE TEMPORARY TABLE `norep_zonebannertmp` (
    `zoneid` SMALLINT(6) NOT NULL DEFAULT '0' , 
    `block` TINYINT(4) NOT NULL DEFAULT '0' , 
    `location` TINYINT(4) NOT NULL DEFAULT '0' , 
    `bannerid` MEDIUMINT(9) NOT NULL DEFAULT '0' , 
    KEY `location` (`location`), 
    KEY `bannerid` (`bannerid`), 
    KEY `block` (`block`), 
    KEY `zoneid` (`zoneid`)    
)ENGINE=INNODB; 

INSERT INTO tbllogging SELECT CURRENT_TIMESTAMP,2; 
DROP TABLE IF EXISTS norep_zonebannertmp_bk; 
CREATE TEMPORARY TABLE `norep_zonebannertmp_bk` (
    `zoneid` SMALLINT(6) NOT NULL DEFAULT '0' , 
    `block` TINYINT(4) NOT NULL DEFAULT '0' , 
    `location` TINYINT(4) NOT NULL DEFAULT '0' , 
    `bannerid` MEDIUMINT(9) NOT NULL DEFAULT '0' , 
    KEY `location` (`location`), 
    KEY `bannerid` (`bannerid`), 
    KEY `block` (`block`), 
    KEY `zoneid` (`zoneid`)    
)ENGINE=INNODB; 

INSERT INTO tbllogging SELECT CURRENT_TIMESTAMP,3; 
DROP TABLE IF EXISTS norep_zonebanner_delete_tmp; 
CREATE TEMPORARY TABLE `norep_zonebanner_delete_tmp` (
    `zoneid` SMALLINT(6) NOT NULL DEFAULT '0' , 
    `block` TINYINT(4) NOT NULL DEFAULT '0' , 
    `location` TINYINT(4) NOT NULL DEFAULT '0' , 
    `bannerid` MEDIUMINT(9) NOT NULL DEFAULT '0' , 
    KEY `location` (`location`), 
    KEY `bannerid` (`bannerid`), 
    KEY `block` (`block`), 
    KEY `zoneid` (`zoneid`)    
)ENGINE=INNODB; 

INSERT INTO tbllogging SELECT CURRENT_TIMESTAMP,4; 
DROP TABLE IF EXISTS norep_zonebanner_cur_tmp; 
CREATE TEMPORARY TABLE `norep_zonebanner_cur_tmp` (
    `zoneid` SMALLINT(6) NOT NULL DEFAULT '0' , 
    `location` TINYINT(4) NOT NULL DEFAULT '0' , 
    `bannerid` MEDIUMINT(9) NOT NULL DEFAULT '0' , 
    KEY `location` (`location`), 
    KEY `bannerid` (`bannerid`), 
    KEY `zoneid` (`zoneid`)    
)ENGINE=INNODB; 
INSERT INTO tbllogging SELECT CURRENT_TIMESTAMP,5; 
DROP TABLE IF EXISTS norep_grouptmp; 
CREATE TEMPORARY TABLE `norep_grouptmp` (
    `groupid` SMALLINT(6) NOT NULL DEFAULT '0' , 
    `w` MEDIUMINT(9) NOT NULL DEFAULT '0'   
)ENGINE=INNODB; 

INSERT INTO tbllogging SELECT CURRENT_TIMESTAMP,6; 
DROP TABLE IF EXISTS norep_block_delete_tmp; 
CREATE TEMPORARY TABLE `norep_block_delete_tmp` (
    `zoneid` INT(9) NOT NULL DEFAULT '0' , 
    `location` TINYINT(4) NOT NULL DEFAULT '0' , 
    `block` TINYINT(4) NOT NULL DEFAULT '0' , 
    KEY `zoneid` (`zoneid`), 
    KEY `location` (`location`), 
    KEY `block` (`block`)   
)ENGINE=INNODB; 

INSERT INTO tbllogging SELECT CURRENT_TIMESTAMP,7; 
DROP TABLE IF EXISTS norep_banner_channel_tmp; 
CREATE TEMPORARY TABLE `norep_banner_channel_tmp` (
    `bannerid` INT(9) NOT NULL DEFAULT '0' , 
    `channelid` INT(9) NOT NULL DEFAULT '0' , 
    `location` TINYINT(4) NOT NULL DEFAULT '0', 
     KEY `channelid` (`channelid`)    
)ENGINE=INNODB; 

INSERT INTO tbllogging SELECT CURRENT_TIMESTAMP,8; 
DROP TABLE IF EXISTS norep_user_zone_tmp; 
CREATE TEMPORARY TABLE `norep_user_zone_tmp` (
    `userid` INT(9) NOT NULL DEFAULT '0' , 
    `zoneid` INT(9) NOT NULL DEFAULT '0' , 
    `location` TINYINT(4) NOT NULL DEFAULT '0' ,  
     KEY `userid` (`userid`) ,   
     KEY `zoneid` (`zoneid`) ,  
     KEY `location` (`location`)   
)ENGINE=INNODB; 

INSERT INTO tbllogging SELECT CURRENT_TIMESTAMP,9; 
DROP TABLE IF EXISTS norep_user_zone_loc_tmp; 
CREATE TEMPORARY TABLE `norep_user_zone_loc_tmp` (
    `userid` INT(9) NOT NULL DEFAULT '0' , 
    `zoneid` INT(9) NOT NULL DEFAULT '0' , 
    `loc` TINYINT(4) NOT NULL DEFAULT '0' , 
    `num` TINYINT(4) NOT NULL DEFAULT '0'   
)ENGINE=INNODB; 

INSERT INTO tbllogging SELECT CURRENT_TIMESTAMP,10; 
DROP TABLE IF EXISTS norep_bannertmp_KH; 
CREATE TEMPORARY TABLE `norep_bannertmp_KH` (
    `campaignid` MEDIUMINT(6) NOT NULL DEFAULT '0' , 
    `isexpire` MEDIUMINT(6) NOT NULL DEFAULT '0' , 
    `bannerid` MEDIUMINT(6) NOT NULL DEFAULT '0' , 
    KEY `bannerid` (`bannerid`) , 
    KEY `campaignid` (`campaignid`)   
)ENGINE=INNODB; 
INSERT INTO tbllogging SELECT CURRENT_TIMESTAMP,11; 
DROP TABLE IF EXISTS norep_bannertmp_NB; 
CREATE TEMPORARY TABLE `norep_bannertmp_NB` (
    `groupid` MEDIUMINT(6) NOT NULL DEFAULT '0' , 
    `campaignid` MEDIUMINT(6) NOT NULL DEFAULT '0' , 
    `bannerid` MEDIUMINT(6) NOT NULL DEFAULT '0' , 
    `isexpire` MEDIUMINT(6) NOT NULL DEFAULT '0' ,  
    KEY `bannerid` (`bannerid`) , 
    KEY `campaignid` (`campaignid`)   
)ENGINE=INNODB; 
INSERT INTO tbllogging SELECT CURRENT_TIMESTAMP,12; 
DROP TABLE IF EXISTS norep_bannertmp1; 
CREATE TEMPORARY TABLE `norep_bannertmp1` (
    `groupid` INT(9) NOT NULL DEFAULT '0' , 
    `userid` INT(9) NOT NULL DEFAULT '0' , 
    `campaignid` INT(9) NOT NULL DEFAULT '0' , 
    `bannerid` INT(9) NOT NULL DEFAULT '0' ,  
    `location` TINYINT(4) , 
    `typegroup` TINYINT(4) DEFAULT 0 , 
    `w` INT DEFAULT 0 , 
    KEY `campaignid` (`campaignid`) ,   
    KEY `bannerid` (`bannerid`) , 
    KEY `groupid` (`groupid`) , 
    KEY `userid` (`userid`) ,   
    KEY `location` (`location`) ,  
    KEY `typegroup` (`typegroup`) 

)ENGINE=INNODB; 
INSERT INTO tbllogging SELECT CURRENT_TIMESTAMP,13; 

DROP TABLE IF EXISTS norep_101_tmp; 
CREATE TEMPORARY TABLE `norep_101_tmp` (
    `userid` INT , 
    `bannerid` INT , 
    `ctr` decimal(6,3) NOT NULL, 
    `views` INT , 
    KEY `userid` (`userid`) , 
    KEY `bannerid` (`bannerid`)    
)ENGINE=INNODB; 

INSERT INTO tbllogging SELECT CURRENT_TIMESTAMP,14; 
DROP TABLE IF EXISTS norep_banner_zone_in; 
CREATE TEMPORARY TABLE `norep_banner_zone_in` (
    `channelid` INT , 
    `zoneid` INT , 
    `location` TINYINT(4) , 
    `bannerid` INT , 
    `CTR` DECIMAL(6,3) , 
    `money` INT, 
    KEY `channelid` (`channelid`) , 
    KEY `zoneid` (`zoneid`) , 
    KEY `bannerid` (`bannerid`) , 
    KEY `location` (`location`)   
)ENGINE=MYISAM; 
INSERT INTO tbllogging SELECT CURRENT_TIMESTAMP,15; 
DROP TABLE IF EXISTS norep_banner_zone_no_gen_tmp; 
CREATE TEMPORARY TABLE `norep_banner_zone_no_gen_tmp` (
    `zoneid` INT , 
    `location` TINYINT(4) , 
    `bannerid` INT , 
    `userid` INT , 
    KEY `userid` (`userid`) , 
    KEY `zoneid` (`zoneid`) , 
    KEY `bannerid` (`bannerid`) , 
    KEY `location` (`location`)   
)ENGINE=INNODB; 

INSERT INTO tbllogging SELECT CURRENT_TIMESTAMP,16; 
DROP TABLE IF EXISTS norep_banner_zone_no_gen_tmp1; 
CREATE TEMPORARY TABLE `norep_banner_zone_no_gen_tmp1` (
    `zoneid` INT , 
    `location` TINYINT(4) , 
    `bannerid` INT , 
    `userid` INT , 
    KEY `userid` (`userid`) , 
    KEY `zoneid` (`zoneid`) , 
    KEY `bannerid` (`bannerid`) , 
    KEY `location` (`location`)   
)ENGINE=INNODB; 

INSERT INTO tbllogging SELECT CURRENT_TIMESTAMP,17; 
DROP TABLE IF EXISTS norep_banner_zone_no_gen_today_tmp; 
CREATE TEMPORARY TABLE `norep_banner_zone_no_gen_today_tmp` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `zoneid` INT , 
    `location` TINYINT(4) , 
    `bannerid` INT , 
    `userid` INT , 
    KEY `id` (`id`) , 
    KEY `userid` (`userid`) , 
    KEY `zoneid` (`zoneid`) , 
    KEY `bannerid` (`bannerid`) , 
    KEY `location` (`location`)   
)ENGINE=INNODB; 

INSERT INTO tbllogging SELECT CURRENT_TIMESTAMP,18; 
DROP TABLE IF EXISTS norep_banner_zone_no_gen_today_tmp1; 
CREATE TEMPORARY TABLE `norep_banner_zone_no_gen_today_tmp1` (
    `id` int(11) NOT NULL, 
    `zoneid` INT , 
    `location` TINYINT(4) , 
    `bannerid` INT , 
    `userid` INT , 
    KEY `id` (`id`) , 
    KEY `userid` (`userid`) , 
    KEY `zoneid` (`zoneid`) , 
    KEY `bannerid` (`bannerid`) , 
    KEY `location` (`location`)   
)ENGINE=INNODB; 


INSERT INTO tbllogging SELECT CURRENT_TIMESTAMP,19; 
DROP TABLE IF EXISTS norep_ssv_tmp; 
CREATE TEMPORARY TABLE `norep_ssv_tmp` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `userid` int(11) unsigned NOT NULL, 
    `bannerid` int(11) unsigned NOT NULL, 
    `money` int(11) unsigned NOT NULL, 
    `ctr` decimal(6,3) NOT NULL, 
    `createtime` datetime DEFAULT NULL, 
    `typegroup` tinyint(4) NOT NULL DEFAULT '0' , 
    KEY `id` (`id`) , 
    KEY `typegroup` (`typegroup`) , 
    KEY `userid` (`userid`) 
) ENGINE=INNODB; 
INSERT INTO tbllogging SELECT CURRENT_TIMESTAMP,20; 
DROP TABLE IF EXISTS norep_ssv_tmp1; 
CREATE TEMPORARY TABLE `norep_ssv_tmp1` (
    `id` int(11) NOT NULL, 
    `userid` int(11) unsigned NOT NULL, 
    `bannerid` int(11) unsigned NOT NULL, 
    `money` int(11) unsigned NOT NULL, 
    `ctr` decimal(6,3) NOT NULL, 
    `createtime` datetime DEFAULT NULL, 
    `typegroup` tinyint(4) NOT NULL DEFAULT '0' , 
    KEY `typegroup` (`typegroup`) , 
    KEY `userid` (`userid`) 
) ENGINE=INNODB; 

INSERT INTO tbllogging SELECT CURRENT_TIMESTAMP,21; 

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; 
INSERT INTO tbllogging select CURRENT_TIMESTAMP, 22; 

SELECT * FROM tbllogging; 
END; 

http://pastebin.com/q6sETytk

的MySQL 5.5 RAM:48 GB

任何想法?

+0

我無法理解所有的臨時表的使用情況,您能詳細點嗎? – ericosg

+0

Stack Overflow旨在成爲一個長期的知識庫。鼓勵您在此處發佈代碼,因此問題是自我封閉的。 –

回答

0

看起來你所有的存儲過程正在刪除和重新創建一些臨時表。

如果是這種情況,則應該用TRUNCATE TABLE代替所有DROPCREATE TABLE語句(並使用create where not exists)。

你可能會耗盡所有的DROP陳述記憶被稱爲DROP能夠被回滾

+0

ericosg:原始存儲過程需要在執行一些插入/更新語句之前創建臨時表(但在我發佈的存儲中,我已刪除插入/更新語句以進行測試)。 Seph:我可以明白你的意思,但是如果我這樣做,我的db有很多表格,我不想管理太多的表格:D。 –

+0

@ThanhNguyen然後,不要刪除表格,'TRUNCATE',然後'DROP'他們,你沒有發佈你的所有查詢,因爲它顯然是刪除空表並重新創建它們的東西,這會讓你用完記憶。 – Seph