2009-01-19 6 views
48

Estoy ejecutando mySQL en un servidor donde necesito dejar caer toneladas de bases de datos (después de algunas pruebas con el servidor). Todas las bases de datos que necesito descartar tienen el mismo prefijo "Whatever_".¿Deseas soltar las bases de datos MySQL que coinciden con algún comodín?

Después del prefijo, los nombres son aleatorios. Así que tienes tu Whatever_something, Whatever_232, Whatever_blabla, ...., Whatever_imthelast.

Voy a estar haciendo este trabajo algunas veces, así que me preguntaba ¿cuál sería la mejor manera de hacerlo?

EDIT: Puedo usar cualquier tipo de idioma o conectarme para mysql ... para que podamos hacerlo de alguna manera. En este momento, le pregunté al tipo que está generando las bases de datos para darme un .txt con cada nombre en una línea ... así que estoy codificando un php rápido que tomará un archivo y eliminará todas las bases de datos en él, más adelante intentaré % de respuesta (si funciona, toma la respuesta correcta para asegurarse de que es la manera más fácil). De todos modos me gustaría hacer esto coz de la manera más fácil no voy a ser capaz de soportar el código (otros chicos y usted sabe ...)

editar 2: El uso de una obra aún no ha comodín: # 1008 - No se puede eliminar la base de datos 'whatever_%'; la base de datos no existe

Respuesta

78

La idea básica es ejecutar "mostrar tablas" en su base de datos y utilizar los resultados para seleccionar las tablas que desee. No creo que MySQL te permita hacer nada con el conjunto de resultados de "mostrar tablas", , pero probablemente estoy equivocado.

Aquí es una solución rápida y sucia que utilizan la cáscara:

mysql -u your_user -D your_database_name -e "show tables" -s | 
    egrep "^Whatever_" | 
    xargs -I "@@" echo mysql -u your_user -D your_database_name -e "DROP TABLE @@" 

que imprimirá toda la cáscara de comandos para eliminar las tablas que comienzan con "Whatever_". Si quiere que realmente ejecute esos comandos, elimine la palabra "eco".

EDIT: ¡Olvidé explicar lo anterior! No sé cómo usted está familiarizado con secuencias de comandos shell, pero aquí va:

mysql -u your_user -D your_database_name -e "show tables" -s 

imprime una lista de todas las tablas, con el encabezado "Tables_in_your_database_name".La salida desde que se instala tubos (el símbolo | significa "hilo", como en el pasado-en) a través de la siguiente orden:

egrep "^Whatever_" 

posteriormente buscar líneas que comienzan (que^símbolos significa "seres con") las palabra "Whatever_" y solo imprime esos. Por último, la tubería esa lista de "*" Whatever_ tablas a través del comando:

xargs -I "@@" echo mysql -u your_user -D your_database_name -e "DROP TABLE @@" 

que tiene cada línea en la lista de nombres de tabla, y lo inserta en lugar del "@@" en el comando

echo mysql -u your_user -D your_database_name -e "DROP TABLE @@" 

Así que si había un montón de tablas denominadas "Whatever_1", "Whatever_2", "Whatever_3", los comandos generados serían:

echo mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_1" 
echo mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_2" 
echo mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_3" 

Cuál sería la salida el siguiente:

mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_1" 
mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_2" 
mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_3" 

Espero que haya sido suficiente detalle, y que no estoy golpeando a nadie en exceso con demasiada información. ¡Buena suerte y tenga cuidado al usar el comando "DROP TABLE"!

+0

Conmigo no da salida a las comillas ('" ') después de' -e'. Emite líneas como esta: 'mysql -u root -D joomla_test -e DROP TABLE bak_xlr1q_weblinks' usando tu script bash exacto. Estoy usando Bash 4.1.5 (1) -release. – Hubro

+0

@Codemonkey Para hacer que las comillas aparezcan, puedes escapar de ellas. Reemplaza '" DROP TABLE @@ "' con '\ "DROP TABLE @@ \" ' – scraimer

-4

Puede probar el mysql 5 general purpose routine library (descargable desde here). Utilizándolo, puede colocar varias tablas que coincidan con una expresión regular. Sugiero verificar cuidadosamente la expresión regular para evitar que se caigan las tablas que necesita.

+0

Creo que no leyó toda la pregunta. Él quiere eliminar múltiples "bases de datos", no "tablas" múltiples. – Xn0vv3r

-1

Lo sentimos, no podemos dejar caer múltiples bases de datos a la vez utilizando comandos SQL

+1

podemos eliminar varias tablas a la vez usando los comandos sql – Adnan

+0

DROP table table1, table2 ... – Adnan

-7

Utilice la instrucción

DROP {DATABASE | SCHEMA} [IF EXISTS] db_name 

como described here.

No sé si se puede usar wildcars hacer algo como

DROP DATABASE Whatever_% 

pero creo que deberías probarlo.

+0

# 1008 - No se puede eliminar la base de datos 'whatever_%'; la base de datos no existe, al parecer, solo funciona en el SELECCIONAR – DFectuoso

1

Bueno, creo que no se pueden eliminar varias bases de datos en MySql.

Pero tengo una solución muy geek. puede programar en C/C++/C#/JAVA para imprimir muchas veces "DROP DATABASE WHATEVER_<name>;" en un bloc de notas o en cualquier editor de texto. Después de eso, puede copiar pegar en el símbolo del sistema del cliente de MySql y listo. no olvide el ";" después de cada comando DROP.

Creo que esto es posible. prueba a escribir esto

25

El principio de la respuesta por scraimer es correcto, pero ya que la pregunta era por dejar caer una base de datos no es una tabla de una base de datos, el comando correcto debería ser:

mysql -u your_username -p'your password' -e 'show databases' 
| grep Whatever_* 
| xargs -I "@@" mysql -u your_username -p'your password' -e "DROP database \`@@\`" 

Para una explicación del comando , mira scraimer 's explicación.

el último bit ... \ `` @@ \ tenemos nuestro nombre de base de datos resultante citados en bacticks (`) en caso de que el nombre de nuestra base de datos tiene caracteres especiales como` -`

Saludos

+0

Para mí fue mejor utilizar la expresión Regular en la parte grep:' | grep -e ". * _ Backup" 'selecciona todas las bases de datos que terminan en" _backup " – Yeti

-1
DROP DATABASE `any-database_name`; 

Acabo de utilizar este carácter ` (retroceso) antes y después del nombre de mi base de datos.

11

Podemos hacerlo con procedimientos almacenados. Aquí hay uno a continuación:

drop procedure if exists droplike; 
delimiter // 
create procedure droplike(pattern varchar(20)) 
begin 
    set group_concat_max_len = 65535; 
    select @drop:= concat('drop table ', group_concat(table_name) , ';') from information_schema.tables where table_schema = "database_name" and table_name like pattern; 
    prepare statement from @drop; 
    execute statement; 
end // 
delimiter ; 

Reemplace database_name con el nombre de la base de datos (se requiere permiso de escritura). Para eliminar tablas con el patrón de XYZ llamada el procedimiento con la entrada como XYZ seguido de comodín se indican a continuación:

call droplike("XYZ%"); 
+0

Algunos dialectos de SQL permiten comas- listas delimitadas como esta: 'DROP TABLE" table1_bits ", " table2_links ", " table3_stuff ";' – MarkHu

0

En caso de que alguien está buscando una respuesta simple que refleja scraimer y Explorador 's pero está escrito en Java utilizando JDBC (sé que era), aquí está una rápida y sucia que consiguió el trabajo hecho por mí:

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.ArrayList; 

public class DatabaseDeleter { 
    // Pass your database wildcard as the only argument to program ("%MY_CRAZY_PATTERN%") 
    public void main(String[] args) throws SQLException, ClassNotFoundException{ 

     Class.forName("com.mysql.jdbc.Driver"); 
     Connection connection = DriverManager.getConnection("jdbc:mysql://databaseURL"); 
     PreparedStatement pst = connection.prepareStatement("show databases like ?"); 
     pst.setString(1, args[0]); 
     ResultSet rs = pst.executeQuery(); 

     ArrayList<String> databases = new ArrayList<String>(); 
     while (rs.next()) databases.add(rs.getString(1)); 

     for (String s : databases){ 
      Statement st = connection.createStatement(); 
      st.execute("drop database " + s); 
     } 
     connection.close(); 
    } 
} 

Advertencia: no superficie esto a los clientes o incluso de otros desarrolladores si no quiero tu Servidor SQL saqueado

1

¿qué tal esto (Jython)?

rs = stmt.executeQuery("SHOW DATABASES LIKE 'Whatever_%'") 
databases_for_dropping = [] 
while rs.next(): 
    databases_for_dropping.append(rs.getString(1)) 
for database_for_dropping in databases_for_dropping: 
    stmt.execute("DROP DATABASE %s" % database_for_dropping) 
Cuestiones relacionadas