我正在尝试使用以下命令将 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,但它不允许我创建临时文件。
使用
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 ...
则没有这样做。它还捕获存储的例程。