Отправляет email-рассылки с помощью сервиса Sendsay

MS SQL Server

  Все выпуски  

MS SQL Server - дело тонкое...


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

#046<<#047

DBA И БЕЗОПАСНОСТЬ

Microsoft Security Bulletin (MS01-024)
8 мая 2001г. Микрософт опубликовал бюллетень об уязвимости защиты Windows 2000 "Malformed Request to Domain Controller can Cause Memory Exhaustion". Сформированный специальным образом не корректный запрос к контроллеру домена Windows 2000 мог спровоцировать отказ в обслуживании клиентов (DoS), причиной которого является чрезмерная утилизация оперативной память сервера контроллера домена.

Затронутые продукты:
Microsoft Windows 2000 Server
Microsoft Windows 2000 Advanced Server
Microsoft Windows 2000 Datacenter Server

FAQ относительно этой уязвимости и заплаты можно найти тут:
http://www.microsoft.com/technet/security/bulletin/MS01-024.asp

Заплаты доступны тут:
http://www.microsoft.com/Downloads/Release.asp?ReleaseID=29537

СОВЕТЫ

Уловка, позволяющая обойти критическое (Emergency) состояние базы данных и особенности DUMP TRANSACTION WITH NO_LOG
По материалам статьи Microsoft Knowledge Base "Bypass (Emergency) Mode and DUMP TRANSACTION WITH NO_LOG"
Информация в этой статье относится к версиям Microsoft SQL Server 4.2x, 6.0, 6.5, 7.0

В критических ситуациях, база данных может быть представлена Вам, как SUSPECT, из-за завершения неудачей её восстановления во время старта сервера, причём обычно, это препятствует любому доступу клиентов к данным. Однако, существует возможность ручного вывода базы данных из состояния SUSPECT в "bypass mode" (также называемого "emergency mode") и последующего исполнения команды SELECT или запуска программы Bulk Copy (BCP), позволяющих осуществить копирование данных в другое место, в целях их сохранения. В то время, когда никто не сможет выполнять никаких легитимных модификаций данных, с помощью этой уловки, можно выполнить DUMP TRANSACTION WITH NO_LOG. Обратите внимание, что использование этой уловки не поддерживается Микрософт, и является потенциально опасной операцией. По этим же причинам, если восстановление базы при запуске будет осуществляться слишком долгое время, Вы не должны прерывать этот процесс, переводить базу данных в bypass mode, и затем выполнять DUMP TRANSACTION WITH NO_LOG.
Все операции сервера, исполняемые в рамках DUMP TRANSACTION, обычно регистрируются в журнале, так, что эти операции можно восстановить или отменить. Однако, эти операции, порождённые непосредственно командой DUMP, также занимают место в transaction log. Если transaction log переполнен, и места недостаточно для нормальной работы сервера, а также для регистрации операций DUMP TRANSACTION, использование опции WITH NO_LOG может предоставить Вам возможность произвести усечение transaction log без регистрации каких - либо операций в журнале.
DUMP TRANSACTION WITH NO_LOG правильно сохраняет транзакции только при относительно нормальных условиях работы сервера. Сервер сам предпринимает определённые меры для гарантии успешности восстановления, даже если на сервере произойдёт сбой во время этой операции. В редких случаях автоматическое восстановление (также называемое, восстановление при запуске - startup recovery) может закончится неудачей, после чего база данных будет отмечена, как SUSPECT. Восстановление закончится неудачей по определенной причине. Очень важно обратить внимание на сообщение в errorlog, которое отражает причину завершения неудачей восстановления, потому что это может помочь локализовать проблему. Восстановление, это процесс поиска и исправления противоречий в базе данных, который восстанавливает или отменяет все транзакции, которые были или активны или завершены после времени исполнения последней контрольной точки. Этот процесс основывается на write-ahead (опережающей записи) природе transaction log (все измененные страниц записываются вначале в журнал регистрации транзакций, и только потом в базу данных). Восстановление состоит из чтения каждой записи журнала, сравнения её timestamp с timestamp соответствующей страницы базы данных, и последующего принятия или отмены этого изменения. Отмена происходит в случае не исполненной транзакции, а восстановление внесённого изменения в случае исполненной транзакции.
После обнаружения в errorlog нужного сообщения, которое относится к ошибке, повлекшей неудачу процесса восстановления, попробуйте перевести состояние базы данных в нормальное NORMAL, с помощью простого перезапуска SQL сервера. Это позволит Вам попробовать выполнить процедуру восстановления второй раз. Вы можете изменить состояние базы данных посредством хранимой процедуры sp_resetstatus. Эта дополнительная хранимая процедура, которую Вы можете установить, воспользовавшись сценарием Instsupl.sql в каталоге Mssql\Install. Для получения дополнительной информации, см. "Resetting the Suspect Status" в документации.
Если восстановление все равно терпит неудачу, обратите внимание на сообщение об ошибках, и войдите в контакт с вашей службой поддержки. Вы должны также убедится в наличии и работоспособности вашей последней резервной копии базы данных, потому что она может понадобится для восстановления работоспособности базы. Однако, многие данные в вашей базе могут быть все еще доступны, хотя их целостность нарушена. Вы можете обращаться к этим данным, установив предварительно состояние базы данных в bypass или emergency mode. Для этого установите для базы данных sysdatabases.status в значение: -32768, которое будет применено после выполнения команды "allow updates". Например, используйте следующую команду:

UPDATE SYSDATABASES SET STATUS=-32768 WHERE NAME='DBNAME'

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

ГОТОВИМСЯ К ТЕСТУ ПО 70-028

ШПАРГАЛКА #9 Продолжение (обзор официального курса Microsoft)
Архив шпаргалок Вы найдёте на следующих сайтах:
http://www.sql.ru/subscribe/
http://subscribe.ru/archive/comp.soft.winsoft.sqlhelpyouself

SQL Server Performance Monitor

Стандартное средство диагностики работы операционной системы Windows NT Performance Monitor может иметь вариант настройки, позволяющий отслеживать операции, статистику производительности в течении заданного временного интервала или наблюдать операции сервера по мере их выполнения, и т.п., касающееся MS SQL Server, и всё это будет уже называться SQL Server Performance Monitor. К стандартному набору счётчиков сервера и операционной системы добавляются специфические счётчики сервера баз данных, которые совместно со счётчиками NT сохраняются в файле с расширением .pmc. Создание объектов измерения производительности MS SQL Server происходит на стадии инсталляции сервера БД, и эти, предварительно определённые счётчики, сохраняются в файле Sqlctrs.pmc. Разумеется, работа Performance Monitor не проходит незаметно для общей производительности системы, поскольку отнимает ресурсы на свои нужды. Если Вы используете NT аутентификацию, то счётчики сервера баз данных будут доступны только для пользователей, входящих роль sysadmin.
Автоматически, при запуске SQL Server Performance Monitor вам будут предложены для анализа данные следующих, предварительно определённых счётчиков:

- SQL Server: Buffer Manager\Buffer Cache Hit Ratio - определяющий долю страниц в процентах, которые были обнаружены в буферном кэше, что позволило обойтись без дисковых операций;
- SQL Server: General Statistics\User Connections - показывающий количество подключённых к системе пользователей;
- SQL Server: Memory Manager\Total Server Memory (KB) - показывает общий объём динамической памяти, используемой сервером в текущий момент.
- SQL Server: SQL Statistics\SQL Compilations/sec - показывает количество исполненных компиляций SQL запросов в секунду;
- SQL Server: Buffer Manager\Page Reads/sec - показывает число операций чтения физических страниц базы в секунду;
- SQL Server: Buffer Manager\Page Writes/sec - показывает число операций записи физических страниц базы в секунду.

Следующие счётчики не являются предварительно определёнными, но очень часто бывают полезны:

- SQL Server: Databases\Active Transactions - показывает количество активных транзакций для БД;
- SQL Server: Databases\Percent Log Used\database - показывает процент заполнения журнала регистрации транзакций для выбранной БД;
- SQL Server: Access Methods\Full Scans/sec - показывает количество исполненных полных сканирований (без ограничений) таблиц или индексов, в секунду;
- SQL Server: Access Methods\Index Searches/sec - показывает количество исполненных операций поиска по индексу, в секунду. Такие сканирования могут применятся для начала процедуры просмотра диапазона, выборки отдельных записей индекса и переустановки узлов в индексе;
- SQL Server: Locks\Number of Deadlocks/sec - показывает количество запросов на блокировку, которые закончились тупиковой блокировкой.

Часто, весьма полезными оказываются и счётчики Windows NT Performance Monitor, вот некоторые из них:

- Memory/Pages per second - показывает количество считанных или записанных на диск страниц из-за отсутствия нужных страниц в памяти;
- Memory/Pages faults per second - показывает количество ошибок процессора в секунду, вызванных отсутствием страниц в памяти;
- Memory/Pages input per second - показывает количество считанных с диска страниц, в секунду, из-за отсутствия страниц в памяти;
- Process/Pages faults per second/SQL Server - показывает количество ошибок SQL Server в секунду, вызванных отсутствием страниц в памяти;
- Processor/% processor time - показывает долю процессорного времени в процентах (утилизацию процессора), затраченную на обслуживание текущего операционного потока;
- Process/% processor time/ SQL Server - показывает утилизацию процессора со стороны SQL Server.

Кроме стандартных счётчиков, у Вас есть возможность определить до десяти пользовательских счётчиков. Специальный объект SQL Server User-Settable Counters может содержать до 10-ти определяемых пользователем счётчиков - SQL User Counter. Такие счётчики Вы можете создавать с помощью хранимой процедуры sp_usercounter, параметром которой служит номер счётчика от 1 до 10. Вы можете сами определять значения для этих счётчиков, которые могут отображать данные, возвращаемые операторами SQL, а также любыми операциями SQL сервера, например, системными хранимыми процедурами.

Продолжение следует.

ПОЛЕЗНОСТИ

Новые технические статьи Microsoft

Q279159 - BUG: Cancel Button in DTS Package Designer Save Dialog Box Exits Form Without Saving
Q297468 - BUG: Invalid Value Specified for STOPAT Parameter During Restore
Q288185 - FIX: Stored Procedure Continues to Use Parameter Value Passed During First Execution
Support WebCast: Understanding INSTEAD OF Triggers in Microsoft SQL Server 2000
Support WebCast: Microsoft SQL Server 2000 Windows CE Edition Overview and Programming
Support WebCast: Troubleshooting Distributed Queries in SQL Server 7.0
Support WebCast: Microsoft SQL Server 2000 Log Shipping
Support WebCast: Multi-instancing in Microsoft SQL Server 2000
Support WebCast: Microsoft SQL Server 2000: Merge Replication Enhancements
Support WebCast: Analyzing Optimal Compiled Plan Caching
Support WebCast: Microsoft SQL Server 2000: New XML Features
Support WebCast: Introduction to Microsoft SQL Server 2000 Clustering
Support WebCast: Understanding User-Defined Functions in Microsoft SQL Server 2000
Support WebCast: How to Effectively Use SQL Server Profiler
Support WebCast: Microsoft SQL Server 7.0 Common Problems and Resolutions
Support WebCast: Optimizing SQL Server 7.0 on Windows 2000 Advanced Server and Windows 2000 Datacenter Server
Support WebCast: Cascading Referential Integrity Constraints in SQL Server 2000
Support WebCast: Inside Microsoft SQL Server 6.5 Replication
Support WebCast: SQL Server 7.0 Full-Text Search and Basic Troubleshooting Methods
Support WebCast: SQL Server 2000 Profiler: What's New and How to Effectively Use It
Support WebCast: SQL Server 2000 Database Recovery: Backup and Restore
Support WebCast: SQL Server 7.0: Features of Data Transformation Services
Support WebCast: Implementing and Accessing Web Services Using Visual Basic 6.0 and the SOAP Toolkit for Visual Studio
Q296642 - BUG: Cannot Refer to Column in a Query Using the Name of a Table Variable
Q284237 - FIX: SELECT Statement with Two LIKE Clauses Where the Table Has a CHECK Constraint Causes AV
Q296186 - BUG: Incorrect Results In Cube Editor When You Edit a Dependent Calculated Member or Calculated Cell
Q295533 - BUG: Opening an Existing DTS Package with OLAP Tasks Causes Error After Analysis Manager Is Installed
Q295121 - BUG: DOC Error: Documentation Incorrectly States that DB_Owner role has Restore Database Permissions
Q140532 - INF: How to Use SQLSetPos in Updatable Joins w/ SQL Server
Q150149 - Contents of Visual FoxPro 1.0 ODBC Vfpodbc.txt File
Q175313 - BUG: S1000 Error When Sharing Connection in Multiple Threads
Q184968 - Adovcsp.exe Demonstrates Using Stored Procedures with ADO
Q237980 - INF: How to Convert an Access Database to SQL Server
Q242027 - SAMPLE: Embedcgi.exe CGI Application Shows How to Use Embedded SQL
Q247931 - INF: Authentication Methods for Connections to SQL Server in Active Server Pages
Q248829 - FIX: Denial of Services During Connections
Q252987 - INF: Execute a SQL Server DTS Package from Active Server Pages
Q254561 - INF: How to Obtain Service Pack 2 for Microsoft SQL Server 7.0 and Microsoft Data Engine (MSDE) 1.0
Q254759 - BUG: ListAvailableServers Method of the SQLDMO.Application Object Causes Error 0x800A000E
Q256052 - FIX: Sqlservr.exe Non-Trusted Connection Through OPENROWSET Allows Access to Service Account
Q263889 - INF: SQL Blocking Due to [[COMPILE]] Locks
Q274446 - INF: Upgrade to a SQL Server 2000 Failover Solution Recommended for all non-SQL Server 2000 Virtual Servers
Q274797 - INF: SQL Server 7.0 Service Pack 3 Fixlist
Q274799 - INF: How to Obtain Service Pack 3 for Microsoft SQL Server 7.0 and Microsoft Data Engine (MSDE) 1.0
Q273836 - INF: Running OLAP Services on a Domain Controller
Q279153 - INF: Upgrade Wizard Does Not Transfer Existing Stored Procedures
Q283880 - PRB: Unable to Register OLAP Client Files with MDAC 2.6 Installed
Q286357 - FIX: SQL Server CE Refresh Fixes GUID Generation Problems
Q288054 - SAMPLE: RLockMFC.exe Demonstrates Row-Level Locking Using MFC and SQL Server
Q287737 - INF: How to Enumerate Available SQL Servers Using SQLDMO
Q294860 - FIX: Modification Queries May Take Too Long to Compile if Halloween Protection is Required for Multiple Tables
Q294445 - FIX: Error Message 2731 Occurs When You Create a Table with a Column Length of Zero
Q297105 - FIX: Potential English Query Security Issue
Q296637 - BUG: Raiserror with %i Type Displays Incorrect Integer Value
Q264194 - BUG: DB Maintenance Plan Cannot Be Modified to Include/Exclude Integrity Checks Before Backups
Q295739 - BUG: DTS Designer May Stop Responding When You Use Microsoft Jet 4.0 OLE DB Provider
Q288809 - PRB: How to Recover SQL Server After a Tempdb Database is Marked Suspect
Q296559 - PRB: ALTER COLUMN Sets TrimTrailingBlanks Property to NO
Q268362 - PRB: OLAP Databases Larger Than 150 GB May Result in NT Kernel Out of Memory Errors

НОВОСТИ ПРОЕКТА SQL.RU

Недавно я получил письмо от SergSuper sergsuper@mail.ru, который должен быть известен многим посетителям форума. Это письмо затрагивает, на мой взгляд, очень интересную и перспективную проблему, интерес к которой возможно проявят многие подписчики рассылки. Вот, что Сергей пишет:

Периодически на форуме возникают вопросы, как работать с деревьями. Я раз 5 кидал ссылку на статью Деревья в SQL, хотя реализовать такую модель довольно трудно, особенно для не совсем опытных. Недавно эта тема затронула и меня по основной работе, в результате чего я написал некую болванку для множественной модели дерева, которую можно как угодно расширить. Т.е. можно вставлять данные как для обычной модели дерева, с соотношениями дитё-родитель, а триггеры будут пересчитывать левые и правые номера ветвей.
И хоть скрипт занимает всего 150 строчек, писал я его дня три (и не исключено что в нем есть еще ошибки) - в общем, пришлось голову поломать. Может стоит это куда-нибудь вывести, может кому пригодиться?

Обсудить статью Деревья в SQLможно в специальном форуме:
Обсуждение статьи "Деревья в SQL"
Кроме того, в настоящее время эта тема обсуждается в форуме MS SQL Server, в топике:
Задача с деревьями
Далее, приводится присланный Сергеем скрипт:

"НАЧАЛО СКРИПТА"

drop table tree
go
create table tree(id int identity, parent int , n varchar(33), le int, ri int)
go
go
set nocount on
insert tree select 0, 'K',1,16
insert tree select 1, '1',2,13
insert tree select 2, '11',3,4
insert tree select 2, '12',5,12
insert tree select 4, '121',6,7
insert tree select 4, '122',8,9
insert tree select 4, '123',10,11
insert tree select 2, '2',14,15
select t1.le, t1.ri, t1.id, t1.parent,replicate(' ',count(*))+t1.n
 from tree t1, tree t2
 where t2.le<t1.le and t2.ri>t1.ri
 group by t1.n, t1.le,t1.le, t1.ri, t1.parent,t1.id

 order by t1.le
go

create trigger td_tree on tree for delete
as
begin
 set nocount on
 if (select count(*) from tree where parent=0)<>1
   begin
    print('удаляется главная мама')
    rollback tran
   end

 if exists(select * from deleted d, tree t
    where d.id=t.parent)
  begin
    print('появление сирот при удалении')
    rollback tran
   end

 declare @d1 table(le int, rasn int)
 insert @d1
 select d.le, d.ri+1-d.le rasn
   from tree t, deleted d
   where t.id=d.parent

 declare @d2 table(le int, pop int)
 insert @d2
 select d1.le, sum(d2.rasn) pop
   from @d1 d1, @d1 d2
   where d2.le<=d1.le
   group by d1.le

 declare @min int
 select @min=min(le) from deleted

 update tree
    set ri=t.ri-pop
    from tree t, @d2 d2
    where t.ri>@min
     and d2.le=(select max(d3.le) from @d2 d3 where d3.le<t.ri)

 update tree
   set le=t.le-pop
   from tree t, @d2 d2
   where t.ri>@min
    and d2.le=(select max(d3.le) from @d2 d3 where d3.le<t.le)
end
go

create trigger ti_tree on tree for insert
as
begin
 if not update(parent) return
 set nocount on
 if exists(select * from deleted d, tree t
     where d.id=t.parent)
  begin
    print('появление сирот при вставке')
    rollback tran
  end

 declare @id int, @ri int
 declare @i1 table(id int, parent int)
 insert @i1 select id, parent from inserted

 while 2+2=4
  begin
    select @id=min(id) from @i1 i -- детей вставляем в последнюю очередь
    where not exists(select * from @i1 i2 where i.parent=i2.id)
    if @id is null break

    select @ri=t1.ri from tree t1,tree t2
    where t1.id=t2.parent and t2.id=@id

    update tree
     set ri=ri+2
     where ri>=@ri
    update tree
     set le=le+2
     where le>=@ri
    update tree
     set le=@ri, ri=@ri+1
     where id=@id

    delete @i1 where id=@id
    end
    end
go

create trigger tu_tree on tree for update
as
begin
 set nocount on
 if exists(select * from inserted i, BuhBalans b where i.le>b.le and i.ri<b.ri)
    begin
     print('получается зацикленная ветка')
     rollback tran
    end

 declare @u1 table(id int, le int,ri int, parn_ri int, pid int, n varchar(55))

 insert @u1
 select i.id, i.le, i.ri, p.ri parn_ri, p.id pid, p.n
    from inserted i, deleted d, tree p
    where i.id=d.id and p.id=i.parent

 declare @m table(id int, le int, ri int, ord char(2)) -- здесь будем копить поправки, ord поле для отладки
 declare @i table(id int, le int, ri int) -- итоговая таблица поправок
 insert @m -- как бы удаление
   select t.id, 0, -(u.ri-u.le+1),'d1' -- из старого места
    from tree t, @u1 u --
   where t.ri>u.ri and not (t.le>=u.le and t.ri<=u.ri)
 insert @m --
   select t.id, -(u.ri-u.le+1), 0,'d2' --
    from tree t, @u1 u --
   where t.le>u.le and not (t.le>=u.le and t.ri<=u.ri) --

 insert @m -- как бы вставка
   select t.id,0,u.ri-u.le+1 ,'i1' -- в новое место
    from tree t, @u1 u --
    where t.ri>=u.parn_ri and not (t.le>=u.le and t.ri<=u.ri) -- то что надо переносить пока не трогаем
 insert @m --
   select t.id,u.ri-u.le+1,0 ,'i2' --
    from tree t, @u1 u --
    where t.le>=u.parn_ri and not (t.le>=u.le and t.ri<=u.ri)

 insert @m -- как бы сам перенос
   select t.id, -u.ri+u.parn_ri-1,-u.ri+u.parn_ri-1,'m1'
    from tree t, @u1 u
    where t.le>=u.le and t.ri<=u.ri
 insert @m -- если переносим влево
   select t.id, u.ri-u.le+1,u.ri-u.le+1,'m2'
    from tree t, @u1 u
    where t.le>=u.le and t.ri<=u.ri and u.ri>u.parn_ri

 insert @i -- подводим итог
   select id, sum(le), sum(ri)
    from @m group by id

 delete @i where le=0 and ri=0 -- и так ясно

 update tree -- вносим изменения в таблицу
   set le=t.le+i.le, ri=t.ri+i.ri
    from tree t, @i i
    where t.id=i.id
end
go

"КОНЕЦ СКРИПТА"

ФОРУМ SQL.RU: ДЮЖИНА САМЫХ ПОПУЛЯРНЫХ ТОПИКОВ НЕДЕЛИ

Реализация массивов в TSQL
То ли сервер глюкавый, то ли руки кривые... HELP!
Вернемся к MSSQL 2000
Резервный сервер? (Помогите)
Проблема с Identity!
поиск по множеству таблиц
T-SQL. Как отключить всех от БД?
Columns_Updated() - генератор случайных чисел...
Как проверить существование временной таблицы ?
Задача с деревьями
Уважаемые господа профи...
Trigger insert и update - поменять значение для вставляемого поля

ФОРУМ SQL.RU: ВОПРОСЫ ОСТАЛИСЬ БЕЗ ОТВЕТА

JOIN и фильтрация записей?
Скажите, а правда в SQL Server 2000 реплицировать можно на "removeable devices"
Удаление базы рассылки после сбоя...
ошибка при репликации (SQL7)
Merge replication Подскажите, где искать?
Огромный размер tempdb

#046<<#047


Вопросы, предложения, коментарии, замечания, критику и т.п. присылайте Александру на адрес: MSSQLHelp@pisem.net

sql.ru

Описание рассылки
 Поиск на SQL.RU
Искать: 
Результатов на странице: Формат:
Тип запроса: Раздел:
МИНИФОРМА
ПОДПИСКИ




http://subscribe.ru/
E-mail: ask@subscribe.ru

В избранное