2013-03-04 123 views
12

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

有没有办法指示我的AWS RDS实例在US-East上运行指向PST时区,以便日期的任何持久性都可以将值存储在PST而不是EST中。 (即,如果将对象存储在美国东部时间上午10点左右,那么数据库列应反映上午7点EST)。

回答

35

在我的其他答案之前,我只想现在推荐如果您有任何选择将您的应用程序更改为使用UTC,那么现在和将来都会为您节省很多痛苦。

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

但是,如果你真的需要它作为PST存储,请继续阅读。


你是正确的,MySQL将使用服务器的时区默认情况下为时间戳存储,但是你的假设,即RDS实例有自己的时区基于它们所推出的AWS区域设置不正确, - 所有RDS实例与他们的时区设置为UTC推出,and this configuration can't be changed:

The time zone is currently not modifiable. There is indeed a Parameter value in rds-describe-db-parameters called "default_time_zone" but it's marked as not modifiable.

所以你唯一的选择是设置时区您的应用程序对数据库实例PST每个连接上。您可以使用SET SESSION time_zone = 'PST'查询每一个应用程序,使通过以下两个步骤found here连接执行:

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

    DELIMITER | 
    CREATE PROCEDURE mysql.store_time_zone() 
        IF NOT (POSITION('[email protected]' 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每个查询,而无需修改任何应用程序逻辑而无需更新数据库中以前存储的任何时间戳。

+13

更好的解决方案是将您的指定时区设置为处理夏令时。我建议将该行改为:SET SESSION time_zone ='US/Pacific'; – 2013-05-15 19:07:46

+0

我想强调之前的评论,名为timezone确实节省了夏令时的痛苦,同时也意识到了GMT,因为它没有保留夏令时抵消 – Zavael 2015-04-09 12:22:23

+0

@ThomasPaine我唯一对此解决方案的担心是,似乎每个新用户添加到这个数据库中的数据库将不得不访问这个数据库函数,否则它将无法正常工作?其他数据库及其用户呢?我可以使用此存储过程创建数据库,并确保每个人都可以默认访问它吗? – Neo 2015-08-06 17:29:21

相关问题