我遵循了
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"