在MySQL中搜索整个数据库中的字符串的方法

时间:2009-09-05 20:53:37

标签: mysql

我正在开发一个庞大的MySQL数据库(大约120个表)。我试图理解它,如果我可以搜索所有120个表+列以寻找我正在寻找的字符串,那将会有很大帮助。

这可以在MySQL数据库上做吗?

5 个答案:

答案 0 :(得分:19)

有一种解决方案,可能不是您想要的。如果您将表转储到包含数据的文件(mysqldump)中,那么您将能够从中获取所需的任何信息。

这将消除对耗时的搜索查询的需求,并且是我能想到的最有效的方式。

希望这有帮助!

答案 1 :(得分:2)

这将帮助您在整个数据库中找到一个字符串

DELIMITER ##
 CREATE PROCEDURE sp_search1(IN searchstring INT)
BEGIN
 DECLARE done INT DEFAULT FALSE;
 DECLARE output TEXT;
  DECLARE table_name TEXT;
  DECLARE column_name TEXT;
DECLARE s TEXT;  
 DECLARE searchcursor CURSOR FOR 
SELECT table_name,column_name  FROM information_schema.columns AS column    
ORDER BY table_name,ordinal_position;   
OPEN searchcursor;
PREPARE stmt2 FROM 'select * from ? where ? = ?' ;  
search_loop : LOOP
IF done THEN 
LEAVE search_loop;
END IF;              
FETCH searchcursor INTO table_name,column_name;
IF(     EXECUTE stmt2 USING table_name, column_name,searchstring) THEN
 INSERT INTO `table_names`(`table_name`) VALUES(@table_name);    
    END IF;
END LOOP;   
END;

答案 2 :(得分:0)

只是想加入Omnipresent的答案,这是搜索数据库的事实上的方法。

不幸的是,99%的时间,我的数据库很庞大,平均转储几乎没有新行,这意味着我想要的字符串的grepping将返回绝大多数的sql文件。

我现在更喜欢使用--tab开关,它在数据库中为每个表生成制表符分隔的txt文件。

这意味着我不仅每行都能获得一条记录,而且可以快速获取我的搜索字词所在的表格。

试试这个:

mysqldump -u user_name -p database_name --tab=tmp

其中tmp是您创建的空目录。

一个tmp的tmp会给你这样的东西:

users.sql
users.txt
orders.sql
orders.txt

其中sql文件包含create table语法,而txt包含数据。

请注意,tab选项使用mysql的SELECT INTO OUTFILE,这意味着除了localhost之外,这个技巧不能在任何地方完成。

答案 3 :(得分:0)

在unix机器中,如果数据库不是太大:

mysqldump -u <username> -p <password> <database_name> --extended=FALSE | grep <String to search> | less -S

答案 4 :(得分:-1)

您可以仅迭代每个表:

mysql="mysql -uUSER -pPASS -hHOST --protocol=tcp dbname -e"
for table in `$mysql "show tables;"`
do
  echo $table
  $mysql "select * from $table;" | grep STRING_TO_SEARCH_FOR
done