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 だし、こちらの方が分かりやすいかも。