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_sizetmp_table_size(此处不相关)设置为大约 1% 的 RAM(在您的情况下为 300M)是合理的;肯定有 16M 的 MEDIUMTEXT(或者更多的开销)。

【讨论】:

以上是关于Amazon RDS:ER_RECORD_FILE_FULL:在存储过程中创建临时表时表已满的主要内容,如果未能解决你的问题,请参考以下文章

sh Amazon RDS性能调整设置

如何水平扩展 Amazon RDS 实例?

如何获取 Amazon MySQL RDS 证书

Amazon RDS 停止实例 [重复]

Amazon RDS(postgres)连接限制?

是否可以从 Amazon Aurora 迁移回 Amazon RDS 中的原生 MySQL?