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
2
3
4
5
6
7
mysql> SELECT * FROM time_zone_name
+------+--------------+
| Name | Time_zone_id |
+------+--------------+
+------+--------------+
1 row in set
Time: 0.009s

Ya que estamos, vamos a cercionarnos de que es asi:

1
2
3
4
5
6
7
MariaDB [(none)]> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM | SYSTEM |
+--------------------+---------------------+
1 row in set (0.00 sec)

Mmmmm….lo tenemos en SYSTEM; Sigamos.

1
2
3
4
5
6
7
MariaDB [mysql]> SELECT NOW();
+---------------------+
| NOW() |
+---------------------+
| 2018-07-19 09:29:37 |
+---------------------+
1 row in set (0.00 sec)

… 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.

  1. Primero truncamos las tablas podridas (nada de drop, eh?)

    1
    2
    3
    4
    5
    TRUNCATE `time_zone` ;
    TRUNCATE `time_zone_leap_second` ;
    TRUNCATE `time_zone_name` ;
    TRUNCATE `time_zone_transition` ;
    TRUNCATE `time_zone_transition_type` ;
  2. Ejecutamos de nuevo la query para tener UTC (si quereis otra timezone, poned la que querais)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    set @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;
  3. 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 -S -p mysql

  4. Luego, 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
    11
    mysql> 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.009s
  5. Y por ultimo

    1
    2
    3
    4
    5
    6
    7
    MariaDB [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

Comentários

⬆︎TOP