특정 문자열에 대한 전체 MySQL 데이터베이스를 검색하는 방법


19

특정 문자열을 찾기 위해 전체 데이터베이스 테이블 (행 및 열)을 검색 할 수 있습니까?

약 35 개의 테이블이있는 A라는 데이터베이스가 있는데 "hello"라는 문자열을 검색해야 하며이 문자열이 저장된 테이블을 알 수 없습니다. 가능한가요?

MySQL 사용

나는 리눅스 관리자이고 데이터베이스에 익숙하지 않다. u도 쿼리를 설명 할 수 있다면 정말 도움이 될 것이다.


답변:



7

2012 년 7 월에이 글을 썼습니다

mysql db의 모든 테이블과 필드에서 텍스트를 찾아서 바꾸는 쿼리

information_schema.columns 테이블을 사용하여 모든 CHAR, VARCHAR 및 TEXT 필드를 선택하고 텍스트 REPLACE를 수행합니다 .

내 이전 링크를 살펴보고 패러다임을 사용하여 검색하십시오.

예를 들어 모든 테이블의 각 텍스트 열에 대해 별도의 SELECT를 만듭니다.

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;

이를 사용하여 Giant SQL 텍스트 파일을 작성하십시오. 그런 다음 Giant SQL 스크립트를 실행하십시오.

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 세션 내에서 쿼리를 붙여 넣을 수 있었지만 해당 쿼리를 파일에 붙여 넣을 수도 있습니까?
John T

@ JohnT II는 대답을 세로로 스크롤하지 않아도되도록 한 줄씩 수행합니다. 가장 간단한 방법으로 할 수 있습니다.
RolandoMySQLDBA

2

SQL 쿼리를 작성하지 않아도되는 다른 접근 방식을 사용 하여 CRGREP 를 무료 오픈 소스 명령 행 도구로 개발 했습니다 (MySQL 포함). "고객"테이블의 "열을"fr? d * .author "와 같이보다 복잡한 패턴 일치로 변환하여 모든 테이블의 모든"작성자 "열과 패턴을 일치시킵니다.


2

당신의 오프 구축하여 한 번에 모든 찾고있는 모든 값과 일치하는 모든 테이블의 모든 열을 반환 할 수 있습니다 RolandoMySQLDBA의 대답 과 사용 PREPAREEXECUTE쿼리를 실행합니다 .

-- 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를 사용할 수 있다면-여기 스크립트가 있습니다 : 데이터베이스에 pass 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

Linux 관리자 인 경우 명령 줄에 익숙해야하므로이 명령이 유용합니다.

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

변경 root/ root당신의 MySQL의 자격 증명 (또는 사용에 ~/.my.cnf), db_name데이터베이스 이름과 foo당신의 검색 텍스트. 에 --skip-extended-insert대한 매개 변수 mysqldump는 각 쿼리를 별도의 행으로 표시합니다. 매개 변수 --color=autogrep문자열을 강조 표시 -w하고 전체 단어와 일치합니다.


0

phpMyAdmin에 액세스 할 수 있습니까? 각 데이터베이스에 대한 검색 기능이 있습니다.

또는 (change 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 : 검색 할 모든 테이블 이름을 입력하십시오.


이것은 매우 작은 데이터베이스에서 실용적 일 수 있습니다. 수백 개의 테이블과 수천 개의 열에서 값을 찾으려고하는 경우에는 더 적습니다. 원래 질문의 "전체 데이터베이스"라는 문구를 기반으로 DB의 모든 테이블을 처리해야한다고 가정합니다.
RDFozz

0

MySQL Workbench를 사용하는 경우 데이터베이스 스키마를 마우스 오른쪽 단추로 클릭하고 "테이블 데이터 검색 ..."을 선택한 다음 양식을 작성하십시오. 전체 데이터베이스를 검색합니다. 결과가 나타나면 화살표를 클릭하여 확장하십시오. 스키마, 테이블, 기본 키 데이터, 열 이름 및 검색과 일치하는 실제 데이터가 표시됩니다.
팁 : 아무 것도 나타나지 않으면 검색 범위를 넓히십시오.
이 텍스트 만 검색에 매우 유용하다 (주의하시기 바랍니다 char, varchartext데이터 유형).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.