Перенос базы данных SQL Server из Windows в Linux с помощью резервного копирования и восстановления
Область применения: SQL Server — Linux
Если нужно перенести базу данных из SQL Server в Windows в SQL Server на Linux, рекомендуется использовать функцию резервного копирования и восстановления SQL Server. В этом руководстве описаны действия, необходимые для перемещения базы данных в Linux с методами резервного копирования и восстановления.
- Создание файла резервной копии в Windows с помощью SSMS
- Установка оболочки Bash в Windows
- Перемещение файла резервной копии в Linux из оболочки Bash
- Восстановление файла резервной копии в Linux с помощью Transact-SQL
- Выполнение запроса для проверки переноса
Для переноса базы данных SQL Server из Windows в Linux можно также создать группу доступности Always On SQL Server. См. статью Настройка кроссплатформенной группы доступности Always On SQL Server в Windows и Linux.
Необходимые компоненты
Для работы с этим руководством необходимо выполнить следующие условия.
На компьютере с Windows:
- установленный экземпляр SQL Server;
- установленная среда SQL Server Management Studio;
- целевая база данных для переноса.
На компьютере Linux:
- SQL Server (Red Hat Enterprise Linux, SUSE Linux Enterprise Server или Ubuntu) с инструментами командной строки.
Создание резервной копии в Windows
Создать файл резервной копии базы данных в Windows можно несколькими способами. В приведенных ниже инструкциях используется SQL Server Management Studio (SSMS).
Запустите SQL Server Management Studio на компьютере Windows.
В диалоговом окне подключения введите localhost.
В обозревателе объектов разверните узел Базы данных.
Щелкните правой кнопкой мыши целевую базу данных, выберите "Задачи", а затем нажмите кнопку "Создать резервную копию...".
В диалоговом окне Резервное копирование базы данных в поле Тип резервной копии должно быть выбрано значение Полная, а в поле Создать резервную копию на — Диск. Запишите имя и расположение файла. Например, база данных с именем
YourDB
SQL Server 2019 (15.x) имеет путь резервногоC:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\YourDB.bak
копирования по умолчанию.Нажмите кнопку ОК, чтобы создать резервную копию базы данных.
Другой вариант — выполнить запрос Transact-SQL для создания файла резервной копии. Следующая команда Transact-SQL выполняет те же действия, что и предыдущие действия для вызываемой YourDB
базы данных:
BACKUP DATABASE [YourDB]
TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\YourDB.bak'
WITH NOFORMAT, NOINIT, NAME = N'YourDB-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10;
GO
Установка оболочки Bash в Windows
Чтобы восстановить базу данных, необходимо сначала перенести файл резервной копии с компьютера Windows на целевой компьютер Linux. В этом руководстве мы переместим файл в Linux из оболочки Bash (окно терминала), работающей в Windows.
Установите оболочку bash на компьютере Windows, поддерживающую команды scp (безопасная копия) и SSH (удаленный вход). Вот два примера:
- подсистема Windows для Linux (Windows 10);
- Оболочка Git Bash (https://git-scm.com/downloads)
Откройте сеанс bash в Windows.
Копирование файла резервной копии в Linux
В сеансе bash перейдите в каталог, содержащий файл резервной копии. Например:
cd 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\'
Перенесите файл на конечный компьютер Linux с помощью команды scp. Следующий пример передается
YourDB.bak
в домашний каталогuser1
сервера Linux с IP-адресом 192.168.2.9:scp YourDB.bak user1@192.168.2.9:./
Вот что мы должны были увидеть:
The authenticity of host 192.168.2.9(192.168.2.9)' can't be established. ECDSA key fingerprint is SHA256: aB1cD2eF-3gH4iJ5kL6-mN7oP8qR= Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.2.9' (ECDSA) to the list of known hosts. Password: YourDB.bak 100% 8960KB 7.4MB/s 00:01
Совет
Существуют альтернативные варианты использования SCP для передачи файлов. Одна из них — настройка сетевой папки SMB между Windows и Linux с помощью Samba. Пошаговое руководство по Ubuntu см. в статье Samba как файловый сервер. После установки вы можете получить доступ к нему в качестве сетевой общей папки из Windows, например \\machinenameorip\share
.
Перенос файла резервной копии перед восстановлением
Сейчас файл резервной копии находится на сервере Linux в домашнем каталоге пользователя. Перед восстановлением базы данных в SQL Server необходимо поместить резервную копию в подкаталог /var/opt/mssql
, так как это принадлежит пользователю mssql
и группе mssql
. Если вы хотите изменить расположение резервного копирования по умолчанию, см . статью "Настройка с помощью mssql-conf ".
В том же сеансе Windows bash подключитесь удаленно к целевому компьютеру Linux с помощью SSH. В следующем примере выполняется подключение к компьютеру
192.168.2.9
Linux в качестве пользователяuser1
.ssh user1@192.168.2.9
Теперь вы выполняете команды на удаленном сервере Linux.
Перейдите в режим суперпользователя.
sudo su
Создайте каталог резервного копирования. Параметр ничего не делает,
-p
если каталог уже существует.mkdir -p /var/opt/mssql/backup
Переместите файл резервной копии в этот каталог. В следующем примере файл резервной копии находится в домашнем каталоге
user1
. Измените команду в соответствии с расположением и именем вашего файла резервной копии.mv /home/user1/YourDB.bak /var/opt/mssql/backup/
Выйдите из режима суперпользователя.
exit
Восстановление базы данных в Linux
Чтобы восстановить резервную копию базы данных, можно использовать RESTORE DATABASE
команду Transact-SQL (TQL).
В приведенных ниже инструкциях используется программа sqlcmd. Если вы еще не установили средства SQL Server, см. статью "Установка средств командной строки SQL Server sqlcmd и bcp в Linux".
В том же окне терминала запустите sqlcmd. В следующем примере выполняется подключение к локальному экземпляру SQL Server с учетной записью
sa
. Введите пароль при появлении запроса или укажите пароль, добавив-P
параметр.sqlcmd -S localhost -U sa
В командной строке
>1
введите следующуюRESTORE DATABASE
команду, нажав клавишу ВВОД после каждой строки (вы не можете скопировать и вставить всю команду с несколькими строками одновременно). Замените все вхожденияYourDB
на имя вашей базы данных.RESTORE DATABASE YourDB FROM DISK = '/var/opt/mssql/backup/YourDB.bak' WITH MOVE 'YourDB' TO '/var/opt/mssql/data/YourDB.mdf', MOVE 'YourDB_Log' TO '/var/opt/mssql/data/YourDB_Log.ldf'; GO
Должно появиться сообщение об успешном восстановлении базы данных.
RESTORE DATABASE
Может возвращать ошибку, как показано в следующем примере:File 'YourDB_Product' cannot be restored to 'Z:\Microsoft SQL Server\MSSQL15.GLOBAL\MSSQL\Data\YourDB\YourDB_Product.ndf'. Use WITH MOVE to identify a valid location for the file. Msg 5133, Level 16, State 1, Server servername, Line 1 Directory lookup for the file "Z:\Microsoft SQL Server\MSSQL15.GLOBAL\MSSQL\Data\YourDB\YourDB_Product.ndf" failed with the operating system error 2(The system cannot find the file specified.).
Это значит, что база данных содержит дополнительные файлы. Если эти файлы не указаны в
MOVE
предложенииRESTORE DATABASE
, процедура восстановления пытается создать их в том же пути, что и исходный сервер.Вы можете вывести список всех файлов, содержащихся в резервной копии:
RESTORE FILELISTONLY FROM DISK = '/var/opt/mssql/backup/YourDB.bak'; GO
Вы должны получить список, как показано в следующем примере (перечисление только двух первых столбцов):
LogicalName PhysicalName .............. ------------------- ---------------------------------------------------------------------------- --------------- YourDB Z:\Microsoft SQL Server\MSSQL15.GLOBAL\MSSQL\Data\YourDB\YourDB.mdf .............. YourDB_Product Z:\Microsoft SQL Server\MSSQL15.GLOBAL\MSSQL\Data\YourDB\YourDB_Product.ndf .............. YourDB_Customer Z:\Microsoft SQL Server\MSSQL15.GLOBAL\MSSQL\Data\YourDB\YourDB_Customer.ndf .............. YourDB_log Z:\Microsoft SQL Server\MSSQL15.GLOBAL\MSSQL\Data\YourDB\YourDB_Log.ldf ..............
Этот список можно использовать для создания
MOVE
предложений для дополнительных файлов. В этом примере командаRESTORE DATABASE
имеет следующий вид:RESTORE DATABASE YourDB FROM DISK = '/var/opt/mssql/backup/YourDB.bak' WITH MOVE 'YourDB' TO '/var/opt/mssql/data/YourDB.mdf', MOVE 'YourDB_Product' TO '/var/opt/mssql/data/YourDB_Product.ndf', MOVE 'YourDB_Customer' TO '/var/opt/mssql/data/YourDB_Customer.ndf', MOVE 'YourDB_Log' TO '/var/opt/mssql/data/YourDB_Log.ldf'; GO
Проверьте восстановление, получив список всех баз данных на сервере. Восстановленная база данных должна быть указана в списке.
SELECT name FROM sys.databases; GO
Выполните другие запросы к перенесенной базе данных. Следующая команда переключает контекст в
YourDB
базу данных и выбирает строки из одной из таблиц.USE YourDB; SELECT * FROM YourTable; GO
Когда вы закончите использовать sqlcmd, введите
exit
.Когда вы закончите работу в удаленном сеансе SSH , введите
exit
еще раз.
Следующий шаг
В этом руководстве вы узнали, как создать резервную копию базы данных в Windows и переместить ее на сервер Linux с SQL Server. Вы научились выполнять следующие задачи:
- создание файла резервной копии в Windows с помощью SSMS и Transact-SQL;
- установка оболочки Bash в Windows;
- перенос файлов резервных копий из Windows в Linux с помощью команды scp;
- удаленное подключение к компьютеру Linux с помощью команды ssh;
- перемещение файла резервной копии для подготовки к восстановлению;
- выполнение команд Transact-SQL с помощью sqlcmd;
- Восстановление резервной копии базы данных с помощью
RESTORE DATABASE
команды - выполнение запроса для проверки переноса.
Далее вы можете ознакомиться с другими сценариями переноса для SQL Server на Linux.