如何为AWS RDS实例设置数据库时区

时间:2013-03-04 07:14:34

标签: mysql amazon-ec2 amazon-rds

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

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

1 个答案:

答案 0 :(得分:34)

在我的回答之前,我现在只想建议,如果您有任何选择更改您的应用程序以使用UTC,它将为您现在和将来节省很多悲伤。

但是考虑到你的问题的背景,我假设这不是一个选项,并且你正在调整一个设计用于在传统服务器环境中使用MySQL的系统,你可以在那里改变时区,并且代码逻辑需要这个时区,并且不能轻易地适应使用UTC。

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


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

  

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

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

  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';
    
  4. 现在,任何客户端针对您的RDS实例执行的每个查询都应该使用PST,而无需修改任何应用程序逻辑,也无需更新数据库中以前存储的任何时间戳。