Comment rechercher toute la base de données MySQL pour une chaîne particulière

19

est-il possible de rechercher une table de base de données entière (ligne et colonne) pour trouver une chaîne particulière.

J'ai une base de données nommée A avec environ 35 tables, je dois rechercher la chaîne nommée "bonjour" et je ne sais pas sur quelle table cette chaîne est enregistrée. Est-ce possible?

Utiliser MySQL

je suis un administrateur linux et je ne suis pas familier avec les bases de données, il serait vraiment utile que vous puissiez également expliquer la requête.

Kevin Parker
la source
1
Voir ici: stackoverflow.com/a/5350405/330315
a_horse_with_no_name

Réponses:

7

En juillet 2012, j'ai écrit ce message

Requête pour trouver et remplacer du texte dans toutes les tables et tous les champs d'une base de données mysql

Il utilise la table information_schema.columns pour récupérer tous les champs CHAR, VARCHAR et TEXT et effectuer un REMPLACEMENT textuel .

Veuillez regarder mon ancien lien et utiliser son paradigme pour faire une recherche.

Par exemple, cela créera un SELECT distinct pour chaque colonne de texte dans chaque tableau

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;

Créez un fichier texte SQL géant avec. Ensuite, exécutez ce script Giant SQL:

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

La sortie vous indique la base de données, la table et la colonne dans lesquelles les données apparaissent.

Essaie !!!.

ÉDITER:

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

DEVRAIT: ajouter les deux graduations ci-dessous pour les tableaux qui ont un espace dans le nom.

db,'.`',tb,'`',' WHERE
RolandoMySQLDBA
la source
Cette solution a très bien fonctionné! Est-il nécessaire de copier manuellement la requête initiale dans une variable d'environnement ligne par ligne? J'ai pu coller et exécuter la requête dans une session mysql, mais il est sûrement possible de coller également cette requête dans un fichier?
John T
@JohnT II fait ligne par ligne pour éviter d'avoir à faire défiler verticalement ma réponse. Vous pouvez faire la méthode la plus simple.
RolandoMySQLDBA
2

En adoptant une autre approche qui ne nécessite pas la création de requêtes SQL, j'ai développé CRGREP comme un outil de ligne de commande open source gratuit qui accueillera les bases de données (y compris MySQL) et prend en charge les recherches de type "fred customer.name" simples pour "fred" dans le "nom" "colonne de la table" client "à une correspondance de modèle plus complexe telle que" fr? d * .author "pour la correspondance de modèle avec toutes les colonnes" auteur "de toutes les tables.

Craig
la source
2

Vous pouvez renvoyer toutes les colonnes de toutes les tables qui correspondent à toutes les valeurs que vous recherchez en une seule fois en vous basant sur la réponse de RolandoMySQLDBA et en utilisant PREPAREet EXECUTEpour exécuter la requête .

-- 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;
0b10011
la source
1

Si vous pouvez utiliser un bash - voici un script: Il a besoin d'un utilisateur dbread avec pass dbread sur la base de données.

#!/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

Si quelqu'un veut une explication: http://infofreund.de/?p=1670

chris2k
la source
1

Si vous êtes administrateur Linux, vous devez être familier avec la ligne de commande, donc celle-ci serait pratique:

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

Modifiez root/ rootvos identifiants mysql (ou utilisez ~/.my.cnf), db_namevotre nom de base de données et foovotre texte de recherche. Le paramètre --skip-extended-insertpour mysqldumpaffichera chaque requête sur des lignes distinctes. Le paramètre --color=autopour grepmettra en surbrillance votre chaîne et -wcorrespondra au mot entier.

kenorb
la source
0

Avez-vous accès à phpMyAdmin? Il a une fonction de recherche pour chaque base de données.

ou utilisez le script de votre choix sur le résultat de (changer le nom de la base de données):

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

Je me concentre sur une solution de modèle simple pour votre question implémentée dans plsql pour Oracle base de données , j'espère la personnaliser sur MySql, étant un simple googleing. tout ce dont vous avez besoin est d'étudier le schéma d'informations sur MySql et de remplacer un nom de table et des colonnes.

Dans le script: ALL_TAB_COLUMNSest une table de schéma d'informations contenant toutes les colonnes de table 'VARCHAR2', 'NVARCHAR2', 'NCHAR', 'CHAR' fait référence aux types de colonnes de chaîne dans Oracle, vous devez les remplacer par des noms de type équivalents de MySql
% hello% est le mot-clé de recherche le remplacer par n'importe quelle chaîne.

Le résultat sera un ou plusieurs scripts SQL (en fonction de vos types de colonnes de tables) et leur exécution entraînera votre réponse.
Les performances et la consommation de temps seront également un autre problème.
j'espère que ce sera utile

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')
Mohsen Heydari
la source
0

Il y a une belle bibliothèque pour lire toutes les tables, 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...

}
mirhossein
la source
0

Utilisez cette astuce avec une seule ligne de code

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

nom_colonne: saisissez le nom de toutes les colonnes dans lesquelles vous effectuez une recherche.

nom_table: saisissez tous les noms de table dans lesquels vous effectuez une recherche.

Sahil Jangra
la source
Cela peut être pratique dans de très petites bases de données - c'est moins le cas si vous essayez de localiser une valeur dans des centaines de tables et des milliers de colonnes. Sur la base du libellé "base de données entière" dans la question d'origine, je suppose que cela devrait concerner toutes les tables de la base de données.
RDFozz
0

Si vous utilisez MySQL Workbench, faites un clic droit sur le schéma de la base de données et sélectionnez "Rechercher les données de la table ..." puis remplissez le formulaire. Cela recherchera la base de données entière. Lorsque (ou si) les résultats apparaissent, cliquez sur la flèche pour développer. Il affichera le schéma, la table, les données de clé primaire, le nom de la colonne et les données réelles qui correspondent à votre recherche.
Conseil: Si rien ne se produit, essayez d'élargir votre recherche.
S'il vous plaît noter que ceci est vraiment utile pour le texte de recherche ( char, varcharet text) les types de données.

kurdtpage
la source