该主题非常重要,因为可能没有确切答案。我在生产环境中有一个22Gb MySql数据库。但是对于测试目的,例如,我需要从数据库中提取2Gb,并且此提取必须具有所有依赖项(键,索引,FK等)。如何在MySql数据库中执行此部分提取?
此查询从指定的数据库中选择所有表名,并在外键树中显示它们的级别。
WITH RECURSIVE
cte1 AS
(
SELECT table_name,
referenced_table_name
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE table_schema = 'test'
AND referenced_column_name IS NOT NULL
),
cte2 AS
(
SELECT t1.referenced_table_name name, 1 level
FROM cte1 t1
WHERE NOT EXISTS (
SELECT NULL
FROM cte1 t2
WHERE t1.referenced_table_name = t2.table_name
)
UNION ALL
SELECT cte1.table_name, cte2.level + 1
FROM cte1
JOIN cte2 ON cte1.referenced_table_name = cte2.name
)
SELECT name, MIN(level) level
FROM cte2
GROUP BY name
ORDER BY name, level;
当您重新创建数据库结构或将数据从原始数据库复制到其重新创建的副本时,必须按所示顺序处理表。
删除表时,您必须按倒序进行。
在您的特定情况下,您:
WHERE table_schema = 'test'
替换为您的实际数据库名称。CREATE TABLE new_database.{name} LIKE old_database.{name} ;
level = 1
执行命令的每一行INSERT INTO new_database.{name}
SELECT * FROM old_database.{name} LIMIT {some_value};
[some_value
对于所有根表或单个根表都可以相同。
level > 1
执行命令的每一行INSERT IGNORE INTO new_database.{name}
SELECT * FROM old_database.{name} LIMIT {some_value};
如果方案包含触发器,则必须将它们分别备份并作为最后一步还原到新数据库中。