2013-03-04 14 views
12

Używamy najnowszego serwera MySQL w instancji AWS RDS i skonfigurowaliśmy go do uruchamiania w centrum danych US-East. Zakładamy, że każde nowe wywołanie Date() lub Time.now() zapisze datę w strefie czasowej, w której działa serwer bazy danych.Jak ustawić strefę czasową bazy danych dla instancji AWS RDS

Czy istnieje sposób, aby wskazać moją instancję RDS AWS działającą na trasie US-East, aby wskazywała strefę czasową PST, tak aby każda trwałość daty przechowywała wartości w PST zamiast EST. (np. Jeśli obiekt jest przechowywany w okolicach 10-godzinnego czasu EST, kolumna db powinna zamiast tego odzwierciedlać 7-godzinny EST).

Odpowiedz

35

Przed dalszą odpowiedzią chciałbym teraz polecić, że jeśli masz jakąkolwiek opcję zmiany aplikacji, aby użyć UTC, zaoszczędzisz wiele żalu teraz i w przyszłości.

Jednak biorąc pod uwagę kontekst twojego pytania, zakładam, że nie jest to możliwe i że dostosowujesz system zaprojektowany do używania MySQL w tradycyjnym środowisku serwera, gdzie możesz po prostu zmienić strefę czasową, a także istnieje logika kodu, która oczekuje tej strefy czasowej i nie może być łatwo dostosowana do użycia UTC.

Ale jeśli naprawdę potrzebujesz go do przechowywania jako plik PST, czytaj dalej.


Jesteś poprawne, że MySQL użyje czasową serwera do przechowywania datownika domyślnie jednak twoje założenie, że RDS przypadki mają ich czasowe, ustalane na podstawie regionu AWS, w których są uruchamiane jest nieprawidłowy - wszystko RDS przypadki są uruchamiane ze swojej strefy czasowej ustawionej jako 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.

więc jedyną opcją jest, aby ustawić strefę czasową na każdym połączeniu aplikacja sprawia, że ​​na przykład bazy danych do pliku PST. Można użyć zapytania SET SESSION time_zone = 'PST' wykonać w każdym połączeniu aplikacja sprawia, wykonując dwa kroki found here:

  1. Utwórz następującą procedurę przechowywaną (UTC-8 jest 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. Połącz do instancji i uruchom następujące polecenie:

    $ rds-modify-db-parameter-group PARAMGROUP --parameters "name=init_connect, value='CALL mysql.store_time_zone', method=immediate" 
    
  3. może zaistnieć potrzeba udzielenia EXECUTE uprawnienia do użytkowników, którzy będą łączyć się z bazą danych, w przeciwnym razie może pojawić się błąd połączenia:

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

Teraz każdy kwerendy wykonywane przed wystąpieniem RDS przez każdego klienta należy użyć PST bez zmiany logiki aplikacji i bez konieczności aktualizowania wcześniej zapisanych znaczników czasowych w bazie danych.

+13

Lepszym rozwiązaniem byłoby, aby ustawić strefę czasową nazwie obsłużyć letniego. Sugeruję zmianę linii na: SET SESSION time_zone = 'US/Pacific'; –

+0

Chcę położyć nacisk na poprzednim komentarzu, nazwany stref czasowych naprawdę oszczędza ból oszczędności światła dziennego, mieć świadomość GMT też, ponieważ nie posiadają letniego przesunięcie – Zavael

+0

@ThomasPaine Moja jedyna obawa tego rozwiązania jest to, że wydaje się, każdy nowy użytkownik która jest dodana do tej bazy danych będzie musiała mieć dostęp do tej funkcji bazy danych lub nie będzie działać, prawda? A co z innymi bazami danych i ich użytkownikami.Czy mogę utworzyć bazę danych z tą procedurą przechowywaną i jakoś upewnić się, że każdy ma do niej domyślny dostęp? – Neo

Powiązane problemy