sql - 如何将 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 转储——但我不确定有什么区别。
我为 Linux Docker实例创建了一个新的SQL Server ;似乎一切就绪。我进行了一些更改,以便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 Docs,-i
您使用的标志指定:
包含一批 SQL 语句或存储过程的文件。
如果给定数据库备份文件作为参数,该标志可能无法正常工作。
推荐阅读
- angular - Typescript 在初始化期间为通过订阅响应读取的对象设置其他属性的属性值
- python - Kivy:支持 UI 价值的最佳方式是什么?我正在尝试使用字典,但是在将 .kv 实例中的 dict 键传递回类时遇到了麻烦
- javascript - npm i react-form-input-fields 显示错误
- javascript - 如何查看登录状态?
- reactjs - NextJS - 受保护的路由不起作用创建以下错误(JSON.parse 位置 1 处的 JSON 中的意外标记 o(
)) - react-native - 360 度视频 - 使用本机反应的 HLS 流式传输
- python - BeautifulSoup - 亚马逊和谷歌将我识别为机器人;我该如何解决?
- google-drive-api - 更改了本地 Google 文档文件中的内容?
- python - 如何遍历多个数据帧的特定列,然后比较它们的值以找到最大的?
- c++ - 是否有任何定义如何在编译时评估浮点值?