Флаг 1807

Типовые вопросы по этой теме с sqlclub.ru:

- Хранение MS SQL базы на сетевом диске. Как реализовать сабж? Установлено:windows 2003 server SP2 + MS SQL Server 2005.
- Доброго времечка!
Суть проблемы такова: принято решение файлы БД убрать с диска сервера (по техническим и финансовым причинам). Встал вопрос - как к SQL-серверу, расположенному на одной машине, прикрепить файлы БД, расположенные в общем случае на другой машине (в частном случае - на сетевом хранилище)?
Заранее спасибо за помощь!

и т.д.

Ответ короткий. По умолчанию - никак.

create database NetworkSharingTest on primary
(name = 'NetworkSharingTest', filename = '\\192.168.0.1\C$\Temp\NetworkSharingTest.mdf', size = 3MB , maxsize = UNLIMITED, filegrowth = 1024KB)
log on
(name = 'NetworkSharingTest_Log', filename = '\\192.168.0.1\C$\Temp\NetworkSharingTest.ldf', size = 512KB , maxsize = 2048GB , filegrowth = 10%)

(local): Msg 5110, Level 16, State 2, Line 1
The file "\\192.168.0.1\C$\Temp\NetworkSharingTest.mdf" is on a network path that is not supported for database files.
(local): Msg 1802, Level 16, State 1, Line 1
CREATE DATABASE failed. Some file names listed could not be created. Check related errors.

Вот, чем это мотивировалось во времена семерки (https://windowsitpro.com/article/articleid/14285/can-i-create-sql-server-databases-on-network-drives.html).
Во-первых, спросите себя, что вас заставляет к этому прибегнуть (разместить файлы БД на шаре). Производительность съедет, и вы будете более подвержены коррупции в базе из-за различных сетевых чудес (которые намного вероятней, чем глюки в шине scsi/fibre). Пуская i/o через сетку (даже быструю), вы сразу съезжаете на порядки величины по сравнению со scsi/fibre, и задержка будет значительно дольше. Если это не выделенное соединение, вы будете ощущать замедления по причине конкуренции с другим трафиком.
SQL Server на данный момент не располагает концепцией шаринга базы, расположенной на другом сервере. Только один сервер может иметь доступ к файлу БД в каждый момент времени. Исключение составляет ситуация, когда несколько SQL Server'ов доступаются к read-only базе на общем диске. Таким образом лишено преимущества переложение базы на "сетевой диск" - по любому она может быть забэкаплена / к ней можно обращаться с сервера, на котором работает SQL Server.

Однако тогда же с распространением NAS появилась возможность создавать базы на сетевых шарах. Волшебное слово для этого – флаг 1807. Включим его и повторим создание базы:

dbcc traceon(1807)
go
create database NetworkSharingTest on primary
(name = 'NetworkSharingTest', filename = '\\192.168.0.1\C$\Temp\NetworkSharingTest.mdf', size = 3MB , maxsize = UNLIMITED, filegrowth = 1024KB)
log on
(name = 'NetworkSharingTest_Log', filename = '\\192.168.0.1\C$\Temp\NetworkSharingTest.ldf', size = 512KB , maxsize = 2048GB , filegrowth = 10%)

На этот раз она создалась успешно:

use NetworkSharingTest
select * from sys.database_files

file_id file_guid   type type_desc  data_space_id name                    physical_name                                  state state_desc   size        max_size    growth    
------- ------- ---- ---------- ------------- ----------------------- ---------------------------------------------- ----- ------------ ----------- ----------- -----------
1       ... 0    ROWS       1             NetworkSharingTest      \\192.168.0.1\C$\Temp\NetworkSharingTest.mdf   0     ONLINE       384         -1          128       
2       ... 1    LOG        0             NetworkSharingTest_Log  \\192.168.0.1\C$\Temp\NetworkSharingTest.ldf   0     ONLINE       64          268435456   10

Более подробную информацию можно почерпнуть тут - https://support.microsoft.com/?id=304261