Being a SQL specialist is not enough. Windows and the interfaces SQL consumes are becoming ever more complex. Being aware of these technologies and beyond can make you a better DBA. You will learn how to become a DBA 2.5, SQL Enterprise name resolution strategies, create your own private VSAN & VCluster, fail instances BETWEEN separate clusters and use the CLR to manage the OS from SQL.
3. Generalist vs Specialist
Generalist
“Jack of all trades” (...master of none), versatile
Unfocused, unproductive
Specialist
Attention to detail, very productive, take responsibility
A risk, inflexible, bottleneck
11. How to become a DBA 2.5 part II
From a technical level
Use Personal Virtualization
Understand hardware, RAID Levels and Storage
Understand TCP/IP and networking
...and know when to use ping, nslookup, netstat etc
Use other Operating Systems and Database Engines
Program a .NET language to a competent level
Have an arsenal of tools and scripts
12. How to become a DBA 2.5 part III
From a personal level
Invest time
Maintain standards
Produce documentation and notes
Don't be afraid to say NO – you are responsible
Don't be afraid to ask questions
Surround yourself with brilliant people
14. Name Resolution
Service Based Machine Based
DNS DNS name
.NET SQLClient
cache
SQL Browser SQL Native Local hostname
Service Client
netbios name lmhosts
NBNS (WINS)
cache
Active netbios
hosts
Directory broadcast
15. Using DNS
sqlbits.com.
AUTHORITIVE
POSITIVE
REFERRAL
NEGATIVE
Lookup
sqlbits1_alias vserver1.sqlbits.com.
Connect to IP
and instance
10.0.3.1sql1
21. Preparing for our Virtual SAN
Virtual Hardware
Disk/s for Operating System and iSCSI targets
Network Card
Installation Media
FreeNAS ISO or CD (alternatives such as Openfiler)
Configuration Considerations
IP address, subnet mask, g/w, memory
Active Directory
22. Demo
Setup our Virtual SAN
and Virtual Cluster
23. Clustering solution version 1
cluster1 cluster2
server2 server3 server4 server5
vserver1 virtual server vserver1
vserver2 names shared vserver2
vserver3 vserver3
vserver4 vserver4
LUNS LUNS
SAN based mirroring
24. Clustering solution version 2
cluster1 Enterprise cluster2
Redirection
server2 server3 server4 server5
vserver1 Unique virtual
vserver1f
vserver2f server names
vserver2
vserver3 vserver3f
vserver4f vserver4
LUNS LUNS
SAN based mirroring
27. Using the CLR
using sql = Microsoft.SqlServer.Server;
using io = System.IO;
public class IO {
[sql.SqlFunction()]
public static sqltype.SqlInt64 DriveFree(sqltype.SqlString drive){
io.DriveInfo di;
try {
di = new System.IO.DriveInfo(drive.ToString());
return di.TotalFreeSpace;
}
catch { return -1; }
}
.......
}
28. Using the CLR
using sql = Microsoft.SqlServer.Server;
using io ASSEMBLY SQLCallAssembly
CREATE = System.IO;
FROM 'H:SQLCallAssembly.DLL'
WITH PERMISSION_SET = EXTERNAL_ACCESS
public class IO {
GO [sql.SqlFunction()]
public static sqltype.SqlInt64 DriveFree(sqltype.SqlString drive){
CREATE io.DriveInfo di;
FUNCTION dbo.udf_drivefree(@drive NVARCHAR(1))
RETURNS BIGINT
try {
EXTERNAL NAME SQLCallAssembly.IO.DriveFree;
di = new System.IO.DriveInfo(drive.ToString());
GO return di.TotalFreeSpace;
CREATE }FUNCTION dbo.udf_driveused(@drive NVARCHAR(1))
... catch { return -1; }
CREATE FUNCTION dbo.udf_drivesize(@drive NVARCHAR(1))
}
..........
} CREATE FUNCTION dbo.udf_drivefreepercent(@drive NVARCHAR(1))
...
CREATE FUNCTION dbo.udf_driveusedpercent(@drive NVARCHAR(1))
...
GO
29. Using the CLR
using sql = Microsoft.SqlServer.Server;
using io ASSEMBLY SQLCallAssembly
CREATE = System.IO;
CREATE 'H:SQLCallAssembly.DLL'
FROM VIEW vw_drivespace AS
public SELECTIO {
class 1 as 'seq',
WITH PERMISSION_SET = EXTERNAL_ACCESS
GO [sql.SqlFunction()] drive,
'system' as
public 'C' as sqltype.SqlInt64 DriveFree(sqltype.SqlString drive){
static 'letter',
[dbo].[udf_drivefreepercent]('c') AS [%free],
CREATE io.DriveInfo di;
FUNCTION dbo.udf_drivefree(@drive NVARCHAR(1))
RETURNS BIGINT
[dbo].[udf_driveusedpercent]('c')as [%used],
try {
EXTERNAL NAME SQLCallAssembly.IO.DriveFree;AS [capacity(MB)],
[dbo].[udf_drivesize]('c')/1048576
di = new System.IO.DriveInfo(drive.ToString());
GO [dbo].[udf_drivefree]('c')/1048576 AS [free(MB)],
return di.TotalFreeSpace;
CREATE } [dbo].[udf_driveused]('c')/1048576 as [used(MB)]
FUNCTION dbo.udf_driveused(@drive NVARCHAR(1))
... UNION { return -1; }
catch
CREATE FUNCTION dbo.udf_drivesize(@drive NVARCHAR(1))
}
..........
.....
} CREATE FUNCTION dbo.udf_drivefreepercent(@drive NVARCHAR(1))
...
SELECT .....
CREATE FUNCTION dbo.udf_driveusedpercent(@drive NVARCHAR(1))
...
GOGO
30. Using the CLR
using sql = Microsoft.SqlServer.Server;
using io ASSEMBLY SQLCallAssembly
CREATE = System.IO;
CREATE 'H:SQLCallAssembly.DLL'
FROM VIEW vw_drivespace AS
public SELECTIO {
class 1 as 'seq',
WITH PERMISSION_SET = EXTERNAL_ACCESS
GO [sql.SqlFunction()] drive,
'system' as
public 'C' as sqltype.SqlInt64 DriveFree(sqltype.SqlString drive){
static 'letter',
[dbo].[udf_drivefreepercent]('c') AS [%free],
CREATE io.DriveInfo di;
FUNCTION dbo.udf_drivefree(@drive NVARCHAR(1))
RETURNS BIGINT
[dbo].[udf_driveusedpercent]('c')as [%used],
try {
EXTERNAL NAME SQLCallAssembly.IO.DriveFree;AS [capacity(MB)],
[dbo].[udf_drivesize]('c')/1048576
di = new System.IO.DriveInfo(drive.ToString());
GO [dbo].[udf_drivefree]('c')/1048576 AS [free(MB)],
return di.TotalFreeSpace;
CREATE } [dbo].[udf_driveused]('c')/1048576 as [used(MB)]
FUNCTION dbo.udf_driveused(@drive NVARCHAR(1))
... UNION { return -1; }
catch
CREATE FUNCTION dbo.udf_drivesize(@drive NVARCHAR(1))
}
..........
.....
} CREATE FUNCTION dbo.udf_drivefreepercent(@drive NVARCHAR(1))
...
SELECT .....
CREATE FUNCTION dbo.udf_driveusedpercent(@drive NVARCHAR(1))
...
GOGO
31. Summary #1
DBA 2.5
Widen your skillset but still stay focused
Talk to other teams and get involved
Get your own Virtual Environment
Name Resolution
Useful for abstracting from the host name
Not suitable for every situation, good for applications