代码之家  ›  专栏  ›  技术社区  ›  TJ Biddle

如何将SQL Server RDS备份导入到SQL Server Linux Docker实例中?

  •  4
  • TJ Biddle  · 技术社区  · 6 年前

    我遵循了 AWS documentation 使用其存储过程从RDS导入/导出数据库时。

    命令类似于:

    exec msdb.dbo.rds_backup_database 
                  @source_db_name='MyDatabase', 
                  @s3_arn_to_backup_to='my-bucket/myBackup.bak'
    

    这部分工作得很好,过去我做过很多次。

    不过,我现在想实现的是将这个数据库恢复到本地SQL Server实例;不过,我目前正在努力。我假设这不是一个“正常”的SQL Server转储,但我不确定有什么区别。

    我创造了一个新的 SQL Server for Linux Docker 实例;似乎都设置好了。我做了一些改变 sqlcmd 安装了工具;所以从技术上讲,我运行的图像是由这个dockerfile组成的;没有什么不同。

    FROM microsoft/mssql-server-linux:2017-latest
    
    RUN apt-get update && \
        apt-get install -y curl && \
        curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - && \
        apt-get update && \
        apt-get install -y mssql-tools unixodbc-dev
    

    这个图像很好用,我是通过 docker build -t sql . 并通过 docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=myPassword1!' -p 1433:1433 -v $(pwd):/backups sql

    在本地文件夹中,我下载了来自RDS的备份,因此该文件现在位于 /backups/myBackup.bak

    我现在试着跑 实用工具 使用以下命令导入数据;我遇到了一个问题,这使我认为这不是传统的SQL转储。不确定传统的SQL转储看起来是什么样子,但大多数文件看起来都是乱七八糟的 ^@^@^@^@ 当然还有其他事情。

    /opt/mssql-tools/bin/sqlcmd -S localhost -i /backups/myBackup.bak -U sa -P myPassword1! -x
    

    最后,我得到了这个错误:

    sqlcmd:错误:在文件“/backups/mybackup.bak”中命令“go”附近的第56048行出现语法错误。

    最终答案

    我的最终解决方案主要来自于使用 -Q 运行一个 RESTORE 查询而不是用文件导入,但我还需要包括一些 MOVE 选项,因为它们指向Windows文件路径。

    /opt/mssql-tools/bin/sqlcmd -U SA -P myPassword -Q "RESTORE DATABASE MyDatabase FROM DISK = N'/path/to/my/file.bak' WITH MOVE 'mydatabase' TO '/var/opt/mssql/mydatabase.mdf', MOVE 'mydatabase_log' TO '/var/opt/mssql/mydatabase.ldf', REPLACE"
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Adil B Cleve Green    6 年前

    RESTORE DATABASE

    /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P myPassword1! -Q "RESTORE DATABASE MyDatabase FROM DISK='/backups/myBackup.bak'"
    

    According to the sqlcmd Docs -i