在MySQL数据库的每个表的字段中搜索文本

我想从一个MySQL数据库的所有表的所有字段搜索一个给定的字符串,可能使用语法为:

SELECT * FROM * WHERE * LIKE '%stuff%'

有可能做这样的事情吗?

544663 次浏览

你可以查看information_schema模式。它包含所有表和表中所有字段的列表。然后,您可以使用从该表中获得的信息运行查询。

涉及的表包括SCHEMATA、tables和COLUMNS。有一些外键,这样您就可以在模式中准确地构建表的创建方式。

你可以用

SHOW TABLES;

然后获取这些表中的列(在循环中)

SHOW COLUMNS FROM table;

然后用这些信息创建很多很多的查询,如果你需要的话,你也可以UNION这些查询。

但这对数据库的影响非常大。特别是如果你在做LIKE搜索。

如果你安装了phpMyAdmin,使用它的“搜索”功能。

  • 选择您的数据库
  • 确保你有一个DB选择(即不是一个表,否则你会得到一个完全不同的搜索对话框)
  • 点击“搜索”标签
  • 选择您想要的搜索词
  • 选择要搜索的表

我在250个表/10GB的数据库上使用过这个功能(在一个快速的服务器上),响应时间非常惊人。

您可以对数据库(及其数据)执行SQLDump,然后搜索该文件。

这是检索所有列和表的最简单的查询

SELECT * FROM information_schema.`COLUMNS` C WHERE TABLE_SCHEMA = 'YOUR_DATABASE'

在phpMyAdmin中,可以通过搜索选项卡搜索所有表或名称中有特定字符串的表。

有良好的查询…\ ^ ^ /

PHP函数:

function searchAllDB($search){
global $mysqli;
    

$out = Array();
    

$sql = "show tables";
$rs = $mysqli->query($sql);
if($rs->num_rows > 0){
while($r = $rs->fetch_array()){
$table = $r[0];
$sql_search = "select * from `".$table."` where ";
$sql_search_fields = Array();
$sql2 = "SHOW COLUMNS FROM `".$table."`";
$rs2 = $mysqli->query($sql2);
if($rs2->num_rows > 0){
while($r2 = $rs2->fetch_array()){
$column = $r2[0];
$sql_search_fields[] = "`".$column."` like('%".$mysqli->real_escape_string($search)."%')";
}
$rs2->close();
}
$sql_search .= implode(" OR ", $sql_search_fields);
$rs3 = $mysqli->query($sql_search);
$out[$table] = $rs3->num_rows."\n";
if($rs3->num_rows > 0){
$rs3->close();
}
}
$rs->close();
}
    

return $out;
}


print_r(searchAllDB("search string"));

这是我的解决方案

DROP PROCEDURE IF EXISTS findAll;
CREATE PROCEDURE `findAll`( IN `tableName` VARCHAR( 28 ) , IN `search` TEXT )
BEGIN
DECLARE finished INT DEFAULT FALSE ;
DECLARE columnName VARCHAR ( 28 ) ;
DECLARE stmtFields TEXT ;
DECLARE columnNames CURSOR FOR
SELECT DISTINCT `COLUMN_NAME` FROM `information_schema`.`COLUMNS`
WHERE `TABLE_NAME` = tableName ORDER BY `ORDINAL_POSITION` ;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = TRUE;
SET stmtFields = '' ;
OPEN columnNames ;
readColumns: LOOP
FETCH columnNames INTO columnName ;
IF finished THEN
LEAVE readColumns ;
END IF;
SET stmtFields = CONCAT(
stmtFields , IF ( LENGTH( stmtFields ) > 0 , ' OR' , ''  ) ,
' `', tableName ,'`.`' , columnName , '` REGEXP "' , search , '"'
) ;
END LOOP;
SET @stmtQuery := CONCAT ( 'SELECT * FROM `' , tableName , '` WHERE ' , stmtFields ) ;
PREPARE stmt FROM @stmtQuery ;
EXECUTE stmt ;
CLOSE columnNames ;
END;

这个解
a)只是MySQL,不需要其他语言,并且
b)返回SQL结果,准备处理!< / p >

#Search multiple database tables and/or columns
#Version 0.1 - JK 2014-01
#USAGE: 1. set the search term @search, 2. set the scope by adapting the WHERE clause of the `information_schema`.`columns` query
#NOTE: This is a usage example and might be advanced by setting the scope through a variable, putting it all in a function, and so on...


#define the search term here (using rules for the LIKE command, e.g % as a wildcard)
SET @search = '%needle%';


#settings
SET SESSION group_concat_max_len := @@max_allowed_packet;


#ini variable
SET @sql = NULL;


#query for prepared statement
SELECT
GROUP_CONCAT("SELECT '",`TABLE_NAME`,"' AS `table`, '",`COLUMN_NAME`,"' AS `column`, `",`COLUMN_NAME`,"` AS `value` FROM `",TABLE_NAME,"` WHERE `",COLUMN_NAME,"` LIKE '",@search,"'" SEPARATOR "\nUNION\n") AS col
INTO @sql
FROM `information_schema`.`columns`
WHERE TABLE_NAME IN
(
SELECT TABLE_NAME FROM `information_schema`.`columns`
WHERE
TABLE_SCHEMA IN ("my_database")
&& TABLE_NAME IN ("my_table1", "my_table2") || TABLE_NAME LIKE "my_prefix_%"
);


#prepare and execute the statement
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

我也做了我自己的mysql爬虫来搜索一些wordpress配置,在界面和数据库中都无法找到它,数据库转储太沉重和不可读。我得说我现在不能没有它。

它的工作原理类似于@Olivier,但它管理外来的数据库/表名,并且是像小丑一样安全。

<?php


$database = 'database';
$criteria = '*iemblo'; // you can use * and ? as jokers


$dbh = new PDO("mysql:host=127.0.0.1;dbname={$database};charset=utf8", 'root', '');
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);


$tables = $dbh->query("SHOW TABLES");
while (($table = $tables->fetch(PDO::FETCH_NUM)) !== false)
{
$fields = $dbh->prepare("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?");
$fields->execute(array ($database, $table[0]));


$ors = array ();
while (($field = $fields->fetch(PDO::FETCH_NUM)) !== false)
{
$ors[] = str_replace("`", "``", $field[0]) . " LIKE REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(:search, '\\\\', '\\\\\\\\'), '%', '\\%'), '_', '\\_'), '*', '%'), '?', '_')";
}


$request = 'SELECT * FROM ';
$request .= str_replace("`", "``", $table[0]);
$request .= ' WHERE ';
$request .= implode(' OR ', $ors);
$rows = $dbh->prepare($request);


$rows->execute(array ('search' => $criteria));


$count = $rows->rowCount();
if ($count == 0)
{
continue;
}


$str = "Table '{$table[0]}' contains {$count} rows matching '{$criteria}'.";
echo str_repeat('-', strlen($str)), PHP_EOL;
echo $str, PHP_EOL;
echo str_repeat('-', strlen($str)), PHP_EOL;


$counter = 1;
while (($row = $rows->fetch(PDO::FETCH_ASSOC)) !== false)
{
$col = 0;
$title = "Row #{$counter}:";
echo $title;
foreach ($row as $column => $value)
{
echo
(($col++ > 0) ? str_repeat(' ', strlen($title) + 1) : ' '),
$column, ': ',
trim(preg_replace('!\s+!', ' ', str_replace(array ("\r", "\t", "\n"), array ("", "", " "), $value))),
PHP_EOL;
}
echo PHP_EOL;
$counter++;
}
}

运行这个脚本可以输出如下内容:

---------------------------------------------------
Table 'customers' contains 1 rows matching '*iemblo'.
---------------------------------------------------
Row #1: email_client: my@email.com
numero_client_compta: C05135
nom_client: Tiemblo
adresse_facturation_1: 151, My Street
adresse_facturation_2:
ville_facturation: Nantes
code_postal_facturation: 44300
pays_facturation: FR
numero_tva_client:
zone_geographique: UE
prenom_client: Alain
commentaires:
nom_societe:
email_facturation: my@email.com

使用MySQL Workbench可以很容易地选择几个表,并在所有这些数据库表中搜索文本;-)

我修改了一点Olivier的PHP答案:

  • 打印出找到字符串的结果
  • 省略没有结果的表格
  • 如果列名与搜索输入匹配,也显示输出
  • 显示结果总数

    function searchAllDB($search){
    global $mysqli;
    
    
    $out = "";
    $total = 0;
    $sql = "SHOW TABLES";
    $rs = $mysqli->query($sql);
    if($rs->num_rows > 0){
    while($r = $rs->fetch_array()){
    $table = $r[0];
    $sql_search = "select * from ".$table." where ";
    $sql_search_fields = Array();
    $sql2 = "SHOW COLUMNS FROM ".$table;
    $rs2 = $mysqli->query($sql2);
    if($rs2->num_rows > 0){
    while($r2 = $rs2->fetch_array()){
    $colum = $r2[0];
    $sql_search_fields[] = $colum." like('%".$search."%')";
    if(strpos($colum,$search))
    {
    echo "FIELD NAME: ".$colum."\n";
    }
    }
    $rs2->close();
    }
    $sql_search .= implode(" OR ", $sql_search_fields);
    $rs3 = $mysqli->query($sql_search);
    if($rs3 && $rs3->num_rows > 0)
    {
    $out .= $table.": ".$rs3->num_rows."\n";
    if($rs3->num_rows > 0){
    $total += $rs3->num_rows;
    $out.= print_r($rs3->fetch_all(),1);
    $rs3->close();
    }
    }
    }
    $out .= "\n\nTotal results:".$total;
    $rs->close();
    }
    return $out;
    }
    

HeidiSQL是一个实用可靠的工具,专为使用流行的MySQL服务器的web开发人员设计。

在HeidiSQL中,您可以按shift + ctrl + f,您可以在服务器上的所有表中找到文本。这个选项非常有用。

我使用Union将查询串在一起。不知道这是不是最有效的方法,但确实有效。

SELECT * FROM table1 WHERE name LIKE '%Bob%' Union
SELCET * FROM table2 WHERE name LIKE '%Bob%';

虽然这个问题已经很老了,但如果你使用的是mysql workbench 6.3,你可以这样做。(很可能它也适用于其他版本)

右键点击你的模式和“搜索表数据”,输入你的值,然后点击“开始搜索”。这是它。

如果你像躲避瘟疫一样避免stored procedures,或者由于权限而无法执行mysql_dump,或者遇到其他各种原因。

我建议采用如下三步法:

1)该查询构建了一堆查询作为结果集。

# =================
# VAR/CHAR SEARCH
# =================
# BE ADVISED USE ANY OF THESE WITH CAUTION
# DON'T RUN ON YOUR PRODUCTION SERVER
# ** USE AN ALTERNATE BACKUP **


SELECT
CONCAT('SELECT * FROM ', A.TABLE_SCHEMA, '.', A.TABLE_NAME,
' WHERE ', A.COLUMN_NAME, ' LIKE \'%stuff%\';')
FROM INFORMATION_SCHEMA.COLUMNS A
WHERE
A.TABLE_SCHEMA != 'mysql'
AND     A.TABLE_SCHEMA != 'innodb'
AND     A.TABLE_SCHEMA != 'performance_schema'
AND     A.TABLE_SCHEMA != 'information_schema'
AND
(
A.DATA_TYPE LIKE '%text%'
OR
A.DATA_TYPE LIKE '%char%'
)
;

# =================
# NUMBER SEARCH
# =================
# BE ADVISED USE WITH CAUTION


SELECT
CONCAT('SELECT * FROM ', A.TABLE_SCHEMA, '.', A.TABLE_NAME,
' WHERE ', A.COLUMN_NAME, ' IN (\'%1234567890%\');')
FROM INFORMATION_SCHEMA.COLUMNS A
WHERE
A.TABLE_SCHEMA != 'mysql'
AND     A.TABLE_SCHEMA != 'innodb'
AND     A.TABLE_SCHEMA != 'performance_schema'
AND     A.TABLE_SCHEMA != 'information_schema'
AND     A.DATA_TYPE IN ('bigint','int','smallint','tinyint','decimal','double')
;

# =================
# BLOB SEARCH
# =================
# BE ADVISED THIS IS CAN END HORRIFICALLY IF YOU DONT KNOW WHAT YOU ARE DOING
# YOU SHOULD KNOW IF YOU HAVE FULL TEXT INDEX ON OR NOT
# MISUSE AND YOU COULD CRASH A LARGE SERVER
SELECT
CONCAT('SELECT CONVERT(',A.COLUMN_NAME, ' USING utf8) FROM ', A.TABLE_SCHEMA, '.', A.TABLE_NAME,
' WHERE CONVERT(',A.COLUMN_NAME, ' USING utf8) IN (\'%someText%\');')
FROM INFORMATION_SCHEMA.COLUMNS A
WHERE
A.TABLE_SCHEMA != 'mysql'
AND     A.TABLE_SCHEMA != 'innodb'
AND     A.TABLE_SCHEMA != 'performance_schema'
AND     A.TABLE_SCHEMA != 'information_schema'
AND     A.DATA_TYPE LIKE '%blob%'
;

结果应该是这样的:

Copy these results into another query window .

2)然后你可以只Right Click并使用Copy Row (tab-separated)

enter image description here

3)将结果粘贴到一个新的查询窗口,并运行到您的心脏内容。

详细信息:我排除了那些你在工作台中通常不会看到的系统模式,除非你选中了选项Show Metadata and Internal Schemas

我这样做是为了在需要时提供一种快速方法ANALYZE整个主机或DB,或者运行OPTIMIZE语句来支持性能改进。

我相信有不同的方法你可以去做这件事,但这里是什么对我有用:

-- ========================================== DYNAMICALLY FIND TABLES AND CREATE A LIST OF QUERIES IN THE RESULTS TO ANALYZE THEM
SELECT CONCAT('ANALYZE TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname';


-- ========================================== DYNAMICALLY FIND TABLES AND CREATE A LIST OF QUERIES IN THE RESULTS TO OPTIMIZE THEM
SELECT CONCAT('OPTIMIZE TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbname';

MySQL版本:5.6.23

警告:如果出现以下情况,请不要运行此命令:

  1. 您担心会导致表锁(密切关注您的客户端连接)
  2. 你不确定你在做什么。

  3. 你在试图激怒你的DBA。(你的办公桌上可能有的人。)

干杯,杰伊;-]

有一个很好的库可以读取所有的表,ridona

$database = new ridona\Database('mysql:dbname=database_name;host=127.0.0.1', 'db_user','db_pass');


foreach ($database->tables()->by_entire() as $row) {


....do


}

我不知道这是否只在最近的版本中,但右键单击Navigator窗格中的Tables选项会弹出一个名为Search Table Data的选项。这将打开一个搜索框,您可以在其中填写搜索字符串并点击搜索。

您确实需要在左侧窗格中选择要搜索的表。但如果你按住shift键一次选择10个表,MySql可以在几秒钟内处理并返回结果。

对于任何正在寻找更好选择的人!:)

我建立在之前的答案,有这个,一些额外的填充,只是为了能够方便地连接所有的输出:

SELECT
CONCAT('SELECT ''',A.TABLE_NAME, '-' ,A.COLUMN_NAME,''' FROM ', A.TABLE_SCHEMA, '.', A.TABLE_NAME,
' WHERE ', A.COLUMN_NAME, ' LIKE \'%Value%\' UNION')
FROM INFORMATION_SCHEMA.COLUMNS A
WHERE
A.TABLE_SCHEMA != 'mysql'
AND     A.TABLE_SCHEMA != 'innodb'
AND     A.TABLE_SCHEMA != 'performance_schema'
AND     A.TABLE_SCHEMA != 'information_schema'
UNION SELECT 'SELECT '''


-- for exact match use: A.COLUMN_NAME, ' LIKE \'Value\' instead

首先运行它,然后粘贴并运行结果(无需编辑),它将显示使用该值的所有表名和列。

我要用这个。你只需要改变变量

$query ="SELECT `column_name` FROM `information_schema`.`columns` WHERE `table_schema`='" . $_SESSION['db'] . "' AND `table_name`='" . $table . "' ";
$stmt = $dbh->prepare($query);
$stmt->execute();
$columns = $stmt->fetchAll(PDO::FETCH_ASSOC);


$query="SELECT name FROM `" . $database . "`.`" . $table . "` WHERE ( ";
foreach ( $columns as $column ) {
$query .=" CONVERT( `" . $column['column_name'] . "` USING utf8 ) LIKE '%" . $search . "%' OR ";
}
$query = substr($query, 0, -3);
$query .= ")";


echo $query . "<br>";
$stmt=$dbh->prepare($query);
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "<pre>";
print_r ($results );
echo "</pre>";
这是我知道的最简单的方法。 在PHPMyAdmin中选择你的DB,然后转到“搜索”选项卡,写下你想要找到的内容以及你要搜索的位置。如果要从所有表中搜索单词,则选择所有表。__abc0

我已经使用HeidiSQL做到这一点。 它不容易找到,但按Ctrl+Shift+F它会显示“表格工具”对话框。然后选择要搜索的内容(全库到单表),输入“要查找的文本”值,点击“查找”。我发现它惊人的快(870MiB db在不到一分钟)

MySQL工作台

这里有一些说明。

下载并安装MSQL Workbench。

https://www.mysql.com/products/workbench/

安装时,可能需要安装Visual Studio c++ Redistributable。你可以在这里买到:

https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads

x64: vc_redist.x64.exe(适用于64位Windows)

打开MySQL Workbench时,必须输入主机名、用户名和密码。

在侧菜单栏上有一个Schemas选项卡,单击Schemas选项卡,然后双击数据库以选择要搜索的数据库。

然后转到菜单数据库-搜索数据,并输入你要搜索的文本,单击开始搜索。

enter image description here

HeidiSql

下载并安装HeidiSql https://www.heidisql.com/download.php < / p >

输入主机名、用户名和密码。

按Ctrl+Shift+F搜索文本。

enter image description here

如果23个答案还不够,这里还有2个……根据数据库结构和内容,您可能会发现其中一个实际上是快速而简单的解决方案。

对于shell一行程序的爱好者,这里有一个很长的程序(实际上只有2行,使用变量):

cmd='mysql -u Username -pYour_Password -D Your_Database' # <-- Adapt this


$cmd -s -e 'SHOW TABLES' | while read table; do echo "=== $table ==="; $cmd -B -s -e "SELECT * FROM $table" | grep 'Your_Search'; done

或多行,使其更具可读性:

$cmd -s -e 'SHOW TABLES' \
| while read table; do
echo "=== $table ===";
$cmd -B -s -e "SELECT * FROM $table" \
| grep 'Your_Search';
done
  • -s (--silent)是抑制列名标题

  • -B (--batch)转义像换行这样的特殊字符,所以我们在使用grep时获得整个记录

对于Perl爱好者来说,这将允许您使用正则表达式:

# perl -MDBI -le '($db,$u,$p)=@ARGV; $dbh=DBI->connect("dbi:mysql:dbname=$db",$u,$p); foreach $table ($dbh->tables()) {print "$table\n"; foreach $r ($dbh->selectall_array("SELECT * FROM $table")) {$_=join("\t", @$r); print $_ if (/Your_Regex/);}}' Your_Database Username Your_Password

在“real”中;Perl脚本可能是这样的:

#!/usr/bin/perl


use strict;
use open qw(:std :utf8);


use DBI;


my $db_host  = 'localhost';
my $db       = 'Your_Database';
my $db_user  = 'Username';
my $db_pass  = 'Your_Password';


my $search    = qr/Your_regex_Search/;




# https://metacpan.org/pod/DBD::mysql
my $dbh = DBI->connect( "dbi:mysql:dbname=$db;host=$db_host", $db_user, $db_pass,
{ mysql_enable_utf8mb4 => 1 }
) or die "Can't connect: $DBI::errstr\n";




foreach my $table ( $dbh->tables() ) {
my $sth = $dbh->prepare("SELECT * FROM $table")
or die "Can't prepare: ", $dbh->errstr;


$sth->execute
or die "Can't execute: ", $sth->errstr;


my @results;


while (my @row = $sth->fetchrow()) {
local $_ = join("\t", @row);
if ( /$search/ ) {
push @results, $_;
}
}


$sth->finish;


next unless @results;


print "*** TABLE $table :\n",
join("\n---------------\n", @results),
"\n" . "=" x 20 . "\n";
}


$dbh->disconnect;

即使下面的建议不应该被认为是最终的解决方案,你也可以通过这样做来实现目标:

SET SESSION group_concat_max_len = 1000000;
SET @search = 'Text_To_Search';


DROP table IF EXISTS table1;
CREATE TEMPORARY TABLE table1 AS
(SELECT
CONCAT('SELECT \'',TABLE_NAME,'\' as \'table_name\',\'',COLUMN_NAME,'\' as \'column_name\',CONVERT(count(*),char) as \'matches\' FROM `',
TABLE_NAME,'` where `',COLUMN_NAME,'` like \'%',@search,'%\' UNION ') as 'query'
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'db_name' limit 1000000);


set @query = (SELECT GROUP_CONCAT(t1.`query` SEPARATOR '') as 'final_query' from table1 t1 limit 1);
set @query = (SELECT SUBSTRING(@query, 1, length(@query) - 7));


PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

请记住:

  1. 选项:group_concat_max_len限制1000000并不总是需要的,这将取决于你的服务器/IDE配置。以防我加进去。

  2. 执行此命令后,您将得到一个3列响应:[table_name], [column_name], [matches]

  3. Column 'matches'是给定表/列中出现的次数。

  4. 这个查询非常快。

免责声明:它只对个人使用有用,换句话说,请不要在生产系统中使用它,因为考虑到搜索参数与其他字符串连接,它对SQL注入攻击很敏感。 如果你想创建一个prod. ready函数,那么你需要创建一个带有LOOP.

的存储过程

使用实例在CLI下搜索数据库所有表中的字符串。

mysqldump -u UserName --no-create-info --extended-insert=FALSE DBName -p | grep -i "searchingString"

或者,

mysqldump -u UserName --no-create-info --extended-insert=FALSE DBName -p | grep -i "searchingString" > searchingString.sql

它是十二年,没有人张贴以下问题的答案:

我想从MySQL数据库的所有表中搜索给定字符串的所有字段

答案包括gui、模糊的概念、语法错误、需要表名或前缀的过程以及各种扭曲。下面是一个实际的、有效的、经过测试的、简单易用的答案,它建立在多个先前的答案的基础上,同时还将主键添加到结果中。

DROP PROCEDURE IF EXISTS findAll;
DELIMITER $$
CREATE PROCEDURE findAll( IN `search` TEXT )
BEGIN
SET SESSION group_concat_max_len := @@max_allowed_packet;
SELECT GROUP_CONCAT(
"SELECT '", c1.TABLE_NAME, "' AS `table`, '", c1.COLUMN_NAME, "' AS `column`, ",
"CONCAT_WS(',', ",  (SELECT GROUP_CONCAT(c2.column_name) FROM `information_schema`.`columns` c2 WHERE c1.TABLE_SCHEMA=c2.TABLE_SCHEMA AND c1.TABLE_NAME=c2.TABLE_NAME AND c2.COLUMN_KEY='PRI') ,") AS pri,",
c1.COLUMN_NAME, " AS value FROM ", c1.TABLE_NAME,
" WHERE `",c1.COLUMN_NAME,"` LIKE '%", search, "%'" SEPARATOR "\nUNION\n") AS col
INTO @sql
FROM information_schema.columns c1
WHERE c1.TABLE_SCHEMA = DATABASE();
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END $$
DELIMITER ;

就是这样。你现在可以执行CALL findAll('foobar');

不除外。你会遇到两个问题:

  1. MySQL错误1436:线程堆栈溢出
  2. 准备好的语句需要重新准备。

将以下两行添加到/etc/mysql/mysql.conf.d/mysqld.cnf或您的cnf所在的位置,或将它们保存在单独的文件中并复制到conf.d目录中。

thread_stack            = 2M
table_definition_cache  = 5000

是的,显然这不应该在生产环境中运行,因为它不安全,而且会降低您的性能。

如果您不是在代码级别上使用它,只是想检查信息,您可以将整个数据库导出为SQL,然后在文本编辑器上搜索。