Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中搜索整个数据库中字符串的方法_Mysql - Fatal编程技术网

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

在MySQL中搜索整个数据库中字符串的方法,mysql,Mysql,我正在开发一个巨大的MySQL数据库(大约120个表)。我正在尝试理解它,如果我能在所有120个表+列中搜索我正在寻找的字符串,这将非常有帮助 在MySQL数据库上可以这样做吗?有一种解决方案,可能不是您想要的。如果您将表转储到一个包含数据的文件(mysqldump)中,那么您就可以从中获取任何需要的信息 它将不再需要耗时的搜索查询,这是我能想到的最有效的方法。只是想添加到Omnipresent的答案上,这是搜索数据库的实际方法 不幸的是,99%的情况下,我的数据库是巨大的,平均转储很少有换行符

我正在开发一个巨大的MySQL数据库(大约120个表)。我正在尝试理解它,如果我能在所有120个表+列中搜索我正在寻找的字符串,这将非常有帮助


在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