バックアップと復元を使用して SQL Server データベースを Windows から Linux に移行する

適用対象: SQL Server - Linux

SQL Server のバックアップと復元の機能は、Windows の SQL Server から SQL Server on Linux にデータベースを移行する場合に推奨される方法です。 このチュートリアルでは、バックアップと復元の手法を使用してデータベースを Linux に移動するために必要な手順について説明します。

  • SSMS を使用して Windows でバックアップ ファイルを作成する
  • Windows に Bash シェルをインストールする
  • Bash シェルから Linux にバックアップ ファイルを移動する
  • Linux で Transact-SQL を使用してバックアップ ファイルを復元する
  • クエリを実行して移行を検証する

また、SQL Server Always On 可用性グループを作成して、SQL Server データベースを Windows から Linux に 移行することもできます。 「Windows と Linux に SQL Server Always On 可用性グループを構成する (クロス プラットフォーム)」を参照してください。

前提条件

このチュートリアルを完了するには、次の前提条件を満たす必要があります。

Windows でバックアップを作成する

Windows でデータベースのバックアップ ファイルを作成するには、いくつかの方法があります。 以下の手順では、SQL Server Management Studio (SSMS) を使います。

  1. Windows コンピューターで SQL Server Management Studio を開始します。

  2. 接続ダイアログ ボックスで、「localhost」と入力します。

  3. オブジェクト エクスプローラーで、 [データベース] を展開します。

  4. 対象のデータベースを右クリックし、[タスク] を選択して、[バックアップ...] を選択します。

    SSMS を使用してバックアップ ファイルを作成しているスクリーンショット。

  5. [Backup Up Database](データベースのバックアップ) ダイアログで、[バックアップの種類][Full](完全) であり、[バックアップ先][ディスク] であることを確認します。 ファイルの名前と場所を記録しておきます。 たとえば、SQL Server 2019 (15.x) では、YourDB という名前のデータベースの既定のバックアップ パスは C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\YourDB.bak になります。

  6. [OK] を選んでデータベースをバックアップします。

もう 1 つの方法は、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

Windows に Bash シェルをインストールする

データベースを復元するには、最初に Windows コンピューターからターゲットの Linux コンピューターにバックアップ ファイルを転送する必要があります。 このチュートリアルでは、Windows 上で実行されている Bash シェル (ターミナル ウィンドウ) から Linux にファイルを移動します。

  1. scp (セキュア コピー) コマンドと ssh (リモート ログイン) コマンドがサポートされている Bash シェルを、Windows コンピューターにインストールします。 次の 2 つの例があります。

  2. Windows で Bash セッションを開きます。

バックアップ ファイルを Linux にコピーする

  1. Bash セッションで、バックアップ ファイルが格納されているディレクトリに移動します。 次に例を示します。

    cd 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\'
    
  2. scp コマンドを使って、ターゲットの Linux コンピューターにファイルを転送します。 次の例では、IP アドレスが 192.0.2.9 である Linux サーバー上の user1 のホーム ディレクトリに、YourDB.bak を転送します。

    scp YourDB.bak user1@192.0.2.9:./
    

    scp コマンドのスクリーンショット。

ヒント

scp を使用したファイル転送の代わりになる方法があります。 1 つは、Samba を使用して、Windows と Linux の間に SMB ネットワーク共有を構成するというものです。 Ubuntu のチュートリアルについては、「ファイル サーバーとしてのSamba」を参照してください。 確立された後は、Windows からネットワーク ファイル共有としてアクセスできます (\\machinenameorip\share など)。

復元する前にバックアップ ファイルを移動する

この時点で、バックアップ ファイルは Linux サーバー上のユーザーのホーム ディレクトリにあります。 SQL Server にデータベースを復元する前に、/var/opt/mssql のサブディレクトリにバックアップを配置する必要があります。これは、mssql ユーザーと mssql グループが所有しているためです。 既定のバックアップ場所の変更を検討している場合は、「mssql-conf での構成」の記事を参照してください。

  1. 同じ Windows Bash セッションで、ssh を使ってターゲット Linux コンピューターにリモート接続します。 次の例では、ユーザー user1 として Linux コンピューター 192.0.2.9 に接続しています。

    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 ツールをインストールしていない場合は、「Linux に SQL Server コマンドライン ツール sqlcmd および bcp をインストールする」を参照してください。

  1. 同じターミナルで、sqlcmd を起動します。 次の例では、SA ユーザーを使ってローカル SQL Server インスタンスに接続します。 プロンプトが表示されてからパスワードを入力するか、-P パラメーターを追加してパスワードを指定します。

    sqlcmd -S localhost -U SA
    
  2. >1 プロンプトで、次の RESTORE DATABASE コマンドを入力します。1 行入力するごとに ENTER キーを押します (複数行のコマンド全体を一度にコピーして貼り付けることはできません)。 すべての 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.).
    

    この場合、データベースにはセカンダリ ファイルが含まれています。 これらのファイルを RESTORE DATABASEMOVE 句で指定しないと、復元プロシージャでは元のサーバーと同じパスにこれらのファイルの作成が試みられます。

    バックアップに含まれるすべてのファイルの一覧を表示できます。

    RESTORE FILELISTONLY FROM DISK = '/var/opt/mssql/backup/YourDB.bak';
    GO
    

    次の例のような一覧が表示されます (最初の 2 列のみを示してあります)。

    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 データベースに切り替えられて、そのテーブルの 1 つから行が選択されます。

    USE YourDB
    SELECT * FROM YourTable
    GO
    
  5. sqlcmd の使用が終わったら、「exit」と入力します。

  6. リモート ssh セッションでの作業が終わったら、「exit」と入力します。

次のステップ

このチュートリアルでは、Windows 上でデータベースをバックアップし、SQL Server が実行されている Linux サーバーにそれを移動する方法について学習しました。 以下の方法を学習しました。

  • SSMS と Transact-SQL を使用して、Windows でバックアップ ファイルを作成する
  • Windows に Bash シェルをインストールする
  • scp を使用して、Windows から Linux にバックアップ ファイルを移動する
  • ssh を使用して、Linux コンピューターにリモート接続する
  • 復元の準備のためにバックアップ ファイルを再配置する
  • sqlcmd を使用して Transact-SQL コマンドを実行する
  • RESTORE DATABASE コマンドを使用して、データベースのバックアップを復元する
  • クエリを実行して移行を検証する

次に、SQL Server on Linux の他の移行シナリオを調べます。