Denali CTP3 のAlwaysOn Availability Groups (可用性グループ) を使用すると、FileTableやFILESTREAM のデータをサーバー間で連携できるようになります。
SQL Server Denali AlwaysOn?Q&A
AlwaysOn Availability Groups (SQL Server)
今回はこの内容についてまとめてみたいと思います。
非トランザクショナルの内容は CTP3 の制限のようで RTM では対応されていました。
■可用性グループを使用したファイルのサーバー間連携
SQL Server 2008 R2 までのデータベースミラーリングでは FILESTREAM のファイルグループがあるデータベースはミラーリングを設定することができませんでした。
可用性グループではこの制限が緩和され、FILESTREAM のファイルグループがあってもレプリカを作成することができるようになっています。
そのため FileTable や FILESTREAM データ型のデータをサーバー間で連携できるようになっています。
ただし、可用性グループで FILESTREAM のファイルグループを含めるときは条件があります。
可用性グループ内の各サーバーで同じディレクトリ構造にしておく必要があるのは、通常の可用性グループの条件と同じなのですが、FILESTREAM に関しては、非トランザクションアクセスを Off (無効) の状態にしておく必要があります。
Off 以外 (ReadOnly / Full) になっている状態で可用性グループを作成しようとするとエラーになります。
非トランザクションアクセスが使用できないので、ファイル名を指定して実行から [\サーバー名] で FILESTREAM のデータを開くことができないようです。
FileTable にファイルを直接 INSERT したい場合は、以下のようなクエリで INSERT することが可能です。
CREATE TABLE FileTable1 AS FILETABLE WITH ( FILETABLE_DIRECTORY = ‘FileTable1’, FILETABLE_COLLATE_FILENAME = database_default ) INSERT INTO FileTable1(name, is_directory) VALUES ( ‘AlwaysOn’, 1) INSERT INTO FileTable1(name,file_stream) VALUES (‘AlwaysOnDB.bak’, (SELECT * FROM OPENROWSET(BULK N’C:ShareAlwaysOnDB.bak’, SINGLE_BLOB) AS [File])) |
FILESTREAM データ型の場合は、以下のようなクエリになるでしょうか。
CREATE TABLE FileStream1 ( Col1 uniqueidentifier ROWGUIDCOL PRIMARY KEY, Col2 varbinary(MAX) FILESTREAM NULL ) INSERT INTO FileStream1 VALUES (NEWID(), (SELECT * FROM OPENROWSET(BULK N’C:ShareAlwaysOnDB.bak’, SINGLE_BLOB) AS [File])) |
少しわかりにくいのですが、右がプライマリの FileTable のデータ格納ディレクトリ、左がセカンダリの FIleTable のデータ格納ディレクトリになります。
同じファイルが存在している (FileTable への更新が可用性グループ内に伝搬されている) のが確認できますね。
通常の共有フォルダとして開けると面白かったのですが、AlwaysOn を使用することで複数サーバー間でファイルの複製といったこともできそうですね。
# 私はコード書くことが苦手なので FILESTREAM の API を使って実ファイルとして操作の検証まではできていないのですが…。