किसी विशेष स्ट्रिंग के लिए पूरे MySQL डेटाबेस को कैसे खोजें


19

क्या किसी विशेष स्ट्रिंग का पता लगाने के लिए पूरे डेटाबेस तालिकाओं (पंक्ति और स्तंभ) को खोजना संभव है।

मेरे पास लगभग 35 तालिकाओं वाला A नाम का डेटाबेस है, मुझे "hello" नामक स्ट्रिंग की खोज करने की आवश्यकता है और मुझे नहीं पता कि यह स्ट्रिंग किस तालिका में सहेजी गई है। क्या यह संभव है?

MySQL का उपयोग करना

मैं एक linux admin हूँ और मैं डेटाबेस से परिचित नहीं हूँ, यह वास्तव में उपयोगी होगा यदि u क्वेरी को भी समझा सके।


जवाबों:



7

जुलाई 2012 में वापस मैंने यह पोस्ट लिखी

एक mysql db के सभी तालिकाओं और क्षेत्रों में पाठ को खोजने और बदलने की क्वेरी

यह तालिका का उपयोग करता information_schema.columns हर CHAR, VARCHAR, और पाठ क्षेत्र लेने और एक टेक्स्ट का प्रदर्शन करने के लिए REPLACE

कृपया मेरी पुरानी लिंक देखें और खोज करने के लिए इसके प्रतिमान का उपयोग करें।

एक उदाहरण के रूप में, यह प्रत्येक तालिका में प्रत्येक पाठ कॉलम के लिए एक अलग चयन बनाएगा

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;

इसके साथ एक विशालकाय एसक्यूएल पाठ फ़ाइल बनाएँ। फिर, उस विशाल एसक्यूएल स्क्रिप्ट को निष्पादित करें:

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

आउटपुट आपको डेटाबेस, टेबल और कॉलम बताता है जिसमें डेटा दिखाई देता है।

कोशिश करो !!!।

संपादित करें:

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

SHOULD: टेबल्स के लिए नीचे दिखाए गए दो बैक टिक्स जोड़ें, जिनके नाम में एक स्थान है।

db,'.`',tb,'`',' WHERE

इस समाधान बहुत अच्छी तरह से काम किया! क्या यह आवश्यक है कि प्रारंभिक क्वेरी को लाइन द्वारा वातावरण चर रेखा में मैन्युअल रूप से कॉपी करें? मैं एक mysql सत्र के अंदर क्वेरी को पेस्ट और चलाने में सक्षम था, लेकिन निश्चित रूप से उस क्वेरी को फ़ाइल में पेस्ट करना संभव है?
जॉन टी

@JohnT II मेरे उत्तर को लंबवत स्क्रॉल करने से बचने के लिए लाइन-बाय-लाइन करते हैं। आप जो भी कर सकते हैं सबसे सरल तरीका है।
रोलैंडमाइसीडीडीबीए

2

एसक्यूएल प्रश्नों के निर्माण की आवश्यकता नहीं है, एक और दृष्टिकोण लेते हुए, मैंने CRGREP को एक मुक्त ओपनसोर्स कमांड लाइन टूल के रूप में विकसित किया है जो डेटाबेस (MySQL सहित) को grep करेगा और दोनों सरल "fred customer.name" प्रकारों का समर्थन करता है "नाम में" fred "के लिए। "ग्राहक" तालिका का "कॉलम" अधिक जटिल पैटर्न से मेल खाता है, जैसे "fr? d * .author" सभी टेबल के सभी "लेखक" कॉलम के खिलाफ पैटर्न के मिलान के लिए।


2

आप उन सभी तालिकाओं से सभी कॉलम वापस कर सकते हैं जो किसी भी मूल्य से मेल खाते हैं जो आप सभी के लिए एक बार देख रहे हैं, जो कि रॉलैंडमाइसीडीडीबीए के उत्तर का उपयोग करके PREPAREऔर EXECUTEक्वेरी का उपयोग करके बना सकते हैं

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

1

यदि आप एक bash का उपयोग कर सकते हैं - यहाँ एक स्क्रिप्ट है: यह डेटाबेस पर पास dbread के साथ dbread उपयोगकर्ता की आवश्यकता है।

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

अगर किसी को स्पष्टीकरण चाहिए: http://infofreund.de/?p=1670


1

यदि आप लिनक्स व्यवस्थापक हैं, तो आपको कमांड लाइन से परिचित होना चाहिए, इसलिए यह आसान होगा:

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

अपने mysql क्रेडेंशियल को बदलें root/ root(या उपयोग करें)~/.my.cnf ), db_nameअपने डेटाबेस नाम करने के लिए और fooअपने खोज पाठ के लिए। पैरामीटर --skip-extended-insertके लिए mysqldumpअलग-अलग पंक्तियों में प्रत्येक क्वेरी को प्रदर्शित करेगा। पैरामीटर --color=autoके लिए grepअपने स्ट्रिंग को उजागर करेगा और -wपूरे शब्द से मेल खाएगी।


0

क्या आपके पास phpMyAdmin तक पहुँच है? इसमें प्रत्येक डेटाबेस के लिए एक खोज सुविधा है।

या (परिवर्तन dbname) के परिणाम पर अपनी पसंद की स्क्रिप्टिंग का उपयोग करें:

$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

में लागू आपके प्रश्न के लिए मैं एक सरल टेम्पलेट समाधान पर ध्यान केंद्रित करता हूं Oracle डेटाबेस के लिए plsql हूं, मुझे आशा है कि इसे MySql पर अनुकूलित करना, सरल फेंक Googleing है। आपको केवल MySql पर सूचना स्कीमा की जांच करने और कुछ टेबल नाम और कॉलम को बदलने की आवश्यकता है।

स्क्रिप्ट में: ALL_TAB_COLUMNSएक सूचना स्कीमा तालिका है जिसमें सभी तालिका कॉलम 'VARCHAR2', 'NVARCHAR2', 'NCHAR', 'CHAR' शामिल हैं , जो Oracle में स्ट्रिंग कॉलम प्रकारों को संदर्भित करता है, आपको उन्हें MySql
% hello% के समकक्ष प्रकार के नामों से बदलना होगा। खोज कीवर्ड इसे किसी भी स्ट्रिंग के साथ बदल देता है।

परिणाम कुछ या कई sql स्क्रिप्ट (आपके टेबल कॉलम के प्रकारों के आधार पर) होगा और उन्हें चलाने से आपका जवाब
भी मिलेगा। प्रदर्शन और समय की खपत अन्य मामले होंगे।
मुझे आशा है कि यह उपयोगी होगा

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

सभी तालिकाओं, रीडोना को पढ़ने के लिए एक अच्छा पुस्तकालय है

$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

कोड की एक लाइन के साथ इस ट्रिक का उपयोग करें

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

column_name: वह सभी कॉलम नाम लिखें जिसमें आप खोज करते हैं।

table_name: वह सभी तालिका नाम लिखें जिसमें आप खोज करते हैं।


यह बहुत छोटे डेटाबेस में व्यावहारिक हो सकता है - यदि आप सैकड़ों तालिकाओं और हजारों स्तंभों में कोई मान प्राप्त करने का प्रयास कर रहे हैं तो यह कम है। मूल प्रश्न में "पूरे डेटाबेस" शब्द के आधार पर, मैं मान रहा हूं कि यह डीबी में सभी तालिकाओं से निपटना चाहिए।
RDFozz

0

यदि आप MySQL कार्यक्षेत्र का उपयोग कर रहे हैं, तो डेटाबेस स्कीमा पर राइट क्लिक करें और "सर्च टेबल डेटा ..." चुनें और फिर फॉर्म भरें। यह पूरे डेटाबेस को खोजेगा। जब (या यदि) परिणाम सामने आते हैं, तो विस्तार करने के लिए तीर पर क्लिक करें। यह स्कीमा, तालिका, प्राथमिक कुंजी डेटा, कॉलम नाम और वास्तविक डेटा दिखाएगा जो आपकी खोज से मेल खाता है।
युक्ति: यदि कुछ नहीं आता है, तो अपनी खोज को विस्तृत करें।
कृपया ध्यान दें कि यह केवल पाठ की खोज करने के लिए वास्तव में उपयोगी है ( char, varcharऔर text) डेटा प्रकार।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.