SQL Tact

pointers, solutions and scripts for the SQL DBA
not intended to replace msdn, common sense or oxford commas

Friday, August 04, 2017

SQLSat Planner's Calendar

We just completed our 9th annual SQLSaturday Baton Rouge. In my post-mortem of the event, I've updated and tweaked the living, breathing SQLSaturday Planner's Calendar that I've been crafting for a couple years now.

If you are a SQLSaturday organizer of any level of veterancy, you may find this calendar helpful in remembering to keep up with the months-long building to your event. If you're on some of the SQLSat Slacks you have may seen an earlier version of this doc, and already I've received a ton of good feedback. I am open to feedback on what to add/move/modify in this calendar, please reach out one or another if you have some wisdom that another SQLSat organizer or I need to hear.


Let me know if you have any questions or feedback!

Monday, July 31, 2017

Twilight TimeZone: Handling Time in Your App Architecture at SQLSaturday Baton Rouge

Thanks to everyone who joined my colleague Steve Schaneville and me for a presentation on date/time data architecture in modern applications. Steve and I are the principal consultants for appdev and SQL Server respectively at Sparkhound, and figured that a joint presentation on this topic would be valuable.

It was! We got a lot of great questions and positive feedback from our first audience at SQLSat Baton Rouge 2017, as well as a ton of notes to add to our presentation the next time, which will likely be at Houston Tech Fest 2017 in September.

We reviewed the SQL and .NET architecture for date/time storage an informative and thought-provoking talk about handling timezones in your application architecture. Dealing with Time Zones is disconcerting, rarely straightforward, and often complicated! In the end, our architecture recommendations lead to two likely best paths - either using datetimeoffset (and optionally also storing the Time Zone information in a separate field) or storing the date and time in separate fields. There are little advantages to storing only UTC data or all-in-one time zone data.

You can download the slidedeck and sample code here.

Our presentation at SQLSatBR 2017

Sunday, July 30, 2017

Change RegisterAllProvidersIP setting on an existing Availability Group

Was working with a client who had an existing Availability Group, but did not have the RegisterAllProvidersIP setting enabled on their cluster. So, recent changes to their connection strings to take advantage of MultiSubnetFailover to minimize failover re-connection delay wasn't helping. Multisubnet failover needs to see both Listener IP's to help, so RegisterAllProviderIP's is required to be ON.

Here's why.

With RegisterAllProvidersIP disabled on the client access point (the cluster network), only one IP address is made available for the listener. When enabled, all site IPs for the listener are simultaneously listed. Connection strings using MultiSubnetFailover will try out all IPs simultaneously, providing for the fastest possible transition after an availability group failover.

Caveat remains that any connection strings that aren't or can't use MultiSubnetFailover will have problems. So RegisterAllProvidersIP should be enabled only when MultiSubnetFailover can be used in all application connection strings. More information here. You really do need to understand the applications and their connection strings here, this has little to do with the SQL Server and more to do with apps and DNS aliases.

In the case of the client above, enabling RegisterAllProvidersIP on an existing, in-use cluster is possible, but does require a brief outage.

Here is the script to use via PowerShell.

Comments guide along the way.

nslookup AAGListenerName #With RegisterAllProvidersIP = 0, this will only return one IP, the IP of the current primary.

Get-ClusterResource  -Cluster "FC_Name" #Get Cluster Network name

Get-ClusterResource "ClusterNetworkName"  -Cluster "FC_Name" | set-clusterparameter RegisterAllProvidersIP 1  -Cluster "FC_Name"

#You'll get a warning, all changes will take effect until ClusterNetworkName is taken offline and then online again.

Stop-clusterresource "ClusterNetworkName"  -Cluster "FC_Name" #Take Offline

Start-clusterresource "ClusterNetworkName"  -Cluster "FC_Name" #Right Back Online

Start-clusterresource "AAGName"  -Cluster "FC_Name" #This step is important. The AAG is offline, must bring the AAG Back online

#Wait a moment, then verify

Get-ClusterResource  -Cluster "FC_Name" #Verify

nslookup AAGListenerName #This should now return Two IPs, for both the primary and secondary. Now, MultiSubnetFailover can help.

UPDATE: Thanks to a commenter, updated the 0 to 1 in the set-clusterparameter line.