web-dev-qa-db-ja.com

MySQLデータベースのすべてのテーブルのすべてのフィールドで文字列を検索するにはどうすればよいですか?

文字列を検索したいのですが、どの列とテーブルが正確にわかりません。

どうすれば見つけられますか?

ありがとう。

3
Sarah

これは大変な問題であり、私には厳しい提案があります

提案#1:information_schemaを使用する

これを行う方法についての私の古い投稿を参照してください

提案#2:mysqldumpを使用する

Mysqldumpを使用して文字列を突き止めることができるはずです。

あなたが探している文字列が「Hello、World」であるとしましょう

すべてのユーザー定義データベースをテキストファイルにmysqldumpして、テキストファイルをgrepできます。

STRTOFIND="Hello, World"
DUMPFILE=mysqldump_to_search.sql
SRCHFILE=Search_Resutls.txt
MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
SQL="SET group_concat_max_len = 1048576;"
SQL="${SQL} SELECT GROUP_CONCAT(schema_name SEPARATOR ' ')"
SQL="${SQL} FROM information_schema.schemata WHERE schema_name NOT IN"
SQL="${SQL} ('information_schema','performance_schema','mysql')"
DBLIST=`mysql ${MYSQL_CONN} -ANe"${SQL}"`
MYSQLDUMP_OPTIONS="--single-transaction --routines --triggers -B ${DBLIST}"
mysqldump ${MYSQL_CONN} -A ${MYSQLDUMP_OPTIONS} > ${DUMPFILE}
grep -n "${STRTOFIND}" ${DUMPFILE} > ${SRCHFILE}

検索結果ファイルには、文字列が見つかった行だけでなく、ダンプファイル内の行番号も含まれます。

試してみる !!!

3
RolandoMySQLDBA

純粋なMySQL SPで実行する場合は、次のように使用できます。

    CREATE TABLE `temp_details` (
     `t_schema` varchar(45) NOT NULL,
     `t_table` varchar(45) NOT NULL,
     `t_field` varchar(45) NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

    ## Procedure for search in all fields of all databases
    DELIMITER $$
    #Script to loop through all tables using Information_Schema
    DROP PROCEDURE IF EXISTS get_table $$
    CREATE PROCEDURE get_table(in_search varchar(50))
     READS SQL DATA
    BEGIN
     DECLARE trunc_cmd VARCHAR(50);
     DECLARE search_string VARCHAR(250);

     DECLARE db,tbl,clmn CHAR(50);
     DECLARE done INT DEFAULT 0;
     DECLARE COUNTER INT;

     DECLARE table_cur CURSOR FOR
     SELECT concat('SELECT COUNT(*) INTO @CNT_VALUE FROM `',table_schema,'`.`',table_name,'` WHERE `', column_name,'` REGEXP ''',in_search,''';')
     ,table_schema,table_name,column_name
     FROM information_schema.COLUMNS
     WHERE TABLE_SCHEMA NOT IN ('information_schema','test','mysql');

     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;

     #Truncating table for refill the data for new search.
     PREPARE trunc_cmd FROM "TRUNCATE TABLE temp_details;";
     EXECUTE trunc_cmd ;

     OPEN table_cur;
     table_loop:LOOP
     FETCH table_cur INTO search_string,db,tbl,clmn;

     #Executing the search
     SET @search_string = search_string;
     SELECT search_string;
     PREPARE search_string FROM @search_string;
     EXECUTE search_string;


     SET COUNTER = @CNT_VALUE;
     SELECT COUNTER;

     IF COUNTER>0 THEN
     # Inserting required results from search to table
     INSERT INTO temp_details VALUES(db,tbl,clmn);
     END IF;

     IF done=1 THEN
     LEAVE table_loop;
     END IF;
     END LOOP;
     CLOSE table_cur;

     #Finally Show Results
     # SELECT * FROM temp_details;
    END $$
    DELIMITER ;

最後に実行するだけです:select * from [SCHEMA].temp_details;

PD:この手順が終了するまでの時間は、データベースのデータ量によって異なります。

1
oNare