जवाबों:
आप information_schema
स्कीमा में झांक सकते हैं । इसमें सभी तालिकाओं और सभी क्षेत्रों की सूची है जो एक तालिका में हैं। फिर आप इस तालिका से प्राप्त जानकारी का उपयोग करके क्वेरी चला सकते हैं।
इसमें शामिल टेबल SCHEMATA, TABLES और COLUMNS हैं। विदेशी कुंजी हैं जैसे कि आप बिलकुल बना सकते हैं कि स्कीमा में टेबल कैसे बनाए जाते हैं।
information_schema
एक डेटाबेस है, तालिका नहीं है। किस खोज पर कुछ स्पष्टीकरण information_schema
अच्छा होगा!
आप एक SQLDump
डेटाबेस (और उसके डेटा) कर सकते हैं फिर उस फ़ाइल को खोजें।
mysqldump -T
जो एक निर्दिष्ट निर्देशिका में प्रति तालिका दो फाइलें बनाता है। मैं तो grep <search> *
dir में हूँ, और जो लौटा है वह tablename.txt या .sql फ़ाइल है। Txt फ़ाइल तालिका के लिए डेटा रखती है (टैब सीमांकित, एक्सेल में खोलने के लिए csv का नाम बदलकर), और sql में तालिका परिभाषा रखती है, आपने अनुमान लगाया: एसक्यूएल। इस तरह से आप सब कुछ खोज रहे हैं और जहाँ आपका डेटा है उसे संकीर्ण करना आसान है। यह विधि हालांकि कुछ वातावरण में काम पाने के लिए काफी मुश्किल हो सकती है। स्टैक ओवरफ्लो यहां बहुत मददगार है।
यदि आपके पास phpMyAdmin स्थापित है तो इसकी 'खोज' सुविधा का उपयोग करें।
मैंने 250 टेबल / 10 जीबी डेटाबेस (एक फास्ट सर्वर पर) पर इसका उपयोग किया है और प्रतिक्रिया समय आश्चर्यजनक से कम नहीं है।
PHP फ़ंक्शन:
function searchAllDB($search){
global $mysqli;
$out = "";
$sql = "show tables";
$rs = $mysqli->query($sql);
if($rs->num_rows > 0){
while($r = $rs->fetch_array()){
$table = $r[0];
$out .= $table.";";
$sql_search = "select * from ".$table." where ";
$sql_search_fields = Array();
$sql2 = "SHOW COLUMNS FROM ".$table;
$rs2 = $mysqli->query($sql2);
if($rs2->num_rows > 0){
while($r2 = $rs2->fetch_array()){
$column = $r2[0];
$sql_search_fields[] = $column." like('%".$search."%')";
}
$rs2->close();
}
$sql_search .= implode(" OR ", $sql_search_fields);
$rs3 = $mysqli->query($sql_search);
$out .= $rs3->num_rows."\n";
if($rs3->num_rows > 0){
$rs3->close();
}
}
$rs->close();
}
return $out;
}
$mysqli
इस तरह सेट करें:$mysqli = new mysqli('localhost', 'root', 'hunter2', 'my_database');
$colum
साथ "`$colum`"
फ़ील्ड को आरक्षित शब्दों के कारण समस्या नहीं होगी
आप इस परियोजना का उपयोग कर सकते हैं: http://code.google.com/p/anywhereindb
यह सभी तालिका में सभी डेटा को खोजेगा।
यदि आप stored procedures
प्लेग की तरह से बच रहे हैं , या mysql_dump
अनुमतियों के कारण, या अन्य विभिन्न कारणों से नहीं चल पा रहे हैं।
मैं इस तरह एक तीन-चरण दृष्टिकोण का सुझाव दूंगा:
1) जहां यह क्वेरी परिणाम सेट के रूप में प्रश्नों का एक गुच्छा बनाता है।
# =================
# 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%'
;
परिणाम इस तरह दिखना चाहिए:
2) तुम तो बस Right Click
और का उपयोग कर सकते हैंCopy Row (tab-separated)
3) एक नई क्वेरी विंडो में परिणाम पेस्ट करें और अपने दिल की सामग्री पर चलाएँ।
विस्तार से: मैं सिस्टम स्कीमा को बाहर करता हूं जो आप आमतौर पर अपने कार्यक्षेत्र में नहीं देख सकते हैं जब तक कि आपके पास विकल्प की Show Metadata and Internal Schemas
जांच न हो।
ANALYZE
जरूरत पड़ने पर या OPTIMIZE
प्रदर्शन सुधारों का समर्थन करने के लिए बयान चलाने के लिए मैंने पूरे HOST या DB को एक त्वरित तरीका प्रदान करने के लिए ऐसा किया ।
मुझे यकीन है कि ऐसा करने के बारे में आपके अलग - अलग तरीके हो सकते हैं, लेकिन यहां मेरे लिए क्या काम करता है:
-- ========================================== 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';
MySQL संस्करण पर परीक्षण किया गया: 5.6.23
चेतावनी: यदि यह नहीं है तो भागो:
- आप टेबल-लॉक पैदा करने से चिंतित हैं (अपने क्लाइंट-कनेक्शन पर नज़र रखें)
आप इस बारे में अनिश्चित हैं कि आप क्या कर रहे हैं।
आप डीबीए पर गुस्सा करने की कोशिश कर रहे हैं। (आप अपने डेस्क पर लोगों के पास जल्दी के साथ आ सकते हैं ।)
चीयर्स, जय; -]
मैंने अपने खुद के mysql क्रॉलर को कुछ वर्डप्रेस कॉन्फ़िगरेशन की खोज करने के लिए भी किया था, इंटरफ़ेस और डेटाबेस दोनों में इसे खोजने में असमर्थ था, और डेटाबेस डंप बहुत भारी और अपठनीय थे। मुझे कहना होगा कि मैं अब इसके बिना नहीं कर सकता।
यह @Olivier की तरह काम करता है, लेकिन यह विदेशी डेटाबेस / टेबल नामों का प्रबंधन करता है और LIKE-joker सुरक्षित है।
<?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++;
}
}
इस स्क्रिप्ट को चलाना कुछ इस तरह से आउटपुट कर सकता है:
---------------------------------------------------
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
यह सभी कॉलम और टेबल्स को पुनः प्राप्त करने के लिए सबसे सरल क्वेरी है
SELECT * FROM information_schema.`COLUMNS` C WHERE TABLE_SCHEMA = 'YOUR_DATABASE'
सभी तालिकाओं या विशिष्ट स्ट्रिंग वाले नाम phpMyAdmin में खोज टैब के माध्यम से खोजे जा सकते हैं।
अच्छा प्रश्न है ... \ ^। ^
MySQL कार्यक्षेत्र का उपयोग करना कई सारणियों का चयन करना और DB के उन सभी तालिकाओं में पाठ की खोज को चलाना आसान है ;-)
यहाँ इसके लिए मेरा समाधान है
DROP PROCEDURE IF EXISTS findAll;
CREATE PROCEDURE `findAll`( IN `tableName` VARCHAR( 28 ) , IN `search` TEXT )
BEGIN
DECLARE finished INT DEFAULT FALSE ;
DECLARE columnName VARCHAR ( 28 ) ;
DECLARE stmtFields TEXT ;
DECLARE columnNames CURSOR FOR
SELECT DISTINCT `COLUMN_NAME` FROM `information_schema`.`COLUMNS`
WHERE `TABLE_NAME` = tableName ORDER BY `ORDINAL_POSITION` ;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = TRUE;
SET stmtFields = '' ;
OPEN columnNames ;
readColumns: LOOP
FETCH columnNames INTO columnName ;
IF finished THEN
LEAVE readColumns ;
END IF;
SET stmtFields = CONCAT(
stmtFields , IF ( LENGTH( stmtFields ) > 0 , ' OR' , '' ) ,
' `', tableName ,'`.`' , columnName , '` REGEXP "' , search , '"'
) ;
END LOOP;
SET @stmtQuery := CONCAT ( 'SELECT * FROM `' , tableName , '` WHERE ' , stmtFields ) ;
PREPARE stmt FROM @stmtQuery ;
EXECUTE stmt ;
CLOSE columnNames ;
END;
CALL findAll('tbl_test','abb')
, तो मुझे यह त्रुटि याद आती है: # 1267 - कोलाज का अवैध मिश्रण (utf8_general_ci, IMPLICIT) और (utf8_unicode_ci, IMPLICIT) ऑपरेशन के लिए = = क्या आप इसे ठीक कर सकते हैं? धन्यवाद!
मैं उपयोग कर रहा हूँ HeidiSQL लोकप्रिय MySQL सर्वर का उपयोग करके वेब डेवलपर्स के लिए डिज़ाइन किया गया एक उपयोगी और विश्वसनीय उपकरण है।
HeidiSQL में आप Shift + ctrl + f पुश कर सकते हैं और आप सभी टेबलों में सर्वर पर टेक्स्ट पा सकते हैं। यह विकल्प बहुत उपयोगी है।
आप उपयोग कर सकते हैं
SHOW TABLES;
फिर उन तालिकाओं (एक लूप में) के साथ कॉलम प्राप्त करें
SHOW COLUMNS FROM table;
और फिर उस जानकारी के साथ कई सवाल पैदा करते हैं जिन्हें आप ज़रूरत पड़ने पर यूनिअन भी कर सकते हैं।
लेकिन यह डेटाबेस पर बहुत भारी है। विशेष रूप से अगर आप LIKE सर्च कर रहे हैं।
SHOW TABLES FROM <db_name>
अधिक सटीक है
यह समाधान
a) केवल MySQL है, जिसे किसी अन्य भाषा की आवश्यकता नहीं है, और
b) प्रसंस्करण के लिए तैयार SQL परिणाम लौटाता है!
#Search multiple database tables and/or columns
#Version 0.1 - JK 2014-01
#USAGE: 1. set the search term @search, 2. set the scope by adapting the WHERE clause of the `information_schema`.`columns` query
#NOTE: This is a usage example and might be advanced by setting the scope through a variable, putting it all in a function, and so on...
#define the search term here (using rules for the LIKE command, e.g % as a wildcard)
SET @search = '%needle%';
#settings
SET SESSION group_concat_max_len := @@max_allowed_packet;
#ini variable
SET @sql = NULL;
#query for prepared statement
SELECT
GROUP_CONCAT("SELECT '",`TABLE_NAME`,"' AS `table`, '",`COLUMN_NAME`,"' AS `column`, `",`COLUMN_NAME`,"` AS `value` FROM `",TABLE_NAME,"` WHERE `",COLUMN_NAME,"` LIKE '",@search,"'" SEPARATOR "\nUNION\n") AS col
INTO @sql
FROM `information_schema`.`columns`
WHERE TABLE_NAME IN
(
SELECT TABLE_NAME FROM `information_schema`.`columns`
WHERE
TABLE_SCHEMA IN ("my_database")
&& TABLE_NAME IN ("my_table1", "my_table2") || TABLE_NAME LIKE "my_prefix_%"
);
#prepare and execute the statement
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
#1243 - Unknown prepared statement handler (stmt) given to EXECUTE
जब मैं पूरे डेटाबेस में खोज के लिए Phpmyadmin में आपकी क्वेरी चला रहा हूं, तो मुझे त्रुटि हो रही है
मैंने ओलिवियर के PHP उत्तर को थोड़ा संशोधित किया:
कुल परिणाम देखें
function searchAllDB($search){
global $mysqli;
$out = "";
$total = 0;
$sql = "SHOW TABLES";
$rs = $mysqli->query($sql);
if($rs->num_rows > 0){
while($r = $rs->fetch_array()){
$table = $r[0];
$sql_search = "select * from ".$table." where ";
$sql_search_fields = Array();
$sql2 = "SHOW COLUMNS FROM ".$table;
$rs2 = $mysqli->query($sql2);
if($rs2->num_rows > 0){
while($r2 = $rs2->fetch_array()){
$colum = $r2[0];
$sql_search_fields[] = $colum." like('%".$search."%')";
if(strpos($colum,$search))
{
echo "FIELD NAME: ".$colum."\n";
}
}
$rs2->close();
}
$sql_search .= implode(" OR ", $sql_search_fields);
$rs3 = $mysqli->query($sql_search);
if($rs3 && $rs3->num_rows > 0)
{
$out .= $table.": ".$rs3->num_rows."\n";
if($rs3->num_rows > 0){
$total += $rs3->num_rows;
$out.= print_r($rs3->fetch_all(),1);
$rs3->close();
}
}
}
$out .= "\n\nTotal results:".$total;
$rs->close();
}
return $out;
}
मैंने पिछले उत्तर पर बनाया है और इसमें कुछ अतिरिक्त पैडिंग हैं, जो आसानी से सभी आउटपुट में शामिल होने में सक्षम हैं:
SELECT
CONCAT('SELECT ''',A.TABLE_NAME, '-' ,A.COLUMN_NAME,''' FROM ', A.TABLE_SCHEMA, '.', A.TABLE_NAME,
' WHERE ', A.COLUMN_NAME, ' LIKE \'%Value%\' UNION')
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'
UNION SELECT 'SELECT '''
-- for exact match use: A.COLUMN_NAME, ' LIKE \'Value\' instead
पहले आप इसे चलाते हैं, फिर परिणाम (कोई संपादन नहीं) पेस्ट करते हैं और यह उन सभी तालिका नामों और स्तंभों को प्रदर्शित करेगा जहां मूल्य का उपयोग किया जाता है।
WHERE NOT A.TABLE_SCHEMA IN ('mysql', 'innodb', 'performance_schema', 'information_schema')
इसे बेहतर बना सकते हैं, इसे निष्पादित कर सकते हैं, इसका उपयोग कर सकते हैं, उपयोग किए गए स्कीमा की जांच कर सकते हैं, और उपयोग किए गए स्कीमा को उस स्थान पर सेट कर सकते हैं, जहां से अन्य सभी को छोड़कर।
मुझे यह काम करने के लिए मिला है। आपको बस चर बदलने की जरूरत है
$query ="SELECT `column_name` FROM `information_schema`.`columns` WHERE `table_schema`='" . $_SESSION['db'] . "' AND `table_name`='" . $table . "' ";
$stmt = $dbh->prepare($query);
$stmt->execute();
$columns = $stmt->fetchAll(PDO::FETCH_ASSOC);
$query="SELECT name FROM `" . $database . "`.`" . $table . "` WHERE ( ";
foreach ( $columns as $column ) {
$query .=" CONVERT( `" . $column['column_name'] . "` USING utf8 ) LIKE '%" . $search . "%' OR ";
}
$query = substr($query, 0, -3);
$query .= ")";
echo $query . "<br>";
$stmt=$dbh->prepare($query);
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "<pre>";
print_r ($results );
echo "</pre>";
मैंने HeidiSQL का उपयोग करके ऐसा किया है। इसे खोजना आसान नहीं है लेकिन Ctrl + Shift + F दबाकर यह "टेबल टूल्स" डायलॉग प्रदर्शित करता है। फिर जो आप खोजना चाहते हैं (एकल तालिका में पूर्ण डेटाबेस) का चयन करें और "पाठ को मान" खोजने के लिए दर्ज करें और "ढूंढें" पर क्लिक करें। मुझे यह आश्चर्यजनक रूप से तेज़ लगा (एक मिनट से भी कम समय में 870MiB db)
मैंने क्वेरीज़ को एक साथ जोड़ने के लिए यूनियन का उपयोग किया। नहीं पता कि यह सबसे कुशल तरीका है, लेकिन यह काम करता है।
SELECT * FROM table1 WHERE name LIKE '%Bob%' Union
SELCET * FROM table2 WHERE name LIKE '%Bob%';
सभी तालिकाओं, रीडोना को पढ़ने के लिए एक अच्छा पुस्तकालय है
$database = new ridona\Database('mysql:dbname=database_name;host=127.0.0.1', 'db_user','db_pass');
foreach ($database->tables()->by_entire() as $row) {
....do
}
मुझे नहीं पता कि यह केवल हाल के संस्करणों में है, लेकिन फलक Tables
में विकल्प पर राइट क्लिक Navigator
करने से एक विकल्प आता हैSearch Table Data
। यह एक खोज बॉक्स खोलता है जहाँ आप खोज स्ट्रिंग और हिट खोज में भरते हैं।
आपको उस तालिका का चयन करने की आवश्यकता है जिसे आप बाएं फलक पर खोजना चाहते हैं। लेकिन अगर आप शिफ्ट को दबाए रखते हैं और एक समय में 10 तालिकाओं की तरह चुनते हैं, तो MySql इसे संभाल सकता है और परिणाम सेकंड में वापस कर सकता है।
बेहतर विकल्पों की तलाश में किसी के लिए! :)