如何从大型MySql数据库中转储部分备份?

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

该主题非常重要,因为可能没有确切答案。我在生产环境中有一个22Gb MySql数据库。但是对于测试目的,例如,我需要从数据库中提取2Gb,并且此提取必须具有所有依赖项(键,索引,FK等)。如何在MySql数据库中执行此部分提取?

mysql database mysql-workbench database-restore
1个回答
0
投票

此查询从指定的数据库中选择所有表名,并在外键树中显示它们的级别。

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;

当您重新创建数据库结构或将数据从原始数据库复制到其重新创建的副本时,必须按所示顺序处理表。

删除表时,您必须按倒序进行。

在这种情况下,查询不会受到引用环的保护,并且将达到最大递归深度或导致执行错误(包括可能的服务器进程失败或挂起)。因此请注意。


在您的特定情况下,您:

  1. 执行此查询(不要忘记将WHERE table_schema = 'test'替换为您的实际数据库名称。
  2. 创建新数据库。
  3. 对于输出中的每一行(存储顺序)执行命令
CREATE TABLE new_database.{name} LIKE old_database.{name} ;
  1. 对于输出中level = 1执行命令的每一行
INSERT INTO new_database.{name} 
SELECT * FROM old_database.{name} LIMIT {some_value};

[some_value对于所有根表或单个根表都可以相同。

  1. 对于输出中level > 1执行命令的每一行
INSERT IGNORE INTO new_database.{name} 
SELECT * FROM old_database.{name} LIMIT {some_value};
  1. 享受。

如果方案包含触发器,则必须将它们分别备份并作为最后一步还原到新数据库中。

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