Як шукати всю базу даних MySQL для певного рядка


19

чи можна шукати цілі таблиці баз даних (рядок і стовпець), щоб дізнатися певний рядок.

У мене є база даних з назвою A з приблизно 35 таблицями, мені потрібно шукати рядок під назвою "привіт", і я не знаю, на якій таблиці збережена ця рядок. Чи можливо це?

Використання MySQL

Я адміністратор Linux, і я не знайомий з базами даних, було б дуже корисно, якщо ви також можете пояснити запит.


Відповіді:



7

Ще в липні 2012 року я написав це повідомлення

Запит на пошук та заміну тексту у всіх таблицях та полях mysql db

Він використовує стовпці 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 II робити по черзі, щоб уникнути необхідності вертикально прокручувати мою відповідь. Можна зробити будь-який спосіб найпростішим.
RolandoMySQLDBA

2

Здійснюючи інший підхід, який не потребує побудови SQL запитів, я розробив CRGREP як безкоштовний інструмент командного рядка open source , який буде копіювати бази даних (включаючи MySQL) та підтримувати обидва прості пошукові типи "fred customer.name" для "fred" в імені " "стовпець таблиці" клієнт "для більш складного узгодження шаблонів, наприклад" fr? d * .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, будучи простою гугл-кидкою. все, що вам потрібно, це дослідити інформаційну схему на 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`);

ім'я стовпця: Введіть усі назви стовпців, в яких ви шукаєте.

table_name: Введіть усе ім'я таблиці, в якій ви шукаєте.


Це може бути практично в дуже малих базах даних - це менше, якщо ви намагаєтесь знайти значення в сотнях таблиць і тисячах стовпців. Виходячи з формулювання "всієї бази даних" в оригінальному запитанні, я припускаю, що це має стосуватися всіх таблиць у БД.
RDFozz

0

Якщо ви використовуєте MySQL Workbench, клацніть правою кнопкою миші на схемі бази даних та виберіть "Пошук даних таблиці ...", а потім заповніть форму. Тут буде здійснено пошук у всій базі даних. Коли (або якщо) з'являються результати, натисніть стрілку, щоб розгорнути. Він відображатиме схему, таблицю, дані первинного ключа, назву стовпця та фактичні дані, які відповідають вашому пошуку.
Порада. Якщо нічого не з’явиться, спробуйте розширити пошук.
Будь ласка , зверніть увагу , що це дійсно корисно тільки для пошуку тексту ( char, varcharа text) типи даних.


0

Якщо у вас встановлений phpMyAdmin, використовуйте його функцію "Пошук".

Вибір бази даних Переконайтеся, що ви вибрали DataBase, а не таблицю, інакше ви отримаєте зовсім інше діалогове вікно пошуку

  1. Перейдіть на вкладку "Пошук"
  2. Елемент списку Виберіть потрібний термін пошуку
  3. Виберіть таблиці для пошуку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.