Sql server 复制SQL Server 2016数据库的内容

Sql server 复制SQL Server 2016数据库的内容,sql-server,linux,docker,Sql Server,Linux,Docker,我想通过一张纸条在两台SQL Server服务器之间复制数据库的全部内容:模式和数据,最好嵌入linux docker映像中。 副本将在测试环境中用于测试目的 我没有什么限制: 我能够通过sqlcmd协议访问选定的DBs 我无法访问服务器上的文件 我想从linux执行脚本 我放弃了哪些解决方案: 备份(bak)文件,因为我没有文件访问权限 Bacpac-据我所知,我没有必要的权限 我认为可能有效,但似乎设计过度: 用于创建在linux上可用的DAC文件 使用dac更新目标数据库上的结构 使

我想通过一张纸条在两台SQL Server服务器之间复制数据库的全部内容:模式和数据,最好嵌入linux docker映像中。 副本将在测试环境中用于测试目的

我没有什么限制:

  • 我能够通过sqlcmd协议访问选定的DBs
  • 我无法访问服务器上的文件
  • 我想从linux执行脚本
  • 我放弃了哪些解决方案:

    • 备份(bak)文件,因为我没有文件访问权限
    • Bacpac-据我所知,我没有必要的权限
    我认为可能有效,但似乎设计过度:

    • 用于创建在linux上可用的DAC文件
    • 使用dac更新目标数据库上的结构
    • 使用bcp从复制数据
    由于结构故障的更新,解决方案可能会失败

    还有其他我忽略的选择吗? 还是更好的主意

    编辑: I'v实现了如上所述的解决方案(sqlpackage+bcp),并将其固定在linux上


    不过,仍在寻找更好的方法。

    在SQL Server management studio中,您可以右键单击源数据库并选择任务>生成脚本。在那里,您可以选择导出架构和数据。然后,您可能会得到一个巨大的SQL脚本,可以在目标数据库上执行。您可能需要对其进行一些编辑,以避免它试图创建您的目标数据库(如果该数据库已经存在)。数据库中的用户也是如此。

    我一直在Visual Studio中使用SQL schema compare和SQL Data compare与SSDT进行比较,在与您相同的场景中取得了一些成功

    最好的顺序是首先进行模式比较,但从选项中心取消选择用户/权限和角色成员

    执行更新,然后再次比较,但这次只从非应用程序范围的对象进行登录

    然后只做用户、权限和角色成员身份

    现在您可以进行数据比较-单击以仅显示源中的记录(因为您的目标数据库为空)

    如果您遇到外键问题,那么您可能必须首先选择某些表,更新它们,然后执行其余的表

    请注意,数据比较不会对超过一定大小的表进行比较——但我相信我可以处理多达500000条记录


    下次您需要同步数据库时,它应该会快得多,因为在比较中要做的工作会少。

    您可以尝试通过sys.*创建数据库,并使用由INFORMATION_SCHEMA.COLUMNS创建的脚本将表填充到动态查询中,或将数据转换为XML,而不是使用Management Studio生成的脚本。 如果您的SQL Server安装没有权限写入您可以访问的任何文件夹,那么您可以在数据库中配置一个带有连接字符串的小型exe

    因此,您需要为每种对象类型编写一个脚本,并为获取数据编写一个脚本。。我认为这不值得,因为你的方法更快,但我只是提到了这一点,以防触发任何想法

    例如,您可以创建如下存储过程:

    SELECT 'IF object_ID(N''[' + schema_name(schema_id) + '].[' + Name + ']'') IS NOT NULL 
                   DROP PROCEDURE ['+ schema_name(schema_id) +' ].[' + Name + ']' + char(13) + char(10) + 'GO' + char(13) + char(10) +
                   OBJECT_DEFINITION(OBJECT_ID) + char(13) +char(10) + 'GO' + char(13) + char(10)
                   FROM sys.procedures
                   WHERE is_ms_shipped = 0 and Name = 'Loop Name'
    

    PS小心使用BCP它太糟糕了:D

    你试过使用微软的MSSQL脚本工具吗?使用MSSQL Scripter和python从CLI转储架构和/或数据的详细信息

    他们的一些代码示例:

    将架构写入文件:

    mssql-scripter -S .\sql2016 -d WideWorldImporters --include-objects sales.CustomerCategories -f c:\test\sales_CustCategory.sql  
    
    将数据显示到控制台:

    mssql-scripter -S .\sql2016 -d WideWorldImporters --data-only --include-objects sales.CustomerCategories
    

    我以docker image的形式实现了我的变通方法:不过,我还是在寻找更好的解决方案,正如我在问题中提到的:我希望以linux脚本的形式执行它,而不使用SSMS@mjpolak正如我在问题中提到的那样,我不理解源代码是在linux中的:我希望以linux脚本的形式执行它,而不使用SSM。此外,我还实现了您在这里描述的自动化:只需寻找更好的解决方案,QLPackage就是一个完全按照您描述的方式进行操作的工具。感谢BCP的提醒,现在看起来不错,但我会小心的