2013-03-04 6 views
12

Utilizziamo l'ultimo server MySQL nell'istanza RDS AWS e abbiamo configurato l'esecuzione sul centro dati US-East. Supponiamo che ogni nuova chiamata a Date() o Time.now() memorizzerà la data nel fuso orario in cui è in esecuzione il server di database.Come impostare il fuso orario del database per un'istanza RDS AWS

C'è un modo per puntare la mia istanza di RDS AWS in esecuzione su US-East per puntare al fuso orario PST, in modo che qualsiasi persistenza di data memorizzerà i valori in PST anziché EST. (ad esempio se si memorizza un oggetto intorno alle 10:00 EST, la colonna db dovrebbe riflettere invece 7 AM EST).

risposta

35

Prima del resto della mia risposta, mi piacerebbe solo raccomandare ora che se avete qualche opzione per cambiare la vostra applicazione per utilizzare UTC vi farà risparmiare un sacco di dolore ora e in futuro.

Tuttavia dato il contesto della tua domanda, presumo che questa non sia un'opzione e che tu stia adattando un sistema progettato per usare MySQL in un ambiente server tradizionale dove puoi semplicemente cambiare il fuso orario, e che c'è la logica del codice che si aspetta questo fuso orario e non può essere facilmente adattata per utilizzare UTC.

Ma se è davvero necessario archiviare come PST, continua a leggere.


Sei corretta che MySQL utilizzerà fuso orario del server per l'archiviazione timestamp per impostazione predefinita, tuttavia tua ipotesi che RDS casi hanno i loro fusi orari impostati in base alla regione AWS in cui vengono lanciati non è corretto - tutto istanze di RDS sono lanciati con il loro fuso orario impostato come 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.

Quindi l'unica opzione è quella di impostare il fuso orario su ogni connessione l'applicazione fa per l'istanza del database a PST. È possibile utilizzare la query SET SESSION time_zone = 'PST' da eseguire in ogni connessione un'applicazione effettua seguendo le due fasi found here:

  1. creare il seguente stored procedure (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. Connect all'istanza, ed eseguire il seguente comando:

    $ rds-modify-db-parameter-group PARAMGROUP --parameters "name=init_connect, value='CALL mysql.store_time_zone', method=immediate" 
    
  3. potrebbe essere necessario concedere EXECUTE autorizzazioni per gli utenti che saranno la connessione al database, altrimenti si può ottenere un errore di connessione:

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

Ora ogni query eseguita contro l'istanza di RDS da qualsiasi client dovrebbero usare PST senza modificare alcuna logica applicativa e senza la necessità di aggiornare i timestamp precedentemente memorizzati nel database.

+13

Una soluzione migliore sarebbe quella di impostare il proprio fuso orario denominato per gestire l'ora legale. Suggerisco di cambiare la linea in: SET SESSION time_zone = 'US/Pacific'; –

+0

Voglio mettere l'accento sul commento precedente, chiamato timezone fa davvero risparmiare sull'ora legale, sii consapevole anche del GMT, poiché non regge l'ora legale offset – Zavael

+0

@ThomasPaine Il mio unico timore di questa soluzione è che, sembra ogni nuovo utente quello che viene aggiunto a questo database dovrà avere accesso a questa funzione del database o non funzionerà, corretto? Che dire degli altri database e dei loro utenti.Posso creare un database con questa stored procedure e in qualche modo assicurarmi che tutti possano accedervi per impostazione predefinita? – Neo

Problemi correlati