Quantcast
Channel: Немножко всего .. из жизни администратора ms sql server
Viewing all 43 articles
Browse latest View live

Ошибка при отображение OLAP куба

$
0
0

При начале работы в Microsoft  VisualStudio 2008 с OLAPкубами может  возникнуть следующая ошибка при попытке отобразить куб:

Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)) (Microsoft Visual Studio)

 

Решение: необходимо скачать компонент Office 2003 Add-in: Office Web Components:
http://www.microsoft.com/en-us/download/confirmation.aspx?id=22276
После установки ошибка исчезает.

Настройка репликации MS SQL Server через сеть Интернет

$
0
0

Иногда необходимо доставить данные с одного сервера MS SQL Server  к другому серверу через сеть Интернет использую репликацию, такой случай у меня  был, и ниже я описал как это было реализорвано.
Настройка репликации  MSSQLServerчерез Интернет мало чем отличается от настройки репликации в локальной сети, за исключением настройки сетевого оборудования.
 


Примерная схема, того, что у нас должно получиться примерно такова:


Объект 1 Сервер 1 и Объект 4 Сервер 2 - это сервера с MSSQLServerв разных сетях.
На Сервере 4 находится основная база, на которую настроена репликация транзакций.
Сервере 1 будет выполнять роль PULLподписчика.

Я еще дополнительно использую ftpдля получения резервной копии и её восстановления на Сервер 1 для настройки репликации. Сервер ftp так же запущен на сервере 2. В MSSQLServerесть возможность использовать ftpдля доставки моментальных снимков при репликации, но у меня была проблема с настройкой сетевого оборудования с настройкой NAT-PT, FTPALG, иначе не будет происходить доступ подписчика к ftpсерверу.  Я решил по-простому – использовать резервные копии.
Объект 2,3 –это коммутаторы имеющие выход в Интернет с  внешним IP, на которых будут настроены сетевые правила .

Сначала настраивается сетевое оборудование, на коммутаторе 2 необходимо открыть порты TCP20,21 для ftpи 1433 для самого MSSQLServer (при использование именованного инстанса дополнительно открыть UDP 1434 ) для пакетов от SourceСервер1 к Destinationвнешний IPкоммутатора 3.

На коммутаторе 3 настраиваем NATпроброску TCPпакетов MSSQLServerот источника IPкоммутатора 2

После настройки сетевого оборудования  проверяем доступность портов командой telnet:

telnet 85.30.240.26 1433
где сначало указывается IP нашего сервера 2,  а затем порт, через который подключаемся, в нашем случае это ms sql порты.

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

Следующий шаг связан с тем,  что репликация MSSQLServerвозможна только между серверами   с использованием имени сервера, а не по IP.

Т.к наши сервера знают  о друг друге только по IP, чтобы они знали и  имена, то пропишем их на подписчике Сервер1 имя сервера 2, для этого открываем файл hosts (C:\Windows\System32\drivers\etc)  и делаем привязку имени к IPдобавив строку:

85.30.240.26     имя_сервера2

Где 85.30.240.26    это внешний IPкоммутатора 3, но для mssqlна сервере1  это  будет сервер 2, а там наш коммутатор должен пробросить пакет до реального сервера 2.

После этого можно проверить подключение к MSSQLServer с сервера 1 на сервер 2 через MSSQLManagementStudioкак по имени , так и по IP.

Еще одно важное замечание, т.к. сервера в разных подсетях и не знают о друг друге ничего, то необходимо использовать sqlаутефикацию.

 После этого можно настроить саму  репликацию MSSQLServer(Инструкция есть у меня в блоге):
1)Создать распространителя на сервер 2
2)Создать публикацию. И Добавив подписчика сервер 1, сервер добавляется через sqlскрипт,а не в графическом режиме.
3) И Создать подписчика на сервере 1, предварительно восстановив базу  из резервной копии  созданной на сервере 2 и скопированная из ftpсервера.

После запуска агентов репликации , репликация должна работать!

 

Скрипт список разрешений пользователей на сервер MS SQL Server

$
0
0

 При миграции с одного MSSQLserverна другой сервер, переустановки сервера  необходимо кроме как скопировать  учетные записи, нужно скопировать и их разрешения на сервер MSSQLServer.

Ниже приводится скрипт  получения списка прав на MSSQLServer(скрипт применим для версий MS SQL Server 2005 и старше):

select 
 'sqlcommand'=
   case
     when s.class_desc='SERVER'then  
         case
             when  s.state_desc<>'GRANT_WITH_GRANT_OPTION'then
              s.state_desc+''+s.permission_name +' TO ['+p.name+']'collate Cyrillic_General_CI_AS
             else 
              'GRANT '+s.permission_name +' TO ['+p.name+'] '+'WITH GRANT OPTION 'collate Cyrillic_General_CI_AS
         end
    
     when s.class_desc='ENDPOINT'then
        case
             when  s.state_desc<>'GRANT_WITH_GRANT_OPTION'then
              s.state_desc+''+s.permission_name +' ON ENDPOINT::['+(select name  fromsys.endpointswhereendpoint_id=s.major_id)
                                  +'] TO ['+p.name+']'collateCyrillic_General_CI_AS
             else 
              'GRANT '+s.permission_name +' ON ENDPOINT::['+(select name  fromsys.endpointswhereendpoint_id=s.major_id)
                                  +'] TO ['+p.name+'] '+'WITH GRANT OPTION 'collateCyrillic_General_CI_AS
            end

       when s.class_desc='SERVER_PRINCIPAL'then
         case
             when  s.state_desc<>'GRANT_WITH_GRANT_OPTION'then
              s.state_desc+''+s.permission_name +' ON LOGIN::['+
              (select name fromsys.server_principalswhere                       principal_id=s.major_id)+'] TO ['+p.name+']'collateCyrillic_General_CI_AS
             else 
              'GRANT '+s.permission_name +' ON LOGIN::['+(select name fromsys.server_principalswhere principal_id=s.major_id)
                                  +'] TO ['+p.name+'] '+'WITH GRANT OPTION 'collateCyrillic_General_CI_AS
            end
      end

       ,p.name
      ,s.permission_name
      ,s.class_desc
      --,*
fromsys.server_permissions s innerjoinsys.server_principals p
     on s.grantee_principal_id=p.principal_id
where
      s.permission_name<>'CONNECT SQL'
      and
      p.name notlike'##%'

  Результат можно запроса можно выгрузить в файл, только предварительно  оставив в результирующем наборе только поле «sqlcommand».

Можно настроить выгрузку результата в файл(алгоритм выгрузки взят с sql.ru):
DECLARE @result int
EXEC @result =master..xp_cmdshell
 'sqlcmd -S localhost -E -Q "Текствышеуказанногоскрипта" -b -o c:\mssqlUserPermissions.txt', no_output

IF (@result = 0)
   PRINT'Success'
ELSE
   PRINT'Failure'

Этот скрип совместно с скриптом "Скриптование всех пользователей, ролей БД и их прав"поможет перенести Вам права пользователей в MS SQL Server.
Кстати, напоминаю, что скрипт копирования самих пользователей с их SID-ами находится на сайте Microsoft.
НадеюсьскриптВампригодится.

32-разрядные ODBC драйвера на 64-разрядной операционной системе

$
0
0

Довольно часто бывает, что при настройке доступа из MSSQLServerк другим источникам данных мы имеем только 32-разрядные  ODBCдрайвера в то время, когда операционная система 64-разрядная.

Решить данную проблему можно следующими способами:

1)Установить на 64 –разрядную ОС 32-разрядную версию MSSQLServer, иногда подходит даже  редакция MSSQLServerExpress. После этого возможно настроить связанный сервер с помощью 32 - разрядных  драйверов.

2)Создать ODBCисточник в операционной системе, затем создать SSISпакет, а в свойствах пакета указать работу в 32-разрядном режиме. В этом случае наши драйвера будут работать.  

Для указания данного параметра необходимо в среде MSSQLServerBusinessIntelligenceDevelopmentStudioв свойствах проекта «Project -> NameofProjectProperties» выбрать пункт «Debugging»  параметр «Run64BitRuntime» выставить в значение  «False».

Важно:И еще после установки 32-разрядных драйверов, настройка источников данных осуществляется через приложение odbcad32.exeрасположенное в каталоге «C:\Windows\SysWOW64».

Удачных коннектов!

Настройка IBM Lotus ODBC драйвера для MS SQL Server

$
0
0

    Недавно пришлось настраивать, а точнее восстанавливать, ODBCподключение к  базам Lotus-а.

А началось с того, что позвонил аналитик и сообщил, что перестала работать загрузка данных из баз данных Lotus-а. Выгрузка эта была настроена давно другим пользователем, и он уже как пол года уволился, а выгрузка перестала работать 3 дня назад. Начал разбираться, т.к это был первый опыт работы с данным источником, то пришлось разбираться с нуля, и получилось довольно не просто.
   06.11.2013 добавлена информация по настройке драйверов для Windows 2012 Server.
Ниже описаны шаги по настройке данного источника данных для MSSQLServer.

Итак, порядок установки и настройки таков:

1)Скачиваем и устанавливаем LotusNotesSQLODBCдрайвера с сайта IBM. На момент написания этой статьи была доступна следующая версия драйверов 8.51.2009.1021 от 21.10.2009. На что здесь стоит обратить, то что драйвера только 32-разрядные, а  большинство серверов уже 63 разрядные. Соответственно настройка источника необходимо производить как описано в данной статье.

После того как скачали, устанавливаем драйвера, желательно в каталог по умолчанию C:\NotesSQL.

2)Устанавливаем клиент IBMLotusNotesна сервер. После установки клиента на сервер, его необходимо настроить под пользователем, через которого будет осуществляться доступ к базам Lotus-а.

3) Запустить приложение Nsql_ALM.exe , которое находится в каталоге установки ODBCдрайверов IBMLotus. В данном приложении необходимо указать файл lotus.ini и user.idи  сохранить настройки.

Здесь  я думал, что все настроено, но при создании источника данных возникла ошибка:

The setup routines for the Lotus Notes SQL Driver (*.nsf) ODBC driver could not be loaded due to system error code 126: The specified module could not be found. (C:\NotesSQL\nsqlc32.dll).

На решение этой проблемы и потратилось больше всего времени. Она возникает из-за того, что драйвера были написаны для 32-разрядных старых операционных систем и разницы путей в реестрах.

Итак, благодаря интернету, была решена данная проблема, необходимо сделать следующее:

1)Проверить пути в реестре и в реальность следующего ключа [HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\Lotus Notes SQL Driver (*.nsf)] , разница маловероятно, но стоит сначала проверить.

2)И самое ключевое, прописать путь в системные переменные операционной системы.

Для этого в свойствах компьютера выбираем вкладку «Дополнительно\Advanced», затем «Переменные среды\ EnvironmentVariables»


Выбираем переменную «Path»

И добавляем следующие пути, через символ « ; »:

-          Путь установки клиента IBMLotusNotesClient-а,

-          Пусть установки ODBCдрайверов IBMLotusSQL, по умолчанию C:\NotesSQL

 после этого сохраняем данные  и перегружаем сервер.

Теперь можно и создать источник данных, к примеру так:

Указав в поле «Username» учетную запись Lotus-а.
    Далее это источник можно использовать в SSISпакетах, либо создавать связанных серверах.

Добавлено 06.11.2013:
    При установки данных драйверов в ОС Windows 2012 Server данные драйвера не появляются в источника ODBC. Для того, чтобы они появились и необходимо поправить реестр:
Добавить ключ в ветвь:
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ODBC\ODBCINST.INI\ODBC Drivers]
"Lotus Notes SQL Driver (*.nsf)"="Installed"
и создать ветку Lotus Notes SQL Driver (*.nsf) в каталоге [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ODBC\ODBCINST.INI\]
параметры следующие (можно скопировать в .reg файл):
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ODBC\ODBCINST.INI\Lotus Notes SQL Driver (*.nsf)]
"APILevel"="1"
"ConnectFunctions"="YYY"
"CPTimeout"="<not pooled>"
"Driver"="C:\\NotesSQL\\nsql32.dll"
"FileExtns"="*.nsf"
"FileUsage"="2"
"Setup"="C:\\NotesSQL\\nsqlc32.dll"
"SQLLevel"="0"
"UsageCount"=dword:00000002



Помог следующий ресурс:
http://www.sqlservercentral.com/Forums/Topic478479-146-1.aspx
еще нашел :
http://www.databasejournal.com/features/mssql/article.php/3462011/Connect-to-Lotus-Domino-using-SQL-Server-Linked-Server.htm

Удачного подключения!

Резервное копирование и восстановление сервера отчетов MS SQL Server Reporting Services

$
0
0

С сервера MSSQL  ServerReportingServices  с отчетами нужно обязательно создавать резервные копии, как и с других компонентов  MSSQLServer.

Иначе,  при внештатной ситуации данный сервер может быть недоступен, что приведет к недоступности отчетной информации.

Ниже описан минимум, что нужно резервировать:

1) Создать резервные копии баз данных сервера отчетов, по умолчанию это базы  ReportServer,

ReportServerTempDB .

База  ReportServerTempDBсодержит временную информацию необходимая только самому серверу отчетов на определенный момент, это что-то вроде TempDbдля сервера отчетов. Поэтому её нет необходимости все время создавать резервные копии, желательно иметь хотя бы 1 резервную копию базы. Она необходима для того, чтобы не создавать заной данную базу при восстановлении нового сервера отчетов. Так же эта резервная копия пригодится при повреждении целостности базы данных при проверки CheckDb().

База данных ReportServerсодержит всю информацию по пользовательским объектам сервера отчетов. Частота резервного копирования данной информации выставляется исходя из частоты создания\изменения объектов на сервере отчетов. Обычно достаточно раз в день

2) Необходимо создать резервную копию ключа шифрования пользовательской информации.

ДляэтогонужноотрытьMS SQL Server Reporting Server Configuration Manager, выбратьпункт«Encryption Key»   инажатькнопку«Backup»



При создании необходимо указать путь хранения файлов, а так же указать безопасный пароль (пароль состоящий из букв и цифр различного регистра и длиной не менее 8 символов)

3) Так же необходимо сделать копии файлов:

·         Rsreportserver.config;
·         Rssvrpolicy.config;
·         Rsmgrpolicy.config;
·         Reportingservicesservice.exe.config;
·         Web.config — для приложений ASP.NET сервера отчетов и диспетчера отчетов;
·         Machine.config для ASP.NET.

Эти файлы необходимо скопировать один раз при установке службы MSSQLServerReportingServices.

Если вы хотите восстановить службу на новом сервере, то порядок восстановления следующий:

1) Необходимо установить саму службу MSSQLServerReportingServicesбез конфигурирования .

2) Восстановить базы данных ReportServer,ReportServerTempDBиз резервных копий.

Убедитесь, что учетная запись , от которой работает  MSSQLReposrtingServices, имеет права на сервер MSSQLServer.


3) Подсоединить к службе отчетов восстановленные базы данных.

Отрыть MSSQLServerReportingServerConfigurationManager, выбрать пункт «Database» , нажать кнопку «ChangeDatabase»  и укажите наши восстановленные базы данных.


4) Восстановить ключ шифрования из резервной копии.

 ДляэтогонужноотрытьMS SQL Server Reporting Server Configuration Manager, выбратьпункт«Encryption Key»   инажатькнопку«Restore»

5) СоздайтеWeb Service иReport Manager Url-ы. ДляэтоговMS SQL Server Reporting Configuration Manager выберитесоответственнопункты«WEB Service URL» и«Report Manager Url» инажмитекнопкуApply, принеобходимостиуказавнужныеадреса.


После данных операций сервер будет восстановлен аналогично исходному по содержанию. После первого запуска Webсервера отчетов, на MS SQL Server-е  создадутся необходимые задания MSSQLAgent-а, если они необходимы.


Самое главное при восстановлении иметь резервную копию ключа шифрования сервера отчетов, в противном случае будут доступны отчеты пользователей, но вся информация связанная ч учетными записями (строки соединений, адреса подписок, расписание заданий) будет потеряна, необходимо будет её заново восстанавливать.


Скрипт переноса пользователей ролей сервера

$
0
0
При переходе с одного сервера на другой, необходимо так же перенести пользователей и вхождения в роли сервера.

Ниже приводится скрипт, которые предоставляет это сделать:

IFNOTEXISTS(SELECT*FROM tempdb.sys.objectsWHEREobject_id=OBJECT_ID(N'tempdb.dbo.#t')

ANDtypein(N'U'))

BEGIN
  createtable #t

  ( serverrole nvarchar(40),

  membername nvarchar(200),

  membersid varbinary(85)

  )
end

else
  truncatetable #t

declare @serverrole nvarchar(40)
declare @Membername nvarchar(200)
declare @sql nvarchar(250)

insertinto #t
execsp_helpsrvrolemember-- 'sysadmin'
--Если необходим список конкретной роли, то нужно указать её, иначе получится скрипт для всех ролей
 
declare cur cursorfor
select serverrole,Membername from #t
where Membername notin('sa','NT AUTHORITY\SYSTEM',

                                           'NT SERVICE\MSSQLSERVER','NT SERVICE\SQLSERVERAGENT',

                                           'NT AUTHORITY\NETWORK SERVICE'

                                           ,'BUILTIN\Administrators')

open cur

FETCHNEXTFROM cur INTO @serverrole,@membername
WHILE@@FETCH_STATUS= 0
BEGIN

   set @sql='exec sp_addsrvrolemember '''+@Membername+''' ,'''+ @serverrole+''';'

   print @sql

FETCHNEXTFROM cur INTO @serverrole,@membername
END

CLOSE cur
DEALLOCATE cur
droptable #t

Результат будет примерно такой:

exec sp_addsrvrolemember 'sa2' ,'sysadmin';

exec sp_addsrvrolemember 'user_testt' ,'sysadmin';

.
Этот скрипт  совместно со скриптом копирования прав пользователей на сервер MS SQL Server поможет вам перенести пользователей и из права на новый сервер.
Скрипт копирования самих пользователей с их SID-ами находится на сайте Microsoft.
 
Всего хорошего!

Основы MS SQL Server шифрования на примере симметричного шифрования

$
0
0
Рассмотрим один из способов шифрования данных MSSQLServer 2008R2, а именно использование симметричного ключа, далее с помощью данного ключа зашифруем столбец в таблице.

Для начало немного теории:

Симметричный ключ –это ключ шифрования который используется как для шифрования данных, так и для их расшифровки. При его создании он должен быть зашифрован с помощью одним из средств: сертификат, пароль, симметричным\ассиметричным ключом. В примере будем шифровать с помощью сертификата.

Для того чтобы создать сертификаты и симметричный ключ в базе данных, нужно создать главный ключ базы данных (masterkey). Главный ключ базы данных  шифруется с помощью главного ключа службы, и хранится как в самой базе данных так и её копия в базе данных master.

Главный ключ службы является вершиной иерархии шифрования mssqlserver. Он создается автоматически, когда он понадобится при шифровании.
Для шифрования отдельный строк данных  необходимы функции шифрования – мы будем использовать EncryptByKey\ DescryptByKey.

В итоге имеем следующую цепочку:

Главный ключ службы -> Главный ключ базы данных -> Ключи и сертификаты в базе данных.
Соответственно, не имея одного из компонентов, мы не сможем расшифровать наши данные. Поэтому не забываем делать резервные копии ключей.
Перейдем от теории к практики:
Задача: зашифровать поле  в таблице.

1) Для начало создадим ключ базы данных:

CREATEMASTERKEYENCRYPTIONBY
    PASSWORD='superpassword#12'

2)Затем создадим сертификат для шифрования:

CREATECERTIFICATE cert1
   WITHSUBJECT='Certificate for Admin bd';

3) Затем создадим симметричный ключ шифрования с помощью сертификата:

CREATESYMMETRICKEYSSN_Key_01
    WITHALGORITHM=AES_256
    ENCRYPTIONBYCERTIFICATE cert1;
GO

Проверить наличие наших ключе и сертификатов можно выполнив запросы:

SELECT*FROMsys.symmetric_keys
SELECT * FROMsys.certificates

4) После того как все создали, необходимо сделать резервные копии наших ключе и сертификатов:
Создание резервной копии главного ключа базы данных

BACKUPMASTERKEYTOFILE='c:\adminbd'
  ENCRYPTIONBYPASSWORD='password@1';
GO

Создание резервной копии сертификата:
BACKUPCERTIFICATE cert1  TOFILE='c:\cert1_backup';
GO

 И самое главное, создание резервной копии главного ключа службы:

BACKUPSERVICEMASTERKEYTOFILE='c:\service_master_key’
      ENCRYPTIONBYPASSWORD='Password@1'

 5) После этого можно шифровать\дешифровать данные  в таблице.
Но перед тем как использовать шифрование\дешифрование, необходимо открыть ключ шифрования.

Пример вставки с шифрованием:

OPENSYMMETRICKEYSSN_Key_01
   DECRYPTIONBYCERTIFICATE cert1;

INSERTINTO[dbo].[servicelogins]
           ([login]           ,[srv]                      ,[encrpsw]
           ,[bd]           ,[description]           ,[owner]           )
VALUES

           ('test_login'
           ,'test_srv'
           ,EncryptByKey(Key_GUID('SSN_Key_01'),'testpassword')
           ,'test bd'
           ,'[description]'
           ,'[owner]'
           )

Чтение данных:
OPENSYMMETRICKEYSSN_Key_01
   DECRYPTIONBYCERTIFICATE cert1;

select  [login]
      ,[srv]
      ,[encrpsw]
      ,convert(char,DecryptByKey([encrpsw]))as p
      ,[bd] ,owner
from [dbo].[servicelogins]
go

Ключ открывается на время сеанса.
При чтение таблицы без ключа ошибки не будет, но данные соответсвено будут в зашифрованном виде.   

Самое, главное при создание резервной копии и восстановлении её на другом сервере, база данных будет восстановлена, данные будут,  сертификаты и ключи базы данных так же будут восстановлены, но читать с помощью их  данные не получится, т.к главный ключ службы другой. Для этого необходимо восстановить главный ключ из резервной копии:

RESTORESERVICEMASTERKEYFROMFILE='c:\service_master_key’
    DECRYPTIONBYPASSWORD='Password@1'force
  

Параметр ‘Force’ указывает, что можно заменить текущий ключ. Внимание, если на сервере есть зашифрованные данные текущего мастера ключа, то они будут недоступные при восстановлении нового ключа. Данный факт стоит учитывать при резервном копировании и восстановлении.

 Удачной работы!

Основы прозрачного шифрования MS SQL Server

$
0
0

Продолжая тему защиты данных в базе данных в MSSQLServer, рассмотрим прозрачное шифрование (TransparentDataEncryption- TDE) в MSSQLServer.  Демонстрация шифрования будет проводится на MSSQLServer 2012 SP1 EnterpriseEdition  для базы данных клиентов [DbClients], но данный сценарий будет рабочий и для MSSQLServer 2005/2008. Прозрачное шифрование доступно только в редакциях Enterprise или Datacenter.
Итак, для начало немного теории:

Как всегда все хорошо описано в BOL -http://msdn.microsoft.com/ru-ru/library/bb934049.aspx .
Функция прозрачного шифрования данных (TDE) выполняет в реальном времени шифрование и дешифрование файлов данных и журналов в операциях ввода-вывода. При шифровании используется ключ шифрования базы данных (DEK), который хранится в загрузочной записи базы данных для доступности при восстановлении.Ключ шифрования базы данных является симметричным ключом, защищенным сертификатом, который хранится в базе данных master на сервере, или асимметричным ключом, защищенным модулем расширенного управления ключами.Функция прозрачного шифрования данных защищает «неактивные» данные, то есть файлы данных и журналов

Основное прозрачного шифрования, это то , что:
Шифрование файла базы данных проводится на уровне страниц. Страницы в зашифрованной базе данных шифруются до записи на диск и дешифруются при чтении в память.Прозрачное шифрование данных не увеличивает размер зашифрованной базы данных.

При этом не стоит забывать, что прозрачное шифрование не шифрует данные при передачи через каналы связи, для этого к примеру можно включить шифрование соединения.

Так же надо учитывать, что шифрование\дешифрование данных это нагрузка на CPU, следовательно при проектирование необходимо учесть запас мощностей процессоров.

 
Ниже представлена схема работы прозрачного шифрования (так же взята из BOL):



Порядок включения шифрования:

1.       Создать главный ключ

2.       Создать или получить сертификат, защищенный главным ключом

3.       Создать ключ шифрования базы данных и защитить его с помощью сертициката

4.       Задать ведение шифрование базы данных

 Перейдем к самой реализации:

1)      Создание главного ключа шифрования

   CREATEMASTERKEYENCRYPTIONBYPASSWORD='StrongPassword#1';

Созданный наш ключ можно увидеть в  view:

select*fromsys.key_encryptions

 Удалить ключ можно инструкцией:

dropmasterkey

 После того как создали главный ключ, необходимо сделать его резервную копию и поместить резервную копию в надежное место:

BACKUPMASTERKEYTOFILE='c:\sqltest2012_masterkey_backup.bak'

    ENCRYPTIONBYPASSWORD='Password1'

 2)      Создание сертификата

CREATECERTIFICATETDECertificateWITHSUBJECT='TDE Certificate for DBClients'

Проверканаличиясозданногосертификата:

select*fromsys.certificateswherename='TDECertificate'

 Создание резервной копии сертификата с закрытым ключом:

       BACKUPCERTIFICATETDECertificate

       TOFILE='c:\sqltest2012_cert_TDECertificate'

       WITHPRIVATEKEY

       (

             FILE='c:\sqltest2012SQLPrivateKeyFile',

             ENCRYPTIONBYPASSWORD='Password#3'

       );

 
3)      Создание ключа шифрования в нашей базе данных с использование нашего сертификата

USE[DBClients]

CREATEDATABASEENCRYPTIONKEY

WITHALGORITHM=AES_128

ENCRYPTIONBYSERVERCERTIFICATETDECertificate;

 
4)      И наконец включаем шифрование для нашей базы данных

ALTERDATABASE[DBClients]

SETENCRYPTIONON;

В итоге имеем базу данных с прозрачным шифрованием.

Несколько моментов в работе с базой данных с включенным шифрованием:
Если создать резервную копию и попытаться восстановить на другом сервере, то получим ошибку:

Msg 33111, Level 16, State 3, Line 2
Cannot find server certificate with thumbprint '0x5B139FF1F2C5ED9EB3D503E78A63DEF3DD1FD96F'.
Msg 3013, Level 16, State 1, Line 2
RESTORE DATABASE is terminating abnormally.

Такую же ошибку получим и при попытки присоединения файлов базы данных.

Порядок восстановления  базы данных с прозрачным шифрованием на другом экземпляре MSSQLServer:
1)      Создать мастер главный ключ шифрования на сервере MS SQL Server
2)      Восстановить из резервной копии сертификат с закрытым ключом.

CREATECERTIFICATETDECertificate

    FROMFILE='c:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\sqltest2012_cert_TDECertificate'

    WITHPRIVATEKEY (FILE='c:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\sqltest2012SQLPrivateKeyFile',

    DECRYPTIONBYPASSWORD='Password#3');

3)      Восстановить шифрованную базу данных или присоединить файлы базы данных с включенным шифрованием. БД готова для работы.
 

В заключение, прозрачное шифрование это один из шагов безопасного хранения базы данных, но при этом надо не забывать про резервное копирование сертификатов с закрытым ключами, иначе резервная копия будет бесполезна.

 

MS SQL Server и MS SharePoint 2013. Сообщение «Using 'dbghelp.dll' version '4.0.5'»

$
0
0

После развертывания баз данных MSSharePoint 2013 на сервере MSSQLServer 2008R2 в логах СУБД появилось несметное количество однородных сообщений малоинформативного содержания:

Message
Using 'dbghelp.dll' version '4.0.5'

Все бы ничего, но их количество – 10-12 сообщений в минуту:



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

http://connect.microsoft.com/SQLServer/feedback/details/781950/turn-off-using-dbghelp-dll-version-4-0-5-messages-trace-flag
http://blogs.msdn.com/b/chaun/archive/2013/08/01/sp2013-sql2012-database-performance-metric-provider-timer-job-using-dbghelp-dll-version-4-0-5.aspx

Сообщение это возникает и в MSSQLServer2012, рекомендации Майкрософт – ожидать пакет исправлений.
В итоге решил избавиться от данного сообщения.
Из выше указанных источников, выяснено, что Sharepointсоздает расширенные события, их имена получаем следующим запросом:

select event_session_id,name fromsys.server_event_sessions

Результат:

name
-------------------------------------------------------------------------------------------------
system_health
SharePoint_Diagnostics_e4299af2cd984988a6bc5bdcc784b139_0
SharePoint_Diagnostics_e4299af2cd984988a6bc5bdcc784b139_1

Далееихпростоудаляем:

DROPEVENTSESSIONSharePoint_Diagnostics_e4299af2cd984988a6bc5bdcc784b139_0
ONSERVER
Go
DROPEVENTSESSIONSharePoint_Diagnostics_e4299af2cd984988a6bc5bdcc784b139_1
ONSERVER
Go

Ошибка исчезает, но через несколько минут замечаем, что сообщение снова появилось – sharepointзаново создал эти расширенные события.  В итоге скрипт удаления события включаем в задание MSSqlагента и запуском каждый  час.

В итоге, избавились от ненужного сообщения, а лог стал более читаем.

Не запускается MS SQL Reporting Services после обновления.

$
0
0
После недавнего обновления Windows перестала запускаться служба MS SQL Reporting Services.
Симптомы:

В браузере ошибка простая: IE не может отобразить данную страницу.
На сервере: служба ReportServer не запускается , ошибка ниже:

В  каталоге логов \\....\MSRS10_50.MSSQLSERVER\Reporting Services\LogFiles информации нет.
Обновление, после которого перестала запускаться служба KB2868626.

Решение прислали сотрудники Майкрософта ссылаясь на более ранние аналогичные проблемы после обновлений.
Решение:
№1Разблокируйте следующие URLs в firewall или proxy:

http://ctldl.windowsupdate.com/msdownload/update/v3/static/trustedr/en/authrootstl.cab
это в том случае, если с сервера есть выход в Интернет.
 
Альтернативное решение, которым я воспользовался

№2.
Выключите проверку CTL (certificate trust list) в Reporting Services service. Это предпочтительный метод если SSRS не имеет доступа в интернет или к изменение правил firewall или proxy невозможно.

a. Откройте файл ReportingServicesService.exe.config в текстовом редакторе (обычно лежит в этой папке C:\Program Files\Microsoft SQL Server\MSRS10_50.<Instance Name>\Reporting Services\ReportServer\bin).

b. Добавьте строчки в секции <runtime>:
    <generatePublisherEvidence enabled="false"/>
    <alwaysFlowImpersonationPolicy enabled="true"/>

c. Перезагрузите SSRS сервер
d.Запустите Reporting Services service
После этого служба заработала.
Так же есть аналогичное решение и на сайте Майкрософт: http://support.microsoft.com/kb/2745448
Аналогичная ошибка возникает и после обновления  KB2677070.
Хороших отчетов!

MS SQL Server 2014 Mirroring - спасибо, что еще есть)

$
0
0
Решил проверить наличие возможности зеркалировать базы данных в MS SQL Server 2014
CTP 2.
Ура, пока возможность есть:


Кстати, на скриншоте видно сообщение, что новые таблицы "в памяти"нельзя использовать совместно с зеркалированием.
Хотя еще в MS SQL Server 2012 уже предупреждали о возможности прекращении данной функции в будущих версиях MS SQL server http://msdn.microsoft.com/ru-ru/library/ms190202.aspx
Теперь это предупреждение есть и на  страничке по MS SQL Server 2014 http://msdn.microsoft.com/ru-ru/library/ms190202(v=sql.120).aspx

Значит, хорошее решение отказоустойчивости еще будет жить!






Создание базы данных на сетевом ресурсе.

$
0
0
Если по каким-то причинам Вам  необходимо разместить базу данных на сетевом ресурсе, а по умолчанию данная возможность закрыта, то можно воспользоваться ниже указанным способом:


База дынных на сетевом ресурсе создается через скрипт T-sql, в графическом режиме не получится.
Итак, перед создание необходимо активировать флаг 1807:
DBCCTRACEON(1807,-1)
go
После этого выполнить скрипт создания базы данных:

CREATEDATABASE[db1]
ONPRIMARY
(NAME=N'db1',FILENAME=N'\\sql-test-2\data\db1_idera.mdf',SIZE= 5120KB,FILEGROWTH= 10024KB)
LOGON
(NAME=N'db1_log',FILENAME=N'\\sql-test-2\data\db1__ideralog.ldf',SIZE= 1024KB,FILEGROWTH= 10%)



GO
База данных успешно создана:

Таким способом мы создаем  базы данных на сетевых ресурсах.
Единственно нужно учитывать:
- при создании базы данных нужно учесть права на сетевом ресурсе для учетной записи MS SQL Server
- т.к скорость доступа через Lan и надежность такового соединения меньше стандартного расположения баз данных, то таким способом рекомендуется создавать тестовые базы данных либо не критичных систем

Данные возможность проверялась в MS SQL Server 2008R2 и в 2012.
Небольшое замечание,  на других ресурсах описывается возможность присоединения баз данных с сетевых каталог, у меня по каким -то причинам такое не получилось: лог подключения к каталогу учетной записи MS SQL Server-а был, но откуда-то бралась учетная запись ANONYMOUS LOGON, у которой не проходила команда SeBackupPrivilige.
Решить данную проблему не получилось, даже предоставляя всем все права. Система была Windows 2008 и 2012.
UPD.17/08/15: Возможно просто необходимо было включить делегирование прав для учетной записи в домене  в настройках записи в AD, но это как предположение, не проверял.
Использованный материал:
Спасибо!.

Мониторинг AlwaysOn в MS SQL Server 2012

$
0
0
  Начиная с MS SQL Server 2012 появилась очень хорошая функция отказоустойчивости AlwaysOn. Функция-то функция хорошая, но вот с мониторингом плоховато в MS SQL Server. Да и в последнее время ответственность за мониторинг полностью ложится на администратора СУБД. Если раньше для зеркалирования был хоть какой-то джоб и на его можно повесить операторов СУБД, то для AlwaysOn такого задания нет.

Ниже написан запрос мониторинга AlwaysOn:

DECLARE @stateVARCHAR(30) 
DECLARE @P varchar(50)     --просто переменная для формирования текста письма
DECLARE @String VARCHAR(max)  -- текст письма
DECLARE @Groups TABLE(Gr varchar(50), synchronization_health_desc VARCHAR(30))
DECLARE @databases TABLE(DB varchar(100), synchronization_health_desc VARCHAR(30), replica varchar(30))
declare @Subj varchar(100)

declare@prreplicavarchar(100)=@@servername

--проверка, является ли данный сервер первичный для групп
--т.к на вторичных репликах состоянии не HEALTH
if@@SERVERNAME  in (select primary_replica from
                                                  sys.dm_hadr_availability_group_states  whereprimary_replica=@@SERVERNAME)
begin
  insertinto @Groups
   select g.name,s.synchronization_health_descfrom sys.dm_hadr_availability_group_states s
   inner join sys.availability_groups g on s.group_id=s.group_id
        where s.synchronization_health_desc<>'HEALTHY'
         ands.primary_replica=@@SERVERNAME

end

--проверка состояния БД
insertinto @databases
select d.name,s.synchronization_state_desc,r.replica_server_namefrom sys.dm_hadr_database_replica_states s
  inner join sys.sysdatabases d on s.database_id=d.dbid
  inner join sys.availability_replicas r on s.replica_id=r.replica_id
            where s.synchronization_health_desc<>'HEALTHY'
                           and d.dbid>4

--формирование текста письма
Set @String=''
if exists(select1from @Groups)
  while exists(selecttop1 gr from @Groups)
  begin
     selecttop1 @p=Gr,@state=synchronization_health_desc from @Groups
     set @String=@String+'Проблема с AlwaysOn на сервере '+@@SERVERNAME+'.Группа доступности '+@p+'     находится в состоянии '+@state+'.'+CHAR(13)
     deletefrom @Groups where gr=@p
  end

if exists(select1from @databases)
  while exists(selecttop1 db from @databases)
  begin
      selecttop1 @p=DB,@state=synchronization_health_desc from @databases
      set @String=@String+'Проблема с AlwaysOn на сервере '+@@SERVERNAME+'.База данных '+@p+'находится в состоянии '+@state+'.'+CHAR(13)
      deletefrom @databases where DB=@p
  end


-- отсылка письма
if  len(@string)>1
begin
set @Subj='Проблема с AlwaysOn на сервере '+@@SERVERNAME
  EXEC msdb.dbo.sp_send_dbmail'mail_profile', 'dba_admins@mail.ru;', @body = @string, @subject = @Subj
end


Запихиваем данный запрос в задание MS SQL агента, ставим расписание и запускаем.

Что он делает:
Он проверят состояние групп доступности и состоянии баз данных(сделано одновременно, т.к может быть несколько групп доступности) и если у них состоянии не HEALTH, то идет формирование письма и отсылка на указанные адреса.

Буду рад, если данный запрос Вам помог!
Удачи!

08072014 upd: Обновлен скрипт с учетом более 1 групп доступности и на серверах с различными ролями серверов.

Секционирование. Очистка больших таблиц.

$
0
0

 Одно из возможных применений секционирование – это обслуживание больших таблиц, такое как удаление старых данных, оставлять только актуальные.

Данный способ редко применяется , но имеет быть. В текущей статье расскажу реальную задачу, которую пришлось решить с  помощью секционирования.

  Имелась таблица логов системы, количество строк переваливало за 65 млн. строк. Необходимо было оставить только актуальные данные, при том , что таблица должна быть доступна для вставки.. Самих актуальных данных было уже более 10 млн. строк. Конечно можно было настроить задание по очистке таблицы порциями, но это и долго и «просто»).Решил использовать секционирование .

Итак, планбыл таков:

1) Переименовать текущую таблицу логов
2) Создать новую таблицу с именем исходной таблицы логов
3) В переименованной таблице создать секции со старыми данными и актуальными
4) Секцию с актуальными данными присоединить  к таблице логов

Но здесь есть несколько подводных камней, если заметили,   самое главное: присоединений секций к таблице возможно, если только если таблица назначения пуста,  а создание секций на таблице со 65 млн. строками займет десятки минут, и явно  таблица логов заполнится.
 Здесь я немного схитрил, я переименовывал таблицу логово два раза, второй раз после завершения создания секций , переименовывается таблица логов, создается новая таблица логов и тут идет присоединение секции к таблице.  А затем просто из второй переименованной таблицы  скопированы  данные в новую таблицу логов( за время создания секций это количество было более 5000 строк).

Меньше слов, больше кода:

1)      Переименование таблицы

USE [DB]
GO
EXECsp_rename'dbo.logs','logs1';
GO

2) Создание аналогичной таблицы

USE [DB]
GO
CREATETABLE [dbo].[logs](
      [novell] [nvarchar](50)NULL,
      [ip] [nvarchar](50)NULL,
      [eventtime] [datetime] NULL,
      [num] [nvarchar](100)NULL,
      [id] [nvarchar](100)NULL,
      [ppa] [nvarchar](100)NULL
)
GO

3) Создание функции секционировании, схемы и создание секций.

USE [DB]
GO
BEGINTRANSACTION
CREATEPARTITIONFUNCTION[partFuncLogs](datetime)
ASRANGERIGHTFORVALUES (N'2014-01-01T00:00:00.001')
 
CREATEPARTITION SCHEME [partSchemeLogs]
 ASPARTITION[partFuncLogs] TO ([PRIMARY], [PRIMARY])
 
CREATECLUSTEREDINDEX[ClusteredIndex_on_partSchemeLogs_635265953843153227] ON[dbo].[logs1]
(
      [eventtime]
)WITH (SORT_IN_TEMPDB=OFF,IGNORE_DUP_KEY=OFF,DROP_EXISTING=OFF,ONLINE=OFF)ON [partSchemeLogs]([eventtime])

DROPINDEX[ClusteredIndex_on_partSchemeLogs_635265953843153227] ON[dbo].[logs1] WITH (ONLINE=OFF)
COMMITTRANSACTION

4)Присоединений секции к новой таблице логово

ALTERTABLE dbo.logs1 SWITCH PARTITION 2 TO  dbo.logs
GO

В текущем коде пропущены пункты второго переименования и пересоздания таблицы логов, но они повторяют пункты 1 и 2. Так же хочу отметить, что в этот момент были транзакции ожидавшие вставки в таблицу логов. После создания таблиц, новых данных было порядка 100 строк. Само создание и присоединение секции занимает доли секунды.

А это так, для информации , узнать в какой секции данные )
SELECT$PARTITION.partFuncLogs('2014-01-01T09:31:08.657') (Написал для себя , чтобы запомнить); 

Благодаря такому решению, мы имеем:
- Таблица была доступна.
- Данный разделены
- Потрачено незначительное время.

Несколько замечание:
- функция секционирования доступна в редакции Enterprise

- в момент созданий новой таблицы и присоединения секции возможна вставка данных в  таблицу, в этом случае присоединение секции будет невозможно. Придется еще раз повторять операцию Поэтому, для таблиц в которые льются сотни строк в секунду, данный способ будет может быть не применим.

- данный способ может быть вообще неприменим из-за структуры данных и таблиц, так что перед этим нужно тестировать не тестовом сервере.

Хороших вам таблиц. Спасибо, если помог.

DBCC CHECKDB. Решение одной из ошибок проверки целостности базы данных.

$
0
0

Данным заголовком будет начата серия постов по решению проблем, которые появляются после проверки целостности базы данных процедурой DBCCCHECKDB.

Утром пришло письмо, что на одном из сервере MSSQLне прошла проверка целостности базы данных.

Заглянув на сервер, увидел подробную информацию ошибки:

DBCC results for 't_DSY_PB_wrk_dosye'.

Msg 8928, Level 16, State 1, Line 1

Object ID 228195863, index ID 1, partition ID 72057594061193216, alloc unit ID 72057594097565696 (type In-row data): Page (1:505650) could not be processed.  See other errors for details.

Msg 8976, Level 16, State 1, Line 1

Table error: Object ID 228195863, index ID 1, partition ID 72057594061193216, alloc unit ID 72057594097565696 (type In-row data). Page (1:505650) was not seen in the scan although its parent (1:3527852) and previous (1:3527595) refer to it. Check any previous errors.

Msg 8944, Level 16, State 17, Line 1

Table error: Object ID 228195863, index ID 1, partition ID 72057594061193216, alloc unit ID 72057594097565696 (type In-row data), page (1:505650), row 1. Test (columnOffsets->offTbl [varColumnNumber] <= (nextRec - pRec)) failed. Values are 880 and 455.

Msg 8944, Level 16, State 17, Line 1

Table error: Object ID 228195863, index ID 1, partition ID 72057594061193216, alloc unit ID 72057594097565696 (type In-row data), page (1:505650), row 1. Test (columnOffsets->offTbl [varColumnNumber] <= (nextRec - pRec)) failed. Values are 880 and 455.

Msg 8978, Level 16, State 1, Line 1

Table error: Object ID 228195863, index ID 1, partition ID 72057594061193216, alloc unit ID 72057594097565696 (type In-row data). Page (1:3527596) is missing a reference from previous page (1:505650). Possible chain linkage problem.

There are 11997711 rows in 1308185 pages for object "t_DSY_PB_wrk_dosye".

CHECKDB found 0 allocation errors and 5 consistency errors in table 't_DSY_PB_wrk_dosye' (object ID 228195863).

Уровень серьезности ошибки 16(Level 16) показывает, что данную ошибку может исправить пользователь базы данных, или, проще говоря ошибка, не сильно серьезная, но нужно исправить.
Эта ошибка описывает несоответствие размещения данных в страницах индекса  согласно указателям - ошибка логического уровня. Сказывает это тем, что при обращение к данным страницам возможны некорректные ошибки или ошибки выполнения запроса.

Шаги решения:
1) Если объектов много , то для начала выяснить что за объект - локализации проблемы:
Можно взять из текста ошибки

DBCC results for 't_DSY_PB_wrk_dosye'
Либо запросом:
select  object_name(228195863)

2) Выявили таблицу, теперь необходимо выявить объект таблицы –индекс, с которым проблема:
indexID 1 – это кластерный индекс

если номер индекса >1 , то тогда запросом:
select*fromsys.indexeswhereobject_id=228195863 andindex_id=1
Мой результат : PK_t_DSY_PB_wrk_dosye

3)Выявили индекс, теперь его «лечим».
В данном случае просто это возможно простым перестроением индекса:

alterindexPK_t_DSY_PB_wrk_dosye on t_DSY_PB_wrk_dosye rebuild;
Либо возможен как вариант пересоздать индекс.
Проверить исправление возможно запусти команду:

dbcc checktable("dbo.t_DSY_RB_wrk_dosye")

Которая должна показать отсутвие ошибок.
Меньше ошибок, Удачи!

 

Настройка MS SQL Server AlwaysOn. Шаг за Шагом.

$
0
0

Технология AlwaysOnв MSSQLServerпредназначена на повышения доступности ваших баз данных, еще один шаг к отказоустойчивости системы. Появилась она с версии MSSQLServer2012  и предрекала в будущем замену технологии зеркалирования. Но уже сейчас видим, что в MSSQLServer 2014 присутствуют технология зеркалирование  и технология AlwaysOn. Что очень радует.

 В технологии AlwaysOnприсутствуют элементы сразу несколько технологий высокой доступности сервера  MSSQLServer:

-кластеризация
 AlwaysOnкак и кластер MSSQLServerимеет общее имя  и IP- адрес для экземпляров MSSQLServer, так же технология AlwaysOnработает как кластерная служба Windows. Для подключения клиентов к базе данных необходимо указать только один IPадрес.

- зеркалирование
В технологии AlwaysOnза основу взята технология зеркалирования MSSQLServer. Присутвует первичная реплика и до 4(3 в синхронном режиме) вторичных реплик(в MSSQLServer2014 до 8 реплик). Возможен режим работ реплик: асинхронный и синхронный.

- доставка журналов (logshipping)
На вторичные реплики при инициализации база данных доставляется как при logshipping–е, т.е автоматически делается полная резервная копия  и журнал транзакций на общий ресурс и автоматически восстанавливается на вторичной реплике. Вторичные реплики доступны для чтения данных, как и при доставке журналов.

Небольшой перечень преимуществ технологии AlwaysOn:

- поддерживается автоматический переход на вторичные реплики
- вторичные реплики возможно использовать для чтения данных
- вторичные реплики возможно использовать для снятия резервных копий без создания нагрузки на первичную реплику
- поддерживается автоматическое восстановление страниц
-нет необходимости использования общего дискового пространства для баз данных (для гео-кластеров это исключает использование лицензии для репликации СХД к примеру на оборудование HP)

 
Итак, изучив немного теории и узнав преимущества технологии MSSQLServer

AlwaysOn, постараемся его настроить.

Необходимые требования:
1)Windowsкластер (WSFC)  - MSSQLServerAlwayOnнастраивается на windowsкластере
2)MSSQLServerредакции Enterprise, который должен быть установлена на каждом узле Windowsкластера(WSFC).
3)Наличие AD. Без этого и WSFCне настроите.
4) На установленных MSSQLServer-ах должны быть настроены одинаковые параметры сортировки

Более подробно об ограничениях и возможностях написано на сайте MSDN.

 После установки MSSQLServer, необходимо включить поддержку AlwaysOnHighAvailability  Groupsна узлах кластера: открываем SQLServerConfigurationManager, выбираем вкладку  «AlwaysOnHighAvailability  » , активируем параметр «AlwaysOnHighAvailability  Groups».



 


Заодно здесь проверяем еще раз, работает ли MSSQLServerпод доменной учетной записью.
Теперь создадим саму группу AlwaysOn.
Открываем вкладку AlwaysOn  HighAvailability, щелкаем правой кнопкой на «AvailabilityGroups» выбираем «NewAvailabilityGroupWizard».

Указываем название группы доступности:

Под данным именем будет работать кластерная группа AlwaysOn, а так же служить именем для управлением доступности.

В следующем окне , выбираем базы , которые будут включены в группу доступности. Если базу данных нельзя  включить в группу, то справа будет описана причина невозможности включения в группу.

Далее необходимо включить реплики в группу AlwaysOnих настройки:


На данном изображении указаны, что сервер srv1\sql2012 является первичной репликой, srv2\sql2012  -вторичная реплика, настроена автоматическая обработка отказов(Failover) в обоих направлениях, режим работы синхронный и реплики доступны для чтения.

Во вкладке «Endpoints» указываются настройки конечных точек  зеркалирования , их порты и возможность шифрования передаваемых данных:

В следующей вкладке указываются настройки возможности снятия резервных копий:


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

Следующая вкладка, очень важная - указывается имя прослушивателя, т.е сетевое имя к которому будут подключаться пользователи, его порт и IP адрес.





Необходимо указать имя прослушивателя и присвоит ему свободный IPадрес, желательно статистический не DHCPадрес. Порт так же лучше указать стандартный MSSQLserver-ый 1433, либо в целях безопасности другой.

Если ноды Windowsкластера находятся в разных подсетях, то нужно указать два IPадреса.

В следующем окне указываем сетевое имя каталога, куда будут создаваться копии баз данных для инициализации группы доступности AlwaysOn.


Возможно указать, что резервные копии там есть, либо  вообще пропустить данный пункт.
В следующем окне идет проверка указанных параметров




После этого создается группа доступности.





Группа доступности AlwaysOnсоздана
Предупреждение указанное на скриншоте, сообщает о неточной конфигурации права голоса кворума.

Данное сообщение появляется при настройке AlwayOnна серверах на ОС Windows2008r2. Для решения данной неточности необходимо скачать обновлении KB2494036. Его нужно установить на всех нодах WFCS. а установить параметры голосов на одной из нод.

Только в описании указано устанавливать параметр голоса 0, но у меня с данным параметром на заработало, а заработало с параметром 1. Врезультатеназапрос :

SELECT  member_name,member_state_desc,number_of_quorum_votes

 FROM   sys.dm_hadr_cluster_members;

Параметр number_of_quorum_votesдолжен показывать 1 для всех нод и свидетеля кластера. В Window 2012 данные  параметры устанавливаются сразу .

Так же еще одно важное  замечание, при создание имя прослушивателя группы доступности AlwaysOn(в примере это “alwayslistener1”), регистрируется DNSимя компьютера в оснастке ADв каталоге Computers. Для этого кластерное имя должно имеет полные права на создание объекта в данном каталоге. Права выставляются в консоли ADSI
 

После создания группы доступности, у нас в консоли кластера появился сервис нашей группы доступности:


Но, не управляйте группой доступностью AlwaysOn через оснастку кластерной службы.

Управление группой AlwaysOnпроисходит в MSSQLServerManagementStudio, правая кнопка на объекте «AlwaysOnHighAvailablity» выбрать «ShowDashboard»




Основные параметры:
1 – Название группы доступности
2 – Имя прослушивателя
3 – Статус группы доступности
4 – Тип Failover–а
5 – Статус первичной реплики
6 – Статусы баз данных в группе доступности
7 -  Переключение на вторичную реплику

upd. 04.06.2014
еще одно важный шаг был пропущен.
Чтобы использовать вторичные реплики только для чтения для коннектов с параметром подключения
applicationintent=readonly
 
необходимо настроить роутинг.
На каждой  реплики группы доступности AlwaysOn выполняет скрипт:
 
ALTERAVAILABILITY GROUP [srv_alwaysOn Group]
MODIFY REPLICA ON
'srv1'WITH
(PRIMARY_ROLE(READ_ONLY_ROUTING_LIST=('srv2,'srv1')));

ALTERAVAILABILITY GROUP [srv_alwaysOn Group]
MODIFY REPLICA ON
'srv2'WITH
(SECONDARY_ROLE(READ_ONLY_ROUTING_URL =N'TCP://srv1.domain.net:1433'));

 После этого можно проверить коннект только для чтения, запускаем MS SQL Management Studio, указываем прослушиватель и открываем меню Options:
 


После успешного подключения проверяем нахождения нашего коннекта:
 
select  SERVERPROPERTY('ComputerNamePhysicalNetBIOS')
в результате должны получить имя сервера с вторичной репликой.

 С основными моментами настройки группы доступности AlwaysOnразобрались. В следующей статье опишу основные операции с группой доступности AlwaysOn.
Высокой доступности Вам!

Разграничение ресурсов сервера между компонентами MS SQL Server

$
0
0

Довольно часто бывает, что для каждой службы не всегда можно выделить отдельные сервера, поэтому на один сервер ставят несколько компонентов MSSQLServer, такие как  MSSQLServer, MSSQLServerAnalysisServices, MSSQLServerReportingServices. Если компонентами активно пользуются, то это приводит к конкуренции ресурсов сервера, и в итоге отрицательное влияние друг на друга.

В текущей статье опишем, как можно разделить ресурсы между компонентами MSSQLServer, установленные на один сервер.

Разделить можно следующие ресурсы: память и процессора. Диски, к сожалению, пока нельзя, я бы рекомендовал просто разнести на различные физические носители (это базы данных MSSQLServerи базы данных MSSQLServerAnalysis ), сгруппировать базы данных с низкой активностью  и т.д. .

Дано сервер с установленным MSSQLServer 2012 и компоненты Analysis, Reporting. На сервере 32 Гб памяти сервера и 8 процессоров, технологии NUMAнет.

Итак, начнем с самого простого, ограничение ресурсов MSSQLServer:
Память :
Графически
Выбираем свойства сервера, вкладка “Memory”, в поле «Maximumservermemory» устанавливаем необходимое значение памяти , которые выделяем  MSSQLServer-у:

 

Либо через инструкции T-SQl:
EXECsys.sp_configureN'max server memory (MB)',N'9000'
GO
RECONFIGUREWITHOVERRIDE

Процессор:
ВкладкаProcessors, снимаемгалочкуупараметра«Automatically set processor affinity for all processors”, отмечаемнеобходимыепроцессоры:

ЧерезкодT-SQL:
ALTERSERVERCONFIGURATIONSETPROCESSAFFINITYCPU= 0 TO 3
GO

Теперь у нас есть сконфигурированный инстанс MSSQLServer, которому выделено  9 Гб памяти и отдано 4 процессора сервера.

ДалеенастраиваемслужбуMS SQL Server  Analysis Services.
Параметры конфигурации службы сохраняются в файле msmdsrv.iniв каталоге установки службы директории OLAP\Config. Перед изменением рекомендуется сохранить отдельно данный файл, хоть и перед рестартом службы копия файла сохраняется с расширением msmdsrv.bak

Можно менять параметры как напрямую в файле, так и в графическом режиме. Лучше, конечно в графическом режиме, так можно меньше сделать ошибок.
Итак нас интересуют параметры памяти:


Memory\TotalMemoryLimitи Memory\LowMemoryLimitэто, можно сказать эквивалент параметров maxи minservermemorylimitу MSSQLServer-а.
Второй параметр нас мало интересует, это параметр определяет минимальное количество памяти при запуска службы. А вот параметр Memoty\TotalMemoryLimitопределяет максимальное количество памяти, которое может использовать служба MSSQLServerAnalysisservices.Значение в процентах от общего количества памяти на сервере. К примеру, значение 20 на сервере с 32 Гб памяти, определяет для службы MSSQLServerAnalysis 6,4 Гб памяти.

Память определили, переходим к процессорам, нас интересую следующие параметры:

Параметры с названием \GroupAffinity . Это параметры определяют привязку отдельных пулов службы к процессорам По умолчанию параметры определяют на использование всех процессоров сервера, но у нас на сервере есть еще и другие службы, поэтому ограничим используемые процессоры. Для MSSQLServerмы определили первые три процессора, для службы Analysisмы определим процессоры 4 и 5.

Вычисляем битовую маску:
Номера процессоров 76543210  - 00110000 , где 1 процессор который будем использовать
Значение 00110000 переводим в 16-е значение=  0х30

Данное значение пропишем в конфигурации. Для применения настроек необходим перезапуск службы. Более подробно описано на MSDNhttp://msdn.microsoft.com/ru-ru/library/ms175657(v=sql.110).aspx#bkmk_groupaffinity, либо здесь http://christianb7.wordpress.com/2012/11/11/analysis-services-2012-configuration-settings/

 Для службы MS SQL Server Analysis память и процессоры выделены и изолированы.  

Теперь осталось настроить службы MS SQL Server Reporting Services.
Для данной службы есть возможность только ограничить потребление памяти.
По умолчанию служба может потреблять всю доступную память на сервере,
Для настройки параметров используемой службой ReportingServicesнеобходимо поправить файл конфигурации, расположенный в каталоге установки службы

…\MSRS11.MSSQLSERVER\Reporting Services\ReportServer
Файл rsreportserver.config

Наиболееважныепараметры:

WorkingSetMaximum- Порог памяти, после которого больше не будут приниматься новые запросы на предоставление памяти от приложений сервера отчетов.
Этот параметр не появляется в файле конфигурации RSReportServer.config, если не добавить его вручную. Чтобы сервер отчетов использовал меньше памяти, можно изменить файл RSReportServer.config, добавив элемент и значение.Диапазон допустимых значений — от 0 до максимального целого числа.Значение указывается в килобайтах.

WorkingSetMinimum - Нижний предел потребления ресурсов; сервер отчетов не будет освобождать память, если общее использование памяти ниже этого предела.

Его значение по умолчанию рассчитывается при запуске службы. В соответствии с этим расчетом, запрашиваемый объем выделенной памяти составляет 60 процентов от WorkingSetMaximum.
Этот параметр не появляется в файле конфигурации RSReportServer.config, если не добавить его вручную. Чтобы изменить это значение, необходимо добавить элемент WorkingSetMinimum в файл RSReportServer.config. Диапазон допустимых значений — от 0 до максимального целого числа. Значение указывается в килобайтах

MemoryRhreshold - Задает процент WorkingSetMaximum, определяющий границу между высоким и средним уровнями потребления памяти. Если процент использования памяти достиг этого значения, сервер отчетов замедляет обработку запросов и перераспределяет память, выделенную различным серверным приложениям.Значение по умолчанию — 90.Это значение должно быть больше значения параметра MemorySafetyMargin.

MemorySafetyMargin - Задает процент WorkingSetMaximum, определяющий границу между средним и низким уровнями потребления памяти. Это значение представляет собой процент доступной памяти, которая будет зарезервирована для системы и не сможет быть использована для работы сервера отчетов.Значение по умолчанию — 80.

Итак , в свою службу , я добавил следующие значения, раздел <Service>:
       <MemorySafetyMargin>80</MemorySafetyMargin> - значения оп умолчанию
       <MemoryThreshold>90</MemoryThreshold>       -значение по умолчанию
       <WorkingSetMaximum>512000</WorkingSetMaximum> - добавлено, определено 512 Мб  максимальный объем памяти для службы MSSQLServerReportingServices
       <WorkingSetMinimum>256000</WorkingSetMinimum> - добавлено, определен нижний предел памяти, установлено 256 мб.

И делаем рестарт службы.

После этого у нас все три компонента MSSQLServer , ReportingServices, AnalysisServicesработают с минимальным влиянием в области памяти процессоров.
 

Удачной работы!

Ошибка сборщика данных Data Collector-а

$
0
0

Введение:

При работе сборщика данных на серверах, особенно если на сервере есть базы данных в зеркалировании или в группе доступности AlwaysOn, возможно, что со временем некоторые  наборы сборщиков данных, которые настроены на сбор с кешированием, перестают собирать данные,  а в логах возможна ошибка, примерно следующего содержания:

Log ID                                  159823
Source                               Query Statistics
Collection Set Name   Query Statistics
Collection Item Name                      
Status                                  Error
Runtime Execution Mode              Collection
Start Time                         09.09.2014 10:26:38
Last Iteration Time      
Finish Time                       09.09.2014 10:26:38
Duration (ms)                 0
Operator                          sql -user
Package Execution ID                       
Event                                  
Data Code                       
Message
Failed to create kernel event for collection set: {2DC02BD6-E230-4C05-8516-4E8C0EF21F95}. Inner Error ------------------>
Cannot create a file when that file already exists.

Кстати журнал логов можно просмотреть так:



Описание причины :
Возможная, причина является проблемой с доступом к файлам кеширования. По умолчанию, файлы кеширования собираются в каталог :

C:\Users\sql-user\AppData\Local\Temp

Если вы откроете его, то в увидите файлы с расширением .cache, это как раз файлы, куда перед загрузкой в базу данных DataCollector-а собираются данные.

 Решение проблемы:

Данную проблему возможно решить следующим методом:

1)      Сделать загрузку данных всех наборов сборщиков данных и затем их остановить


В данном шаге возможны ошибки, попробовать выполнить их несколько раз.

2)      Отключить сборщик данных


Либо выполнить команду:

USE msdb;GO

EXEC dbo.sp_syscollector_disable_collector;

3)      Проверить отсутствие процессов DTEXEC.EXEв диспетчере задач


Если они есть, их необходимо завершить.
После этого запустить заново сборщика данных и наборы сборщиков.
Запустить можно так же командой :

USE msdb;
GO
EXEC dbo.sp_syscollector_enable_collector;

Запуститьнаборысборщиковможночерезкоманду
sp_syscollector_run_collection_set

Но легче и удобнее сделать через MSSQLManagementStudio.
Проверить наличие данных через некоторое время (когда идет загрузка в базу данных).
Замечание: данные, которые были до остановки сборщика данных, остаются.

 Рекомендации:

Обычно о проблеме сборщика данных узнается когда необходимо просмотреть данные сборщика данных. Чтобы узнать о проблеме как можно раньше , я рекомендую настроить задание по расписанию, в задание добавить следующие инструкции:

declare @t nvarchar(max);

DECLARE @subj varchar(50);

ifexists(
selecttop 1 failure_message  from msdb.[dbo].[syscollector_execution_log_internal]

wherefinish_time>DATEADD(MINUTE,-20,getdate())
andfailure_message isnotnull)
begin
      selecttop 1 @t=failure_message  from msdb.[dbo].           [syscollector_execution_log_internal]

      where finish_time>DATEADD(MINUTE,-20,getdate())

      and failure_message isnotnull

      set @t='Ошибка: '+@t+'Ошибка сборщика данных на сервере '+@@SERVERNAME+'. Проверьте доступность файла \\'+@@SERVERNAME+'\c$\Users\sql-user\AppData\Local\Temp. '
     
      SET @subj = 'Ошибка сборщика данных на '+@@SERVERNAME

      EXEC msdb.dbo.sp_send_dbmail'mail_profile',
      'admin@mssqlhelp.ru;',
      @body = @t,
      @subject = @subj


end

Частоту выполнения можно сделать достаточно каждые 30 минут.

Настройки серверов HP серии DL 580 и DL 980 для MS SQL Server

$
0
0

Best Practice for Tuning Microsoft SQL Server on HP Proliant DL980


Очень часто компании, которые имеют деньги, приобретают высокопроизводительные и дорогие сервера для MSSQLServer, но используют их не более 10%. Причины могут быть разные. В итоге сервера простаивают, потребляют энергию, а также могут происходить “странные” события: вроде дорогой сервер, а имеет проблемы. Источником данных проблем является то, что производитель создает режимы энергопотребления, которые включаются, когда сервер не нагружен. Результатом данного режима для MSSQLServerмогут быть совсем разные.

В данной статье хотелось бы рассказать о проблеме с которой пришлось столкнуться, а также сделать вольный перевод BestPracticeforTuningMicrosoftSQLServerontheHPProliantDL980.

Итак, сначала часть перевода данной статьи.

Я б хотел остановиться именно на настройках оборудования, без конфигурирования MSSQLServer, поэтому будет перевод только части.

Настройки BIOS
Для входа в BIOSнеобходимо при загрузке сервера нажать F9. Ниже будут представлены критические настройки, влияющие на производительность:

 
• System Options > Processor Options > Hyper-threading > Enable or Disable (see section on Hyper-threading below)
• Power Management Options > HP Power Profile > Custom
• Power Management Options > HP Power Regulator > OS Control
• Power Management Options > Advanced Power Management Options > Minimum Processor Idle Power State > C1E (reduces power when possible, for performance + power savings) or NO C-states (when performance is highest priority; power saving functionality is ignored)
• Advanced Options > Advanced Performance and Tuning Options > HW Prefetch > Enabled
• Advanced Options > Advanced Performance and Tuning Options > Adjacent Sector Prefetch > Enabled
• Advanced Options > Advanced System ROM Options > Address Mode 44-bit > Enabled (this setting is for Windows Server 2008 R2 only, and mandatory if ≥ 1TB RAM. On Windows Server 2008 SP2, this setting should remain Disabled, since that OS uses a 40-bit address mode.)

По поводу Hyper-thereadingмогу сказать, что по умолчанию желательно выключить его, включать его стоит тогда, когда это рекомендовано вендором ПО или проведено тестирование с полученными хорошими результатами.

OS/ОС

В документы описаны общие настройки  ОС для сервера, так и некоторые особенности для ОС Windows 2008 и Windows2008R2, Windows 2012. Необходимо учесть количество поддерживаемых ядер каждой ОС: Windows 2008 64 ядер, Windows2008R2 256 ядер, Windows 2012 640 ядер.
Настройки для Windowвсех версий:
·         Не запускать ОС с параметром /debug.
·         Отключить все ненужные сервисы
 

Windows Server 2008 SP2  иWindows Server 2012 /R2
 
Некоторые настройки ОС влияют на производительность. Ниже предоставлены рекомендации HP, которые ссылаются на рекомендации Майкрософт.

Поменятьнастройкивреестре:

• Allocate PFN database sparsely and with small pages:

\HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\ Memory Management\LargePageMinimum = REG_DWORD 0xffffffff

• Verifier.sys - Disable random verification of drivers for debugging:

(normally disabled by default, but verify; performance is adversely affected if enabled) \HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\ Memory Management\DontVerifyRandomDrivers = REG_DWORD 0x00000001

• Disable PartMgr/FltMgr/VolMgr Ioctl counters: (implement only if no applications use these counters) \HKLM\SYSTEM\CurrentControlSet\Services\PartMgr\ EnableCounterForIoctl = REG_DWORD 0x0

• Disable NTFS creation of 8.3 filenames: (make sure this is compatible with applications) \HKLM\SYSTEM\CurrentControlSet\Control\FileSystem\ NtfsDisable8dot3NameCreation = REG_DWORD 0x00000001

Параметры энергопитания, необходимо выставить «Высокая производительность»:

1. Выберите Start > Control Panel.
2. Выберите View > Large Icons.
3. Запустите Power Options.
4. Выбирите High Performance.

Настройки сети

Сетевой SQLтрафик обычно небольшой, обычно при максимальных нагрузках на mssqlнагрузка на сетевые адаптеры не полная. HPрекомендует не превышать 15000 пакетов в секунду на гигабитный адаптер. Вы может использовать NICteamкак опцию, но не как средство повышения производительности.

Настройкаreceive side scalling (RSS)

RSSсредство для доставки сетевого траффика с одиночного сетевого адаптера на различные CPUсохраняя последовательность доставки TCPпакетов. Это позволяет улучшить масштабируемость посредством изменения количество и диапазон процессоров для сетевого адаптера.

RSSмасштабирование включено по умолчанию в WindowsServer2008R2 и в WindowsServer 2012/R2. Для возможности работы с RSS, сетевые драйвера должны быть написаны с учетом работы с RSS. Подробности работы RSSи о количестве поддерживаемых CPUв ОС описаны в документации к ОС на сайтах Майкрософт.

Если по какой-то причине RSSотключен, то вы можете включить следующей командой:

netsh interface tcp set global rss=enabled

Либо, для большинства драйверов можно управлять настройками через графический интерфейс, откройте WindowsDeviceManager, во вкладке AdvancedPropertiesсетевого интерфейса, выполните следующие шаги:

1. Open the Device Manager and expand Network Adapters.
2. Right-click the adapter you want to configure, and select Properties.
3. On the Advanced tab, locate the Receive-side Scaling property and verify that the value is enabled. If not, enable it.
4. Click OK and exit the Device Manager.
Включение опции для уменьшения нагрузки обработки

Оригинальное название данной опции ChecksumOffloads. Опции ChecksumOffloads, TCPSegmentations(LargeSend) иInterruptCoalescingесть во всех современных сетевых адаптерах и предназначены для уменьшения нагрузки на процессоры и увеличения пропускной способности сети.
Чтобы проверить, что опция ChecksumOffloadвключена для отправки\получения TCP\IPпротокола сетевого адаптера, сделайте следующие шаги:

1. Откройте Device Manager and найдитеNetwork Adapters.
2. Правая кнопка мыши на нужном адаптера, выберите Properties.
3. Вкладка Advancedtab, выберите свойство ChecksumOffloadи проверьте, что установлено значение  Tx/RxTCP/IPChecksum.
4. Нажмите OKandи выйдете из DeviceManager.
5. Если были изменены настройки, то необходим рестарт сервера. 

На этом настройки оборудования закончены, я упомянул только те, которые считаю наиболее важные и которые использую.  В статье вы найдете дополнительную информацию и настройки. Там же есть настройки MSSQLServer, по их бы не стал применять, особенно включение всех указанных флагов, а изначально протестировать или иметь конкретные проблемы. 

Из опыта работ с серверами  DL 980, и проблемы которая была:

Был куплен данный сервер, установлен MSSQLServer2008R2 в кластерном режиме. Использование данного сервера было меньше 10 процентов от его возможности. После некоторого времени стали появляться странные проблемы в работе MSSQLServer  именно ошибки 605 и 824.
Так же в SystemLogоперационной системы было много ошибок вида:
Уровень – Warning, Код события -47
Текстпредупреждения:

A corrected hardware error has occurred.

Component: Memory

Error Source: Corrected Machine Check

 
The details view of this entry contains further information.

После открытия кейса в HP, были получен ответ:
Что данная ошибка появляется вследствие малой нагрузки на сервер, после этого сервера переходит в режим энергоэкономии, вследствие чего появляются такие сообщения.

Для выключения энергоэкономии, необходимо поставить следующие настройки:
  -> Minimum Processor Idle Power Package State
        -> No Package  
   -> Minimum Processor Idle Power State
        -> No C-states

После применения данных настроек, количество ошибок уменьшилось, но не исчезли совсем, что является в пределах нормы.
Подробно описано здесь.

Удачных настроек Вам!
Viewing all 43 articles
Browse latest View live