it-swarm.com.de

So durchsuchen Sie die gesamte MySQL-Datenbank nach einer bestimmten Zeichenfolge

ist es möglich, eine ganze Datenbanktabelle (Zeile und Spalte) zu durchsuchen, um eine bestimmte Zeichenfolge herauszufinden?.

Ich habe eine Datenbank mit dem Namen A mit ungefähr 35 Tabellen. Ich muss nach der Zeichenfolge mit dem Namen "Hallo" suchen und weiß nicht, in welcher Tabelle diese Zeichenfolge gespeichert ist. Ist das möglich?

Verwenden von MySQL

ich bin ein Linux-Administrator und ich bin nicht mit Datenbanken vertraut. Es wäre sehr hilfreich, wenn Sie die Abfrage auch erklären könnten.

21
Kevin Parker
$ mysqldump -pPASSWORD database --extended=FALSE | grep pattern | less -S

Mehr: http://winashwin.wordpress.com/2012/08/28/mysql-search/

17
Javier López

Im Juli 2012 habe ich diesen Beitrag geschrieben

Abfrage zum Suchen und Ersetzen von Text in allen Tabellen und Feldern einer MySQL-Datenbank

Es verwendet die Tabelle information_schema.columns , um jedes CHAR-, VARCHAR- und TEXT-Feld aufzunehmen und ein textuelles = auszuführen [~ # ~] ersetzen [~ # ~] .

Bitte schauen Sie sich meinen alten Link an und verwenden Sie sein Paradigma, um eine Suche durchzuführen.

Dadurch wird beispielsweise für jede Textspalte in jeder Tabelle ein separates SELECT erstellt

SELECT
    CONCAT('SELECT ',QUOTE(db),',',QUOTE(tb),',',QUOTE(col),',COUNT(1) FieldHasIt
    FROM ',db,'.',tb,' WHERE \`',col,'\`=''',SearchString,''';') SearchSQL
FROM
(
    SELECT table_schema db,table_name tb,column_name col FROM information_schema.columns
    WHERE table_schema = 'mydb' AND
    (column_type LIKE 'char(%' OR column_type LIKE 'varchar(%' OR column_type LIKE '%text')
) A,(SELECT 'Hello' SearchString) B;

Erstellen Sie damit eine Giant SQL-Textdatei. Führen Sie dann das Giant SQL-Skript aus:

SQL="SELECT CONCAT('SELECT ',QUOTE(db),',',QUOTE(tb),',',"
SQL="${SQL} QUOTE(col),',COUNT(1) FieldHasIt FROM ',db,'.',tb,'"
SQL="${SQL} WHERE \`',col,'\`=''',SearchString,''';') SearchSQL FROM"
SQL="${SQL} (SELECT table_schema db,table_name tb,column_name col FROM"
SQL="${SQL} information_schema.columns WHERE table_schema='store_qa'"
SQL="${SQL} AND (column_type LIKE 'char(%' OR column_type LIKE 'varchar(%'"
SQL="${SQL} OR column_type LIKE '%text')) A,(SELECT 'Hello' SearchString) B;"

mysql -uroot -p... -ANe"${SQL}" > MegaSearch.sql
mysql -uroot -p... -AN < MegaSearch.sql > MegaSearchResults.txt
RESULTS_FOUND=`grep -c "1$" < MegaSearchResults.txt`
echo ${RESULTS_FOUND}
if [ ${RESULTS_FOUND} -gt 0 ] ; then grep "1$" < MegaSearchResults.txt ; fi

Die Ausgabe zeigt Ihnen die Datenbank, Tabelle und Spalte an, in der die Daten angezeigt werden.

Versuche es !!!.

BEARBEITEN:

CONCAT('SELECT ',QUOTE(db),',',QUOTE(tb),',',QUOTE(col),',COUNT(1) FieldHasIt
        FROM ',db,'.',tb,' WHERE \`',col,'\`=''',SearchString,''';')

SOLLTEN: Fügen Sie die beiden unten gezeigten hinteren Häkchen für Tabellen hinzu, deren Name ein Leerzeichen enthält.

db,'.`',tb,'`',' WHERE
7
RolandoMySQLDBA

Mit einem anderen Ansatz, bei dem keine SQL-Abfragen erstellt werden müssen, habe ich CRGREP als kostenloses OpenSource-Befehlszeilentool entwickelt, das Datenbanken (einschließlich MySQL) erfasst und beide unterstützt Der einfache Typ "fred customer.name" sucht in der Spalte "name" der Tabelle "customer" nach "fred", um einen komplexeren Mustervergleich wie "fr? d * .author" für den Mustervergleich mit allen "author" -Spalten zu finden alle Tabellen.

2
Craig

Sie können alle Spalten aus allen Tabellen, die mit den gesuchten Werten übereinstimmen, auf einmal zurückgeben, indem Sie aus Antwort von RolandoMySQLDBA aufbauen und PREPARE und EXECUTE um die Abfrage auszuführen .

-- Your values
SET @table_schema = 'your_table_name';
SET @condition = "LIKE '%your string to search%'";
SET @column_types_regexp = '^((var)?char|(var)?binary|blob|text|enum|set)\\(';

-- Reset @sql_query in case it was used previously
SET @sql_query = '';

-- Build query for each table and merge with previous queries with UNION
SELECT
    -- Use `DISTINCT IF(QUERYBUILDING, NULL, NULL)`
    -- to only select a single null value
    -- instead of selecting the query over and over again as it's built
    DISTINCT IF(@sql_query := CONCAT(
        IF(LENGTH(@sql_query), CONCAT(@sql_query, " UNION "), ""),
        'SELECT ',
            QUOTE(CONCAT('`', `table_name`, '`.`', `column_name`, '`')), ' AS `column`, ',
            'COUNT(*) AS `occurrences` ',
        'FROM `', `table_schema`, '`.`', `table_name`, '` ',
        'WHERE `', `column_name`, '` ', @condition
    ), NULL, NULL) `query`
FROM (
    SELECT
        `table_schema`,
        `table_name`,
        `column_name`
    FROM `information_schema`.`columns`
    WHERE `table_schema` = @table_schema
    AND `column_type` REGEXP @column_types_regexp
) `results`;
select @sql_query;

-- Only return results with at least one occurrence
SET @sql_query = CONCAT("SELECT * FROM (", @sql_query, ") `results` WHERE `occurrences` > 0");

-- Run built query
PREPARE statement FROM @sql_query;
EXECUTE statement;
DEALLOCATE PREPARE statement;
2
0b10011

Wenn Sie eine Bash verwenden können - hier ist ein Skript: Es benötigt einen Benutzer dbread mit pass dbread für die Datenbank.

#!/bin/bash
IFS='
'
DBUSER=dbread
DBPASS=dbread
echo -n "Which database do you want to search in (press 0 to see all databases): " 
read DB
echo -n "Which string do you want to search: " 
read SEARCHSTRING
for i in `mysql $DB -u$DBUSER -p$DBPASS -e "show tables" | grep -v \`mysql $DB -u$DBUSER -p$DBPASS -e "show tables" | head -1\``
do
for k in `mysql $DB -u$DBUSER -p$DBPASS -e "desc $i" | grep -v \`mysql $DB -u$DBUSER -p$DBPASS -e "desc $i" | head -1\` | grep -v int | awk '{print $1}'`
do
if [ `mysql $DB -u$DBUSER -p$DBPASS -e "Select * from $i where $k='$SEARCHSTRING'" | wc -l` -gt 1 ]
then
echo " Your searchstring was found in table $i, column $k"
fi
done
done

Wenn jemand eine Erklärung wünscht: http://infofreund.de/?p=167

1
chris2k

Wenn Sie Linux-Administrator sind, sollten Sie mit der Befehlszeile vertraut sein, daher ist diese praktisch:

$ mysqldump -u root -proot --skip-extended-insert db_name | grep --color=auto -w foo

Ändern Sie root/root in Ihre MySQL-Anmeldeinformationen (oder verwenden Sie ~/.my.cnf), db_name zu Ihrem Datenbanknamen und foo für Ihren Suchtext. Parameter --skip-extended-insert for mysqldump zeigt jede Abfrage in separaten Zeilen an. Parameter --color=auto for grep hebt Ihre Zeichenfolge hervor und -w passt zum ganzen Wort.

1
kenorb

Wenn Sie MySQL Workbench verwenden, klicken Sie mit der rechten Maustaste auf das Datenbankschema und wählen Sie "Tabellendaten durchsuchen ...". Füllen Sie dann das Formular aus. Dadurch wird die gesamte Datenbank durchsucht. Wenn (oder wenn) die Ergebnisse angezeigt werden, klicken Sie auf den Pfeil, um ihn zu erweitern. Es werden das Schema, die Tabelle, die Primärschlüsseldaten, der Spaltenname und die tatsächlichen Daten angezeigt, die Ihrer Suche entsprechen.
Tipp: Wenn nichts angezeigt wird, erweitern Sie Ihre Suche.
Bitte beachten Sie, dass dies nur für die Suche nach Textdatentypen (char, varchar und text) wirklich nützlich ist.

0
kurdtpage

Ich konzentriere mich auf eine einfache Vorlagenlösung für Ihre Frage, die in der Datenbank plsql für Oracle implementiert ist. Ich hoffe, dass ich sie auf MySql anpassen kann, da ich einfach googeln kann. Sie müssen lediglich das Informationsschema in MySql untersuchen und einige Tabellennamen und Spalten ersetzen.

Im Skript: ALL_TAB_COLUMNS ist eine Informationsschematabelle mit allen Tabellenspalten 'VARCHAR2', 'NVARCHAR2', 'NCHAR', 'CHAR' bezieht sich auf String-Spaltentypen in Oracle. Sie müssen diese durch gleichwertige Typnamen ersetzen von MySql
% hello% ist ein Suchschlüsselwort, das durch eine beliebige Zeichenfolge ersetzt wird.

Das Ergebnis sind einige oder viele SQL-Skripte (basierend auf den Tabellenspaltentypen). Wenn Sie sie ausführen, erhalten Sie eine Antwort
Auch Leistung und Zeitverbrauch werden eine andere Sache sein.
Ich hoffe, das wird nützlich sein

SELECT 
'SELECT ' || ALL_TAB_COLUMNS.COLUMN_NAME  || ' AS RESULT_FOUND, ' 
|| '''' || ALL_TAB_COLUMNS.TABLE_NAME ||''''|| ' AS TABLE_NAME, '
|| '''' || ALL_TAB_COLUMNS.COLUMN_NAME ||''''|| ' AS COLUMN_NAME '
|| 'FROM ' || ALL_TAB_COLUMNS.OWNER ||'.'||ALL_TAB_COLUMNS.TABLE_NAME  
|| ' WHERE ' || ALL_TAB_COLUMNS.COLUMN_NAME || ' LIKE ''%hello%''' || ';'
FROM ALL_TAB_COLUMNS 
WHERE 
ALL_TAB_COLUMNS.OWNER = 'SCOTT'
AND 
ALL_TAB_COLUMNS.DATA_TYPE IN ('VARCHAR2','NVARCHAR2','NCHAR','CHAR')
0
Mohsen Heydari

Haben Sie Zugriff auf phpMyAdmin? Es hat eine Suchfunktion für jede Datenbank.

oder verwenden Sie ein Skript Ihrer Wahl für das Ergebnis von (Datenbankname ändern):

$string = 'mysqldump --compact --skip-extended-insert -u ' . $db_user . ' -p' . $db_password . ' dbname 2>&1 | grep "particular string" 2>&1';
$result = Shell_exec ( $string );
0
David

Es gibt eine schöne Bibliothek zum Lesen aller Tabellen, ridona

$database = new ridona\Database('mysql:dbname=database_name;Host=127.0.0.1', 'db_user','db_pass');

foreach ($database->tables(['table_name1','table_name2'])->by_entire() as $row) {

  do...

}
0
mirhossein

Verwenden Sie diesen Trick mit einer Codezeile

SELECT * FROM `table_name1`,`table_name2` 
WHERE '$data' IN (`column_name1`,`column_name2`,`column_name3`,`column_name4`);

spaltenname: Geben Sie alle Spaltennamen ein, in denen Sie suchen.

tabellenname: Geben Sie den gesamten Tabellennamen ein, in dem Sie suchen.

0
Sahil Jangra

Wenn Sie phpMyAdmin installiert haben, verwenden Sie die Suchfunktion.

Wählen Sie Ihre Datenbank aus. Stellen Sie sicher, dass Sie Datenbank und keine Tabelle ausgewählt haben. Andernfalls wird ein völlig anderer Suchdialog angezeigt

  1. Klicken Sie auf die Registerkarte "Suchen"
  2. Listenelement Wählen Sie den gewünschten Suchbegriff
  3. Wählen Sie die zu durchsuchenden Tabellen aus
0
Anil Gupta