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?
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?
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:
2) Sie können dann einfach Right Click
und verwenden Sie die Copy Row (tab-separated)
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:
Sie möchten Tabellensperren verursachen (achten Sie auf Ihre Client-Verbindungen)
Sie sind unsicher, was Sie tun.
Sie versuchen, Ihren DBA zu verärgern. (Sie haben vielleicht Leute an Ihrem Schreibtisch, die die Schnelligkeit .)
Prost, Jay ;-]
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
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.
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.
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.