Yanıtlar:
Şemaya göz atabilirsiniz information_schema
. Tüm tabloların ve tablodaki tüm alanların bir listesine sahiptir. Daha sonra bu tablodan aldığınız bilgileri kullanarak sorgu çalıştırabilirsiniz.
İlgili tablolar SCHEMATA, TABLOLAR ve COLUMNS'dir. Tabloların bir şemada nasıl oluşturulduğunu tam olarak oluşturabileceğiniz yabancı anahtarlar vardır.
information_schema
bir veritabanı değil, bir veritabanıdır. Hangi tabloyu arayacağınıza dair bazı açıklamalar information_schema
iyi olur!
Bir SQLDump
veritabanını (ve verilerini) yapabilir ve o dosyada arama yapabilirsiniz.
mysqldump -T
Belirli bir dizinde tablo başına iki dosya oluşturur gibi . Sonra grep <search> *
dir ve ben döndürülen tablename.txt veya .sql dosyası. Txt dosyası, tablo için verileri tutar (sekmeyle ayrılmış, Excel'de açmak için csv olarak yeniden adlandır) ve sql, tablo tanımını tutar, tahmin ettiniz: SQL. Bu şekilde her şeyi ararsınız ve verilerinizin nerede olduğunu daraltmak kolaydır. Yine de bu yöntemin belirli ortamlarda çalışması oldukça zor olabilir. Yığın Taşması burada çok yardımcı olur.
Eğer phpMyAdmin kurulu ise 'Ara' özelliğini kullanın.
Ben 250 tablo / 10GB veritabanlarında (hızlı bir sunucuda) kullandım ve tepki süresi şaşırtıcı kısa bir şey değil.
PHP işlevi:
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
gibi ayarla :$mysqli = new mysqli('localhost', 'root', 'hunter2', 'my_database');
$colum
ile "`$colum`"
böylece ayrılmış kelimelerdir alanlar olmaz sorunlara neden
Bu projeyi kullanabilirsiniz: http://code.google.com/p/anywhereindb
Bu, tüm tablodaki tüm verileri arayacaktır.
stored procedures
Veba gibi bir şeyden kaçınıyorsanız veya mysql_dump
izinlerden dolayı bir şey yapamıyorsanız veya başka çeşitli nedenlerle karşılaşamıyorsanız.
Bunun gibi üç adımlı bir yaklaşım öneririm:
1) Bu sorgunun, sonuç kümesi olarak bir grup sorgu oluşturduğu yer.
# =================
# 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%'
;
Sonuçlar şöyle görünmelidir:
2) Sonra sadece Right Click
ve kullanabilirsinizCopy Row (tab-separated)
3) Sonuçları yeni bir sorgu penceresine yapıştırın ve kalbinizin içeriğine çalıştırın.
Detay: Seçeneği Show Metadata and Internal Schemas
işaretlemediğiniz sürece genellikle çalışma tezgahınızda göremeyeceğiniz sistem şemalarını hariç tutarım .
ANALYZE
Gerektiğinde veya çalıştırmak için tüm HOST veya DB hızlı bir yol sağlamak için yaptımOPTIMIZE
performans geliştirmelerini desteklemek deyimleri .
Eminim bunu yapmak için farklı yollar vardır ama benim için işe yarayan:
-- ========================================== 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 Sürümünde Test Edildi: 5.6.23
UYARI: EĞER BU DURUMDA ÇALIŞTIRMAYIN:
- Tablo kilitlerine neden olmaktan endişe duyuyorsunuz (istemci bağlantılarınıza dikkat edin)
Ne yaptığınızdan emin değilsiniz.
DBA'yı kızdırmaya çalışıyorsun. ( hızlıca masanızda insanlar olabilir .)
Şerefe Jay; -]
Ayrıca bazı wordpress yapılandırmasını aramak için kendi mysql paletli yaptım, hem arayüzde hem de veritabanında bulamadı ve veritabanı dökümleri çok ağır ve okunaksızdı. Şimdi onsuz yapamayacağımı söylemeliyim.
@Olivier'deki gibi çalışır, ancak egzotik veritabanı / tablo adlarını yönetir ve LIKE-joker güvenlidir.
<?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++;
}
}
Bu komut dosyasını çalıştırmak şöyle bir çıktı verebilir:
---------------------------------------------------
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
Bu, tüm Sütunları ve Tabloları yeniden elde etmek için en basit sorgu
SELECT * FROM information_schema.`COLUMNS` C WHERE TABLE_SCHEMA = 'YOUR_DATABASE'
Tüm tablolar veya adında belirli bir dize olan tablolar phpMyAdmin'deki Arama sekmesi aracılığıyla aranabilir.
Güzel Sorunuz Var ... \ ^. ^ /
MySQL Workbench kullanarak birkaç tablo seçmek ve DB ;-) 'nin tüm bu tablolarında metin araması yapmak kolaydır
Bu soru eski olmasına rağmen, mysql çalışma tezgahı 6.3 kullanıyorsanız bunu nasıl yapabileceğiniz aşağıda açıklanmıştır. (Büyük olasılıkla diğer sürümler için de çalışır)
Şemanızı sağ tıklayın ve "Tablo verilerini arayın", değerinizi girin ve "Aramayı Başlat" düğmesine basın. Bu kadar.
İşte bunun için benim çözümüm
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')
, bu hatayı kaçırdım: # 1267 - İşlemler için geçersiz harmanlama karışımı (utf8_general_ci, IMPLICIT) ve (utf8_unicode_ci, IMPLICIT) '=' Düzeltebilir misiniz? Teşekkürler!
HeidiSQL kullanıyorum, popüler MySQL sunucusunu kullanan web geliştiricileri için tasarlanmış kullanışlı ve güvenilir bir araçtır.
HeidiSQL'de shift + ctrl + f tuşlarına basabilir ve sunucudaki metni tüm tablolarda bulabilirsiniz. Bu seçenek çok kullanışlı.
Kullanabilirsin
SHOW TABLES;
Ardından, bu tablolardaki sütunları (döngü halinde)
SHOW COLUMNS FROM table;
ve daha sonra bu bilgilerle İhtiyacınız olursa UNION yapabileceğiniz birçok sorgu oluşturun.
Ama bu veritabanında son derece ağır. Özellikle GİBİ arama yapıyorsanız.
SHOW TABLES FROM <db_name>
daha kesin
Bu çözüm
a) yalnızca MySQL'dir, başka bir dile gerek yoktur ve
b) işleme alınmaya hazır SQL sonuçlarını döndürür!
#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
Tüm veritabanında arama için Phpmyadmin sorgunuzu çalıştırdığınızda hata alıyorum
Olivier PHP cevabını biraz değiştirdim:
toplam sonuç sayısını göster
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;
}
Önceki bir cevaba dayanarak bunu yaptım, sadece tüm çıktılara rahatça katılabilmek için bazı ekstra dolgu var:
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
Önce bunu çalıştırın, sonra yapıştırın ve sonucu çalıştırın (düzenleme yok) ve değerin kullanıldığı tüm tablo adlarını ve sütunlarını görüntüler.
WHERE NOT A.TABLE_SCHEMA IN ('mysql', 'innodb', 'performance_schema', 'information_schema')
daha da iyisi yapabilir, yürütebilir, kullanılan şemaları kontrol edebilir ve kullanılan şemayı bunun yerine diğerlerini hariç tutabilirsiniz.
Bunu işe aldım. sadece değişkenleri değiştirmeniz gerekir
$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>";
Ben HeidiSQL kullanarak yaptım. Bulmak kolay değil ama Ctrl + Shift + F tuşlarına basarak "tablo araçları" iletişim kutusunu görüntüler. Daha sonra ne aramak istediğinizi seçin (Tek tablodan tam veritabanı) ve "Bulmak için metin" değerini girin ve "Bul" u tıklayın. Şaşırtıcı derecede hızlı buldum (bir dakikadan daha kısa sürede 870MiB db)
Sendikaları sorguları birleştirmek için kullandım. En etkili yol olup olmadığını bilmiyorum, ama işe yarıyor.
SELECT * FROM table1 WHERE name LIKE '%Bob%' Union
SELCET * FROM table2 WHERE name LIKE '%Bob%';
Tüm tabloları okumak için güzel bir kütüphane var, ridona
$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
}
Bunun sadece son sürümlerde olup olmadığını bilmiyorum, ancak bölmedeki Tables
seçeneğe sağ tıklandığında Navigator
adlandırılan bir seçenek açılır Search Table Data
. Bu, arama dizesini doldurup aramaya bastığınız bir arama kutusu açar.
Sol bölmede aramak istediğiniz tabloyu seçmeniz gerekir. Ancak shift tuşunu basılı tutarsanız ve aynı anda 10 tablo seçerseniz, MySql bunu halledebilir ve saniyeler içinde sonuç döndürebilir.
Daha iyi seçenekler arayan herkes için! :)