在MySQL中搜索整个数据库中字符串的方法
我正在开发一个巨大的MySQL数据库(大约120个表)。我正在尝试理解它,如果我能在所有120个表+列中搜索我正在寻找的字符串,这将非常有帮助在MySQL中搜索整个数据库中字符串的方法,mysql,Mysql,我正在开发一个巨大的MySQL数据库(大约120个表)。我正在尝试理解它,如果我能在所有120个表+列中搜索我正在寻找的字符串,这将非常有帮助 在MySQL数据库上可以这样做吗?有一种解决方案,可能不是您想要的。如果您将表转储到一个包含数据的文件(mysqldump)中,那么您就可以从中获取任何需要的信息 它将不再需要耗时的搜索查询,这是我能想到的最有效的方法。只是想添加到Omnipresent的答案上,这是搜索数据库的实际方法 不幸的是,99%的情况下,我的数据库是巨大的,平均转储很少有换行符
在MySQL数据库上可以这样做吗?有一种解决方案,可能不是您想要的。如果您将表转储到一个包含数据的文件(mysqldump)中,那么您就可以从中获取任何需要的信息
它将不再需要耗时的搜索查询,这是我能想到的最有效的方法。只是想添加到Omnipresent的答案上,这是搜索数据库的实际方法 不幸的是,99%的情况下,我的数据库是巨大的,平均转储很少有换行符,这意味着对我想要的字符串进行grepping将返回绝大多数sql文件 现在我更喜欢使用--tab开关,它在db中为每个表创建一个以制表符分隔的txt文件 这意味着我不仅可以每行获得一条记录,而且可以快速获得搜索词所在的表 试试这个:
mysqldump -u user_name -p database_name --tab=tmp
其中tmp是您创建的空目录
tmp的ls将为您提供如下信息:
users.sql
users.txt
orders.sql
orders.txt
其中sql文件包含CREATETABLE语法,txt包含数据
请注意,选项卡选项利用了mysql的SELECT INTO OUTFILE,这意味着除了localhost之外,在任何地方都不能执行此操作。在unix机器中,如果数据库不是太大:
mysqldump -u <username> -p <password> <database_name> --extended=FALSE | grep <String to search> | less -S
mysqldump-u-p--extended=FALSE | grep | less-S
这将帮助您在整个数据库中查找字符串
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;
您可以迭代每个表:
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
你想要纯mysql版本吗?如果是这样的话,我不认为有任何机会..从@Arun看到答案的可能重复-如果你将--extended insert添加到mysqldump,你将每行得到一个insert,这样就更容易找到grep