我希望在迁移项目中执行一系列查询。要生成的脚本由分析遗留数据库的工具生成,然后生成脚本以将每个旧实体映射到适当的新记录。这些脚本对于小型实体运行良好,但有些记录有数十万条记录,生成的脚本文件约为 80 MB。
运行这些脚本的最佳方式是什么?
提示中是否有一些处理较大脚本的 SQLCMD?
我还可以将脚本分解为更小的脚本,但我不想执行数百个脚本来执行迁移。
我希望在迁移项目中执行一系列查询。要生成的脚本由分析遗留数据库的工具生成,然后生成脚本以将每个旧实体映射到适当的新记录。这些脚本对于小型实体运行良好,但有些记录有数十万条记录,生成的脚本文件约为 80 MB。
运行这些脚本的最佳方式是什么?
提示中是否有一些处理较大脚本的 SQLCMD?
我还可以将脚本分解为更小的脚本,但我不想执行数百个脚本来执行迁移。
如果可能,修改导出工具以导出 BULK INSERT 兼容文件。
除此之外,您可以编写一个程序,将插入语句解析为 BULK INSERT 将接受的内容。
BULK INSERT
使用BCP
传统(非XML
)或XML
. 它是否必须获得一个新的身份并在孩子身上使用它,而您无法摆脱使用,SET IDENTITY INSERT ON
因为数据库设计已经发生了很大变化?如果是这样,我认为您最好使用 SSIS 或类似方法,并在分配身份后进行合并连接。您还可以使用 SSIS 或 BCP 将数据加载到 SQL 中的临时表中,然后使用常规 SQL(可能在 SQL 任务中的 SSIS 中)使用该OUTPUT INTO
功能来捕获身份并在 children 中使用它们。
我一直在从文件选项中查看“BULK INSERT”,但看不到文件格式的任何示例。文件可以混合行格式还是必须始终以 CSV 方式保持一致?我问的原因是我在各种父/子表中都涉及到身份,这就是当前使用每行插入的原因。
听起来这会INSERT
为每一行生成一个,这真的会很慢。如果它们也都包含在事务中,那可能会有点慢(尽管行数听起来没有那么大,以至于几乎不可能进行事务 - 就像你持有数百万行一样插入事务)。
您最好查看 ETL(DTS、SSIS、BCP 或 BULK INSERT FROM 或其他工具)来迁移数据,而不是编写每个插入的脚本。
您可以分解脚本并分部分执行(特别是如果目前它使这成为一项大事务),只需使用 PowerShell 或类似工具自动执行各个脚本。
只需执行脚本。我们定期运行大小为 100 兆字节的备份/恢复脚本。只需要30秒左右。
如果在这段时间内不要阻止您的服务器很重要,那么您将不得不真正将它分开一点。
还可以查看 mysqldump 的 -tab 选项,使用 TO OUTFILE 输出数据,这更有效,加载速度更快。