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



我遵循了 AWS 文档中有关使用其存储过程从 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

我现在尝试运行sqlcmd以使用以下命令导入数据;我遇到了一个问题,使我认为这不是传统的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"

应使用RESTORE DATABASE命令与备份文件交互,而不是将其指定为数据库命令的输入文件:

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

根据 sqlcmd 文档,您使用的-i标志指定:

包含一批 SQL 语句或存储过程的文件。

如果给定数据库备份文件作为参数,则该标志可能无法正常工作。

相关内容

最新更新