2011-11-15 23 views
10

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 global en todas nuestras aplicaciones utilizando esta instancia de base de datos. Traté de establecer la zona horaria en el caso del DB creo que 'EEUU/Eastern' mediante el uso deAjuste de la configuración de zona horaria predeterminada en RDS

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: 'Estados Unidos/Oriente'"

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

+0

¿Qué tipo de base de datos es esto? MySQL? – Michael

Respuesta

9

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

$ 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 SET GLOBAL es necesario tener el permiso SUPER que no se concede a usted como usuario de RDS.

La única manera de establecer el time_zone es en una base por conexión

mysql> SET time_zone = timezone; 

En mis máquinas He tratado de Estados Unidos/Oriente éxito pero tengo una muy vieja generación en funcionamiento.

Para determinar las zonas horarias que tiene registro disponible en la barra de

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

y escriba

mysql> SELECT * FROM mysql.time_zone_name; 

Debe obtener una lista de instalado y nombres de zona horaria válidas 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... 

Tiene que establecer el time_zone cada vez que se conecta a su base de datos se rver

Por ejemplo, si se utiliza la extensión php Mysqli puede hacerlo

$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 sólo manualmente (en términos de dejar que su conector de base de datos de hacerlo) ejecutar la consulta SET time_zone = '<YOUR_DESIRED_TIMEZONE>' justo después de que ha conectado a su base de datos

+4

Si acaba de cambiar 'set time_zone = 'EEUU/Eastern'' a' time_zone SET =' -5: 00'' entonces usted puede evitar el tema sobre MySQL no reconocer zonas horarias por su nombre en RDS por defecto. –

+0

Buen punto, gracias por el respaldo. –

+0

@RyanWeir, cuidado con el horario de verano/hora de verano, etc si se utiliza compensaciones hora primas – indivisible

3

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 answer in a duplicate question esto probablemente se debe evitar 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 múltiples usuarios configurados en MySQL con permisos variables, 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('[email protected]' IN CURRENT_USER()) = 1) THEN  
    SET SESSION time_zone = 'US/Pacific'; 
END IF; 

prefiero set 'de Estados Unidos/Pacífico' para manejar el horario de verano pero debe probar esto para asegurarse de que su instancia de MySQL reconoce por primera vez. Simplemente ejecute la siguiente consulta SET SESSION time_zone = 'US/Pacific'; para asegurarse de que funciona. Para buscar su zona horaria ejecutar 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(); 

Esperemos que no haya 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 utiliza la línea de comandos que 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 a continuación, sólo tiene que 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 hasta el Grupo de parámetros de la base de datos. 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 momento se encuentra con problemas y la necesidad de revertir las cosas entonces me recomiendan establecer el valor init_connect a algo inofensivo como:

SET SESSION time_zone = '-00:00'; 

el establecimiento de nuevo al espacio en blanco es imposible de hacer desde la consola Web . Ver este hilo para más detalles acerca de por qué la solución de uno can't restore the empty value for the DB parameter

+0

sólo fue capaz de conseguir que esto funcione con el uso de usuario() en lugar de current_user(), ¿sabes por qué su solución parece estar funcionando para todos menos yo con current_user(); lo extraño es que current_user() devuelve lo mismo desde la línea de comandos solo en el contexto de init_connect. De hecho, devuelve el usuario maestro inicial que creaste con RDS independientemente del usuario que se conecta a MySQL. Lo verifiqué cambiando el procedimiento para insertar un registro con el valor de current_user(); – Neo

0

@Thomas Paine que funciona para mí, si tuviera que user() de usuario en lugar de current_user() como dentro del contexto de init_connect current_user() devuelve el RDS usuario maestro. (Por maestra no me refiero a rdsadmin que es el usuario root real, pero el usuario creado con el DB de instancia con la mayoría de los privilegios.)

0

lo 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. editar el grupo de parámetros recién creado

  3. Conjunto time_zone Ex: Asia/Calcuta y Guardar cambios

    ejemplo
  4. Modificar RDS, cambiar grupo de parámetros de DB a recién creado grupo de parámetros

  5. Guardar Y reiniciar la instancia de RDS

+0

cuando intento esto, time_zone no es una opción y no es modificable default_time_zone ... (incluso en mi grupo de parámetros de nueva creación) - en Aurora – iewebguy

+0

@iewebguy que está tratando en el grupo DB de parámetros, usted debe tratar de Cluster grupo de parámetros . –

Cuestiones relacionadas