【问题标题】:How to call a procedure on every time mysql connection created on amazon RDS如何在每次在亚马逊 RDS 上创建 mysql 连接时调用一个过程
【发布时间】:2016-03-19 01:17:41
【问题描述】:

我想为每个会话更改亚马逊 RDS 的时区。 RDS 时区默认为 UTC。 我想把它改成亚洲/加尔各答。

要更改特定会话的时区,我已经定义了过程

DELIMITER |  
CREATE PROCEDURE mysql.store_time_zone ()  
   IF NOT (POSITION('rdsadmin@' IN CURRENT_USER()) = 1) THEN     
       SET SESSION time_zone = '+5:30';  
   END IF 
|
DELIMITER ;

现在我不知道每次创建新连接/会话时应该如何调用它。

我从给定的链接中获取了参考。我无法运行

rds-modify-db-parameter-group PARAMGROUP --parameters "name=init_connect, value='CALL mysql.store_time_zone', method=immediate"

它给出了错误 ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 'rds-modify-db-parameter-group PARAMGROUP --parameters "name=init_connect, value=' 附近使用正确的语法

https://stackoverflow.com/a/15198369/3551179

提前致谢。

【问题讨论】:

标签: mysql amazon-web-services


【解决方案1】:

您在正确的轨道上,但您误解了一个步骤,因为另一个答案中的措辞模棱两可:

连接到您的实例,然后运行以下命令

所以,你实际上是在这样做:

mysql> rds-modify-db-parameter-group ...

但你应该这样做:

$ rds-modify-db-parameter-group ...

这不是 MySQL 语句,而是 shell 命令。 RDS 实例没有 shell 访问权限,因此您需要另一台机器来运行此命令。通常,这可能是一个 EC2 实例,所以我假设这就是其他经理的作者所说的“您的实例”的意思,但它可以是任何具有 RDS command line interface tools installed 的机器。

您也可以通过RDS Console 执行此操作。


还请注意,您还可以更简洁地执行此操作,完全避免存储过程,甚至通过将 rdsadmin 设置为:

SET @@time_zone = '+5:30'

rdsadmin 用户应该对init_connect 免疫,因为它拥有SUPER 权限。

init_connect 的内容不会对拥有SUPER 权限的用户执行。这样做是为了使init_connect 的错误值不会阻止所有客户端连接。例如,该值可能包含有语法错误的语句,从而导致客户端连接失败。不为具有SUPER 权限的用户执行init_connect 使他们能够打开连接并修复init_connect 值。

http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_init_connect

如果你更愿意测试rdsadmin...

SET @@time_zone = CASE
     WHEN CURRENT_USER() LIKE 'rdsadmin@%' THEN @@time_zone
    ELSE '+5:30' END

将变量设置为相同的变量会使值保持不变。

注意@@time_zoneSESSION time_zone 是等价的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-30
    • 2019-09-08
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 2017-05-28
    • 2017-09-15
    • 2017-02-25
    相关资源
    最近更新 更多