SQL Server DeveloperエディションをUbuntu16.04にインストールしてみたので、その時のメモ。

参考URL:UbuntuにSQL Serverをインストールし、データベースを作成

前提条件

  • Ubuntu16.04
  • メモリ2G以上

インストール

GPGキーのインポート

wget -qO- https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -

リポジトリ追加

sudo add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/16.04/mssql-server-2017.list)"

Linux に SQL Server 用のリポジトリを構成するも参照

インストール

sudo apt-get update
sudo apt-get install mssql-server

セットアップ

mssql-confコマンドを実行する。
エディションは、Developerか、Expressを選択。
途中で、パスワードの設定や、ライセンス等に関する確認がある。

sudo /opt/mssql/bin/mssql-conf setup
Choose an edition of SQL Server:
  1) Evaluation (free, no production use rights, 180-day limit)
  2) Developer (free, no production use rights)
  3) Express (free)
  4) Web (PAID)
  5) Standard (PAID)
  6) Enterprise (PAID)
  7) Enterprise Core (PAID)
  8) I bought a license through a retail sales channel and have a product key to enter.
    :
    :
Setup has completed successfully. SQL Server is now starting.
$

サービスの確認

systemctl statusコマンドで、サービスの状態を確認する。

systemctl status mssql-server

コマンドラインツールのインストール

sqlcmdbcpのインストール

GPGキーのインポート

curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -

リポジトリの追加

curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list | sudo tee /etc/apt/sources.list.d/msprod.list

インストール

sudo apt-get update
sudo apt-get install mssql-tools unixodbc-dev

コマンドラインツール実行パスの追加

ログインセッション用(必要に応じて)

echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile

Ubuntuでは、~/.bashrcはあるけれど~/.bash-profileがないので、上記設定をすると~/.bashrcが読まれないようになるので注意。~/.bash-profile~/.bashrcを読み込むよう指定する記述も必要。

非ログインセッション用

echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
source ~/.bashrc

ローカル接続のテスト

sqlcmd -S localhost -U SA -P ''
1>

プロンプト(1>)が出力されればOK。抜けるには、exit

照合順序の変更

このままだと、Sqlserverのインスタンスの照合順序(SQL_Latin1_General_CP1_CI_AS)と、データベースの照合順序(Japanese_CI_AS)が違っているため、いろいろ不具合が起きる。そのため、次のようにして照合順序を変更する。

$ sudo /opt/mssql/bin/mssql-conf set-collation
Enter the collation: Japanese_CI_AS
Configuring SQL Server...

すでに、データベースをバックアップファイルから復元してしまっている場合は、一旦デタッチしないと上記コマンドはエラーになる。

デタッチ

EXEC sp_detach_db 'TestDB', 'true';
GO

アタッチ

EXEC sp_attach_db TestDB, '/mnt/data/sqldata/TestDB.mdf', '/mnt/data/sqldata/TestDB_Log.ldf';
GO

既存のDBを移行

Windows環境のSQL Serverで稼働しているデータベースを、Linuxに移行させる。

大まかな流れ

  • SSMSでbakファイル作成
  • WinSCPなどで、ファイルを転送
  • Linux上でバックアップファイルを復元
  • クエリ発行して、復元を検証

すでに、BAKファイル作成済みで、Linuxにも転送済みとします。

バックアップファイルの復元

sqlcmdを起動

sqlcmd -S localhost -U SA

SQLを発行

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

次のようなエラーを吐いた場合

File 'YourDB_Product' cannot be restored to 'Z:\Microsoft SQL Server\MSSQL11.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\MSSQL11.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'

次のような結果を得ます。

LogicalName         PhysicalName                                                                 ..............
----------------------------------------------------------------------------------------------------------------------
YourDB              Z:\Microsoft SQL Server\MSSQL11.GLOBAL\MSSQL\Data\YourDB\YourDB.mdf          ..............
YourDB_Product      Z:\Microsoft SQL Server\MSSQL11.GLOBAL\MSSQL\Data\YourDB\YourDB_Product.ndf  ..............
YourDB_Customer     Z:\Microsoft SQL Server\MSSQL11.GLOBAL\MSSQL\Data\YourDB\YourDB_Customer.ndf ..............
YourDB_log          Z:\Microsoft SQL Server\MSSQL11.GLOBAL\MSSQL\Data\YourDB\YourDB_Log.ldf      ..............

この結果から、次のように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
カテゴリー: ubuntu

0件のコメント

コメントを残す

メールアドレスが公開されることはありません。