Перенос базы данных 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

Создать файл резервной копии базы данных в Windows можно несколькими способами. В приведенных ниже инструкциях используется SQL Server Management Studio (SSMS).

  1. Запустите SQL Server Management Studio на компьютере Windows.

  2. В диалоговом окне подключения введите localhost.

  3. В обозревателе объектов разверните узел Базы данных.

  4. Щелкните правой кнопкой мыши целевую базу данных, выберите "Задачи", а затем нажмите кнопку "Создать резервную копию...".

    Снимок экрана: использование SSMS для создания файла резервной копии.

  5. В диалоговом окне Резервное копирование базы данных в поле Тип резервной копии должно быть выбрано значение Полная, а в поле Создать резервную копию на — Диск. Запишите имя и расположение файла. Например, база данных с именем YourDB SQL Server 2019 (15.x) имеет путь резервного C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\YourDB.bakкопирования по умолчанию.

  6. Нажмите кнопку ОК, чтобы создать резервную копию базы данных.

Другой вариант — выполнить запрос 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.

  1. Установите оболочку bash на компьютере Windows, поддерживающую команды scp (безопасная копия) и SSH (удаленный вход). Вот два примера:

  2. Откройте сеанс bash в Windows.

Копирование файла резервной копии в Linux

  1. В сеансе bash перейдите в каталог, содержащий файл резервной копии. Например:

    cd 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\'
    
  2. Перенесите файл на конечный компьютер Linux с помощью команды scp. Следующий пример передается YourDB.bak в домашний каталог user1 сервера Linux с IP-адресом 192.0.2.9:

    scp YourDB.bak user1@192.0.2.9:./
    

    Снимок экрана: команда scp.

Совет

Существуют альтернативные варианты использования SCP для передачи файлов. Одна из них — настройка сетевой папки SMB между Windows и Linux с помощью Samba. Пошаговое руководство по Ubuntu см. в статье Samba как файловый сервер. После установки вы можете получить доступ к нему в качестве сетевой общей папки из Windows, например \\machinenameorip\share.

Перенос файла резервной копии перед восстановлением

Сейчас файл резервной копии находится на сервере Linux в домашнем каталоге пользователя. Перед восстановлением базы данных в SQL Server необходимо поместить резервную копию в подкаталог /var/opt/mssql, так как это принадлежит пользователю mssql и группе mssql. Если вы хотите изменить расположение резервного копирования по умолчанию, см . статью "Настройка с помощью mssql-conf ".

  1. В том же сеансе Windows bash подключитесь удаленно к целевому компьютеру Linux с помощью SSH. В следующем примере выполняется подключение к компьютеру 192.0.2.9 Linux в качестве пользователя user1.

    ssh user1@192.0.2.9
    

    Теперь вы выполняете команды на удаленном сервере Linux.

  2. Перейдите в режим суперпользователя.

    sudo su
    
  3. Создайте каталог резервного копирования. Параметр ничего не делает, -p если каталог уже существует.

    mkdir -p /var/opt/mssql/backup
    
  4. Переместите файл резервной копии в этот каталог. В следующем примере файл резервной копии находится в домашнем каталоге user1. Измените команду в соответствии с расположением и именем вашего файла резервной копии.

    mv /home/user1/YourDB.bak /var/opt/mssql/backup/
    
  5. Выйдите из режима суперпользователя.

    exit
    

Восстановление базы данных в Linux

Чтобы восстановить резервную копию базы данных, можно использовать RESTORE DATABASE команду Transact-SQL (TQL).

В приведенных ниже инструкциях используется программа sqlcmd. Если вы еще не установили средства SQL Server, см. статью "Установка средств командной строки SQL Server sqlcmd и bcp в Linux".

  1. В том же окне терминала запустите sqlcmd. Следующий пример подключается к локальному экземпляру SQL Server с пользователем SA . Введите пароль при появлении запроса или укажите пароль, добавив -P параметр.

    sqlcmd -S localhost -U SA
    
  2. В командной строке >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
    
  3. Проверьте восстановление, получив список всех баз данных на сервере. Восстановленная база данных должна быть указана в списке.

    SELECT Name FROM sys.Databases
    GO
    
  4. Выполните другие запросы к перенесенной базе данных. Следующая команда переключает контекст в YourDB базу данных и выбирает строки из одной из таблиц.

    USE YourDB
    SELECT * FROM YourTable
    GO
    
  5. Когда вы закончите использовать sqlcmd, введите exit.

  6. Когда вы закончите работу в удаленном сеансе 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.