361 Stimmen

Text in Feldern in jeder Tabelle einer MySQL-Datenbank suchen

Ich möchte in allen Feldern aus allen Tabellen einer MySQL-Datenbank eine gegebene Zeichenfolge suchen, möglicherweise mit Syntax wie:

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

Ist es möglich, so etwas zu tun?

18voto

JayRizzo Punkte 2574

Wenn Sie Folgendes vermeiden wollen stored procedures wie die Pest, oder sind nicht in der Lage, eine mysql_dump aufgrund von Berechtigungen oder aus anderen Gründen.

Ich würde einen dreistufigen Ansatz wie diesen vorschlagen:

1) Bei dieser Abfrage wird eine Reihe von Abfragen als Ergebnismenge erstellt.

# =================
# 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%'
;

Die Ergebnisse sollten wie folgt aussehen:

Copy these results into another query window

2) Sie können dann einfach Right Click und verwenden Sie die Copy Row (tab-separated)

enter image description here

3) Fügen Sie die Ergebnisse in ein neues Abfragefenster ein und führen Sie sie nach Herzenslust aus.

Einzelheiten: Ich schließe Systemschemata aus, die Sie normalerweise nicht in Ihrer Workbench sehen, es sei denn, Sie haben die Option Show Metadata and Internal Schemas überprüft.

Ich habe dies getan, um eine schnelle Möglichkeit zu bieten ANALYZE einen ganzen HOST oder eine DB bei Bedarf oder zur Ausführung OPTIMIZE Aussagen zur Unterstützung von Leistungsverbesserungen.

Ich bin sicher, es gibt verschiedene Es gibt verschiedene Möglichkeiten, wie Sie das machen können, aber für mich funktioniert das folgendermaßen:

-- ========================================== 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';

Getestet mit MySQL Version: 5.6.23

WARNUNG: FÜHREN SIE DIES NICHT AUS, WENN:

  1. Sie möchten Tabellensperren verursachen (achten Sie auf Ihre Client-Verbindungen)

  2. Sie sind unsicher, was Sie tun.

  3. Sie versuchen, Ihren DBA zu verärgern. (Sie haben vielleicht Leute an Ihrem Schreibtisch, die die Schnelligkeit .)

Prost, Jay ;-]

10voto

Fred Christophe Punkte 171

Mit MySQL Workbench ist es einfach, mehrere Tabellen auszuwählen und eine Suche nach Text in allen Tabellen der DB durchzuführen ;-)

9voto

Alain Tiemblo Punkte 34390

Ich habe auch meinen eigenen Mysql-Crawler eingesetzt, um einige Wordpress-Konfigurationen zu suchen, konnte sie aber weder in der Schnittstelle noch in der Datenbank finden, und die Datenbank-Dumps waren zu schwer und unlesbar. Ich muss sagen, dass ich jetzt nicht mehr ohne sie auskommen kann.

Es funktioniert wie das von @Olivier, verwaltet aber exotische Datenbank-/Tabellennamen und ist LIKE-Joker-sicher.

<?php

$database = 'database';
$criteria = '*iemblo'; // you can use * and ? as jokers

$dbh = new PDO("mysql:host=127.0.0.1;dbname={$database};charset=utf8", 'root', '');
$dbh->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++;
    }
}

Die Ausführung dieses Skripts könnte etwas wie folgt ausgeben:

---------------------------------------------------
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
        commentaires: 
        nom_societe: 
        email_facturation: my@email.com

7voto

Lev K. Punkte 308

HeidiSQL ist ein nützliches und zuverlässiges Werkzeug für Webentwickler, die den beliebten MySQL-Server verwenden.

In HeidiSQL kann man mit der Tastenkombination Shift + Strg + F den Text auf dem Server in allen Tabellen finden. Diese Option ist sehr nützlich.

7voto

live-love Punkte 40586

MySQL-Workbench

Hier sind einige Anweisungen.

Laden Sie MSQL Workbench herunter und installieren Sie es.

https://www.mysql.com/products/workbench/

Bei der Installation kann es erforderlich sein, dass Sie Visual Studio C++ Redistributable installieren müssen. Sie können es hier erhalten:

https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads

x64: vc_redist.x64.exe (für 64-Bit-Windows)

Wenn Sie MySQL Workbench öffnen, müssen Sie Ihren Hostnamen, Ihren Benutzer und Ihr Passwort eingeben.

Es gibt eine Registerkarte Schemas in der seitlichen Menüleiste. Klicken Sie auf die Registerkarte Schemas und doppelklicken Sie dann auf eine Datenbank, um die Datenbank auszuwählen, die Sie durchsuchen möchten.

Gehen Sie dann zum Menü Datenbank - Daten suchen, geben Sie den gesuchten Text ein und klicken Sie auf Suche starten.

enter image description here

HeidiSql

HeidiSql herunterladen und installieren https://www.heidisql.com/download.php

Geben Sie Ihren Hostnamen, Ihren Benutzer und Ihr Passwort ein.

Drücken Sie Strg+Umschalt+F, um Text zu suchen.

enter image description here

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X