কোনও নির্দিষ্ট স্ট্রিংয়ের জন্য কীভাবে পুরো মাইএসকিউএল ডাটাবেস অনুসন্ধান করবেন


19

কোনও নির্দিষ্ট স্ট্রিংটি অনুসন্ধান করার জন্য কি কোনও পুরো ডাটাবেস সারণী (সারি এবং কলাম) অনুসন্ধান করা সম্ভব?

আমার প্রায় 35 টি টেবিল সহ এ নামের একটি ডেটাবেস রয়েছে, আমার "হ্যালো" নামের স্ট্রিংটি অনুসন্ধান করতে হবে এবং এই স্ট্রিংটি কোন টেবিলে সংরক্ষণ করা হয়েছে তা আমি জানি না s এটা কি সম্ভব?

মাইএসকিউএল ব্যবহার করছি

আমি একটি লিনাক্স প্রশাসক এবং আমি ডেটাবেসগুলির সাথে পরিচিত নই, আপনি যদি ক্যোয়ারীটিও ব্যাখ্যা করতে পারেন তবে এটি সত্যিই সহায়ক।


1
এখানে দেখুন: stackoverflow.com/a/5350405/330315
a_horse_with_no_name

উত্তর:



7

জুলাই 2012 এ ফিরে আমি এই পোস্টটি লিখেছিলাম

একটি mysql db এর সমস্ত সারণী এবং ক্ষেত্রগুলিতে পাঠ্য সন্ধান এবং প্রতিস্থাপনের জন্য প্রশ্ন

এটা টেবিলের ব্যবহার information_schema.columns যে গৃহস্থালি, 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,''';')

শিখতে হবে: নামের মধ্যে স্থান রয়েছে এমন টেবিলগুলির জন্য নীচে প্রদর্শিত দুটি পিছনের টিকগুলি যুক্ত করুন।

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

এই সমাধানটি খুব সুন্দরভাবে কাজ করেছে! প্রাথমিক ক্যোয়ারিকে ম্যানুয়ালি একটি লাইনের দ্বারা পরিবেশের পরিবর্তনশীল লাইনে অনুলিপি করা প্রয়োজন? আমি কোয়ালিটি একটি মাইএসকিএল সেশনের অভ্যন্তরে পেস্ট করতে এবং চালাতে সক্ষম হয়েছি, তবে অবশ্যই এই ক্যোয়ারীটি কোনও ফাইলে পেস্ট করা কি সম্ভব?
জন টি

আমার উত্তর উল্লম্বভাবে স্ক্রোল করা এড়ানোর জন্য দ্বিতীয় জন দ্বিতীয়টি লাইন বাই লাইন করুন। আপনি যে কোনও উপায়ে সহজ করতে পারেন।
রোল্যান্ডোমাইএসকিউএলডিবিএ

2

এসকিউএল ক্যোয়ারীগুলি নির্মাণের প্রয়োজন নেই এমন আরেকটি পদ্ধতির অবলম্বন করে আমি সিআরজিআরইপিকে একটি ফ্রি ওপেনসোর্স কমান্ড লাইন সরঞ্জাম হিসাবে বিকাশ করেছি যা ডাটাবেসগুলিকে গ্রেপ্তার করবে (মাইএসকিউএল সহ) এবং "ফ্রেড" নামে পরিচিত "ফ্রেড" জন্য টাইপ অনুসন্ধান উভয় সমর্থন করে custome "গ্রাহক" সারণীর কলামটি আরও জটিল প্যাটার্নের সাথে মেলে যেমন সমস্ত ফ্যাশন জুড়ে সমস্ত "লেখক" কলামগুলির সাথে প্যাটার্ন মিলের জন্য "ফ্রি? ডি * .অক্ষেত্র"।


2

আপনি বন্ধ নির্মাণের দ্বারা সব টেবিল যে কোনো মান আপনি একসাথে সব খুঁজছেন মেলে থেকে সব কলাম আসতে পারেন RolandoMySQLDBA এর উত্তর এবং ব্যবহার 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

আপনি যদি ব্যাশ ব্যবহার করতে পারেন - এখানে একটি স্ক্রিপ্ট রয়েছে: এটির জন্য ডাটাবেসে পাস ডিব্রেড সহ একটি ব্যবহারকারী ডাব্রেড প্রয়োজন।

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

আপনার ডাটাবেসের নাম এবং আপনার অনুসন্ধানের পাঠ্যের জন্য root/ rootআপনার মাইএসকিএল শংসাপত্রগুলি (বা ব্যবহার ~/.my.cnf) পরিবর্তন করুন / এর জন্য প্যারামিটার প্রতিটি ক্যোয়ারিকে আলাদা লাইনে প্রদর্শন করবে। এর জন্য প্যারামিটারটি আপনার স্ট্রিংটিকে হাইলাইট করবে এবং পুরো শব্দের সাথে মিলবে।db_namefoo--skip-extended-insertmysqldump--color=autogrep-w


0

আপনার কি পিএইচপিএমআইএডমিন অ্যাক্সেস আছে? এটিতে প্রতিটি ডাটাবেসের জন্য অনুসন্ধানের বৈশিষ্ট্য রয়েছে।

বা (ডিবি নাম পরিবর্তন করুন) এর ফলাফলটিতে আপনার পছন্দসই স্ক্রিপ্টিং ব্যবহার করুন:

$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

আমি ওরাকল ডাটাবেসটির জন্য plsql এ প্রয়োগ করা আপনার প্রশ্নের জন্য একটি সাধারণ টেম্পলেট সমাধানের দিকে মনোনিবেশ করছি , আমি আশা করি যে এটি থ্রো গুগলিং হওয়ায় এটি মাইএসকিউএলে অনুকূলিতকরণ করব। আপনার কেবলমাত্র মাইএসকিএল-তে তথ্য স্কিমা অনুসন্ধান করা এবং কিছু টেবিলের নাম এবং কলামগুলি প্রতিস্থাপন করা দরকার।

স্ক্রিপ্টে: ALL_TAB_COLUMNSএকটি তথ্য স্কিমা টেবিল যা সমস্ত টেবিল কলাম 'VitcAR2', 'এনভিচারার 2', 'এনসিএইচআর', 'সিএএইচআর' রয়েছে তার সাথে ওড়াকলে স্ট্রিং কলামের প্রকারগুলি বোঝায়, আপনাকে সেগুলি মাইএসকিএল
% হ্যালো% এর সমতুল্য টাইপের নামের সাথে প্রতিস্থাপন করতে হবে have অনুসন্ধান কীওয়ার্ডটি কোনও স্ট্রিংয়ের সাথে এটি প্রতিস্থাপন করে।

ফলাফলটি কিছু বা অনেকগুলি এসকিএল স্ক্রিপ্ট হবে (আপনার টেবিলগুলির কলামের ধরণের ভিত্তিতে) এবং সেগুলি চালানো আপনার উত্তরকে উত্তর দেবে
এছাড়াও পারফরম্যান্স এবং সময় ব্যয় অন্য বিষয় হবে।
আমি আশা করি এটি কার্যকর হবে

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

কলাম_নাম: আপনি যে কলামগুলির সন্ধান করেন তার নাম টাইপ করুন।

টেবিলের নাম: আপনি যে সারণীর নাম সন্ধান করেন সেগুলি টাইপ করুন।


এটি খুব ছোট ডেটাবেজে ব্যবহারিক হতে পারে - আপনি যদি কয়েকশ টেবিল এবং কয়েক হাজার কলামে কোনও মান খুঁজে বের করার চেষ্টা করছেন তবে এটি কম less মূল প্রশ্নের "পুরো ডাটাবেস" শব্দটির ভিত্তিতে, আমি ধরে নিচ্ছি যে এটি ডিবিতে সমস্ত সারণীর সাথে কাজ করা উচিত।
আরডিফোজ

0

আপনি যদি মাইএসকিউএল ওয়ার্কবেঞ্চ ব্যবহার করছেন, ডাটাবেস স্কিমাতে ডান ক্লিক করুন এবং "সারণী ডেটা অনুসন্ধান করুন ..." নির্বাচন করুন তারপরে ফর্মটি পূরণ করুন। এটি পুরো ডাটাবেস অনুসন্ধান করবে। (বা যদি) ফলাফলগুলি উপস্থিত হয়, প্রসারণের জন্য তীরটিতে ক্লিক করুন। এটি স্কিমা, টেবিল, প্রাথমিক কী ডেটা, কলামের নাম এবং আসল ডেটা দেখায় যা আপনার অনুসন্ধানের সাথে মেলে।
টিপ: যদি কিছু না আসে তবে আপনার অনুসন্ধান আরও প্রশস্ত করার চেষ্টা করুন।
দয়া করে মনে রাখবেন এই শুধুমাত্র টেক্সট অনুসন্ধানের জন্য সত্যিই দরকারী ( char, varcharএবং text) ডেটা ধরনের।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.