Восстановить базу данных в Docker-контейнере
Получение ошибки ниже при восстановлении базы данных AdventureWorks2017 в Docker-контейнере. Запуск SQL Server 2019 CTP 2.0 (mcr.microsoft.com/mssql/server:vNext-CTP2.0-ubuntu) Сохраняются как резервные, так и целевые тома данных. Нет проблем при создании новой базы данных. Проверены пути и они верны. Не возникает проблем при восстановлении с использованием образа докера последней версии 2017 года.
У кого-нибудь еще есть эта проблема с 2019-CTP2, обходные пути?
Сообщение 3634, уровень 16, состояние 1, строка 7 Операционная система возвратила ошибку "2(система не может найти указанный файл.)" При попытке "RestoreContainer::ValidateTargetForCreation" для "/var/opt/mssql/data/AdventureWorks2017".mdf. Сообщение 3156, уровень 16, состояние 5, строка 7 Файл "AdventureWorks2017" не может быть восстановлен в "/var/opt/mssql/data/AdventureWorks2017.mdf". Используйте WITH MOVE, чтобы определить правильное местоположение файла. Сообщение 3634, уровень 16, состояние 1, строка 7 Операционная система вернула ошибку "2(система не может найти указанный файл.)" При попытке "RestoreContainer::ValidateTargetForCreation" для "/var/opt/mssql/log/AdventureWorks2017_log".ldf. Сообщение 3156, уровень 16, состояние 5, строка 7 Файл "AdventureWorks2017_log" не может быть восстановлен в "/var/opt/mssql/log/AdventureWorks2017_log.ldf". Используйте WITH MOVE, чтобы определить правильное местоположение файла. Msg 3119, уровень 16, состояние 1, строка 7 Были выявлены проблемы при планировании оператора RESTORE. Предыдущие сообщения содержат подробности. Сообщение 3013, уровень 16, состояние 1, строка 7 RESTORE DATABASE завершается ненормально.
создать контейнер.
$datapath = "D:\Foo";
$logpath = "D:\Foo";
$backuppath = "D:\Foo";
$pass = ":-)"
$ct = (docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=$pass" `
-e "MSSQL_PID=Developer" -p 2017:1433 `
-e "MSSQL_TCP_PORT=1433" `
-v ${datapath}:/var/opt/mssql/data `
-v ${logpath}:/var/opt/mssql/log `
-v ${backuppath}:/var/opt/mssql/backup `
-e "MSSQL_BACKUP_DIR=/var/opt/mssql/backup" `
-e "MSSQL_DATA_DIR=/var/opt/mssql/data" `
-e "MSSQL_LOG_DIR=/var/opt/mssql/log" `
-d mcr.microsoft.com/mssql/server:vNext-CTP2.0-ubuntu)
Восстановить команду.
RESTORE DATABASE [AdventureWorks2017] FROM DISK = N'/var/opt/mssql/backup/AdventureWorks2017.bak'
WITH FILE = 1,
MOVE N'AdventureWorks2017' TO N'/var/opt/mssql/data/AdventureWorks2017.mdf',
MOVE N'AdventureWorks2017_log' TO N'/var/opt/mssql/log/AdventureWorks2017_log.ldf',
NOUNLOAD, STATS = 1
7 ответов
Был в состоянии обойти эту проблему, сначала создав пустую базу данных, а затем восстановив с помощью параметра замены.
Я воспроизвел эту проблему в Windows 1909, Docker Desktop 2.3.0.3 и SQL Server 2019.
Я проверил 3 обходных пути
- Обходной путь Дэниела по созданию базы данных и восстановлению поверх нее
- Создайте файлы вручную перед восстановлением поверх них
- Использовать сопоставленное хранилище тома вместо сопоставленного хранилища папок хоста
Я обнаружил, что проблема возникает только тогда, когда вы указываете флаг docker -v или --mount для сопоставления папки хоста с папкой контейнера. К сожалению, это именно то, что я хотел сделать, чтобы воспользоваться преимуществами различных томов хранения, подключенных к моему хосту.
Мне удалось успешно восстановить базы данных в другие папки, включая папки с отображением томов, при наличии разрешений. Либо убедитесь, что папка доступна для записи пользователем mssql, либо запустите процесс от имени пользователя root.
Он также позволяет создавать файлы вручную перед восстановлением поверх них. Обратите внимание, что вам необходимо использовать параметр REPLACE при восстановлении, даже если база данных еще не существует.
docker run `
-e "ACCEPT_EULA=Y" -e "SA_PASSWORD=$pwd" `
-e "MSSQL_DATA_DIR=/home/data" `
-e "MSSQL_LOG_DIR=/home/log" `
-e "MSSQL_BACKUP_DIR=/home/backup" `
--mount source=sql2019sysdatavol,target=/var/opt/mssql `
--mount type=bind,source="E:\SQL2019\Data",target=/home/data `
--mount type=bind,source="E:\SQL2019\Log",target=/home/log `
--mount type=bind,source="E:\SQL2019\Backup",target=/home/backup `
--name sql2019 --hostname sql2019 `
-p 1433:1433 `
-d mcr.microsoft.com/mssql/server:2019-latest
docker container exec sql2019 touch /home/data/AdventureWorks2019.mdf
docker container exec sql2019 touch /home/log/AdventureWorks2019_Log.ldf
$cmd = " `
RESTORE DATABASE [AdventureWorks2019] `
FROM DISK = N'/home/backup/AdventureWorks2019.bak' `
WITH FILE = 1, STATS = 5, REPLACE, `
MOVE N'AdventureWorks2017' TO N'/home/data/AdventureWorks2019.mdf', `
MOVE N'AdventureWorks2017_Log' TO N'/home/log/AdventureWorks2019_Log.ldf'"
sqlcmd '-Usa' "-P$pwd" '-S127.0.0.1,1433' "-Q"$cmd""
5 percent processed. ... 100 percent processed. Processed 26344 pages for database 'AdventureWorks2019', file 'AdventureWorks2017' on file 1. Processed 2 pages for database 'AdventureWorks2019', file 'AdventureWorks2017_log' on file 1. RESTORE DATABASE successfully processed 26346 pages in 3.018 seconds (68.198 MB/sec).
Я боролся с этой проблемой часами. Проблема в том, что у каталога не было полного разрешения.
chmod 777 hds
cd hds
sqlcmd -U SA -P <db_password> -Q "RESTORE DATABASE XSP_A0 FROM DISK=N'/home/hds/DBchema.bak' WITH REPLACE, MOVE N'XSP_A0' TO N'/home/hds/XSP_A0.mdf' , MOVE N'XSP_A0_log' TO N'/home/hds/XSP_A0.ldf'"
Я запускаю sql-сервер в контейнере Linux, работающий на ноутбуке с Windows 10. Я использовал следующую команду.
docker run --name testdb3 -d -p 1433:1433 -e MSSQL_SA_PASSWORD=G52ndTOur -e ACCEPT_EULA=Y -v D:/Vivek/Trials/SqlDocker/data:/var/opt/mssql/data -v D:/Vivek/Trials/SqlDocker/log:/var/opt/mssql/log -v D:/Vivek/Trials/SqlDocker/secrets:/var/opt/mssql/secrets mcr.microsoft.com/mssql/server
После выполнения команды и запуска контейнера на компьютере с Windows будут созданы три папки, как показано ниже.
Теперь скопируйте файл .bak в одну из этих папок, скажем, в папку данных.
Подключитесь к серверу, работающему в контейнере, с помощью SSMS следующим образом. ',1433' не является обязательным, потому что 1433 является значением по умолчанию. Таким образом, точка (., Представляющая localhost) также должна работать.
Затем создайте базу данных, которую вы пытаетесь восстановить. В моем случае это SqlServerOnDocker
Теперь щелкните правой кнопкой мыши Базы данных и выберите Восстановить базу данных.
Щелкните ОК, а затем снова ОК. Теперь выберите «Параметры», как показано ниже, в том же диалоговом окне «Восстановление базы данных».
Теперь нажмите ОК, чтобы восстановить базу данных.
Проверьте, предоставили ли вы полные права доступа к папке для сохранения mdf и ldf этой базы данных.
Я использую Mac, пытаясь использовать подключенные тома хоста для данных, и я обнаружил, что это связано с именами файлов.
я столкнулся с той же проблемой на Mac OS. Я использую рабочий стол Docker. Итак, я получил такую ошибку: рабочий стол bc docker имеет ограничения для настройки «предела виртуального диска». Откройте Docker Desktop -> настройки -> Ресурсы -> лимит виртуального диска и увеличьте лимит диска, после этого все будет работать нормально.