mysql - 在创建 Elastic Beanstalk 环境时,有什么方法可以在创建时在 RDS MySQL 实例中创建触发器和存储过程?
问题描述
默认情况下,在创建 Elastic Beanstalk 环境期间创建的 RDS MySQL 实例不允许创建触发器、函数和存储过程,因为主用户没有 SUPER 权限,启用二进制日志记录,并且log_bin_trust_function_creators
为 false。因此,在 container_commands 中尝试此操作的任何脚本都将失败。
这可以在实例化后通过更改为非默认数据库参数组来解决log_bin_trust_function_creators = 1
。有关如何以交互方式执行此操作的说明,请参阅此视频。但是,您似乎无法在创建时将新实例与非默认参数组相关联。因此,您必须在没有触发器和存储过程的情况下进行实例化,修改实例以使用非默认参数组,重新启动实例,然后才能运行脚本来创建触发器和存储过程。
更糟糕的是,您甚至不能让创建触发器的 container_commands 运行,因为这会导致实例化失败,并且您无法获得可以应用所描述的手动干预的工作实例。因此,您需要在创建期间将您的 container_commands 注释掉,然后在随后的重启后“eb deploy”期间重新启用。在这种情况下,您无法自动创建需要 DDL 创建触发器、函数或存储过程的环境。
解决方案
这个问题是在考虑特定 MySQL 参数的情况下编写的,但它适用于需要非默认数据库参数组的任何情况。在与 AWS 技术支持讨论后,您可以在环境创建期间将非默认数据库参数组关联到 RDS 实例。我会建议文档可能会更好;-)
这个例子是特定于 MySQL 8.0 ( mysql8.0
) 的,但是很明显你会针对你的特定情况进行更改。
将以下内容添加到 .ebextensions/ 中的文件中
Resources:
customdbparametergroup:
Type: 'AWS::RDS::DBParameterGroup'
Properties:
Description: "DB parameter group for Beanstalk RDS instance which enables functions, procedures, and triggers"
Family: "mysql8.0"
Parameters:
"log_bin_trust_function_creators" : 1
AWSEBRDSDatabase:
Properties:
DBParameterGroupName:
Ref: customdbparametergroup
当然,如果您已经有一个带有Resources:
节的配置文件,您只需添加参数组资源和AWSEBRDSDatabase
密钥。当您检查创建的实例时,参数组名称将以通常的方式被破坏。您必须在配置中将参数组声明为资源,即您不能指定现有参数组的名称。
推荐阅读
- git - 为什么这次回归失败了?
- eclipse - 如何在 Eclipse 中更改 pom.xml 的默认位置(根目录)?
- c++ - 处理智能指针自定义删除器中的条件
- javascript - 引导下拉菜单在点击时无法在移动设备上运行
- ffmpeg - 如何通过ffplay查看mkvserver生成的流?
- android - 广播接收者权限被拒绝
- c# - 如何防止更新 SQL Server 2012 中的某些行?
- javascript - 如何从这些信息中利用基于 dom 的 xss?它可以利用吗?
- kotlin - 在 kotlin 中减去 2 个可为空的浮点类型
- python - Web Scraper 未从网站获取完整数据