2011-03-28 5 views

Respuesta

8

Linux:

#!/bin/bash 

DB_STARTS_WITH="cms" 
MUSER="root" 
MPWD="yourpass" 
MYSQL="mysql" 

DBS="$($MYSQL -u$MUSER -p$MPWD -Bse 'show databases')" 
for db in $DBS; do 

if [[ "$db" =~ "^${DB_STARTS_WITH}" ]]; then 
    echo "Deleting $db" 
    $MYSQL -u$MUSER -p$MPWD -Bse "drop database $db" 
fi 

done 

Por supuesto, usar la parte drop a su propio riesgo;)

+0

Funcionó para mí, pero necesitaba 'soltar base de datos $ db' ya que' drop $ db' provocó un error de sintaxis –

+1

Esto simplemente falla silenciosamente para mí. – paulwithap

+2

La expresión regular no funciona – HorusKol

10

me gustaría utilizar algo como:

echo "SHOW DATABASES LIKE 'cms_%'" \ 
    | mysql \ 
    | tail -n +2 \ 
    | xargs -n1 mysqladmin -f drop 

Si usted no tiene su nombre de usuario y contraseña predeterminados configurados dentro de ~/my.cnf, es posible que deba proporcionar el nombre de usuario y la contraseña a través del -u y -p cambia a los comandos mysql/mysqladmin arriba.

(Editar - añadió -n arg a la cola.)

+0

Deje de usar la cola o la cabeza para omitir el encabezado, use mysql -N en su lugar :-) – Igor

16

tuve que mejorar neurinos guión porque de caracteres especiales en la contraseña, la falta de 'drop database ...' y la comparación que no trabaja para la expresión DB_STARTS_WITH. La siguiente secuencia de comandos que funcionaba en Ubuntu Server:

#!/bin/bash 

DB_STARTS_WITH="grp" 
MUSER="root" 
MPWD="YOUR_PASSWORD" 
MYSQL="mysql" 

DBS="$($MYSQL -u $MUSER -p"$MPWD" -Bse 'show databases')" 
for db in $DBS; do 

if [[ "$db" == $DB_STARTS_WITH* ]]; then 
    echo "Deleting $db" 
    $MYSQL -u $MUSER -p"$MPWD" -Bse "drop database $db" 
fi 

done 
+0

¿Qué error recibió? – bsmoo

+0

Lo siento, hace mucho tiempo y ya no sé ... ¿por qué? – swarley

+0

¿Alguna sugerencia para los nombres db con guiones en ellos? Obtengo errores de sintaxis con y sin retrocesos. – paulwithap

42

Aquí hay una solución pura mySQL en dos consultas:

SELECT CONCAT('DROP DATABASE `', SCHEMA_NAME, '`;') 
FROM `information_schema`.`SCHEMATA` 
WHERE SCHEMA_NAME LIKE 'cms_%'; 

luego copiar y pegar el conjunto de registros resultante y ejecutar

manera
+1

Rápido y fácil-- y todo hecho bien dentro de la línea de comandos de MySQL. Funcionó a la perfección! –

+1

Una respuesta mucho mejor que la aceptada. – SergeyA

+5

Puede usar el indicador '-s' (' --silent') para 'mysql' para eliminar la cuadrícula alrededor del resultado, facilitando la copia y el pegado. –

0

Una Linux:

for db_name in $(mysql -u USER -pPASS -e "show databases like 'cms_%'" -ss) 
do 
    mysql -u USER -pPASS -e "drop database ${db_name}"; 
done 
1

Si desea permanecer completamente dentro de MySQL/MariaDB (es decir, sin utilizar bash scr ipts y demás) puede hacer lo siguiente:

DELIMITER // 
CREATE PROCEDURE clean() 
BEGIN 
    SET @query := (SELECT CONCAT('DROP DATABASE ', SCHEMA_NAME, ';') FROM `information_schema`.`SCHEMATA` WHERE SCHEMA_NAME LIKE 'dbtVDB%' LIMIT 1); 
    WHILE @query != '' DO 
     PREPARE stmt FROM @query; 
     EXECUTE stmt; 
     DEALLOCATE PREPARE stmt; 
     SET @query := (SELECT CONCAT('DROP DATABASE ', SCHEMA_NAME, ';') FROM `information_schema`.`SCHEMATA` WHERE SCHEMA_NAME LIKE 'cms%' LIMIT 1); 
    END WHILE; 
    DELETE FROM mysql.db WHERE mysql.db.Db LIKE 'cms%'; 
END; 
// 
DELIMITER ; 
CALL clean(); 
DROP PROCEDURE clean; 
+0

ELIMINAR DE mysql.db WHERE mysql.db.Db LIKE 'cms%'; no está relacionado – Igor

0

Me gustó la respuesta que sugiere un bucle "for" del shell. En mi caso, tenía nombres de subdirectorios que coincidían con los nombres de mi base de datos, así que creé arreglos y los usé en el comando.

(Pude haber hecho esto usando el directorio de datos mysql, aunque no había tenido la configuración que tenía. En mi máquina virtual bitnami esto es /opt/bitnami/mysql/data.)

  1. matriz creada a partir subconjunto de archivos: tbtdirs = (OTC * 2015 *)

  2. probó un comando potencialmente espeluznante primera w/"eco": para d en $ {tbtdirs [@]}; do echo mysql -pPASS -e "drop database $ d"; hecho

  3. cayó todas las bases de datos en la matriz: para d en $ {tbtdirs [@]}; do mysql -pPASS -e "drop database $ d"; hecho

¡Trabajó como un encanto! También modificó el ciclo para eliminar subdirectorios.Utilicé la línea de comandos de Linux durante bastante tiempo antes de aprender qué tan útiles podrían ser los comandos bash.

Cuestiones relacionadas