Как искать всю базу данных MySQL для конкретной строки


19

Можно ли искать всю таблицу базы данных (строки и столбцы), чтобы узнать конкретную строку.

У меня есть база данных с именем около 35 таблиц, мне нужно найти строку с именем «привет», и я не знаю, в какой таблице эта строка сохраняется. Возможно ли это?

Использование MySQL

Я администратор Linux, и я не знаком с базами данных, было бы очень полезно, если бы вы могли объяснить запрос также.


Ответы:



7

Еще в июле 2012 года я написал этот пост

Запрос найти и заменить текст во всех таблицах и полях базы данных mysql

Он использует таблицу information_schema.columns для выбора каждого поля CHAR, VARCHAR и TEXT и выполнения текстовой замены. .

Пожалуйста, просмотрите мою старую ссылку и используйте ее парадигму для поиска.

Как пример, это создаст отдельный 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 с ним. Затем выполните этот гигантский 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,''';')

СЛЕДУЕТ: добавить два обратных тика, показанных ниже для таблиц, в имени которых есть пробел.

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

Это решение сработало очень хорошо! Нужно ли вручную копировать исходный запрос в переменную среды построчно? Мне удалось вставить и выполнить запрос в сеансе mysql, но, конечно, можно также вставить этот запрос в файл?
Джон Т

@JohnT Я делаю построчно, чтобы избежать необходимости вертикально прокручивать мой ответ. Вы можете сделать любой простой способ.
RolandoMySQLDBA

2

Используя другой подход, который не требует построения SQL-запросов, я разработал CRGREP как бесплатный инструмент командной строки с открытым исходным кодом, который будет выполнять поиск в базах данных (включая MySQL) и поддерживает оба простых типа «fred customer.name», ищущих «fred» в «имени». msgstr "столбец таблицы" customer "для более сложного сопоставления с образцом, такого как" fr? d * .author "для сопоставления с образцом по всем столбцам" author "во всех таблицах.


2

Вы можете вернуть все столбцы из всех таблиц, которые совпадают с любыми значениями, которые вы ищете, сразу, построив ответ 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;

1

Если вы можете использовать bash - вот скрипт: ему нужен пользовательский 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=autoдля grepвыделит вашу строку и -wбудет соответствовать целому слову.


0

У вас есть доступ к phpMyAdmin? Он имеет функцию поиска для каждой базы данных.

или используйте сценарии на ваш выбор (смените 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

Я сосредотачиваюсь на простом шаблонном решении для вашего вопроса, реализованном в plsql для базы данных Oracle , я надеюсь настроить его на MySql, будучи простым броском Google. все, что вам нужно, это исследовать информационную схему на 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: введите все имя таблицы, в которой вы ищете.


Это может быть полезно в очень маленьких базах данных - это менее важно, если вы пытаетесь найти значение в сотнях таблиц и тысячах столбцов. Исходя из формулировки «вся база данных» в исходном вопросе, я предполагаю, что это должно касаться всех таблиц в БД.
RDFozz

0

Если вы используете MySQL Workbench, щелкните правой кнопкой мыши схему базы данных и выберите «Поиск в таблице данных ...», затем заполните форму. Это будет искать всю базу данных. Когда (или если) результаты появятся, нажмите на стрелку, чтобы развернуть. Он покажет схему, таблицу, данные первичного ключа, имя столбца и фактические данные, которые соответствуют вашему поиску.
Совет: если ничего не появляется, попробуйте расширить поиск.
Пожалуйста , обратите внимание , что это действительно полезно только для поиска текста ( char, varcharа text) типы данных.


0

Если у вас установлен phpMyAdmin, используйте функцию «Поиск».

Выберите базу данных Убедитесь, что вы выбрали базу данных, а не таблицу, иначе вы получите совершенно другой диалог поиска.

  1. Нажмите вкладку «Поиск»
  2. Элемент списка Выберите искомое условие
  3. Выберите таблицы для поиска
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.