0

目前在线学习SQL。我一直在尝试从此链接恢复数据库:

http://app.sixweeksql.com:2000/SqlCourse.bak

当我通过 Docker 运行 SQL Server 时(Mac 用户,不幸的是无法运行 SSMS)。我一直在这里遵循微软的指示:

https://docs.microsoft.com/en-us/sql/linux/tutorial-restore-backup-in-sql-server-container?view=sql-server-2017

我将文件移动到我的容器中并检查了里面列出的文件(Course New 和 CourseNew_log),这样我就可以写出它的文件路径:

sudo docker cp SqlCourse.bak container_name:/var/opt/mssql/backup

其次是:

sudo docker exec -it container_name /opt/mssql-tools/bin/sqlcmd -S localhost \
   -U SA -P "Password" \
   -Q 'RESTORE FILELISTONLY FROM DISK = "/var/opt/mssql/backup/SqlCourse.bak"'

但是我只是不知道如何恢复数据库。我试过这个:

sudo docker exec -it container_name /opt/mssql-tools/bin/sqlcmd \
   -S localhost -U SA -P "Password" \
   -Q 'RESTORE DATABASE SqlCourse FROM DISK = "/var/opt/mssql/backup/SqlCourse.bak" WITH MOVE "CourseNew" TO "/var/opt/mssql/data/SqlCourse.mdf", MOVE "CourseNew_log" TO "/var/opt/mssql/data/SqlCourse.ldf"

它返回“意外参数”。显然这不是正确的选择,但我不知道该怎么做。

(运行 mcr.microsoft.com/mssql/server:2019-CTP3.2-ubuntu)

4

1 回答 1

1

单引号用于将 T-SQL 中的字符串文字括起来,因此生成的RESTORET-SQL 脚本需要:

RESTORE DATABASE SqlCourse
FROM DISK = '/var/opt/mssql/backup/SqlCourse.bak\'
WITH
      MOVE 'CourseNew' TO '/var/opt/mssql/data/SqlCourse.mdf'
    , MOVE 'CourseNew_log' TO '/var/opt/mssql/data/SqlCourse.ldf';

由于您将命令作为bashshell 命令行参数传递,因此您还需要在参数字符串前加上 '$' 前缀,并在字符串中的单引号前加上\:

sudo docker exec -it container_name /opt/mssql-tools/bin/sqlcmd \
   -S localhost -U SA -P "Password" \
   -Q $'RESTORE DATABASE SqlCourse FROM DISK = \'/var/opt/mssql/backup/SqlCourse.bak\' WITH MOVE \'CourseNew\' TO \'/var/opt/mssql/data/SqlCourse.mdf\', MOVE \'CourseNew_log\' TO \'/var/opt/mssql/data/SqlCourse.ldf\';'

RESTORE您可以通过将普通脚本复制到容器中并使用SQLCMD -i参数运行来避免转义的丑陋。

于 2019-12-08T11:58:27.583 回答