Saltar a contenido

Snippets — Base de datos

MySQL

Backup rápido

mysqldump -h <host> -u root -p nombre_db > backup_$(date +%Y%m%d_%H%M%S).sql

Restaurar un backup

mysql -h <host> -u root -p nombre_db < backup.sql

Matar queries lentas que están colgadas

-- Ver qué está corriendo
SHOW PROCESSLIST;

-- Matar un proceso por ID
KILL QUERY 12345;

Exportar solo la estructura (sin datos)

mysqldump -h <host> -u root -p --no-data nombre_db > estructura.sql

Docker + MySQL

Entrar a MySQL dentro de un contenedor

docker exec -it nombre_contenedor mysql -u root -p

Hacer backup desde afuera del contenedor

docker exec nombre_contenedor mysqldump -u root -pPASSWORD nombre_db > backup.sql

Restaurar dentro del contenedor

cat backup.sql | docker exec -i nombre_contenedor mysql -u root -pPASSWORD nombre_db

Cambiar el group_concat_max_len para evitar truncamientos

SET GLOBAL group_concat_max_len = 1000000;

Porque

Esto es necesario porque el valor por defecto de group_concat_max_len es bastante bajo (1024 bytes) y si una consulta devuelve un resultado que supera ese límite, se trunca y no se obtiene toda la información. Cambiarlo a un valor alto asegura que no haya truncamientos en los resultados de consultas que usan GROUP_CONCAT.

Cambiar el group_concat_max_len para evitar truncamientos en DO

import axios from "axios";

const doTocken = '....';

const idDb = '....';

const url = 'https://api.digitalocean.com';

const instance = axios.create({
  baseURL: url,
  headers: {
    Authorization: `Bearer ${doTocken}`
  }
})

const getConfig = async () => {
  const { data } = await instance.get(`/v2/databases/${idDb}/config`);
  console.log(data);
}

getConfig();

const changedConfig = async () => {
  const { data } = await instance.patch(`/v2/databases/${idDb}/config`, {
    config: {group_concat_max_len: 1000000000,
    default_time_zone: "America/Argentina/Buenos_Aires"
    }
  });
  console.log(data);
}

changedConfig();

Tienes que poner el token de DO y el id de la base de datos que querés modificar. Esto va a cambiar el group_concat_max_len a un valor muy alto para evitar truncamientos en los resultados de consultas que usan GROUP_CONCAT. También aprovecho para cambiar la zona horaria por si las fechas que se guardan en la base de datos no están en UTC.

Porque

DO no deja cambiar esto desde su panel solamente api


Pasar .dbt a MySQL

Los archivos .dbt son bases de datos tipo SQLite. Para pasarlos a MySQL, se puede usar la herramienta dbf2mysql:

#!/bin/bash

DB_HOST="192.168.0.202"
DB_USER="root"
DB_PASS="genus2041"
DB_NAME="test"
DBF_DIR="/home/pablo/Descargas/datos_fiol/DATA"

for dbf_file in "$DBF_DIR"/*.dbf; do
    # Obtener el nombre del archivo sin la extensión
    table_name=$(basename "$dbf_file" .dbf)

    # Importar el archivo DBF a MySQL con el nombre de la tabla correspondiente
    dbf2mysql -h "$DB_HOST" -U "$DB_USER" -P "$DB_PASS" -d "$DB_NAME" -c -t "$table_name" "$dbf_file"

    echo "Importado $dbf_file como $table_name"
done

Se tiene que cambiar las variables de conexión y la ruta a los archivos .dbf antes de correr el script. Esto va a importar cada archivo .dbf como una tabla con el mismo nombre en la base de datos MySQL.