我遵循了
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
我现在尝试运行sqlcmd以使用以下命令导入数据;我遇到了一个问题,这让我觉得这不是传统的SQL转储.不确定传统的SQL转储是什么样的,但是大部分文件看起来都很乱,^ @ ^ @ ^ @ ^ @当然还有其他东西.
/opt/mssql-tools/bin/sqlcmd -S localhost -i /backups/myBackup.bak -U sa -P myPassword1! -x
最后;我收到此错误:
Sqlcmd: Error: Syntax error at line 56048 near command ‘GO’ in file ‘/backups/myBackup.bak’.
最终答案
我对此的最终解决方案主要来自使用-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'"
According to the sqlcmd Docs,您使用的-i标志指定:
The file that contains a batch of SQL statements or stored procedures.
如果将数据库备份文件作为参数,那么该标志可能无法正常工作.