Cách tìm kiếm toàn bộ cơ sở dữ liệu MySQL cho một chuỗi cụ thể


19

có thể tìm kiếm toàn bộ bảng cơ sở dữ liệu (hàng và cột) để tìm ra một chuỗi cụ thể.

Tôi đang có một Cơ sở dữ liệu có tên A với khoảng 35 bảng, tôi cần tìm kiếm chuỗi có tên "xin chào" và tôi không biết chuỗi này được lưu trên bảng nào. Có thể không?

Sử dụng MySQL

Tôi là một quản trị viên linux và tôi không quen thuộc với cơ sở dữ liệu, nó sẽ thực sự hữu ích nếu bạn có thể giải thích các truy vấn.


Câu trả lời:



7

Trở lại vào tháng 7 năm 2012 tôi đã viết bài đăng này

Truy vấn để tìm và thay thế văn bản trong tất cả các bảng và trường của một mys mys db

Nó sử dụng bảng information_schema.columns để chọn mọi trường CHAR, VARCHAR và TEXT và thực hiện REPLACE văn bản .

Vui lòng xem qua liên kết cũ của tôi và sử dụng mô hình của nó để thực hiện tìm kiếm.

Ví dụ, điều này sẽ tạo một CHỌN riêng cho từng cột văn bản trong mỗi bảng

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;

Tạo một tệp văn bản SQL khổng lồ với nó. Sau đó, thực thi tập lệnh SQL khổng lồ đó:

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

Đầu ra cho bạn biết Cơ sở dữ liệu, Bảng và Cột mà dữ liệu xuất hiện.

Hãy thử một lần !!!.

CHỈNH SỬA:

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

NÊN: thêm hai dấu tick phía sau hiển thị bên dưới cho các bảng có khoảng trắng trong tên.

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

Giải pháp này đã làm việc rất độc đáo! Có nhất thiết phải sao chép thủ công truy vấn ban đầu vào từng dòng biến môi trường không? Tôi đã có thể dán và chạy truy vấn bên trong phiên mysql, nhưng chắc chắn cũng có thể dán truy vấn đó vào một tệp?
John T

@JohnT II thực hiện từng dòng một để tránh phải cuộn theo chiều dọc câu trả lời của tôi. Bạn có thể làm bất cứ cách nào là đơn giản nhất.
RolandoMySQLDBA

2

Thực hiện một cách tiếp cận khác không yêu cầu xây dựng các truy vấn SQL, tôi đã phát triển CRGREP như một công cụ dòng lệnh mã nguồn mở miễn phí sẽ grep cơ sở dữ liệu (bao gồm cả MySQL) và hỗ trợ cả hai loại tìm kiếm "fred customer.name" đơn giản cho "fred" trong tên " "cột của bảng" khách hàng "thành khớp mẫu phức tạp hơn, chẳng hạn như" fr? d *. Author "để khớp mẫu với tất cả các cột" tác giả "trên tất cả các bảng.


2

Bạn có thể trả về tất cả các cột từ tất cả các bảng khớp với bất kỳ giá trị nào bạn đang tìm kiếm cùng một lúc bằng cách sử dụng câu trả lời của RolandoMyQueryDBA và sử dụng PREPAREEXECUTEđể chạy truy vấn .

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

Nếu bạn có thể sử dụng bash - đây là một tập lệnh: Nó cần một người dùng dbread với pass dbread trên cơ sở dữ liệu.

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

Nếu bất cứ ai muốn một lời giải thích: http://infofreund.de/?p=1670


1

Nếu bạn là quản trị viên Linux, bạn nên làm quen với dòng lệnh, vì vậy cách này sẽ hữu ích:

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

Thay đổi root/ rootthành thông tin đăng nhập mysql của bạn (hoặc sử dụng ~/.my.cnf), db_namethành tên cơ sở dữ liệu của bạn và foocho văn bản tìm kiếm của bạn. Tham số --skip-extended-insertcho mysqldumpsẽ hiển thị mỗi truy vấn trong các dòng riêng biệt. Tham số --color=autocho grepsẽ làm nổi bật chuỗi của bạn và -wsẽ khớp với toàn bộ từ.


0

Bạn có quyền truy cập vào phpMyAdmin không? Nó có một tính năng tìm kiếm cho mỗi cơ sở dữ liệu.

hoặc sử dụng kịch bản lựa chọn của bạn trên kết quả của (thay đổi 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

Tôi tập trung vào một giải pháp mẫu đơn giản cho câu hỏi của bạn được triển khai trong cơ sở dữ liệu Oracle , tôi hy vọng tùy chỉnh nó trên MySql, đơn giản là ném google. tất cả những gì bạn cần là điều tra lược đồ thông tin trên MySql và thay thế một số tên bảng và cột.

Trong tập lệnh: ALL_TAB_COLUMNSlà bảng lược đồ thông tin chứa Tất cả các Cột của bảng 'VARCHAR2', 'NVARCHAR2', 'NCHAR', 'CHAR' đề cập đến các loại cột chuỗi trong Oracle, bạn phải thay thế chúng bằng tên loại bằng của MySql
% hello% là từ khóa tìm kiếm thay thế nó bằng bất kỳ chuỗi.

Kết quả sẽ là một số hoặc nhiều tập lệnh sql (dựa trên các loại cột trong bảng của bạn) và chạy chúng sẽ dẫn đến câu trả lời của bạn
Ngoài ra hiệu suất và thời gian tiêu thụ sẽ là một vấn đề khác.
tôi hy vọng điều này sẽ hữu ích

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

Có một thư viện đẹp để đọc tất cả các bảng, 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...

}

0

Sử dụng thủ thuật này với một dòng mã

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

cột_name: Nhập tất cả tên cột mà bạn tìm kiếm.

tên_bảng: Nhập tất cả tên bảng mà bạn tìm kiếm.


Điều này có thể thực tế trong các cơ sở dữ liệu rất nhỏ - sẽ ít hơn nếu bạn đang cố gắng xác định giá trị trên hàng trăm bảng và hàng nghìn cột. Dựa trên từ ngữ "toàn bộ cơ sở dữ liệu" trong câu hỏi ban đầu, tôi cho rằng điều này sẽ giải quyết tất cả các bảng trong DB.
RDFozz

0

Nếu bạn đang sử dụng MySQL Workbench, nhấp chuột phải vào lược đồ cơ sở dữ liệu và chọn "Dữ liệu bảng tìm kiếm ..." sau đó điền vào biểu mẫu. Điều này sẽ tìm kiếm toàn bộ cơ sở dữ liệu. Khi (hoặc nếu) kết quả xuất hiện, nhấp vào mũi tên để mở rộng. Nó sẽ hiển thị lược đồ, bảng, dữ liệu khóa chính, tên cột và dữ liệu thực tế phù hợp với tìm kiếm của bạn.
Mẹo: Nếu không có gì xuất hiện, hãy thử mở rộng tìm kiếm của bạn.
Xin lưu ý rằng điều này chỉ thực sự hữu ích để tìm kiếm văn bản ( char, varchartext) các kiểu dữ liệu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.