我正在开发一个庞大的MySQL数据库(大约120个表)。我试图理解它,如果我可以搜索所有120个表+列以寻找我正在寻找的字符串,那将会有很大帮助。
这可以在MySQL数据库上做吗?
答案 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