Incarcarea tabelelor timezone
La instalarea serverului de baze de date de tip MySQL sunt create automat o serie de tabele care gestioneaza informatia corespunzatoare fusurilor orare in baza de date mysql. Serverul utilizeaza aceste date pentru a implementa suport pentru fusuri orare (timezone). Cu toate acestea, tabelele de tip timezone, create la instalare, nu contin date.
mysql> USE mysql; mysql> SHOW TABLES WHERE `Tables_in_mysql` LIKE 'time_zone%'; +---------------------------+ | Tables_in_mysql | +---------------------------+ | time_zone | | time_zone_leap_second | | time_zone_name | | time_zone_transition | | time_zone_transition_type | +---------------------------+ 5 rows in set (0.00 sec) mysql> SELECT * FROM time_zone; Empty set (0.00 sec) mysql> SELECT * FROM time_zone_name; Empty set (0.00 sec)
mysql> SELECT CONVERT_TZ(NOW(), 'Europe/Bucharest', 'America/New_York'); +-----------------------------------------------------------+ | CONVERT_TZ(NOW(), 'Europe/Bucharest', 'America/New_York') | +-----------------------------------------------------------+ | NULL | +-----------------------------------------------------------+ 1 row in set (0.00 sec)
Pentru activarea acestei facilitati este necesara popularea tabelelor de tip timezone din baza de date mysql cu inregistrari.
In cadrul acestui tutorial am avut in vedere o distributie Debian Linux (Stretch), distributie care dispune de fisiere de tip timezone. Fisierele se gasesc la urmatoarea locatie /usr/share/zoneinfo.
# ls -lh /usr/share/zoneinfo/
Cum sistemul de operare dispune de fisiere care stocheza data corespunzatoare fusurilor orare, cea mai simpla modalitate de incarcare a tabelelor de tip timezone presupune utilizarea programului mysql_tzinfo_to_sql pentru a converti datele din fisiere in inregistrari.
Urmatoarea comanda va citi continutul tuturor fisierelor sistem de tip timezone, va transfera acest continut in comenzi SQL si il va rula pe serverul de baza de date. Este necesara precizarea parolei pentru utilizatorul de tip administrator sistem mysql (root).
# mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
In cazul in care in locatia precizata mai sus sunt prezente si alte fisiere decat cele de tip timezone (Europe, Pacific, …) pot aparea mesaje de avertizare inofensive. Serverul de baze de date MySQL ignora aceste fisiere.
Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it. Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it. Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it. Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.
Daca executia programului mysql_tzinfo_to_sql s-a realizat cu succes, este recomandata repornirea serverului, astfel incat acesta sa nu utilizeza in continuare date corespunzatoare fusurilor orare anterior stocate in memorie.
# service mysql restart
In MySQL, functia CONVERT_TZ() returneaza rezultatul conversiei unei valori de tip datetime de la fusul orar specificat prin intermediul celui de-al doilea argument (‘Europe/Bucharest’), la fusul orar corespunzator ultimului argument (‘America/New_York’).
mysql> SELECT CONVERT_TZ(NOW(), 'Europe/Bucharest', 'America/New_York'); +-----------------------------------------------------------+ | CONVERT_TZ(NOW(), 'Europe/Bucharest', 'America/New_York') | +-----------------------------------------------------------+ | 2019-01-25 02:25:46 | +-----------------------------------------------------------+ 1 row in set (0.00 sec)
Configurarea fusului orar
Un aspect important al administrarii unui sistem Linux il reprezinta gestionarea informatiei corespunzatoare fusului orar. La nivelul distributiei Debian (Stretch) acest lucru poate fi realizat prin intermediul pachetului tzdata. Vizualizarea sau modificarea fusului orar se poate face astfel:
# dpkg-reconfigure tzdata
Daca se doreste doar verificarea informatie de tip timezone de la nivelul unui sistem Linux, o simpla afisare a fisierului /etc/timezone este suficienta.
# cat /etc/timezone
Europe/Bucharest
In cazul sistemelor de tip MySQL, informatia de tip timezone este controlata prin intermediul a doua variabile de sistem.
Variabila | Semnificatie |
---|---|
time_zone | fusul orar implicit pe care sistemul MySQL il utilizeaza in conexiuni |
system_time_zone | fusul orar stabilit la nivelul sistemului de operare |
Stabilirea unui fus orar implicit pentru sistemul MySQL se poate realiza prin intermediul fisierului de configurare my.cnf, prin directiva default-time-zone de la nivelul sectiunii de configurarea a serverului [mysqld].
# pico /etc/mysql/my.cnf
[mysqld] default-time-zone = 'Europe/Bucharest'
# service mysql restart
mysql> SHOW GLOBAL VARIABLES LIKE '%time_zone%'; +------------------+------------------+ | Variable_name | Value | +------------------+------------------+ | system_time_zone | EET | | time_zone | Europe/Bucharest | +------------------+------------------+ 2 rows in set (0.01 sec) mysql> SET GLOBAL time_zone = 'Europe/London'; Query OK, 0 rows affected (0.00 sec) mysql> SHOW GLOBAL VARIABLES LIKE '%time_zone%'; +------------------+---------------+ | Variable_name | Value | +------------------+---------------+ | system_time_zone | EET | | time_zone | Europe/London | +------------------+---------------+ 2 rows in set (0.01 sec)
Configurarea fusului orar poate fi realizata inclusiv la nivel clientului/sesiunii, folosind comenzi de tipul SET.
mysql> SET time_zone ='SYSTEM'; Query OK, 0 rows affected (0.00 sec) mysql> SELECT @@GLOBAL.time_zone; +--------------------+ | @@GLOBAL.time_zone | +--------------------+ | Europe/London | +--------------------+ 1 row in set (0.00 sec) mysql> SELECT @@SESSION.time_zone; +---------------------+ | @@SESSION.time_zone | +---------------------+ | SYSTEM | +---------------------+ 1 row in set (0.00 sec)