【问题标题】:How to set database timezone for a AWS RDS instance [duplicate]如何为 AWS RDS 实例设置数据库时区 [重复]
【发布时间】:2013-02-18 05:39:31
【问题描述】:

我们在 AWS RDS 实例上使用最新的 MySQL 服务器,并且我们已配置为在美国东部数据中心上运行它。我们假设任何新的 Date() 或 Time.now() 调用都会将日期存储在数据库服务器运行的时区中。

有没有办法将我在美国东部运行的 AWS RDS 实例指向 PST 时区,以便任何持久性日期都将值存储在 PST 而不是 EST 中。 (即,如果在美国东部标准时间上午 10 点左右存储一个对象,则 db 列应反映美国东部标准时间上午 7 点)。

【问题讨论】:

    标签: mysql amazon-ec2 amazon-rds


    【解决方案1】:

    在我回答其余部分之前,我现在只想建议您,如果您可以选择更改您的应用程序以使用 UTC,它将在现在和将来为您省去很多麻烦。

    但是,鉴于您的问题的上下文,我假设这不是一个选项,并且您正在调整一个旨在在传统服务器环境中使用 MySQL 的系统,您可以在其中更改时区,并且有需要这个时区并且不能轻易适应使用 UTC 的代码逻辑。

    但如果您确实需要将其存储为 PST,请继续阅读。


    您是正确的,默认情况下 mySql 将使用服务器的时区进行时间戳存储,但是 您认为 RDS 实例根据启动它们的 AWS 区域设置其时区的假设是不正确的 -所有 RDS 实例都启动时区设置为 UTC,and this configuration can't be changed:

    时区目前不可修改。确实有一个 rds-describe-db-parameters 中的参数值被调用 "default_time_zone" 但它被标记为不可修改。

    因此,您唯一的选择是将应用程序与数据库实例建立的每个连接上的时区设置为 PST。您可以使用SET SESSION time_zone = 'PST' 查询在应用程序建立的每个连接中执行found here 两个步骤:

    1. 创建以下存储过程(UTC-8 是 PST):

      DELIMITER |  
      CREATE PROCEDURE mysql.store_time_zone ()  
         IF NOT (POSITION('rdsadmin@' IN CURRENT_USER()) = 1) THEN     
             SET SESSION time_zone = '-8:00';  
         END IF 
      |
      DELIMITER ;
      
    2. 连接到您的实例,然后运行以下命令:

      $ rds-modify-db-parameter-group PARAMGROUP --parameters "name=init_connect, value='CALL mysql.store_time_zone', method=immediate"
      
    3. 您可能需要将EXECUTE 权限授予将要连接到数据库的用户,否则您可能会收到连接错误:

      GRANT EXECUTE ON PROCEDURE mysql.store_time_zone TO 'user'@'host';
      

    现在,任何客户端针对您的 RDS 实例执行的每个查询都应使用 PST,而无需修改任何应用程序逻辑,也无需更新数据库中任何先前存储的时间戳。

    【讨论】:

    • 更好的解决方案是设置您的命名时区来处理夏令时。我建议将行更改为:SET SESSION time_zone ='US/Pacific';
    • 我想强调之前的评论,命名时区确实可以节省夏令时的痛苦,也要注意 GMT,因为它不保持夏令时偏移
    • @ThomasPaine 我对这个解决方案的唯一担心是,似乎每个添加到这个数据库的新用户都必须有权访问这个数据库功能,否则它将无法工作,对吗?其他数据库及其用户呢?我可以使用这个存储过程创建一个数据库,并以某种方式确保每个人都可以默认访问它吗?
    • @Ryan Weir,我只能使用 user() 而不是 current_user() 来解决这个问题,你知道为什么你的解决方案似乎对除了我之外的所有人都适用 current_user() ;奇怪的是 current_user() 仅在 init_connect 的上下文中从命令行返回相同的内容,它实际上返回您使用 RDS 创建的初始主用户,而不管连接到 MySQL 的用户。我通过更改过程以插入具有 current_user() 值的记录来验证这一点;
    • 请注意,这个接受的答案不再正确。您现在可以在 RDS 中为数据库设置时区值:aws.amazon.com/de/premiumsupport/knowledge-center/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 2020-01-03
    相关资源
    最近更新 更多