zona time_zone servidor madrid horario horaria hora europe establecer cambiar ajustar mysql timezone amazon-rds

time_zone - time zone mysql



Ajuste para la configuraciĆ³n de zona horaria predeterminada en RDS (5)

Desafortunadamente no es posible establecer la zona de hora predeterminada en los grupos de parámetros de base de datos de RDS, por lo que su intento ya era la dirección correcta.

$ rds-describe-db-parameters default | grep "time_zone" DBPARAMETER default_time_zone engine-default string static false

Para establecer el valor global a través de SET GLOBAL, debe tener el privilegio SUPER que no se le otorga como usuario de RDS.

La única forma de establecer time_zone es por conexión

mysql> SET time_zone = timezone;

En mis máquinas probé con US / Eastern con éxito, pero tengo una generación bastante antigua en funcionamiento.

Para determinar las zonas horarias que tiene disponible, inicie sesión en su casilla

mysql -h yourboxhost.rds.amazonaws.com -u <youruser> -p

y tipo

mysql> SELECT * FROM mysql.time_zone_name;

Debería obtener una lista de los nombres de zona horaria instalados y válidos que puede establecer en su instancia

+----------------------------------------+--------------+ | Name | Time_zone_id | +----------------------------------------+--------------+ | Africa/Abidjan | 1 | | Africa/Accra | 2 | | Africa/Addis_Ababa | 3 | | Africa/Algiers | 4 | | Africa/Asmara | 5 | | Africa/Asmera | 6 | | Africa/Bamako | 7 | | Africa/Bangui | 8 | | Africa/Banjul | 9 | | Africa/Bissau | 10 | | Africa/Blantyre | 11 | | Africa/Brazzaville | 12 | | Africa/Bujumbura | 13 | | Africa/Cairo | 14 | etc...

Debes establecer time_zone cada vez que te conectas a tu servidor de base de datos

Por ejemplo, si usas la extensión php Mysqli puedes hacer esto

$mysqli = mysqli_init(); mysqli_options($mysqli,MYSQLI_INIT_COMMAND,"SET time_zone = ''Africa/Brazzaville''" ); mysqli_real_connect($mysqli,$host, $user, $pass,$dbName) or die (''Unable to connect'');

De lo contrario, solo manualmente (en términos de dejar que lo haga su conector de base de datos) ejecute la consulta SET time_zone = ''<YOUR_DESIRED_TIMEZONE>'' justo después de haberse conectado a su base de datos.

Recientemente cambiamos a una instancia de RDS y notamos que muchas de nuestras tareas de base de datos se activaban 4 horas antes de lo necesario. Al investigar más, el problema es causado por la configuración de zona horaria predeterminada (UTC) en la instancia de RDS. Dado que esta configuración no se puede modificar, nos gustaría solucionar el problema en el nivel de código globalmente en todas nuestras aplicaciones utilizando esta instancia de base de datos. Intenté establecer la zona horaria en la instancia de db que creo en ''US / Eastern'' utilizando

set GLOBAL time_zone = ''US/Eastern''" OR set time_zone = ''US/Eastern''"

Pero eso genera un error "Error de base de datos: zona horaria desconocida o incorrecta: ''US / Eastern''"

¿Qué crees que estoy haciendo mal aquí? ¿Alguien ha usado alguna otra solución?


La solución de @Thomas Paine funciona para mí, excepto que tuve que usar user() lugar de current_user() ya que dentro del contexto de init_connect current_user () devuelve el usuario maestro de RDS. (Por maestro no me refiero a rdsadmin, que es el usuario raíz real, sino el usuario creado con la instancia de base de datos con más privilegios).



tldr;

Cree un esquema "compartido" al que todos sus usuarios tengan acceso EXECUTE, cree un SPROC que modifique la zona horaria de la sesión y modifique el parámetro init_connect MySQL para llamarlo.

Como Ryan Weir señaló en su excelente respuesta en una pregunta duplicada, esto probablemente debería evitarse si es posible. Sin embargo, si eres como yo y quieres implementarlo por comodidad y cordura, tomé la solución de Ryan e hice algunas modificaciones.

Si tiene varios usuarios configurados en MySQL con permisos variables, entonces simplemente poner el comando sproc en el esquema mysql puede tener problemas. Para resolver esto, creé un nuevo esquema llamado "compartido" y otorgué a todos mis usuarios el acceso EXECUTE a este esquema. Luego creé el siguiente procedimiento almacenado.

DROP PROCEDURE IF EXISTS shared.store_time_zone; CREATE PROCEDURE shared.`store_time_zone`() IF NOT (POSITION(''rdsadmin@'' IN CURRENT_USER()) = 1) THEN SET SESSION time_zone = ''US/Pacific''; END IF;

Prefiero configurar ''US / Pacific'' para manejar el horario de verano, pero debe probar esto para asegurarse de que su instancia MySQL lo reconozca primero. Simplemente ejecute la siguiente consulta SET SESSION time_zone = ''US/Pacific''; para asegurarse de que funciona Para buscar su zona horaria, ejecute SELECT * FROM mysql.time_zone_name;

En este punto, recomiendo probar los permisos antes de ir a modificar el grupo de parámetros y romper todo potencialmente. Simplemente conéctese a la base de datos (preferiblemente con un usuario que tiene permisos de bajo nivel y / o se usa comúnmente) y ejecute las siguientes consultas.

CALL shared.store_time_zone; select now();

Es de esperar que no haya recibido ningún error y aparezca la hora correcta.

A continuación, deberá modificar el parámetro init_connect en el Grupo de Parámetros DB que está utilizando su instancia RDS. Puede hacerlo en la consola web de RDS, a través de la API o la utilidad de línea de comandos. Si usas la línea de comando, se verá así:

$ rds-modify-db-parameter-group PARAMGROUP --parameters "name=init_connect, value=''CALL shared.store_time_zone'', method=immediate"

Si lo haces a través de la consola web, solo necesitas cambiar el valor de init_connect.

CALL shared.store_time_zone

Regrese a su instancia de RDS en la consola web y desplace el panel de detalles hacia abajo hasta el Grupo de Parámetros de DB. Debería decir algo como (aplicar) o (sincronizar). Una vez que esté (sincronizado), pruebe todo para asegurarse de que no haya problemas.

Si en este punto se encuentra con problemas y necesita hacer una devolución, le recomiendo que configure el valor de init_connect en algo inofensivo como:

SET SESSION time_zone = ''-00:00'';

Volver a ponerlo en blanco es imposible de hacer desde la consola web. Vea este hilo para más detalles sobre por qué uno no puede restaurar el valor vacío para el parámetro DB


Hice los siguientes pasos para poder cambiar la zona horaria

  1. inicie sesión en RDS y cree un nuevo grupo de parámetros.

  2. Edite el grupo de parámetros recién creado

  3. Establezca time_zone Ex: Asia / Calcuta y guarde los cambios

  4. Modifique la instancia de RDS, cambie el grupo de parámetros de DB al grupo de parámetros recién creado

  5. Guardar y reiniciar la instancia de RDS