Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Fusos horários do MySQL


Por padrão, (pelo menos em instalações baseadas em Debian) nenhum dado de fuso horário é carregado no MySQL. Se você quiser testar se eles estão carregados, tente executar:
SELECT CONVERT_TZ('2012-06-07 12:00:00', 'GMT', 'America/New_York');

Se retornar um DATETIME (neste caso 2012-06-07 08:00:00 ), você tem fusos horários carregados. Se retornar NULL , não são. Quando não carregado, você está limitado a converter usando deslocamentos (por exemplo, +10:00 ou -6:00 ).

Isso deve funcionar bem em muitos casos, mas há momentos em que é melhor usar fusos horários nomeados, como para não se preocupar com o horário de verão. A execução do seguinte comando carrega os dados de fuso horário do sistema (somente Unix. Não tenho certeza de qual seria o comando equivalente do Windows):
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

Se você precisar confiar continuamente nos fusos horários do MySQL, o comando acima deve ser executado toda vez que o fuso horário do sistema for atualizado . Você também pode adicioná-lo a um cron job semanal ou mensal para fazer isso automaticamente.

Em seguida, para visualizar uma lista de fusos horários, faça o seguinte:
USE mysql;
SELECT * FROM `time_zone_name`;

Observe que as informações de fuso horário ocupam cerca de 5 MB no MySQL. Se você quiser descarregar as informações de fuso horário, basta executar o seguinte e reiniciar o MySQL:
TRUNCATE `time_zone` ;
TRUNCATE `time_zone_leap_second` ;
TRUNCATE `time_zone_name` ;
TRUNCATE `time_zone_transition` ;
TRUNCATE `time_zone_transition_type` ;

Não DROP estas tabelas ou coisas ruins acontecerão.

Editar:

Com base em um comentário de usuário abaixo, se você deseja que os fusos horários sejam atualizados automaticamente ao atualizar o sistema, primeiro você precisa permitir que o root faça login sem que seja solicitada uma senha.

MySQL>=5.6.6


Execute a seguinte [fonte ]:
mysql_config_editor set --login-path=client --host=localhost --user=root --password

MySQL <5.6.6


Crie um ~/.my.cnf arquivo (se ainda não existir) e adicione o seguinte:
[client]
user=root
password=yourMysqlRootPW

Em seguida, execute chmod 600 ~/.my.cnf para garantir que ninguém mais possa lê-lo.

Atualizar script


Adicione o seguinte script ao crontab para ser executado uma vez por dia:
#!/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

Remova o echo linhas se você não quiser nenhuma saída.

Nota:Este é (principalmente) não testado. Deixe-me saber se você tiver algum problema e eu atualizarei esta resposta.