Amazon RDS:ER_RECORD_FILE_FULL:在存储过程中创建临时表时表已满
Posted
技术标签:
【中文标题】Amazon RDS:ER_RECORD_FILE_FULL:在存储过程中创建临时表时表已满【英文标题】:Amazon RDS : ER_RECORD_FILE_FULL: The table is full occured while creating temporary table in stored procedure 【发布时间】:2016-09-10 09:13:28 【问题描述】:我在 Amazon RDS 上托管了我的数据库。它是 db.r3.xlarge 实例,具有 60Gb 磁存储(40GB 免费)。最近我写了一个存储过程,它将用户输入作为 MEDIUMTEXT 逗号分隔的字符串,解析它并将值插入到临时表中。这是代码:
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 的可用空间。 我在参数组中设置了VARIABLES如下:
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
限制任何后续CREATEd
MEMORY
表的大小。 128K 将限制您只有几千行。从MEDIUMTEXT
看来,您可能需要更多。
将max_heap_table_size
和tmp_table_size
(此处不相关)设置为大约 1% 的 RAM(在您的情况下为 300M)是合理的;肯定有 16M 的 MEDIUMTEXT
(或者更多的开销)。
【讨论】:
以上是关于Amazon RDS:ER_RECORD_FILE_FULL:在存储过程中创建临时表时表已满的主要内容,如果未能解决你的问题,请参考以下文章