Mysql
 sql >> Database >  >> RDS >> Mysql

Fusi orari MySQL

Per impostazione predefinita, (almeno su installazioni basate su Debian) nessun dato di fuso orario viene caricato in MySQL. Se vuoi verificare se sono caricati, prova a eseguire:

SELECT CONVERT_TZ('2012-06-07 12:00:00', 'GMT', 'America/New_York');

Se restituisce un DATETIME (in questo caso 2012-06-07 08:00:00 ), sono stati caricati i fusi orari. Se restituisce NULL , non lo sono. Quando non viene caricato, sei limitato alla conversione utilizzando gli offset (ad es. +10:00 o -6:00 ).

Questo dovrebbe funzionare bene in molti casi, ma ci sono momenti in cui è meglio usare fusi orari con nome, ad esempio per non preoccuparsi dell'ora legale. L'esecuzione del comando seguente carica i dati del fuso orario dal sistema (solo Unix. Non sono sicuro di quale sarebbe il comando equivalente di Windows):

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

Se hai bisogno di fare continuamente affidamento sui fusi orari di MySQL, il comando precedente dovrebbe essere eseguito ogni volta che il fuso orario del sistema viene aggiornato . Puoi anche semplicemente aggiungerlo a un cron job settimanale o mensile per farlo automaticamente.

Quindi, per visualizzare un elenco di fusi orari, procedi come segue:

USE mysql;
SELECT * FROM `time_zone_name`;

Nota, le informazioni sul fuso orario occupano circa 5 MB in MySQL. Se vuoi scaricare le informazioni sul fuso orario, esegui quanto segue e riavvia MySQL:

TRUNCATE `time_zone` ;
TRUNCATE `time_zone_leap_second` ;
TRUNCATE `time_zone_name` ;
TRUNCATE `time_zone_transition` ;
TRUNCATE `time_zone_transition_type` ;

Non DROP queste tabelle o succederanno cose brutte.

Modifica:

Sulla base di un commento dell'utente di seguito, se desideri che i fusi orari vengano aggiornati automaticamente quando aggiorni il sistema, devi prima consentire a root di accedere senza che ti venga richiesta una password.

MySQL>=5.6.6

Esegui il seguente [source ]:

mysql_config_editor set --login-path=client --host=localhost --user=root --password

MySQL <5.6.6

Crea un ~/.my.cnf file (se non esiste ancora) e aggiungi quanto segue:

[client]
user=root
password=yourMysqlRootPW

Quindi esegui chmod 600 ~/.my.cnf per assicurarti che nessun altro possa leggerlo.

Aggiorna script

Aggiungi il seguente script a crontab da eseguire una volta al giorno:

#!/bin/bash
# Find if there are any timezone files that have been modified in the last 24   
# hours and do not have ".tab" in the name (since these are not timezone files) 
if [ `find /usr/share/zoneinfo -mtime -1 | grep -v '\.tab' | wc -l` -gt 0 ]; then
    echo "Updating MySQL timezone info"
    # Note, suppressing STDERR here because of the .tab files above
    # that cause warnings.
    mysql_tzinfo_to_sql /usr/share/zoneinfo 2>/dev/null | mysql -u root mysql
    echo "Done!\n"
fi

Rimuovi l'echo righe se non vuoi alcun output.

Nota:questo è (per lo più) non testato. Fammi sapere se hai problemi e aggiornerò questa risposta.