Buscar en todos los campos de todas las tablas de una base de datos MySQL

Quiero buscar en todos los campos de todas las tablas de una base de datos MySQL una cadena dada, posiblemente usando syntax como:

SELECT * FROM * WHERE * LIKE '%stuff%' 

¿Es posible hacer algo como esto?

Puede echar un vistazo al esquema information_schema . Tiene una lista de todas las tablas y todos los campos que están en una tabla. A continuación, puede ejecutar consultas utilizando la información que ha obtenido de esta tabla.

Las tablas involucradas son SCHEMATA, TABLAS y COLUMNAS. Hay claves externas para que pueda crear exactamente cómo se crean las tablas en un esquema.

Podría hacer un SQLDump de la base de datos (y sus datos) luego buscar ese archivo.

Si tiene instalado phpMyAdmin, use su función ‘Buscar’.

  • Seleccione su DB
  • Asegúrese de tener un DB seleccionado (es decir, no una tabla, de lo contrario obtendrá un diálogo de búsqueda completamente diferente)
  • Haga clic en la pestaña ‘Buscar’
  • Elige el término de búsqueda que quieras
  • Elija las tablas para buscar

Lo he usado en hasta 250 bases de datos de tabla / 10GB (en un servidor rápido) y el tiempo de respuesta es asombroso.

Puede usar este proyecto: http://code.google.com/p/anywhereindb

Esto buscará todos los datos en toda la tabla.

 function searchAllDB($search){ global $mysqli; $out = ""; $sql = "show tables"; $rs = $mysqli->query($sql); if($rs->num_rows > 0){ while($r = $rs->fetch_array()){ $table = $r[0]; $out .= $table.";"; $sql_search = "select * from ".$table." where "; $sql_search_fields = Array(); $sql2 = "SHOW COLUMNS FROM ".$table; $rs2 = $mysqli->query($sql2); if($rs2->num_rows > 0){ while($r2 = $rs2->fetch_array()){ $colum = $r2[0]; $sql_search_fields[] = $colum." like('%".$search."%')"; } $rs2->close(); } $sql_search .= implode(" OR ", $sql_search_fields); $rs3 = $mysqli->query($sql_search); $out .= $rs3->num_rows."\n"; if($rs3->num_rows > 0){ $rs3->close(); } } $rs->close(); } return $out; } 

Si está evitando stored procedures como la plaga, o no puede hacer un mysql_dump debido a permisos, o si se encuentra con otras varias razones.

Sugeriría un enfoque de tres pasos como este:

1) Donde esta consulta construye un conjunto de consultas como un conjunto de resultados.

 # ================= # VAR/CHAR SEARCH # ================= # BE ADVISED USE ANY OF THESE WITH CAUTION # DON'T RUN ON YOUR PRODUCTION SERVER # ** USE AN ALTERNATE BACKUP ** SELECT CONCAT('SELECT * FROM ', A.TABLE_SCHEMA, '.', A.TABLE_NAME, ' WHERE ', A.COLUMN_NAME, ' LIKE \'%stuff%\';') FROM INFORMATION_SCHEMA.COLUMNS A WHERE A.TABLE_SCHEMA != 'mysql' AND A.TABLE_SCHEMA != 'innodb' AND A.TABLE_SCHEMA != 'performance_schema' AND A.TABLE_SCHEMA != 'information_schema' AND ( A.DATA_TYPE LIKE '%text%' OR A.DATA_TYPE LIKE '%char%' ) ; 

.

 # ================= # NUMBER SEARCH # ================= # BE ADVISED USE WITH CAUTION SELECT CONCAT('SELECT * FROM ', A.TABLE_SCHEMA, '.', A.TABLE_NAME, ' WHERE ', A.COLUMN_NAME, ' IN (\'%1234567890%\');') FROM INFORMATION_SCHEMA.COLUMNS A WHERE A.TABLE_SCHEMA != 'mysql' AND A.TABLE_SCHEMA != 'innodb' AND A.TABLE_SCHEMA != 'performance_schema' AND A.TABLE_SCHEMA != 'information_schema' AND A.DATA_TYPE IN ('bigint','int','smallint','tinyint','decimal','double') ; 

.

 # ================= # BLOB SEARCH # ================= # BE ADVISED THIS IS CAN END HORRIFICALLY IF YOU DONT KNOW WHAT YOU ARE DOING # YOU SHOULD KNOW IF YOU HAVE FULL TEXT INDEX ON OR NOT # MISUSE AND YOU COULD CRASH A LARGE SERVER SELECT CONCAT('SELECT CONVERT(',A.COLUMN_NAME, ' USING utf8) FROM ', A.TABLE_SCHEMA, '.', A.TABLE_NAME, ' WHERE CONVERT(',A.COLUMN_NAME, ' USING utf8) IN (\'%someText%\');') FROM INFORMATION_SCHEMA.COLUMNS A WHERE A.TABLE_SCHEMA != 'mysql' AND A.TABLE_SCHEMA != 'innodb' AND A.TABLE_SCHEMA != 'performance_schema' AND A.TABLE_SCHEMA != 'information_schema' AND A.DATA_TYPE LIKE '%blob%' ; 

Los resultados deberían verse así:

Copie estos resultados en otra ventana de consulta

2) Puede hacer Right Click el Copy Row (tab separated) Right Click y usar la Copy Row (tab separated)

enter image description here

3) Pegar resultados en una nueva ventana de consulta y ejecutar al contenido de su corazón.

Detalle: excluyo los esquemas del sistema que normalmente no puede ver en su banco de trabajo a menos que tenga marcada la opción Show Metadata and Internal Schemas .

Hice esto para proporcionar una manera rápida de ANALYZE todo un HOST o DB si es necesario, o para ejecutar OPTIMIZE declaraciones para apoyar mejoras de rendimiento.

Estoy seguro de que hay diferentes maneras en que puede hacer esto, pero esto es lo que funciona para mí:

 -- ========================================== DYNAMICALLY FIND TABLES AND CREATE A LIST OF QUERIES IN THE RESULTS TO ANALYZE THEM SELECT CONCAT('ANALYZE TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname'; -- ========================================== DYNAMICALLY FIND TABLES AND CREATE A LIST OF QUERIES IN THE RESULTS TO OPTIMIZE THEM SELECT CONCAT('OPTIMIZE TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname'; 

Probado en la versión de MySQL: 5.6.23

ADVERTENCIA: NO EJECUTE ESTO SI:

  1. Le preocupa causar lockings de tabla (vigile sus conexiones de cliente)
  2. No estás seguro de lo que estás haciendo.

  3. Estás tratando de enojarte DBA. (Puede tener gente en su escritorio con la rapidez ).

Saludos, Jay; -]

También hice mi propio rastreador mysql para buscar alguna configuración de wordpress, no pude encontrarla tanto en la interfaz como en la base de datos, y los volcados de bases de datos eran demasiado pesados ​​e ilegibles. Debo decir que no puedo prescindir de eso ahora.

Funciona como el de @Olivier, pero gestiona nombres exóticos de bases de datos / tablas y es LIKE-joker safe.

 setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $tables = $dbh->query("SHOW TABLES"); while (($table = $tables->fetch(PDO::FETCH_NUM)) !== false) { $fields = $dbh->prepare("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?"); $fields->execute(array ($database, $table[0])); $ors = array (); while (($field = $fields->fetch(PDO::FETCH_NUM)) !== false) { $ors[] = str_replace("`", "``", $field[0]) . " LIKE REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(:search, '\\\\', '\\\\\\\\'), '%', '\\%'), '_', '\\_'), '*', '%'), '?', '_')"; } $request = 'SELECT * FROM '; $request .= str_replace("`", "``", $table[0]); $request .= ' WHERE '; $request .= implode(' OR ', $ors); $rows = $dbh->prepare($request); $rows->execute(array ('search' => $criteria)); $count = $rows->rowCount(); if ($count == 0) { continue; } $str = "Table '{$table[0]}' contains {$count} rows matching '{$criteria}'."; echo str_repeat('-', strlen($str)), PHP_EOL; echo $str, PHP_EOL; echo str_repeat('-', strlen($str)), PHP_EOL; $counter = 1; while (($row = $rows->fetch(PDO::FETCH_ASSOC)) !== false) { $col = 0; $title = "Row #{$counter}:"; echo $title; foreach ($row as $column => $value) { echo (($col++ > 0) ? str_repeat(' ', strlen($title) + 1) : ' '), $column, ': ', trim(preg_replace('!\s+!', ' ', str_replace(array ("\r", "\t", "\n"), array ("", "", " "), $value))), PHP_EOL; } echo PHP_EOL; $counter++; } } 

Ejecutar este script podría generar algo así como:

 --------------------------------------------------- Table 'customers' contains 1 rows matching '*iemblo'. --------------------------------------------------- Row #1: email_client: my@email.com numero_client_compta: C05135 nom_client: Tiemblo adresse_facturation_1: 151, My Street adresse_facturation_2: ville_facturation: Nantes code_postal_facturation: 44300 pays_facturation: FR numero_tva_client: zone_geographique: UE prenom_client: Alain commentairs: nom_societe: email_facturation: my@email.com 

Esta es la consulta más simple para recuperar todas las columnas y tablas

 SELECT * FROM information_schema.`COLUMNS` C WHERE TABLE_SCHEMA = 'YOUR_DATABASE' 

Todas las tablas o aquellas con cadenas específicas en el nombre se pueden buscar a través de la pestaña Buscar en phpMyAdmin.

Have Nice Query … \ ^. ^ /

Al utilizar MySQL Workbench es fácil seleccionar varias tablas y ejecutar una búsqueda de texto en todas esas tablas de DB 😉

Yo uso HeidiSQL es una herramienta útil y confiable diseñada para desarrolladores web que usan el popular servidor MySQL.

En HeidiSQL puede presionar shift + ctrl + f y puede encontrar texto en el servidor en todas las tablas. Esta opción es muy útil.

Aquí está mi solución para esto

 DROP PROCEDURE IF EXISTS findAll; CREATE PROCEDURE `findAll`( IN `tableName` VARCHAR( 28 ) , IN `search` TEXT ) BEGIN DECLARE finished INT DEFAULT FALSE ; DECLARE columnName VARCHAR ( 28 ) ; DECLARE stmtFields TEXT ; DECLARE columnNames CURSOR FOR SELECT DISTINCT `COLUMN_NAME` FROM `information_schema`.`COLUMNS` WHERE `TABLE_NAME` = tableName ORDER BY `ORDINAL_POSITION` ; DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = TRUE; SET stmtFields = '' ; OPEN columnNames ; readColumns: LOOP FETCH columnNames INTO columnName ; IF finished THEN LEAVE readColumns ; END IF; SET stmtFields = CONCAT( stmtFields , IF ( LENGTH( stmtFields ) > 0 , ' OR' , '' ) , ' `', tableName ,'`.`' , columnName , '` REGEXP "' , search , '"' ) ; END LOOP; SET @stmtQuery := CONCAT ( 'SELECT * FROM `' , tableName , '` WHERE ' , stmtFields ) ; PREPARE stmt FROM @stmtQuery ; EXECUTE stmt ; CLOSE columnNames ; END; 

Podrías usar

 SHOW TABLES; 

A continuación, obtenga las columnas en esas tablas (en un bucle) con

 SHOW COLUMNS FROM table; 

y luego con esa información crea muchas consultas que también puedes UNION si lo necesitas.

Pero esto es extremadamente pesado en la base de datos. Especialmente si estás haciendo una búsqueda LIKE.

Volcar el archivo SQL fue probablemente el más rápido y rápido para mí. También descubrió otro problema de todos modos ..

Modifiqué un poco la respuesta PHP de Olivier a:

  • imprimir los resultados en los que se encontró la cadena
  • omitir tablas sin resultados
  • también muestra salida si los nombres de columna coinciden con la entrada de búsqueda
  • muestra el número total de resultados

     function searchAllDB($search){ global $mysqli; $out = ""; $total = 0; $sql = "SHOW TABLES"; $rs = $mysqli->query($sql); if($rs->num_rows > 0){ while($r = $rs->fetch_array()){ $table = $r[0]; $sql_search = "select * from ".$table." where "; $sql_search_fields = Array(); $sql2 = "SHOW COLUMNS FROM ".$table; $rs2 = $mysqli->query($sql2); if($rs2->num_rows > 0){ while($r2 = $rs2->fetch_array()){ $colum = $r2[0]; $sql_search_fields[] = $colum." like('%".$search."%')"; if(strpos($colum,$search)) { echo "FIELD NAME: ".$colum."\n"; } } $rs2->close(); } $sql_search .= implode(" OR ", $sql_search_fields); $rs3 = $mysqli->query($sql_search); if($rs3 && $rs3->num_rows > 0) { $out .= $table.": ".$rs3->num_rows."\n"; if($rs3->num_rows > 0){ $total += $rs3->num_rows; $out.= print_r($rs3->fetch_all(),1); $rs3->close(); } } } $out .= "\n\nTotal results:".$total; $rs->close(); } return $out; } 

Aunque esta pregunta es antigua, así es cómo puedes hacerlo si estás utilizando mysql workbench 6.3. (Lo más probable es que también funcione para otras versiones)

Haga clic con el botón derecho en su esquema y “Buscar datos de la tabla”, ingrese su valor y presione “Comenzar búsqueda”. Eso es.

Esta solución
a) es solo MySQL, no se necesita otro idioma, y
b) devuelve resultados de SQL, ¡listos para el procesamiento!

 #Search multiple database tables and/or columns #Version 0.1 - JK 2014-01 #USAGE: 1. set the search term @search, 2. set the scope by adapting the WHERE clause of the `information_schema`.`columns` query #NOTE: This is a usage example and might be advanced by setting the scope through a variable, putting it all in a function, and so on... #define the search term here (using rules for the LIKE command, eg % as a wildcard) SET @search = '%needle%'; #settings SET SESSION group_concat_max_len := @@max_allowed_packet; #ini variable SET @sql = NULL; #query for prepared statement SELECT GROUP_CONCAT("SELECT '",`TABLE_NAME`,"' AS `table`, '",`COLUMN_NAME`,"' AS `column`, `",`COLUMN_NAME`,"` AS `value` FROM `",TABLE_NAME,"` WHERE `",COLUMN_NAME,"` LIKE '",@search,"'" SEPARATOR "\nUNION\n") AS col INTO @sql FROM `information_schema`.`columns` WHERE TABLE_NAME IN ( SELECT TABLE_NAME FROM `information_schema`.`columns` WHERE TABLE_SCHEMA IN ("my_database") && TABLE_NAME IN ("my_table1", "my_table2") || TABLE_NAME LIKE "my_prefix_%" ); #prepare and execute the statement PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; 

Exporte toda la base de datos y busque en el archivo .sql.

Si usa phpMyAdmin siga esta respuesta , ese sitio es esta referencia .

Usé Union para encadenar consultas. No sé si es la forma más eficiente, pero funciona.

 SELECT * FROM table1 WHERE name LIKE '%Bob%' Union SELCET * FROM table2 WHERE name LIKE '%Bob%'; 

Hay una buena biblioteca para leer todas las tablas, ridona

 $database = new ridona\Database('mysql:dbname=database_name;host=127.0.0.1', 'db_user','db_pass'); foreach ($database->tables()->by_entire() as $row) { ....do } 

No sé si esto solo se encuentra en las versiones recientes, pero al hacer clic con el botón derecho en la opción Tables en el panel del Navigator abre una opción llamada Search Table Data . Esto abre un cuadro de búsqueda donde completa la cadena de búsqueda y pulsa buscar.

Debe seleccionar la tabla en la que desea buscar en el panel izquierdo. Pero si mantiene presionada la tecla shift y selecciona como 10 tablas a la vez, MySql puede manejar eso y devolver los resultados en segundos.

¡Para cualquiera que esté buscando mejores opciones! 🙂

Construí una respuesta previa y tengo esto, algo de relleno adicional para poder unir convenientemente todo el resultado:

 SELECT CONCAT('SELECT ''',A.TABLE_NAME, '-' ,A.COLUMN_NAME,''' FROM ', A.TABLE_SCHEMA, '.', A.TABLE_NAME, ' WHERE ', A.COLUMN_NAME, ' LIKE \'%Value%\' UNION') FROM INFORMATION_SCHEMA.COLUMNS A WHERE A.TABLE_SCHEMA != 'mysql' AND A.TABLE_SCHEMA != 'innodb' AND A.TABLE_SCHEMA != 'performance_schema' AND A.TABLE_SCHEMA != 'information_schema' UNION SELECT 'SELECT ''' -- for exact match use: A.COLUMN_NAME, ' LIKE \'Value\' instead 

Primero ejecute esto, luego pegue y ejecute el resultado (sin edición) y mostrará todos los nombres y columnas de la tabla donde se usa el valor.

Tengo esto para trabajar. solo necesitas cambiar las variables

 $query ="SELECT `column_name` FROM `information_schema`.`columns` WHERE `table_schema`='" . $_SESSION['db'] . "' AND `table_name`='" . $table . "' "; $stmt = $dbh->prepare($query); $stmt->execute(); $columns = $stmt->fetchAll(PDO::FETCH_ASSOC); $query="SELECT name FROM `" . $database . "`.`" . $table . "` WHERE ( "; foreach ( $columns as $column ) { $query .=" CONVERT( `" . $column['column_name'] . "` USING utf8 ) LIKE '%" . $search . "%' OR "; } $query = substr($query, 0, -3); $query .= ")"; echo $query . "
"; $stmt=$dbh->prepare($query); $stmt->execute(); $results = $stmt->fetchAll(PDO::FETCH_ASSOC); echo "
"; print_r ($results ); echo "

";