Geeks love duct tape. Sure, we pride ourselves on building a rock-solid solution the right way, but when the brown stuff hits the moving metal stuff, we love to show off our ingenuity. We carry our money in duct tape wallets, wear duct tape shirts, practice ductigami, and hang our duct tape from custom metal brackets.
I’m about to discuss a feature of SQL Server that’s probably going to horrify you at first, but take a step back and think of it as duct tape. I don’t want you to build a solution from scratch with it, but it’s a killer tool that deserves a prominent spot in your bag of tricks. Since I’ve started using SQL 2012 in my lab, not a week has gone by that I haven’t used this feature to do something faster and easier.
A Brief History Lesson on Trace Flag 1807
In the past, Microsoft SQL Server required its database files to be stored on local drives or SAN storage. The SQL Server 2000 I/O Basics whitepaper explains in stern terms why not just any storage will do – we have to be sure our data will hit the disk in a calm, orderly fashion. Server vendors got the point, and everybody’s local storage and SAN storage followed the guidelines. Over time, we stopped buying hardware from a Windows Hardware Compatibility List because, well, everything worked. If you could buy it off the shelf from a major vendor, you were fine.
For ambitious people who wanted to gamble with their data, trace flag 1807 let you store your database files on network shares or mapped drives. This was a pretty bone-headed idea – heck, it was hard enough to get our local and SAN storage to be reliable enough – so few people used it. Database administrators are usually way too paranoid to let their databases get corrupted just because somebody tripped over a network cable or a $200 NAS box failed. Even if you didn’t mind unreliability, performance was a major problem – network file shares just weren’t fast enough to handle database access.
Network attached storage gained mainstream credibility over the last few years, and it’s gained widespread use thanks to virtualization and the Network File System protocol (NFS). Under virtualization, each drive on your virtual server is really just one big file (VMDK or VHD), and it’s easier to manage accessing big files on a file share rather than mapping a bunch of LUNs to VMware hosts.
With tuning, NFS performance is fine for virtualization, and this has a bit of a hidden meaning: if we’re running our entire SQL Server in VMware, then we’re already doing database access over NFS. So why can’t we let physical SQL Servers access their own databases via NFS too?
SQL Server 2008R2 and 2012 <3 Your NAS
SQL Server 2008R2 did away with the trace flag and lets you put your data & log files anywhere. This statement works fine:
CREATE DATABASE [DestinedForGreatness] ON PRIMARY ( NAME = N'DestinedForGreatness', FILENAME = N'\\LittleBlackBox\SQL2012data\MSSQL\Data\DestinedForGreatness.mdf' ) LOG ON ( NAME = N'DestinedForGreatness_log', FILENAME = N'\\LittleBlackBox\SQL2012data\MSSQL\Data\DestinedForGreatness_log.ldf') GO
And just to make things really clear, that statement doesn’t just work fine – it doesn’t give you a single warning. Just like that, you’ve got a database relying on a network share, along with all the gotchas that entails. Its database icon looks just like the rest in SSMS, and there’s nothing to suggest that your hosting strategy just got a lot riskier.
File share access goes over the same network paths as your client communications (queries, results, RDP sessions, etc). A heavily accessed database could saturate your network cards, thereby slowing down everything else – or vice versa. An unrelated file copy or backup could bring your network-attached database to its knees.
You also have to start monitoring the remote file share’s performance. It can get slowed down by CPU or memory issues, or just by other activity happening on that same file share. This means we have to capture Perfmon data on that remote file server, including the physical disk counters. I don’t see this as a drawback – after all, I need to do this same level of performance monitoring on my SAN, too.
Use Cases for Databases on NAS
When I first read about this SQL Server feature, I had the same reaction you’re probably having: nobody in their right mind should use this, right? As it turns out, though, I keep using it to make my life easier.
Low log file space emergency? Add a file on a NAS. With a few mouse clicks, disaster is averted. Let your transactions continue (albeit slowly), then go back later to remove that extra log file.
Need to restore a database fast? Attach it from anywhere. I’ve often needed to restore just one table from a big database backup, but I haven’t had the room to restore the entire database in production. No problem – just restore the database on another server (like development), but use a network share name like \\MyFileServer\TempFolder\DatabaseName.mdf as the target. All of the disk-intensive and network-intensive work happens on the dev server. When the restore finishes, detach the database in development, and the production server can attach the database while it sits on the network share. Copy out the tables you need, detach the database, and you’re off.
Hate drive sizing hassles? Use NFS. I run a lot of SQL Servers in virtualization, and I move databases around from server to server. Rather than worrying about whether a server has enough free drive space, I’ve just created a file share on my NAS, and all my SQL Server 2012 instances attach their databases from that share. I can manage free space as a pool, and I never have to worry about an individual server running out of free space again.
Should You Run Databases Over the Network?
The amateur question is, “Do you feel lucky, punk?”
The professional question is, “Do the performance and reliability of your network file shares match up with the performance and reliability needs of the database?”
When I’ve asked myself the professional question, I’ve been surprised at some of my answers. Network storage probably shouldn’t be your first default choice for new databases and files, but give it a chance.
The key to success is getting everybody to agree on both the capabilities of the NAS and the requirements of the database.



Mike Robinson January 10, 2012 | 10:47 am
Great article Brent! I’m constantly amazed at how many system admins will ding a solution “just because” or without really understanding how it works and the pros and cons, but then elevate another solution as “the answer” but don’t have any greater understanding of that solution either.
In the end, its “what they know” even though they don’t really understand why things work the way the do.
David Eaton January 10, 2012 | 2:37 pm
Heresy, complete unabridged Heresy.
Oh wait, the NetApp is calling…….
Scott Bean January 10, 2012 | 5:06 pm
One issue that I ran into is if you are backing up your databases with DPM 2010, it cannot handle the underlying database files being on UNC paths.
Brent Ozar January 10, 2012 | 10:47 pm
Scott – yep, because you can’t take snapshots of a remote UNC path. Great point. I’ve blogged about my challenges with DPM before too:
http://www.brentozar.com/archive/2008/08/microsoft-dpm-2007-review/
Rob January 11, 2012 | 8:58 am
Very nice read on SQL 2012 and virtualization.
Thanks for the informative writeup and Nice blog by the way.
Brent Ozar January 11, 2012 | 5:35 pm
Thanks, glad you liked it!
Paul Tormey January 13, 2012 | 2:44 pm
Great article.
A thought though, would I be able to run a DB in SQL 2000 compatibility using a network share. Could enable quick DR data testing without changing application, DNS Server names or ODBC type definitions.
Cheers
Paul
Paul Tormey January 18, 2012 | 3:52 pm
Paul Tormey
January 13, 2012 | 2:44 PM
Brent,
Left a question for you a couple of days ago:
A thought though, would I be able to run a DB in SQL 2000 compatibility using a network share. Could enable quick DR data testing without changing application, DNS Server names or ODBC type definitions.
Any comments?
Paul
Brent Ozar January 18, 2012 | 3:56 pm
Paul – yep, I did see that, but is this something you think you might be able to try yourself to get the answer you’re looking for? I bet it’d actually be easier to try this yourself rather than typing in the question once – let alone twice.
Paul Tormey February 1, 2012 | 1:16 pm
http://www.brentozar.com/wp-includes/images/smilies/icon_wink.gif
Yep Brent,
Will give it a go when I get to the office.
Ben January 15, 2012 | 5:16 am
Good read. Thanks again Brent, adding a much-needed additional LDF to a network share is a great temporary fix.
Rudy Panigas January 16, 2012 | 10:12 am
Excellent article! See, SQL server is never boring. There is always something interesting to do and learn.
Cheers!
Rudy
Michael Eklöf January 17, 2012 | 2:01 am
Thanks for pointing out some new nice tricks to have in your toolchest, I have at times been restoring to a secondary server and moving SAN LUNs, but this approach makes it even easier when I don’t have to involve the SAN admin.
Paul Brewer January 18, 2012 | 1:34 am
Hi Brent,
What about configuring an iSCSI target on the storage server rather than mapping a network drive? It’s free and might be more resilient
http://www.microsoft.com/download/en/details.aspx?id=19867
Regards
Paul
Brent Ozar January 18, 2012 | 6:32 am
Paul – it’s only free if you’ve got iSCSI set up, and most folks don’t. The reason this feature is attractive to me is its instant flexibility. You don’t need anything set up in order to do it. Tell your network admins that you’re running iSCSI over the regular Windows network, though, and you’re liable to have a mutiny on your hands.
If you want more resiliency, I’d definitely go the iSCSI route but with a separate network for the traffic (which will also help the resiliency angle.)
Paul Brewer February 10, 2012 | 5:18 am
Brent,
I wrote a technical article for sqlservercentral about ‘How to configure a virtual SQL Server 2012 cluster using an iSCSI SAN’ which they are publishing on Monday 13th. I really wish I’d put a footnote in the article saying ‘Think carefully before routing your SAN related Disk IO over your virtual IP network’.
Best wishes
Paul
Brent Ozar February 11, 2012 | 11:46 am
Paul – why not contact SQLServerCentral and edit the article? I’m sure they’d be glad to let you add more.
Steve January 18, 2012 | 9:31 pm
This will give an awful lot of flexibilty for on the fly “what the? …” moments when you discover the BAs really badly underestimated database growth and activity.
In our situation, would I run a db for any period of time off the network? Unlikely – the frequency with which our network breaks or does odd things ( yes we’d like to sack a few people, but I digress ) makes it inadvisable.
A case in point where we had so many outages for a network segment that had mirrored SQL 2008 servers that when the proverbial dust settled, we have half our databases on the principal server and half on the mirror because the main switch went up and down so many times in one night.
But in general, yes very useful. Thanks for bringing it up.
Pingback: SQL2012 Clustering – the drive letter is gone! « Rabin's Ramblings
Curt Spanburgh January 27, 2012 | 10:27 am
Great Article. For sure , someone will come along and be critical of work you do to save resources.
But it’s great to see the tape solutions.
If fact the older guys used a lot of tape in IT.
/:>
Andrew Bruce June 21, 2012 | 5:59 am
I am running SQL Server 2008R2 on NFS because we are (re)building iSCSI solution with our crappy HP MSA SAN. I did not have room on the ESX host or on physicals for the data, so I provisioned tiny 4TB NAS and then attached databases to it from the SQL (running physical on small 67GB 1U pizza box).
To minimize network footprint I attached separate 1GB switch between SQL host and NAS, and used separate 172.28.0/24 network to connect them. So no database traffic is ever going over the public switch, which I was pretty sure would eliminate disk probs for me.
I’m not in the office right now but I just got an email from coworker saying that SQL reported “LogWriter: Operating system error 64 (the specified network name is no longer available)”.
Any perf tuning I should do at the SQL Server level to account for NFS drives?
Thanks for the article…
Brent Ozar June 21, 2012 | 6:13 am
Andrew – if you get an error saying the network name for the shared storage is no longer available, that’s actually an availability problem, not a performance problem. It’s failing to perform period, heh. (I shouldn’t be laughing, but…) This is not an unusual problem with low-end (sub-$5k) network-attached storage devices. Depending on how much load you’re trying to put on them, they may just fall over and reboot – which of course is bad news for SQL Server.
I don’t have a quick and easy silver bullet here. I would avoid running SQL Server on a NAS unless you’ve load tested the NAS under extreme conditions and you know that it won’t reboot no matter what.
Feyi July 3, 2012 | 10:03 pm
Hi,
I have a client that generates a fair volume of data, running SQL 2008R2, requesting for a storage device. From your article, seems a SAN will work just fine, rather than investing on a SAN server….right?
Nice read.
Brent Ozar July 4, 2012 | 6:08 am
Feyi – it depends on what you mean by a storage device and a fair volume of data. Can you be more specific?
Feyi July 5, 2012 | 3:24 am
Thank you Brent for your response.
Well, they need a high availability server for SQL server 2008 backup. I would have recommended a NAS but really cost is not an issue to my client. So I am considering either HP Storageworks x1400 or X3400. Does this make sense?
Andrew Bruce July 5, 2012 | 2:45 pm
Hi All, Finally got my first SQL 2008 R2 cluster built (VMs under ESX 3.5 as well). Cluster is running on sub-par after-market dedicated iSCSI switches using DataCore SANsymphony-V to wrap the two legacy HP MSA1XXX SANs I had available (I know, I know…what a mess).
The original SQL drive share problem I had with the NAS device was that with databases over 11GB: DBCC and other calls would fall over mid-processing. The NAS was connected to the (physical) SQL server using dedicated 1GB switch, Windows Updates turned off, and problems were observed even in simple test scenarios (e.g. running dbcc and other maintenance commands from query manager).
In my shiny new SAN setup where the network connections are even worse due to slowness imposed by ESX vswif and general PE2650 crappiness as an (x86!) ESX host, the same failing functions…work great!
I can only assume that iSCSI protocol, in conjunction with full 60second Windows timeout at guest OS level, is able to handle many “hiccups” on the iSCSI fabric that a standard Windows Share is not.
Based on this admittedly small set of empirical data, I have to say I won’t be trying a NAS again for SQL database of any size (small databases were working fine over the share). Instead, a proper SAN – albeit low end – appears more reliable.
Setting up the cluster is easy – once you’ve done it a few times. That first time was a great way to burn late-night oil, though…
Wayne February 11, 2013 | 10:24 pm
I would like to know what happens to a database actively running on an NFS fileshare when the NAS service goes down. I have a HA NAS environment (failovers do occur) and would only consider running databases on an NFS share if a NAS service failure doesn’t result in database corruption.
Brent Ozar February 12, 2013 | 6:39 am
Wayne – hmm, let’s take a step back here. In any shared storage system, there’s a possibility that the shared storage will suddenly disappear. This is true with even the most redundant storage systems. I’ve got not-so-fond memories of a SAN vendor coming onsite to do a firmware upgrade (because they said I’d done the last one incorrectly) and they proceeded to accidentally bring down the entire storage network before all of the servers were down. Anytime there’s humans, there’s the chance for human error.
Anytime storage disappears without warning, there’s a chance for bad things to happen to the storage. But again, let’s take a step back – even when the storage doesn’t disappear, there’s a chance for corruption. You can never just say, “We’re okay, I don’t need to worry about corruption.”
Wayne February 12, 2013 | 11:29 pm
Thankyou for the reply. I probably didn’t word the question well – I’m a Linux system administrator not a DBA. Would a NAS service failure lead to a need for restoration from overnight dumps?
I’m trying to decide whether to spend $15K to upgrade storage hardware (add controllers etc.) or present an NFS share to the person running the database.