Comparar «de un vistazo rápido» dos bases de datos

Hoy os dejo un pequeño script que me he preparado en un rato y que permite comparar dos bases de datos que pueden pertenecer a dos usuarios diferentes y estar en dos servidores diferentes.

No penséis que el script va a hacer maravillas, no va a comprobar el contenido ni va a generar un informe de la leche. Sólo revisa y compara el número de filas que hay en cada tabla. Para ello, obtiene un listado de las tablas de la primera base de datos, y para cada una de ellas el número de filas que hay. Después, para cada tabla, mira a ver si existe en la segunda base de datos y, de ser así, muestra el número de filas que hay allí. El resultado lo muestra en formato CSV que luego puede verse como hoja de cálculo.

A mí va a resultar imprescindible estos días, ya que estoy haciendo una migración de una base de datos en varias fases, y necesito ir comparando las diferentes versiones que obtengo para ver que no se me han ido perdiendo datos por el camino.

Para utilizarlo, podéis utilizar opciones cortas o largas, dependiendo de la flexibilidad que necesitéis. Por ejemplo, si ambas bases de datos están en el mismo servidor y pertenecen al mismo usuario, las opciones cortas son más que suficientes:

  • u: Usuario de la base de datos
  • p: Contraseña
  • d: Primera base de datos, la que queréis utilizar como base
  • o: Segunda base de datos, la «otra»
  • h: El servidor de bases de datos, si no se especifica es localhost
  • P: El puerto, si no se especifica es 3306
  • t: Muestra los datos de conexión que vamos a utilizar sin llegar a ejecutar la comparación. Sirve para asegurarnos de lo que vamos a comparar y evitar sorpresas.

Asumiendo que queréis guardar el resultado en un fichero CSV, los comandos podrían quedar así:

# Se asume localhost, 3306
dbcmp -u llatasa -p pass \
   -d basedatos1 -o basedatos2 > resultado.csv

# En otro servidor
dbcmp -u llatasa -p pass \
  -d basedatos1 -o basedatos2 \
  -h duranda.net -P 33106 > resultado.csv

# Opciones en distintos formatos
dbcmp -u llatasa -pppas \
  -dbasedatos1 -o basedatos2 > resultado.csv

Si las distintas bases de datos están en distintos servidores o pertenecen a diferentes usuarios, hay que utilizar opciones largas, que serían las siguientes:

  • user: Usuario de la primera base de datos
  • password: Contraseña
  • database: Primera base de datos, la que queréis utilizar como base
  • database2: Segunda base de datos, la «otra»
  • host: El primer servidor de bases de datos, si no se especifica es localhost.
  • port: El puerto, si no se especifica es el mismo que el primero
  • user2, password2, host2 y port2: estos son obvios y, si no se especifican, toman los mismos valores que sus «primos» de la primera base de datos.
  • test: Muestra los datos de conexión que vamos a utilizar sin llegar a ejecutar la comparación. Sirve para asegurarnos de lo que vamos a comparar y evitar sorpresas.

Con este listado, algunos ejemplos de comandos que ejecutaríais serían los siguientes:

# Se asume localhost
dbcmp --user=luis --pass=pwd --database=db1 \
  --user2=otro --password2=pass2 \
  --database2=otradb 

# Se asume mismo usuario, servidor2=servidor1
dbcmp --user=luis --password=pwd --database=db1 \
  --database2=otradb -host=duranda.net

# Fijando todos los parámetros
dbcmp --user=user1 --password=pass1 \
  --database=db1 --host=duranda.net \
  --port=1500 --user2=u2 \
  --password=pass2 --database2=database2 \
  --host2=google.com --port2=5000 > resultado.csv

He decidido asumir que si no indicamos el segundo servidor es porque queremos utilizar el mismo que el primero. De la misma forma, si no indicamos el primer servidor asumo que queremos utilizar localhost. Estas decisiones son discutibles, así que podéis adaptarlas a vuestras necesitades.

Pues nada más por hoy, os dejo el script por si lo queréis descargar:

Descargar dbcmp