-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathRun-MultiServer-Parallel-Pool.py
More file actions
127 lines (101 loc) · 3.79 KB
/
Copy pathRun-MultiServer-Parallel-Pool.py
File metadata and controls
127 lines (101 loc) · 3.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import pyodbc
from prettytable import PrettyTable
from prettytable import from_db_cursor
import argparse
from datetime import datetime
import os
from slack_sdk import WebClient
from multiprocessing import Pool
import math
parser = argparse.ArgumentParser(description="Script to execute sql query on multiple SQLServer",
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument("-s", "--inventory_server", type=str, required=False, action="store", default="localhost", help="Inventory Server")
parser.add_argument("-d", "--inventory_database", type=str, required=False, action="store", default="DBA", help="Inventory Database")
parser.add_argument("--app_name", type=str, required=False, action="store", default="(dba) Run-MultiServerQuery", help="Application Name")
args=parser.parse_args()
today = datetime.today()
today_str = today.strftime('%Y-%m-%d')
inventory_server = args.inventory_server
inventory_database = args.inventory_database
app_name = args.app_name
# Get list of servers from Inventory
invCon = pyodbc.connect("Driver={SQL Server Native Client 11.0};"
f"Server={inventory_server};"
f"Database={inventory_database};"
f"App={app_name};"
"Trusted_Connection=yes;")
invCursor = invCon.cursor()
sql_get_servers = f"""
set nocount on;
select id.sql_instance, id.sql_instance_port, id.[database]
from dbo.instance_details id
where id.is_enabled = 1 and id.is_available = 1
"""
invCursor.execute(sql_get_servers)
servers = invCursor.fetchall()
invCursor.close()
invCon.close()
def query_server(server_row):
#app_name = "(dba) Run-MultiServerQuery"
#app_config = {"app_name": app_name}
server = server_row.sql_instance
port = server_row.sql_instance_port
if port is None:
port = 1433
database = server_row.database
print(f"Working on [{server}].[{database}]..")
connectionString = f'DRIVER={{ODBC Driver 18 for SQL Server}};SERVER={server},{port};DATABASE={database};Trusted_Connection=yes;TrustServerCertificate=YES;App={app_name};'
'''
cnxn = pyodbc.connect("Driver={SQL Server Native Client 11.0};"
f"Server={server},{port};"
f"Database={database};"
f"App={app_name};"
"Trusted_Connection=yes;")
'''
cnxn = pyodbc.connect(connectionString)
sql_query = f"""
set nocount on;
waitfor delay '00:00:10';
select top 5 [sql_instance] = '{server}', *
from dbo.disk_space ds
where 1=1
--and ds.collection_time_utc >= ?
"""
collection_time = '2024-04-26 09:00'
sql_query = f"""
set nocount on;
declare @sql nvarchar(max);
declare @params nvarchar(max);
waitfor delay '00:00:06';
set @params = N'@sql_instance varchar(125), @collection_time_utc datetime2';
set @sql = N'
select top 5 [sql_instance] = @sql_instance, *
from dbo.disk_space ds
where 1=1
and ds.collection_time_utc >= @collection_time_utc
';
exec sp_executesql @sql, @params, '{server}', '{collection_time}'
"""
#print(sql_query)
cursor = cnxn.cursor()
#cursor.execute(sql_query, '2024-04-26 09:00')
cursor.execute(sql_query)
result = cursor.fetchall()
cursor.close()
cnxn.close()
return result
def pool_handler():
threads = math.ceil((os.cpu_count())/2)
p = Pool(threads)
result_all = []
disk_result = []
ptable = PrettyTable()
for allrows in p.map(query_server, servers):
for row in allrows:
disk_result.append(row)
#print(disk_result)
ptable.field_names = [column[0] for column in disk_result[0].cursor_description]
ptable.add_rows(disk_result)
print(ptable)
if __name__ == '__main__':
pool_handler()