AWS Aurora MySQL创建MyISAM表被自动改为InnoDB问题咨询
问题解答
关于RDS Aurora MySQL的引擎限制
是的,你使用的AWS Aurora MySQL 5.7.mysql_aurora.2.10.2版本强制仅支持InnoDB引擎,这是Aurora的底层设计决定的:
- Aurora基于InnoDB深度优化,完全依赖其事务、日志和存储架构,不兼容MyISAM、MEMORY等非InnoDB引擎;
- 无论你显式指定
ENGINE=MYISAM创建表,还是用ALTER TABLE尝试修改引擎,RDS都会自动将表转换为InnoDB,且无法通过参数配置更改这一行为。
解决SIGNAL回滚INSERT日志的方案
因为InnoDB是事务型引擎,SIGNAL抛出异常会触发整个事务回滚,导致之前的日志插入操作被撤销。要实现“记录日志后抛出异常且日志不丢失”的需求,只需将日志插入操作放在独立的事务中提交,再执行SIGNAL即可。
直接执行的示例代码
-- 独立事务插入日志并提交 START TRANSACTION; INSERT INTO Log(type, info, date) VALUES("ERROR", "Error happened...!", CURRENT_TIMESTAMP()); COMMIT; -- 抛出异常,此时不会回滚已提交的日志 SIGNAL CUSTOM_EXCEPTION SET MESSAGE_TEXT = "Error happened...";
存储过程中的示例代码
如果是在存储过程中使用,需要显式控制事务边界:
DELIMITER // CREATE PROCEDURE record_error_and_throw() BEGIN -- 插入日志并提交 START TRANSACTION; INSERT INTO Log(type, info, date) VALUES("ERROR", "Error happened...!", CURRENT_TIMESTAMP()); COMMIT; -- 抛出异常 SIGNAL CUSTOM_EXCEPTION SET MESSAGE_TEXT = "Error happened..."; END // DELIMITER ;
这样日志会被持久化保存,后续的异常抛出不会影响已提交的日志记录。
内容的提问来源于stack exchange,提问作者Savo Simeunovic
相关产品推荐
相关产品推荐

