0

我在Amazon RDS上托管了我的数据库。这是db.r3.xlarge实例和具有60Gb磁存储(40GB免费)。最近我写了一个存储过程,获取用户输入为MEDIUMTEXT逗号分隔的字符串,解析并将值插入到临时表中。下面是代码:Amazon RDS:ER_RECORD_FILE_FULL:在存储过程中创建临时表时发生该表

CREATE DEFINER=`ntadmin`@`%` PROCEDURE `sp_test`(
    IN cStr  MEDIUMTEXT, -- 16777215 --LONGTEXT 4294967295 
) DETERMINISTIC 
BEGIN 

    DROP TEMPORARY TABLE IF EXISTS temp_phone; 
    CREATE TEMPORARY TABLE temp_phone (phone VARCHAR(20) NOT NULL) ENGINE = MEMORY; 

    SET @sql = CONCAT(" INSERT IGNORE INTO tmp_phone(phone) VALUES ", cStr); 
    PREPARE stmt FROM @sql; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
END 

这个存储过程调用这样

CALL sp_test("'1234','4567','897458','5784585','453434'"); 
Note: parameter (cStr) may be come vary vary long string. 

它的正常工作对我的发展实例,也未尝不可在生产实例重大案件。但一些这方面它是通过错误“ER_RECORD_FILE_FULL:该表‘tmp_phone’充满

正如我前面提到的,我有自由空间40GB 我在参数组设置变量如下:

innodb_file_per_table = ON 
innodb_data_file_path = ibdata1:12M:autoextend 
max_heap_table_size = 128000 
tmp_table_size  = 128000 

我是否应该增加max_heap_table_size因为我的最大可能值应在大小来16MB

回答

1

看看你生成的SQL:

INSERT IGNORE INTO tmp_phone(phone) 
    VALUES '1234','4567','897458','5784585','453434' 

现在来看看正确的语法:

INSERT IGNORE INTO tmp_phone(phone) 
    VALUES ('1234'),('4567'),('897458'),('5784585'),('453434') 

接下来看看对空间的要求... max_heap_table_size限制任何随后CREATEdMEMORY表的大小。 128K将限制你只有几千行。从MEDIUMTEXT听起来您可能需要更多。

max_heap_table_sizetmp_table_size(这里不相关)设置为RAM的1%(在你的情况下为300M)是合理的;当然是16M的MEDIUMTEXT(或多一点的开销)。