답변:
$ mysqldump -pPASSWORD database --extended=FALSE | grep pattern | less -S
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
당신의 오프 구축하여 한 번에 모든 찾고있는 모든 값과 일치하는 모든 테이블의 모든 열을 반환 할 수 있습니다 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;
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
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=auto
는 grep
문자열을 강조 표시 -w
하고 전체 단어와 일치합니다.
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')
이 트릭을 한 줄의 코드로 사용
SELECT * FROM `table_name1`,`table_name2`
WHERE '$data' IN (`column_name1`,`column_name2`,`column_name3`,`column_name4`);
column_name : 검색 할 모든 열 이름을 입력하십시오.
table_name : 검색 할 모든 테이블 이름을 입력하십시오.