2010-04-06 17 views
8

¿Es posible registrar sentencias CREATE/ALTER emitidas en un servidor MySQL a través de phpMyAdmin? Escuché que podría hacerse con un disparador, pero parece que no puedo encontrar el código adecuado en ninguna parte. Me gustaría registrar estas declaraciones en una tabla, preferiblemente con la marca de tiempo de cuándo se emitieron. ¿Alguien puede proporcionarme un disparador de muestra que me permita lograr esto?MySQL 5.1/phpMyAdmin - registrando sentencias CREATE/ALTER

Me gustaría registrar estas declaraciones para que pueda sincronizar fácilmente los cambios con otro servidor MySQL.

+1

¿Está intentando sincronizar todos los cambios? La replicación puede ser la respuesta? –

+0

No. Las bases de datos contienen datos diferentes, solo quiero mantener las estructuras de las tablas sincronizadas. – pako

+0

¿Puede confirmar que está interesado en registrar * solo * consultas de phpMyAdmin? Si es así (y podría ser el camino a seguir porque de esa manera puede evitar registrar consultas normales), eche un vistazo a la respuesta de Jarod y la mía. – Unreason

Respuesta

4

Hay un patch para phpMyAdmin que proporciona un registro configurable con solo algunas modificaciones de código simples.

Hicimos esto en mi trabajo y luego lo modifiqué aún más para iniciar sesión en carpetas por día, registrar direcciones IP y un par de otras cosas y funciona muy bien.

Gracias @Unreason por el enlace, no recuerdo dónde lo encontré.

+4

¿Fue http://sourceforge.net/tracker/index.php?func=detail&aid=1252596&group_id=23067&atid=377410? – Unreason

+0

@Unreason - Sí, ese fue el indicado. –

+0

El código parece un poco complicado, pero voy a echarle un vistazo. – pako

1

La respuesta a su pregunta caerán en una de las enumeradas en MySQL Server logs

Si lo que desea es obtener las declaraciones CREAR/alterar, me gustaría ir con the general query log. Pero tendrá que analizar el archivo manualmente. Tenga en cuenta los problemas de seguridad que plantea este enfoque.

En su escenario, la replicación parece ser una exageración.

Los disparadores no son una opción válida ya que solo son compatibles con los niveles SELECCIONAR, ACTUALIZAR e INSERTAR y no ALTERAR/CREAR.

Edición 1:

El registro de consultas sería la mejor opción, pero como usted ha mencionado en servidores ocupados los registros causaría una penalización considerable eficiencia. La única alternativa adicional que conozco es MySQL Proxy.

+1

El servidor SQL está bastante ocupado (más de 70 consultas por segundo), por lo que no quiero registrar todas las consultas. Y no parece que sea posible filtrar qué consultas deberían guardarse en el registro general de consultas. – pako

+0

Puede hacer que el archivo de registro sea una fifo que otro daemon escucha y filtra las entradas de registro a medida que ingresan. Esto reduciría la penalización ya que no tendría el costo de escribir todo en el disco. –

0

Creo que su mejor opción sería observar el uso de procedimientos almacenados y funciones aquí para realizar cambios en su base de datos. De esta forma, podría ver manualmente los datos de registro.

+1

Uso phpMyAdmin para cambiar la estructura de la base de datos y llama directamente a las instrucciones ALTER/CREATE. – pako

2

Aquí hay una secuencia de comandos que haría lo que desee para mysql-proxy (consulte el enlace en los documentos oficiales sobre cómo instalar el proxy).

Para registrar el hecho consultas que puede utilizar algo tan simple como

function string.starts(String,Start) 
    return string.sub(String,1,string.len(Start))==Start 
end 

function read_query(packet) 
    if string.byte(packet) == proxy.COM_QUERY then 
     local query = string.lower(string.sub(packet, 2)) 
     if string.starts(query, "alter") or string.starts(query, "create") then 
      -- give your logfile a name, absolute path worked for me 
      local log_file = '/var/log/mysql-proxy-ddl.log' 
      local fh = io.open(log_file, "a+") 
      fh:write(string.format("%s %6d -- %s \n", 
       os.date('%Y-%m-%d %H:%M:%S'), 
       proxy.connection.server["thread_id"], 
       query)) 
      fh:flush() 
     end 
    end 
end 

El guión fue adoptado de here, la búsqueda para 'registro simple'.

Esto no se preocupa por los resultados, incluso si la consulta devolviera un error, sería registrada (hay un ejemplo de 'registro más personalizado', que es un mejor candidato para el registro de producción).

Además, puede tomar otro enfoque si es aplicable para usted: defina diferentes usuarios en su base de datos y otorgue derechos DDL solo a un determinado usuario; luego, puede registrar todo para ese usuario y no tiene que preocuparse acerca de los detalles (por ejemplo - de proxy reconoce la siguiente server commands, de los cuales se inspecciona única consulta)

Instalación del proxy es sencillo, cuando lo prueba se puede ejecutar con

mysql-proxy --proxy-lua-script=/path/to/script.lua 

se ejecuta en puerto 4040 por defecto, así que pruébelo con

mysql -u user -p -h 127.0.0.1 -P 4040 

(asegúrese de no omitir el proxy; por ejemplo, en mi distro mysql -u user -p -h localhost -P 4040 ignoré por completo el puerto y conecté el conector, lo que me dejó perplejo durante unos minutos)