如何在MySQL中执行select语句的结果

问题描述 投票:0回答:1

我正在尝试使用以下命令将 MySQL 数据库架构复制到新数据库中:

 SET @NewSchema = 'new_schema';
 SET @OldSchema = 'old_schema';
 SELECT CONCAT('CREATE DATABASE IF NOT EXISTS ', @NewSchema, ';');
 SELECT CONCAT('CREATE TABLE IF NOT EXISTS ',@NewSchema,'.',table_name, ' LIKE ', TABLE_SCHEMA ,'.',table_name,';')
 FROM information_schema.TABLES where TABLE_SCHEMA = @OldSchema AND TABLE_TYPE != 'VIEW';

 SELECT CONCAT('CREATE DATABASE IF NOT EXISTS ', @NewSchema, ';') INTO OUTFILE '/tmp/database_creation';
 SELECT CONCAT('CREATE TABLE IF NOT EXISTS ',@NewSchema,'.',table_name, ' LIKE ', TABLE_SCHEMA ,'.',table_name,';') FROM information_schema.TABLES where TABLE_SCHEMA = @OldSchema AND TABLE_TYPE != 'VIEW' INTO OUTFILE '/tmp/table_creation';
 SOURCE 'tmp/database_creation';
 SOURCE 'tmp/table_creation';

代码生成了我想看到的命令,但我无法执行它们。运行临时文件似乎不起作用。可能是什么问题?谢谢!

这是一个 db fiddle,但它不允许我创建临时文件。

mysql database schema clone
1个回答
0
投票

使用

SELECT ... INTO OUTFILE
有点棘手。出于安全原因,他们有一些配置选项旨在默认禁用此功能。您不希望任何人都能够在您的数据库服务器上附加或覆盖文件(例如,如果您有一个 SQL 注入漏洞,允许用户运行他们想要的任何查询,他们可以覆盖您的 /etc/passwd 文件或其他重要的事情)。

您应该知道,

SELECT ... INTO OUTFILE
将文件写入数据库服务器上,但
SOURCE
读取运行MySQL客户端的主机上的本地文件。这些不一定是同一台主机。

您还应该知道

SOURCE
是MySQL客户端中的内置命令。您无法在任何其他客户端或 API 或存储过程等中运行此命令。除非您在 MySQL 客户端中运行上面帖子中显示的命令,否则
SOURCE
将不起作用。

如果您正在运行 MySQL 命令行客户端,那么有一个更简单的解决方案来复制数据库。在 shell 中运行这些命令:

mysqladmin create new_schema
mysqldump --no-data --routines old_schema | mysql new_schema

这还有保留外键定义的优点,而您的

CREATE TABLE ... LIKE ...
则没有这样做。它还捕获存储的例程。

© www.soinside.com 2019 - 2024. All rights reserved.