Как я могу импортировать резервную копию SQL Server RDS в экземпляр SQL Server Linux Docker? - PullRequest
0 голосов
/ 03 июля 2018

Я следовал инструкциям документации 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 для 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: Ошибка: синтаксическая ошибка в строке 56048 рядом с командой 'GO' в файле '/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"

1 Ответ

0 голосов
/ 04 июля 2018

Вы должны использовать команду 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 или хранимых процедур.

Этот флаг, скорее всего, не будет работать должным образом, если в качестве аргумента указан файл резервной копии базы данных.

...