Восстановление базы данных SQL Server в контейнере Linux
Область применения: SQL Server — Linux
В этом руководстве показано, как переместить и восстановить файл резервного копирования SQL Server в образ контейнера SQL Server 2017 (14.x), запущенный в Docker.
В этом руководстве показано, как переместить и восстановить файл резервного копирования SQL Server в образ контейнера SQL Server 2019 (15.x) Linux, запущенный в Docker.
В этом руководстве показано, как переместить и восстановить файл резервного копирования SQL Server в образ контейнера SQL Server 2022 (16.x) Linux, работающий в Docker.
- Извлеките и запустите образ контейнера Linux SQL Server.
- Скопируйте файл базы данных Wide World Importers в контейнер.
- Восстановите базу данных в контейнере.
- Запустите инструкции Transact-SQL для просмотра и изменения базы данных.
- Создайте резервную копию измененной базы данных.
Необходимые компоненты
- Установленная среда выполнения контейнера, например Docker или Podman
- Установка последней версии sqlcmd
- Требования к системе для SQL Server на Linux
Параметры развертывания
В этом разделе приведены варианты развертывания для вашей среды.
Sqlcmd в настоящее время не поддерживает MSSQL_PID
параметр при создании контейнеров. Если вы используете инструкции sqlcmd в этом руководстве, создайте контейнер с выпуском SQL Server для разработчиков. Используйте инструкции по интерфейсу командной строки (CLI), чтобы создать контейнер с помощью выбранной лицензии. Дополнительные сведения см. в статье "Развертывание и подключение к контейнерам SQL Server Linux".
Извлечение и запуск образа контейнера
Откройте терминал bash в Linux.
Извлеките образ контейнера SQL Server 2017 (14.x) на Linux из Реестра контейнеров Майкрософт.
sudo docker pull mcr.microsoft.com/mssql/server:2017-latest
Чтобы запустить образ контейнера с помощью Docker, выполните следующую команду:
sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<password>' \ --name 'sql1' -p 1401:1433 \ -v sql1data:/var/opt/mssql \ -d mcr.microsoft.com/mssql/server:2017-latest
Внимание
Пароль должен соответствовать политике паролей по умолчанию SQL Server. По умолчанию пароль должен быть не короче восьми символов и содержать три вида символов из следующих: прописные буквы, строчные буквы, десятичные цифры, специальные символы. Пароли могут иметь длину до 128 символов. Рекомендуется использовать максимально длинные и сложные пароли.
Эта команда создает контейнер SQL Server 2017 (14.x) с выпуском Developer (по умолчанию). Порт
1433
SQL Server предоставляется на узле в качестве порта1401
. Необязательный-v sql1data:/var/opt/mssql
параметр создает контейнер тома данных с именемsql1data
. Он используется для сохранения данных, созданных SQL Server.Внимание
В этом примере используется контейнер томов данных в DOCKER. Дополнительные сведения см. в статье Настройка образов контейнеров SQL Server в Docker.
Чтобы просмотреть контейнеры, используйте
docker ps
команду.sudo docker ps -a
STATUS
Если столбец отображает состояниеUp
, SQL Server выполняется в контейнере и прослушивает порт, указанный в столбцеPORTS
. Если отображаетсяSTATUS
Exited
столбец контейнера SQL Server, см. статью "Устранение неполадок контейнеров Docker SQL Server".
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
941e1bdf8e1d mcr.microsoft.com/mssql/server/mssql-server-linux "/bin/sh -c /opt/m..." About an hour ago Up About an hour 0.0.0.0:1401->1433/tcp sql1
Откройте терминал bash в Linux.
Извлеките образ контейнера SQL Server 2019 (15.x) на Linux из Реестра контейнеров Майкрософт.
sudo docker pull mcr.microsoft.com/mssql/server:2019-latest
Чтобы запустить образ контейнера с помощью Docker, выполните следующую команду:
sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<password>' \ --name 'sql1' -p 1401:1433 \ -v sql1data:/var/opt/mssql \ -d mcr.microsoft.com/mssql/server:2019-latest
Внимание
Пароль должен соответствовать политике паролей по умолчанию SQL Server. По умолчанию пароль должен быть не короче восьми символов и содержать три вида символов из следующих: прописные буквы, строчные буквы, десятичные цифры, специальные символы. Пароли могут иметь длину до 128 символов. Рекомендуется использовать максимально длинные и сложные пароли.
Эта команда создает контейнер SQL Server 2019 (15.x) с выпуском Developer (по умолчанию). Порт
1433
SQL Server предоставляется на узле в качестве порта1401
. Необязательный-v sql1data:/var/opt/mssql
параметр создает контейнер тома данных с именемsql1data
. Он используется для сохранения данных, созданных SQL Server.Внимание
В этом примере используется контейнер томов данных в DOCKER. Дополнительные сведения см. в статье Настройка образов контейнеров SQL Server в Docker.
Чтобы просмотреть контейнеры, используйте
docker ps
команду.sudo docker ps -a
STATUS
Если столбец отображает состояниеUp
, SQL Server выполняется в контейнере и прослушивает порт, указанный в столбцеPORTS
. Если отображаетсяSTATUS
Exited
столбец контейнера SQL Server, см. статью "Устранение неполадок контейнеров Docker SQL Server".$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 941e1bdf8e1d mcr.microsoft.com/mssql/server/mssql-server-linux "/bin/sh -c /opt/m..." About an hour ago Up About an hour 0.0.0.0:1401->1433/tcp sql1
Откройте терминал bash в Linux.
Извлеките образ контейнера SQL Server 2022 (16.x) на Linux из Реестра контейнеров Майкрософт.
sudo docker pull mcr.microsoft.com/mssql/server:2022-latest
Чтобы запустить образ контейнера с помощью Docker, выполните следующую команду:
sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<password>' \ --name 'sql1' -p 1401:1433 \ -v sql1data:/var/opt/mssql \ -d mcr.microsoft.com/mssql/server:2022-latest
Внимание
Пароль должен соответствовать политике паролей по умолчанию SQL Server. По умолчанию пароль должен быть не короче восьми символов и содержать три вида символов из следующих: прописные буквы, строчные буквы, десятичные цифры, специальные символы. Пароли могут иметь длину до 128 символов. Рекомендуется использовать максимально длинные и сложные пароли.
Эта команда создает контейнер SQL Server 2022 (16.x) с выпуском Developer (по умолчанию). Порт
1433
SQL Server предоставляется на узле в качестве порта1401
. Необязательный-v sql1data:/var/opt/mssql
параметр создает контейнер тома данных с именемsql1data
. Он используется для сохранения данных, созданных SQL Server.Внимание
В этом примере используется контейнер томов данных в DOCKER. Дополнительные сведения см. в статье Настройка образов контейнеров SQL Server в Docker.
Чтобы просмотреть контейнеры, используйте
docker ps
команду.sudo docker ps -a
STATUS
Если столбец отображает состояниеUp
, SQL Server выполняется в контейнере и прослушивает порт, указанный в столбцеPORTS
. Если отображаетсяSTATUS
Exited
столбец контейнера SQL Server, см. статью "Устранение неполадок контейнеров Docker SQL Server".$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 941e1bdf8e1d mcr.microsoft.com/mssql/server/mssql-server-linux "/bin/sh -c /opt/m..." About an hour ago Up About an hour 0.0.0.0:1401->1433/tcp sql1
Смена пароля администратора
Учетная sa
запись является системным администратором экземпляра SQL Server, созданного во время установки. После создания контейнера SQL Server указанную вами переменную среды MSSQL_SA_PASSWORD
можно обнаружить, запустив echo $MSSQL_SA_PASSWORD
в контейнере. В целях безопасности измените sa
пароль:
Выберите надежный пароль, используемый для учетной
sa
записи. Пароль должен соответствовать политике паролей по умолчанию SQL Server. По умолчанию пароль должен быть не короче восьми символов и содержать три вида символов из следующих: прописные буквы, строчные буквы, десятичные цифры, специальные символы. Пароли могут иметь длину до 128 символов. Рекомендуется использовать максимально длинные и сложные пароли.Используйте
docker exec
для запуска программы sqlcmd, чтобы изменить пароль с помощью инструкции Transact-SQL. Замените<old-password>
и<new-password>
собственными значениями пароля.Внимание
Переменная среды
SA_PASSWORD
является нерекомендуемой. Вместо этого используйтеMSSQL_SA_PASSWORD
.sudo docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd \ -S localhost -U sa -P '<old-password>' \ -Q 'ALTER LOGIN sa WITH PASSWORD="<new-password>"'
docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd ` -S localhost -U sa -P "<old-password>" ` -Q "ALTER LOGIN sa WITH PASSWORD='<new-password>'"
Копирование файла резервной копии в контейнер
В этом руководстве используются примеры баз данных Wide World Importers для Microsoft SQL. Выполните следующие действия, чтобы скачать файл резервной копии базы данных Wide World Importers и скопировать его в контейнер SQL Server.
Во-первых, создайте
docker exec
папку резервного копирования. Следующая команда создает/var/opt/mssql/backup
каталог в контейнере SQL Server.sudo docker exec -it sql1 mkdir /var/opt/mssql/backup
Затем скачайте файл WideWorldImporters-Full.bak на хост-компьютер. В следующих командах перейдите в каталог home/user и скачивает файл резервной копии как
wwi.bak
.cd ~ curl -L -o wwi.bak 'https://github.com/Microsoft/sql-server-samples/releases/download/wide-world-importers-v1.0/WideWorldImporters-Full.bak'
Используется
docker cp
для копирования файла резервной копии в контейнер в каталоге/var/opt/mssql/backup
.sudo docker cp wwi.bak sql1:/var/opt/mssql/backup
Восстановление базы данных
Теперь файл резервной копии находится в контейнере. Перед восстановлением резервной копии важно узнать логические имена и типы файлов в резервной копии. Следующие команды Transact-SQL проверяют резервную копию и выполняют восстановление с помощью sqlcmd в контейнере.
Совет
В этом руководстве средство sqlcmd используется в контейнере, так как оно предустановлено в этом контейнере. Однако можно также запускать инструкции Transact-SQL с другими клиентскими средствами за пределами контейнера, такими как расширение SQL Server для Visual Studio Code или использование SQL Server Management Studio в Windows для управления SQL Server на Linux. Для подключения используйте порт узла, сопоставленный с портом 1433 в контейнере. В этом примере на localhost,1401
хост-компьютере и Host_IP_Address,1401
удаленно.
Запустите sqlcmd внутри контейнера, чтобы вывести список логических имен файлов и путей внутри резервной копии. Это делается с помощью инструкции
RESTORE FILELISTONLY
Transact-SQL.sudo docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd -S localhost \ -U sa -P '<new-password>' \ -Q 'RESTORE FILELISTONLY FROM DISK = "/var/opt/mssql/backup/wwi.bak"' \ | tr -s ' ' | cut -d ' ' -f 1-2
Должен отобразиться результат, аналогичный приведенному ниже:
LogicalName PhysicalName ------------------------------------------ WWI_Primary D:\Data\WideWorldImporters.mdf WWI_UserData D:\Data\WideWorldImporters_UserData.ndf WWI_Log E:\Log\WideWorldImporters.ldf WWI_InMemory_Data_1 D:\Data\WideWorldImporters_InMemory_Data_1
RESTORE DATABASE
Вызовите команду для восстановления базы данных внутри контейнера. Укажите новые пути для каждого из файлов в предыдущем шаге.sudo docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd \ -S localhost -U sa -P '<new-password>' \ -Q 'RESTORE DATABASE WideWorldImporters FROM DISK = "/var/opt/mssql/backup/wwi.bak" WITH MOVE "WWI_Primary" TO "/var/opt/mssql/data/WideWorldImporters.mdf", MOVE "WWI_UserData" TO "/var/opt/mssql/data/WideWorldImporters_userdata.ndf", MOVE "WWI_Log" TO "/var/opt/mssql/data/WideWorldImporters.ldf", MOVE "WWI_InMemory_Data_1" TO "/var/opt/mssql/data/WideWorldImporters_InMemory_Data_1"'
Должен отобразиться результат, аналогичный приведенному ниже:
Processed 1464 pages for database 'WideWorldImporters', file 'WWI_Primary' on file 1. Processed 53096 pages for database 'WideWorldImporters', file 'WWI_UserData' on file 1. Processed 33 pages for database 'WideWorldImporters', file 'WWI_Log' on file 1. Processed 3862 pages for database 'WideWorldImporters', file 'WWI_InMemory_Data_1' on file 1. Converting database 'WideWorldImporters' from version 852 to the current version 869. Database 'WideWorldImporters' running the upgrade step from version 852 to version 853. Database 'WideWorldImporters' running the upgrade step from version 853 to version 854. Database 'WideWorldImporters' running the upgrade step from version 854 to version 855. Database 'WideWorldImporters' running the upgrade step from version 855 to version 856. Database 'WideWorldImporters' running the upgrade step from version 856 to version 857. Database 'WideWorldImporters' running the upgrade step from version 857 to version 858. Database 'WideWorldImporters' running the upgrade step from version 858 to version 859. Database 'WideWorldImporters' running the upgrade step from version 859 to version 860. Database 'WideWorldImporters' running the upgrade step from version 860 to version 861. Database 'WideWorldImporters' running the upgrade step from version 861 to version 862. Database 'WideWorldImporters' running the upgrade step from version 862 to version 863. Database 'WideWorldImporters' running the upgrade step from version 863 to version 864. Database 'WideWorldImporters' running the upgrade step from version 864 to version 865. Database 'WideWorldImporters' running the upgrade step from version 865 to version 866. Database 'WideWorldImporters' running the upgrade step from version 866 to version 867. Database 'WideWorldImporters' running the upgrade step from version 867 to version 868. Database 'WideWorldImporters' running the upgrade step from version 868 to version 869. RESTORE DATABASE successfully processed 58455 pages in 18.069 seconds (25.273 MB/sec).
Проверка восстановленной базы данных
Выполните следующий запрос, чтобы отобразить список имен баз данных в контейнере:
sudo docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd \
-S localhost -U sa -P '<new-password>' \
-Q 'SELECT name FROM sys.databases'
Вы увидите WideWorldImporters
в списке баз данных.
Внесение изменения
Чтобы внести изменения в базу данных, выполните следующие действия.
Запустите запрос, чтобы просмотреть первые 10 элементов в
Warehouse.StockItems
таблице.sudo docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd \ -S localhost -U sa -P '<new-password>' \ -Q 'SELECT TOP 10 StockItemID, StockItemName FROM WideWorldImporters.Warehouse.StockItems ORDER BY StockItemID'
Вы увидите список идентификаторов и имен элементов:
StockItemID StockItemName ----------- ----------------- 1 USB missile launcher (Green) 2 USB rocket launcher (Gray) 3 Office cube periscope (Black) 4 USB food flash drive - sushi roll 5 USB food flash drive - hamburger 6 USB food flash drive - hot dog 7 USB food flash drive - pizza slice 8 USB food flash drive - dim sum 10 drive variety pack 9 USB food flash drive - banana 10 USB food flash drive - chocolate bar
Обновите описание первого элемента с помощью следующей
UPDATE
инструкции:sudo docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd \ -S localhost -U sa -P '<new-password>' \ -Q 'UPDATE WideWorldImporters.Warehouse.StockItems SET StockItemName="USB missile launcher (Dark Green)" WHERE StockItemID=1; SELECT StockItemID, StockItemName FROM WideWorldImporters.Warehouse.StockItems WHERE StockItemID=1'
Должен отобразиться результат, аналогичный приведенному ниже:
(1 rows affected) StockItemID StockItemName ----------- ------------------------------------ 1 USB missile launcher (Dark Green)
Создание резервной копии
После восстановления базы данных в контейнере вам может потребоваться регулярно создавать резервные копии базы данных в работающем контейнере. Соответствующие действия выполняются по той же схеме, что и в предыдущих шагах, только в обратном порядке.
BACKUP DATABASE
Используйте команду Transact-SQL для создания резервной копии базы данных в контейнере. В этом руководстве создается новый файл резервной копии вwwi_2.bak
ранее созданном/var/opt/mssql/backup
каталоге.sudo docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd \ -S localhost -U sa -P '<new-password>' \ -Q "BACKUP DATABASE [WideWorldImporters] TO DISK = N'/var/opt/mssql/backup/wwi_2.bak' WITH NOFORMAT, NOINIT, NAME = 'WideWorldImporters-full', SKIP, NOREWIND, NOUNLOAD, STATS = 10"
Вы должны увидеть результат, аналогичный приведенному ниже:
10 percent processed. 20 percent processed. 30 percent processed. 40 percent processed. 50 percent processed. 60 percent processed. 70 percent processed. Processed 1200 pages for database 'WideWorldImporters', file 'WWI_Primary' on file 1. Processed 53096 pages for database 'WideWorldImporters', file 'WWI_UserData' on file 1. 80 percent processed. Processed 3865 pages for database 'WideWorldImporters', file 'WWI_InMemory_Data_1' on file 1. Processed 938 pages for database 'WideWorldImporters', file 'WWI_Log' on file 1. 100 percent processed. BACKUP DATABASE successfully processed 59099 pages in 25.056 seconds (18.427 MB/sec).
Затем скопируйте файл резервной копии из контейнера на хост-компьютер.
cd ~ sudo docker cp sql1:/var/opt/mssql/backup/wwi_2.bak wwi_2.bak ls -l wwi*
Использование хранимых данных
Кроме создания резервных копий базы данных для защиты данных, можно также использовать контейнеры томов данных. В начале этого руководства был создан sql1
контейнер с параметром -v sql1data:/var/opt/mssql
. Контейнер sql1data
тома данных сохраняет /var/opt/mssql
данные даже после удаления контейнера. Следующие шаги полностью удаляют sql1
контейнер, а затем создают новый контейнер sql2
с сохраненными данными.
Остановите
sql1
контейнер.sudo docker stop sql1
Удалите контейнер. Это не удаляет ранее созданный
sql1data
контейнер тома данных и сохраненные в нем данные.sudo docker rm sql1
Создайте контейнер
sql2
и повторно используйте контейнер томаsql1data
данных.sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<password>' \ --name 'sql2' -e 'MSSQL_PID=Developer' -p 1401:1433 \ -v sql1data:/var/opt/mssql -d mcr.microsoft.com/mssql/server:2017-latest
Теперь база данных Wide World Importers находится в новом контейнере. Выполните запрос, чтобы проверить внесенное ранее изменение.
sudo docker exec -it sql2 /opt/mssql-tools/bin/sqlcmd \ -S localhost -U sa -P '<new-password>' \ -Q 'SELECT StockItemID, StockItemName FROM WideWorldImporters.Warehouse.StockItems WHERE StockItemID=1'
Пароль
sa
не является паролем, указанным дляsql2
контейнераMSSQL_SA_PASSWORD=<password>
. Все данные SQL Server были восстановлены изsql1
, включая измененный пароль, приведенный ранее в руководстве. По сути, некоторые параметры, подобные этому, игнорируются из-за восстановления данных в /var/opt/mssql. По этой причине пароль имеет значение<new-password>
, как показано здесь.
Остановите
sql1
контейнер.sudo docker stop sql1
Удалите контейнер. Это не удаляет ранее созданный
sql1data
контейнер тома данных и сохраненные в нем данные.sudo docker rm sql1
Создайте контейнер
sql2
и повторно используйте контейнер томаsql1data
данных.sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<password>' \ --name 'sql2' -e 'MSSQL_PID=Developer' -p 1401:1433 \ -v sql1data:/var/opt/mssql -d mcr.microsoft.com/mssql/server:2019-latest
Теперь база данных Wide World Importers находится в новом контейнере. Выполните запрос, чтобы проверить внесенное ранее изменение.
sudo docker exec -it sql2 /opt/mssql-tools/bin/sqlcmd \ -S localhost -U sa -P '<new-password>' \ -Q 'SELECT StockItemID, StockItemName FROM WideWorldImporters.Warehouse.StockItems WHERE StockItemID=1'
Пароль
sa
не является паролем, указанным дляsql2
контейнераMSSQL_SA_PASSWORD=<password>
. Все данные SQL Server были восстановлены изsql1
, включая измененный пароль, приведенный ранее в руководстве. По сути, некоторые параметры, подобные этому, игнорируются из-за восстановления данных в /var/opt/mssql. По этой причине пароль имеет значение<new-password>
, как показано здесь.
Остановите
sql1
контейнер.sudo docker stop sql1
Удалите контейнер. Это не удаляет ранее созданный
sql1data
контейнер тома данных и сохраненные в нем данные.sudo docker rm sql1
Создайте контейнер
sql2
и повторно используйте контейнер томаsql1data
данных.sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<password>' \ --name 'sql2' -e 'MSSQL_PID=Developer' -p 1401:1433 \ -v sql1data:/var/opt/mssql -d mcr.microsoft.com/mssql/server:2022-latest
Теперь база данных Wide World Importers находится в новом контейнере. Выполните запрос, чтобы проверить внесенное ранее изменение.
sudo docker exec -it sql2 /opt/mssql-tools/bin/sqlcmd \ -S localhost -U sa -P '<new-password>' \ -Q 'SELECT StockItemID, StockItemName FROM WideWorldImporters.Warehouse.StockItems WHERE StockItemID=1'
Пароль
sa
не является паролем, указанным дляsql2
контейнераMSSQL_SA_PASSWORD=<password>
. Все данные SQL Server были восстановлены изsql1
, включая измененный пароль, приведенный ранее в руководстве. В действительности некоторые параметры, такие как это, игнорируются из-за восстановления данных в/var/opt/mssql
. По этой причине пароль имеет значение<new-password>
, как показано здесь.
Внимание
Пароль должен соответствовать политике паролей по умолчанию SQL Server. По умолчанию пароль должен быть не короче восьми символов и содержать три вида символов из следующих: прописные буквы, строчные буквы, десятичные цифры, специальные символы. Пароли могут иметь длину до 128 символов. Рекомендуется использовать максимально длинные и сложные пароли.
Следующий шаг
В этом руководстве вы узнали, как создать резервную копию базы данных в Windows и переместить ее на сервер Linux под управлением SQL Server 2017 (14.x) в контейнере. Вы научились выполнять следующие задачи:
В этом руководстве вы узнали, как создать резервную копию базы данных в Windows и переместить ее на сервер Linux под управлением SQL Server 2019 (15.x) в контейнере. Вы научились выполнять следующие задачи:
В этом руководстве вы узнали, как создать резервную копию базы данных в Windows и переместить ее на сервер Linux под управлением SQL Server 2022 (16.x) в контейнере. Вы научились выполнять следующие задачи:
- Создание образов контейнеров Linux SQL Server.
- Копирование резервных копий базы данных SQL Server в контейнер.
- Запустите инструкции Transact-SQL с помощью sqlcmd.
- Создание файлов резервных копий и извлечение их из контейнера.
- Используйте контейнеры томов данных для сохранения рабочих данных SQL Server.
Затем ознакомьтесь с другими сценариями конфигурации контейнеров и устранения неполадок:
Примите участие в разработке документации по SQL
Знаете ли вы, что содержимое SQL можно изменить самостоятельно? Это не только улучшит нашу документацию, но и даст вам статус участника в создании этой страницы.
Дополнительные сведения см. в разделе Участие в работе над документацией по SQL Server.