子查询 MYSQL 以从服务器中选择所有数据库
Posted
技术标签:
【中文标题】子查询 MYSQL 以从服务器中选择所有数据库【英文标题】:Subquerying MYSQL to select All Databases from server 【发布时间】:2015-09-30 18:48:38 【问题描述】:我在提问之前检查了this主题,我发现它只是在某个方面有帮助,现在还不够。
我的 MariaDB 服务器中有很多数据库,其中一个已注册视图损坏,出现“无效引用”错误。
考虑到此错误阻止我运行备份例程,并且 MariaDB 日志仅显示“数据库(出现错误:1049)(锁定表)”,我需要找出哪些视图损坏了
现在我有了一个视图列表,有没有办法在不同的数据库中“选择 *”所有视图?
我尝试过这样的事情:
select * from TABLE_SCHEMA where (select TABLE_SCHEMA,TABLE_NAME from information_schema.tables where TABLE_TYPE like 'VIEW');
但我知道它不会起作用,因为我没有提供特定的数据库。
我认为 Inner-Join 可以解决这种情况,但我不知道如何完成它...
顺便说一句,如果有更好的方法来找出 View 的缺陷,我将不胜感激。
提前谢谢你!
【问题讨论】:
【参考方案1】:由于唯一的答案被它的贡献者删除,我开发了一个丑陋但有效的解决方法:
-
我使用下面提供的查询创建了一个包含数据库和视图名称的文件:
mysql -p*** -e "SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.`TABLES` WHERE TABLE_TYPE LIKE 'VIEW'" > views.txt
-
这会将包含在视图中运行基本选择所需的信息保存到文件“views.txt”中,因此我执行了以下操作:
while IFS= read -r line; do mysql -p*** -e "select * from $(echo $line | awk 'print $1').$(echo $line | awk 'print $2') LIMIT 1" 2>> errors.txt; echo $line >> errors.txt; done < views.txt
我知道它很难看,但它会在“views.txt”中列出的每个 database.table 或 database.view 中运行一个“select *”,只返回此查询的第一行。
它在我的服务器中为我提供了一个有效的测试,它向我展示了哪些视图被破坏了:
第 1 行的错误 1146 (42S02):表 '.'不存在
如果您遇到类似的问题,希望您能找到更好的方法来解决这个问题。
【讨论】:
以上是关于子查询 MYSQL 以从服务器中选择所有数据库的主要内容,如果未能解决你的问题,请参考以下文章