Перейти к содержимому

Mssql

Все по MSsql

Как узнать какие запросы грузят CPU процессор.

Нагрузка на CPU по базам:

WITH DB_CPU_Stats
AS
(SELECT DatabaseID, DB_Name(DatabaseID) AS [DatabaseName], SUM(total_worker_time) AS [CPU_Time_Ms]
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY (SELECT CONVERT(int, value) AS [DatabaseID]
             FROM sys.dm_exec_plan_attributes(qs.plan_handle)
             WHERE attribute = N'dbid') AS F_DB
GROUP BY DatabaseID)
SELECT ROW_NUMBER() OVER(ORDER BY [CPU_Time_Ms] DESC) AS [row_num],
      DatabaseName, [CPU_Time_Ms],
      CAST([CPU_Time_Ms] * 1.0 / SUM([CPU_Time_Ms]) OVER() * 100.0 AS DECIMAL(5, 2)) AS [CPUPercent]
FROM DB_CPU_Stats
WHERE DatabaseID > 4 -- system databases
AND DatabaseID <> 32767 -- ResourceDB
ORDER BY row_num OPTION (RECOMPILE);

Наибольшая нагрузка на CPU

ELECT TOP 10 
[Average CPU used] = total_worker_time / qs.execution_count
,[Total CPU used] = total_worker_time
Читать далее

Как узнать в какой файловой группе больше всего записи и чтения. Немного дополнил скрипт

SELECT 		
			DB_NAME(a.database_id)          AS [Database Name]
			,i.physical_name
			,CAST((i.size * 8 /1024/1024 ) AS NUMERIC(10) ) AS DMSize        
           --,a.FILE_ID
           ,i.name
           ,a.io_stall_read_ms
           ,a.num_of_reads
           ,CAST(a.io_stall_read_ms / (1.0 + a.num_of_reads) AS NUMERIC(10 ,1)) AS [avg_read_stall_ms]
           ,a.io_stall_write_ms
           ,a.num_of_writes
           ,CAST(
                a.io_stall_write_ms / (1.0 + a.num_of_writes) AS NUMERIC(10 ,1)
            )                             AS [a.avg_write_stall_ms]
           ,a.io_stall_read_ms + a.io_stall_write_ms AS [io_stalls]
           ,a.num_of_reads + a.num_of_writes  AS [total_io]
           ,CAST(
                (a.io_stall_read_ms + a.io_stall_write_ms) / (1.0 + a.num_of_reads + a.num_of_writes) AS NUMERIC(10 ,1)
            )                             AS [avg_io_stall_ms]
FROM   
			
		
			sys.dm_io_virtual_file_stats(NULL ,NULL)a
			INNER JOIN 
	  --	SELECT * FROM	
	   	sys.master_files i
            ON  a.file_id = i.file_id 
            AND            a.database_id = i.database_id
WHERE i.database_id in  ('7')
			
ORDER BY
       		avg_io_stall_ms                  DESC;

 

Как я делал тесты для переезда на ссд. В какой рэйд (raid) собрать в 10 или 50.

Использовал программы для тестов:

1) HD Tune

2) CrystalDiskMark6

3) diskspd

Все тесты картинки будут в гугл документ

https://docs.google.com/document/d/1gTWVuW0DLIE5bJwsoCyZR_WjMxYg6jznYyLterFt6nk/edit?usp=sharing

Вывод сделали что самое оптимальное это raid 5 по производительности и что теряется меньше полезной емкости.

ссд будут на msa 2040. сравнивали с eva 4400

 

как делать бэкап баз mssql в расшаренную папку но под другим пользователем и паролем.

С начало включаем

Для этого выполняем команду:

EXEC sp_configure 'show advanced options', 1
GO

И переконфигурируем SQL Server командой

RECONFIGURE
GO

Затем включаем возможность использования процедцры xp_cmdshell командой:

EXEC sp_configure 'xp_cmdshell', 1
GO

И опять переконфигурируем SQL Server:

RECONFIGURE
GO

После этого задание сделал в плане. до бэкапа

EXEC xp_cmdshell 'net use x: \\192.168.1.226\backup /USER:имя пользователя пароль'

после бэкапа

EXEC xp_cmdshell 'net use x: /delete'

 

Как сделать проверку выполнения задания. версия 2

DECLARE @a NVARCHAR(255)
SET @a = 'SSAS_LSBackup_ax_molniya' --для проверки можно заменить на S0030-ax_molniya-1 (оно всегда запущенно, это задание репликации)
WHILE @a = 'SSAS_LSBackup_ax_molniya' --для проверки можно заменить на S0030-ax_molniya-1 (оно всегда запущенно, это задание репликации)
BEGIN
WAITFOR DELAY '00:00:01.000' --ждем в цикле. В рабочем коде выставить нужное время
set nocount on
IF (not object_id('tempdb..#z') is null) -- проверка наличия темповой таблицы
	drop table #z -- сброс темповой таблицы

--- выборка работающих заданий на 0030
SELECT ja.job_id, j.name as job_name, ja.start_execution_date, isNull(last_executed_step_id,0) + 1 as current_executed_step_id,	js.step_name
	INTO #z FROM s0030.msdb.dbo.sysjobactivity ja left join s0030.msdb.dbo.sysjobhistory jh on ja.job_history_id = jh.instance_id inner 
Читать далее

Как сделать проверку выполнения задания. Мониторит запущено ли задание или нет на удаленном сервере.

Задача мониторить задания когда оно работает на другом сервере. Когда оно отработает запускать следующий шаг. Мониторим мы бэкап лог шипинга (Log shipping backup).

как выглядит задание (job):

Как сделать проверку выполнения задания. Мониторит запущено ли задание или нет на удаленном сервере.

первый шаг запускается задание на удаленном севере. второй шаг и третий в цикле проверяет его после этого стартует следующие шаги.

WAITFOR DELAY '00:05:00.000'
set nocount on

if (not object_id('tempdb..#running_jobs') is null)
	drop table #running_jobs

select
    ja.job_id,
    j.name as job_name,
    ja.start_execution_date,      
    isNull(last_executed_step_id,0) + 1 as current_executed_step_id,
    js.step_name
  
INTO #running_jobs
from s0030.msdb.dbo.sysjobactivity ja 
	left join s0030.msdb.dbo.sysjobhistory jh on ja.job_history_id = jh.instance_id
	inner join s0030.msdb.dbo.sysjobs j on ja.job_id = j.job_id
	inner join s0030.msdb.dbo.sysjobsteps js on ja.job_id 
Читать далее

Как мониторить цепочку lsn лог шипинга ( log shipping ) на разрыв.

Задача мониторить цепочку lsn при работе лог шипинга. Скрипт смотрит в папку куда бэкапятся trn  берет из них данные и сравнивает их. если есть разрыв оповещает пользователей

DECLARE @path NVARCHAR(255)
DECLARE @temp NVARCHAR(255)
DECLARE @trn NVARCHAR(MAX)
SET @path = N'\\ho_report\h$\trn бэкап\' -- сетевой путь папки с трнками
IF OBJECT_ID('tempdb..#x') IS NOT NULL
    DROP TABLE #x;
CREATE TABLE 	
				#x
(
				NAME        NVARCHAR(255) NOT NULL
                ,depth      INT NOT NULL
                ,IsFile     BIT NULL
) 
IF OBJECT_ID('tempdb..#y') IS NOT NULL
    DROP TABLE #y;
----Создаем временную таблицу для команды RESTORE HEADERONLY в курсоре. Внимание!!!! только для sql 2005, в 2012 добавленно еще одно поле и 
Читать далее

Как перенести задания с mssql 2005 на mssql 2008

 

Ни Когда так не делайте

 

На целевом сервере в хранимой процедуре SP_ADD_JOB изменить в команде INSERT…VALUE (@owner_sid на   ****0x01)- владелец всех заданий будет SA

На целевом сервере в хранимой процедуре SP_ADD_SERVER закоментировать часть кода отвечающую за проверку сервера (—- Check that this job has not already been targeted at this server–)

После этого можно выделить все задания нажать создание сценария для заданий

Как перенести задания с mssql 2005 на mssql 2008

Этот скрипт запустить на сервере куда переносим задания

Как оптимизировать SQL Server при работе с курсорами

DECLARE cursor_name CURSOR
[ LOCAL | GLOBAL ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR UPDATE [ OF column_name [ ,...n ] ] ] [;]
[ FOR UPDATE [ OF column_name [ ,…n ] ] ] [;]

Остановлюсь на первых трех строчках ключевых параметров.
LOCAL или GLOBAL:    если хотим, чтобы курсор был доступен другим процедурам, функциям, пакетам в рамках нашей сессии, то GLOBAL – в этом случае за удалением курсора следим сами (команда DEALLOCATE). Во всех остальных случаях (т.е. … Читать далее