刹那(せつな)の瞬き

Willkömmen! Ich heiße Setsuna. Haben Sie etwas Zeit für mich?

Ubuntu18.04のSQLServer2019にデータベースファイルを移行する

前回までの続きです。

  1. Ubuntu18.04にSQLServer2019をインストールする
  2. Ubuntu18.04にSQLServer2019をインストールした後は

Ubuntu 上の SQLServer に sqlcmd で接続するところまで確認しました。
次に、Windows 上の SQLServer で使用してたデータベースファイルを移行してみます。

5. データベースファイルの移行

今回は、NorthwindJ という、NorthwindJ.mdf と NorthwindJ.ldf の2ファイルで構成されたデータベースファイルを移行してみます。

(1) データベースファイルの準備

デタッチ済みのデータベースファイル NorthwindJ.mdf とNorthwindJ.ldf を用意します。

私の場合、ホームディレクトリに work ディレクトリを作成し、そこにコピーしておきました。

$ ls ~/work
NorthwindJ.ldf     NorthwindJ.mdf

現在、SQLServer に NorthwindJ がアタッチされている場合、そのままデータベースファイルをコピーしても移行できません。

SSMS や SQL 文を発行してデタッチした後、前述のファイルをコピーしておきます。

デタッチしたくない方は、別の方法を試してください。

(2) データベースファイルのコピー

Ubuntu 上の SQLServer の既定のデータベースファイルは/var/opt/mssql/dataにあるので、今回はこの場所にコピーします。

ここは root 権限がないと作業できません。

$ sudo su
# cd /var/opt/mssql/data
# cp ~/work/NorthwindJ.* .
# ls -laF
合計 93656
drwxr-xr-x 2 mssql mssql     4096  1月 29 15:45 ./
drwxrwx--- 6 mssql mssql     4096  1月 29 11:13 ../
-rw-r----- 1 mssql mssql      256  1月 29 11:13 Entropy.bin
-rw------- 1 root  root   7798784  1月 29 15:45 NorthwindJ.ldf
-rw------- 1 root  root   5439488  1月 29 15:45 NorthwindJ.mdf
-rw-r----- 1 mssql mssql  5111808  1月 29 11:19 master.mdf
-rw-r----- 1 mssql mssql  2359296  1月 29 15:30 mastlog.ldf
-rw-r----- 1 mssql mssql  8388608  1月 29 11:19 model.mdf
-rw-r----- 1 mssql mssql 14024704  1月 29 11:13 model_msdbdata.mdf
-rw-r----- 1 mssql mssql   524288  1月 29 11:13 model_msdblog.ldf
-rw-r----- 1 mssql mssql   524288  1月 29 11:13 model_replicatedmaster.ldf
-rw-r----- 1 mssql mssql  4194304  1月 29 11:13 model_replicatedmaster.mdf
-rw-r----- 1 mssql mssql  8388608  1月 29 11:19 modellog.ldf
-rw-r----- 1 mssql mssql 17039360  1月 29 11:14 msdbdata.mdf
-rw-r----- 1 mssql mssql  5308416  1月 29 11:14 msdblog.ldf
-rw-r----- 1 mssql mssql  8388608  1月 29 11:14 tempdb.mdf
-rw-r----- 1 mssql mssql  8388608  1月 29 11:19 templog.ldf
#

続けて、所有者を mssql にしてから、root を抜けます。

# chown mssql:mssql NorthwindJ.*
# exit
exit
$
(3) データベースファイルのアタッチ

sqlcmd コマンドで、先程コピーしたデータベースファイルを SQLServerにアタッチします。

私の場合、最初の数分応答がなくて焦りました。コンバートも合わせて処理されたので、少し時間がかかったようです。

$ sqlcmd -S localhost -U sa -P abcd1234$ -w 80
1> exec sp_attach_db @dbname = 'NorthwindJ', @filename1 = '/var/opt/mssql/data/NorthwindJ.mdf', @filename2 = '/var/opt/mssql/data/NorthwindJ.ldf'
2> go
データベース 'NorthwindJ' をバージョン 655 から現在のバージョン 904 に変換しています。
データベース 'NorthwindJ' で、バージョン 655 からバージョン 668 へのアップグレード手順が実行されています。
データベース 'NorthwindJ' で、バージョン 668 からバージョン 669 へのアップグレード手順が実行されています。
〜(ざっくり省略)〜
データベース 'NorthwindJ' で、バージョン 899 からバージョン 900 へのアップグレード手順が実行されています。
データベース 'NorthwindJ' で、バージョン 900 からバージョン 901 へのアップグレード手順が実行されています。
データベース 'NorthwindJ' で、バージョン 901 からバージョン 902 へのアップグレード手順が実行されています。
データベース 'NorthwindJ' で、バージョン 902 からバージョン 903 へのアップグレード手順が実行されています。
データベース 'NorthwindJ' で、バージョン 903 からバージョン 904 へのアップグレード手順が実行されています。
1>

やってから気づいたのですが、今はexec sp_attach_dbではなく、CREATE DATABASE database_name FOR ATTACHでアタッチするのが正しい方法みたいです。

(4) データベースを使用

引き続き、sqlcmd コマンドで、NorthwindJ データベースを使用してみます。

1> use NorthwindJ
2> go
データベース コンテキストが 'NorthwindJ' に変更されました。
1>

まずは、NorthwindJ のテーブル名一覧を取得します。

1> select cast(name as varchar) as table_name from sys.objects where type = 'U';
2> go
table_name                    
------------------------------
社員                            
得意先                           
商品区分                          
商品                            
受注明細                          
受注                            
仕入先                           
sysdiagrams                   
時間1                           
社員2                           
都道府県                          
運送会社                          

(12 rows affected)
1>

NorthwindJ は SQL Server 2008 以前からあった年代もので、テーブル名やカラム名が日本語で定義されています。文字コードの問題とか色々と気になりますが、とりあえず社員テーブルにアクセスしてみます。

1> select 氏名, フリガナ, 誕生日 from 社員;
2> go
氏名                                       フリガナ                                   
                                          誕生日                    
---------------------------------------- ---------------------------------------
----------------------------------------- -----------------------
森上 偉久馬                                   モリウエ イクマ                               
                                          1967-10-25 00:00:00.000
葛城 孝史                                    カツラギ コウシ                               
                                          1961-02-03 00:00:00.000
加藤 泰江                                    カトウ ヤスエ                                
                                          1968-02-02 00:00:00.000
川村 匡                                     カワムラ タダシ                               
                                          1957-12-08 00:00:00.000
松沢 誠一                                    マツザワ セイイチ                              
                                          1965-03-30 00:00:00.000
成宮 真紀                                    ナルミヤ マキ                                
                                          1968-03-03 00:00:00.000
山本 雅治                                    ヤモト マサハル                               
                                          1967-01-16 00:00:00.000
青木 俊之                                    アオキ トシユキ                               
                                          1966-08-21 00:00:00.000
小川 さよ子                                   オガワ サヨコ                                
                                          1966-09-23 00:00:00.000

(9 rows affected)
1>

結果セットは正しく取得できました。

途中、タイプミスでバックスペースで文字を消すと文字化けしますが、動作確認したいだけなので、再入力して済ませました。

異なるプラットホームでも SQLServer が利用できるって素晴らしい。
文字コードや照合順序等の細かな評価はまた後日です。

※追記

機会があったので、CREATE DATABASE database_name FOR ATTACHでアタッチしてみました。

CREATE DATABASE NorthwindJ
    ON (FILENAME = '/var/opt/mssql/data/NorthwindJ.mdf'),   
    (FILENAME = '/var/opt/mssql/data/NorthwindJ.ldf')   
    FOR ATTACH;
GO

CREATE DATABASE は DDL だし、こちらの方が分かりやすいかも。