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

mssql

Как узнать кому отправлялись письма из mssql

msdb.dbo.sysmail_allitems - просмотр всех сообщений;
msdb.dbo.sysmail_sentitems – просмотр только отправленных сообщений;
msdb.dbo.sysmail_unsentitems - просмотр неотправленных сообщений;
msdb.dbo.sysmail_faileditems – просмотр сообщений с ошибками;
msdb.dbo.sysmail_event_log – журнал работы компонента Database Mail.
Например, для просмотра всех отправленных сообщений можно использовать следующий запрос:
SELECT sent_date AS [Дата отправки письма], 
	   send_request_user AS [Кем отправлено письмо],
	   recipients AS [Кому отправлено письмо], 
	   subject AS [Тема письма], 
	   body AS [Текст письма], 
	   file_attachments AS [Отправленные файлы], 
	   query AS [SQL запрос]
 FROM msdb.dbo.sysmail_sentitems

 

Хранимая процедура для архивирования журнала при достижении @danger_value.

Архивирования журнала при достижении @danger_value. Идея в том что лог будет усекаться при достижении 7 гб. Это сделано так как настроен лог шипинг.

eclare @tran_log_space_usage table( 
        database_name sysname
,       log_size_mb float
,       log_space_used float
,       status int
); 
declare @log_space_used float	-- Доля (в процентах) файла журнала, в настоящее время заполненная
declare @danger_value int		-- Значение в Мб, при достижение которого архивируется журнал
declare @job_start_name sysname -- Название задания в Агенте MSSQL 

set @danger_value = 7000
set @job_start_name = N'SSAS_LSBackup_ax_molniya'

insert into @tran_log_space_usage 
exec('DBCC SQLPERF ( LOGSPACE )') ; 

set @log_space_used = (
select (log_space_used * log_size_mb / 100)  from 
Читать далее

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

Задача распределить файловые группы на разные диски. Чем больше операций чтения и записи в файловой группе тем быстрее будут выделены диски и RAID.

Есть база весит 1.5 тб. В ней файловые группы:

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

База TempDb у нас находится на ssd в зеркале.Размер диска 370 гб. TempDb разбит на файлы по рекомендации майкрософт

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

Сначала был выполнен скрипт накопление статистики ожидания из статьи https://habrahabr.ru/post/216309/

WITH [Waits] AS
    (SELECT
        [wait_type],
        [wait_time_ms] / 1000.0 AS [WaitS],
        ([wait_time_ms] - [signal_wait_time_ms]) / 1000.0 AS [ResourceS],
        [signal_wait_time_ms] / 1000.0 AS [SignalS],
        [waiting_tasks_count] AS [WaitCount],
        100.0 * [wait_time_ms] / SUM ([wait_time_ms]) OVER() AS [Percentage],
        
Читать далее

Как сделать бэкап множества баз mssql на сетевое хранилище с созданием папок под бэкап. И после удалить эти базы.

Задача сделать бэкапы баз на 50 серверах в одно файловой хранилище в разные папки

DECLARE @name NVARCHAR(500)
DECLARE @cmd NVARCHAR(500)
DECLARE @Cursor CURSOR   
DECLARE @nameser NVARCHAR(500)
SET @nameser = @@SERVERNAME
SET @Cursor =    CURSOR FOR
SELECT NAME
FROM   [master].[sys].[databases]
WHERE  NOT NAME IN ('master'
                   ,'tempdb'
                   ,'model'
                   ,'msdb'
                   ,'SES'
                   ,'SES_ARCHIVE'
                   ,'SES_SERVICE')
       AND NAME LIKE '%2013%'
       OR NAME LIKE '%2014%'
       OR NAME LIKE '%2015%'
OPEN @Cursor
FETCH NEXT FROM @Cursor INTO @name
WHILE (@@FETCH_STATUS=0)
BEGIN
    --print @nameser
    SET @cmd = '
EXEC xp_cmdshell ''MD \\192.168.0.38\Backup\cristal_arhiv\'+@nameser+'\''
BACKUP DATABASE ['+@name+'] TO  DISK = N''\\192.168.0.38\Backup\cristal_arhiv\'+@nameser+'\'+@nameser+'_'+
        @name+'.BAK'' WITH NOFORMAT, NOINIT,  NAME = N'''+@name+
        '-Полная База данных 
Читать далее

Как увеличить количество файлов в TempDB

USE [master]
GO
ALTER DATABASE [tempdb] MODIFY FILE ( NAME = N'tempdev', SIZE = 6144000KB , MAXSIZE = 35840000KB )
GO
ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev1', FILENAME = N'S:\tempdb1.mdf' , SIZE = 6144000KB , MAXSIZE = 35840000KB , FILEGROWTH = 10%)
GO
ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev2', FILENAME = N'S:\tempdb2.mdf' , SIZE = 6144000KB , MAXSIZE = 35840000KB , FILEGROWTH = 10%)
GO
ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev3', FILENAME = N'S:\tempdb3.mdf' , SIZE = 6144000KB , MAXSIZE = 35840000KB , FILEGROWTH = 10%)
GO
ALTER DATABASE [tempdb] ADD 
Читать далее

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

declare @db nvarchar(max) declare @sql nvarchar(max) declare cursor_size_srv cursor for 
SELECT 
  @@SERVERNAME AS Server , name AS DBName 
  --recovery_model_Desc AS RecoveryModel , --Compatibility_level AS CompatiblityLevel , 
  --create_date , 
  --state_desc FROM sys.server_principals WHERE NAME LIKE 'HEAD_OFFICE\_Розничная сеть%' ORDER BY Name; OPEN cursor_size_srv FETCH NEXT FROM cursor_size_srv INTO @db WHILE (@@FETCH_STATUS=0) BEGIN set @sql = 'USE [Demo_connect] GO CREATE USER ['+@db+'] FOR LOGIN ['+@db+'] GO USE [Demo_connect] GO EXEC sp_addrolemember N''db_datareader'', N'''+@db+''' GO' print (@sql); FETCH NEXT FROM cursor_size_srv INTO @db END CLOSE cursor_size_srv DEALLOCATE cursor_size_srv

 


 

Как найти и удалить дубликаты строк в таблице mssql

Select id, objectname from [ax_molniya].[dbo].[www_reindex_tablename]  where objectname in (
Select objectname from [ax_molniya].[dbo].[www_reindex_tablename] Group by objectname having Count(*) >1)
Delete from t from [ax_molniya].[dbo].[www_reindex_tablename]  t, [ax_molniya].[dbo].[www_reindex_tablename]  v
where t.objectname = v.objectname
and t.id > v.id

 

Как запустить задание (job) удаленна с другова сервере mssql или из другого задания (job).

Была задача запустить задание из другого задания которое находилось на другом сервере mssql

Создаём линковку (связанный сервер) и в свойствах включаем RPC :

Как запустить задание (job) удаленна с другова сервере mssql или из другого задания (job).

Так же надо убедится что у пользователя под кем создалась линкова есть права на базу msdb:

Как запустить задание (job) удаленна с другова сервере mssql или из другого задания (job).Как запустить задание (job) удаленна с другова сервере mssql или из другого задания (job).

exec linkserver.msdb.dbo.sp_start_job  @job_name = 'name job'

 

 

Как сформировать скрипт для реиндекса индексов mssql. Необходимо для каждого индекса с генерировать соответствующую ALTER INDEX команду

DECLARE @SQL NVARCHAR(MAX)

DECLARE cur CURSOR LOCAL READ_ONLY FORWARD_ONLY FOR
	SELECT '
	PRINT ''Перестройка  [' + i.name + N'] начато ''  + Cast(GETDATE() as varchar);
	
	ALTER INDEX [' + i.name + N'] ON [' + SCHEMA_NAME(o.[schema_id]) + '].[' + o.name + '] ' +
		CASE WHEN s.avg_fragmentation_in_percent > 30
			THEN 'REBUILD WITH (FILLFACTOR = 80, PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, SORT_IN_TEMPDB = OFF, ONLINE = ON)
			
	PRINT ''Перестройка  [' + i.name + N'] завершено '' + Cast(GETDATE() as varchar) '
ELSE 'REORGANIZE'
		END + ';'
		
		


	FROM (
		SELECT 
			  s.[object_id]
			, s.index_id
			, avg_fragmentation_in_percent 
Читать далее

Как узнать фрагментацию индексов во всех таблицах в базе MSSQL

SELECT  IndStat.database_id,
                IndStat.object_id,
                QUOTENAME(s.name) + '.' + QUOTENAME(o.name) AS [object_name],
                IndStat.index_id,
                QUOTENAME(i.name) AS index_name,
                IndStat.avg_fragmentation_in_percent,
                IndStat.partition_number,
                (SELECT count (*) FROM sys.partitions p
                        WHERE p.object_id = IndStat.object_id AND p.index_id = IndStat.index_id) AS partition_count
FROM sys.dm_db_index_physical_stats
    (DB_ID('ax_molniya'), OBJECT_ID(NULL), NULL, NULL , 'LIMITED') AS IndStat
        INNER JOIN sys.objects AS o ON (IndStat.object_id = o.object_id)
        INNER JOIN sys.schemas AS s ON s.schema_id = o.schema_id
        INNER JOIN sys.indexes i ON (i.object_id = IndStat.object_id AND i.index_id = IndStat.index_id)
WHERE IndStat.avg_fragmentation_in_percent > 10 AND IndStat.index_id > 0