MariaDB Y Los Timezones
Hay veces que necesitas cambiar el Timezone a UTC de los MariaDB, como es nuestro caso y resulta que este estaba linkado al del OS.
Cambiarlo es facil, pero cuando te da errores es cuando mola de verdad :)
Como os decia, cambiar los Timezones es muy facil, solo teneis que seguir las indicaciones de la web de MariaDB, que en resumidas cuentas es esto:shell>mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
Y todo suele ir bien…hasta que te da este error…16:06:40 FAILED [INSERT - 0 rows, 0.013 secs] [Code: 1062, SQL State: 23000] Duplicate entry 'UTC' for key 'PRIMARY' INSERT INTO time_zone_name (Name, Time_zone_id) VALUES ('UTC', @time_zone_id);
El Problema
Bueno, MariaDB lee los Timezones de una Tabla mysql.time_zone que asocia a un nombre mysql.time_zone_name para que luego al ejecutar set time_zone = UTC; se lo coma con patatas.
Pero si os da ese error, posiblemente al hacer una select sobre mysql.time_zone_name os saldra algo parecido a esto:
1 | mysql> SELECT * FROM time_zone_name |
Ya que estamos, vamos a cercionarnos de que es asi:
1 | MariaDB [(none)]> SELECT @@global.time_zone, @@session.time_zone; |
Mmmmm….lo tenemos en SYSTEM; Sigamos.
1 | MariaDB [mysql]> SELECT NOW(); |
… en mi portatil pone que son las 9:29.
Podemos decir que NO esta pillando el timezone, asi que vamos a solucionarlo
La solucion
Vamos a ir paso a paso, limpiando y dejando todo guay.
Primero truncamos las tablas podridas (nada de drop, eh?)
1
2
3
4
5TRUNCATE `time_zone` ;
TRUNCATE `time_zone_leap_second` ;
TRUNCATE `time_zone_name` ;
TRUNCATE `time_zone_transition` ;
TRUNCATE `time_zone_transition_type` ;Ejecutamos de nuevo la query para tener UTC (si quereis otra timezone, poned la que querais)
1
2
3
4
5
6
7
8
9set @prep=if((select count(*) from information_schema.global_variables where variable_name='wsrep_on'), 'SET GLOBAL wsrep_replicate_myisam=?', 'do ?');
prepare set_wsrep_myisam from @prep;
set @toggle=1; execute set_wsrep_myisam using @toggle;
INSERT INTO time_zone (Use_leap_seconds) VALUES ('N');
SET @time_zone_id= LAST_INSERT_ID();
INSERT INTO time_zone_name (Name, Time_zone_id) VALUES ('UTC', @time_zone_id);
INSERT INTO time_zone_transition_type (Time_zone_id, Transition_type_id, Offset, Is_DST, Abbreviation) VALUES
(@time_zone_id, 0, 0, 0, 'UTC');
set @toggle=0; execute set_wsrep_myisam using @toggle;O podeis pasar este comando, que copia TODAS las timezones de la carpeta que le indiqueis.
shell >> mysql_tzinfo_to_sql /usr/share/zoneinfo/Etc/ | mysql -u {{ user }} -S {{ socket }} -p mysqlLuego, ya podeis darle otra vez y ahora si que os sale el id de la time_zone
1
2
3
4
5
6
7
8
9
10
11mysql> SET GLOBAL time_zone = UTC;
Query OK, 0 rows affected
Time: 0.003s
mysql> SELECT * FROM time_zone_name
+------+--------------+
| Name | Time_zone_id |
+------+--------------+
| UTC | 1 |
+------+--------------+
1 row in set
Time: 0.009sY por ultimo
1
2
3
4
5
6
7MariaDB [mysql]> SELECT NOW();
+---------------------+
| NOW() |
+---------------------+
| 2018-07-19 07:29:50 |
+---------------------+
1 row in set (0.00 sec)Espero que os sirva y si quereis, comentad mas abajo!
[LINKS]
Stackoverflow-mysql-time-zones
MariaDB Documentacion oficial Timezones