Хэрэв temp DB мэдээллийн сан таны SQL Server зай багатай тул таны үйлдвэрлэлийн орчинд томоохон саад тотгор учруулж, амжилттай дуусахад хэрэглэгчийн програмыг тасалдуулж болзошгүй юм. Хэрэв та Temp DB-ийн хэмжээг хянахын тулд скрипт ашиглаж байгаа бол түр зуурын DB бөглөх үндсэн шалтгааныг олж мэдэхийн тулд энэ нийтлэлийн скриптийг хавсаргана уу.
Tempdb дүүрэн - нийтлэг хувилбар
Буруу бичигдсэн асуулга нь хэд хэдэн түр зуурын объект үүсгэж, улмаар tempdb мэдээллийн сангийн өсөлтийг бий болгож болзошгүй. Энэ нь дискний зайны анхааруулга үүсгэж, серверийн асуудал үүсгэж болзошгүй. Олон үед SQL Server Өгөгдлийн сангийн админууд tempdb-г багасгахад маш хэцүү гэж үзвэл тэд серверийг дахин эхлүүлэхийг нэн даруй сонгодог. Хэрэв tempdb мэдээллийн санг багасгах бүх аргыг туршиж үзсэн бөгөөд хэрэв энэ нь агшихгүй хэвээр байвал хамгийн сүүлийн сонголт бол тохиргооны менежерээр дамжуулан SQL Service-г дахин эхлүүлэх явдал юм. Ингэснээр таны дискний зайны анхааруулга зогсох бөгөөд серверийн асуудлууд ч мөн зогсох болно. Гэсэн хэдий ч, хэрэв асуудал үйлдвэрлэлийн сервер дээр гарсан бол tempdb-г дахин эхлүүлэх боломжгүй байж магадгүй юм.
DBCC
Ийм тохиолдолд хэд хэдэн DBCC тушаалууд байдаг бөгөөд эдгээрийг ажиллуулах үед tempdb-г багасгах боломжийг олгодог. Хэрэв та tempdb хэмжээг идэвхтэй хянах скриптүүд тохируулсан бол энэ скриптийг ашиглан tempdb файлыг дүүргэж болно. Одоогийн байдлаар энэ скриптийг бүх линксерверүүд дээр ажиллуулах болно. Хаана гэсэн өгүүлбэрт оруулах замаар та үүнийг хялбархан хянах боломжтой. Та tempdb-т асуудал гарсан тохиолдолд л скриптийг гүйцэтгэх боломжтой болгож болно. @Tserver хүснэгт нь таны холбогдсон бүх серверийн нэрийг хадгалахад ашиглагддаг. Tempdb мэдээллийн сангийн хувьд SQL-ийн ялзрал мэдээллийн баазын төлөвийг SUSPECT болгон өөрчлөх бөгөөд энэ нь тасалдах болно SQL Server үйлчилгээ эхнээс нь.
DECLARE @Tserver TABLE
(
cserver VARCHAR(200)
)
INSERT INTO @Tserver
VALUES ('SERVERNAME')
DECLARE @LogTable TABLE
(
cservername VARCHAR(200),
cssionid SMALLINT,
callocmb BIGINT,
cdeallocmb BIGINT,
ctext VARCHAR(4000),
cstatement VARCHAR(4000)
)
DECLARE c1 CURSOR FOR
SELECT *
FROM @Tserver
DECLARE @cmd NVARCHAR(4000),
@server VARCHAR(200)
OPEN c1
FETCH next FROM c1 INTO @server
WHILE @@FETCH_STATUS = 0
BEGIN
SET @cmd = 'EXEC(''use tempdb Declare @Table1 table ( cdeallopages bigint, callopages bigint, cssionid smallint, creqstid int ) insert into @Table1 SELECT SUM(internal_objects_dealloc_page_count), SUM(internal_objects_alloc_page_count), session_id, request_id FROM sys.dm_db_task_space_usage WITH (NOLOCK) WHERE session_id <> @@SPID GROUP BY session_id, request_id declare @Table2 table ( cssionid smallint, callocmb bigint, cdeallocmb bigint, ctext varchar(4000), cstatement varchar(4000) ) insert into @Table2 SELECT TBL1.cssionid, TBL1.callopages * 1.0 / 128 , TBL1.cdeallopages * 1.0 / 128 , TBL3.text, ISNULL( NULLIF( SUBSTRING( TBL3.text, TBL2.statement_start_offset / 2, CASE WHEN TBL2.statement_end_offset < TBL2.statement_start_offset THEN 0 ELSE( TBL2.statement_end_offset - TBL2.statement_start_offset ) / 2 END ), '''''''' ), TBL3.text ) FROM @Table1 AS TBL1 INNER JOIN sys.dm_exec_requests TBL2 WITH (NOLOCK) ON TBL1.cssionid = TBL2.session_id AND TBL1.creqstid = TBL2.request_id OUTER APPLY sys.dm_exec_sql_text(TBL2.sql_handle) AS TBL3 OUTER APPLY sys.dm_exec_query_plan(TBL2.plan_handle) AS TBL4 WHERE TBL3.text IS NOT NULL OR TBL4.query_plan IS NOT NULL ORDER BY 3 DESC; Select * from @Table2'') at [' + @server + ']'
PRINT @cmd
INSERT INTO @LogTable
(cssionid,
callocmb,
cdeallocmb,
ctext,
cstatement)
EXEC(@cmd)
UPDATE @LogTable
SET cservername = @server
WHERE cservername IS NULL
FETCH next FROM c1 INTO @server
END
CLOSE c1
DEALLOCATE c1
SELECT *
FROM @LogTable
Зохиогчийн танилцуулга:
Нил Варли бол мэдээлэл сэргээх мэргэжилтэн юм DataNumen, Үүнд мэдээлэл сэргээх технологиор дэлхийд тэргүүлэгч, Inc. Outlook-г сэргээх болон excel сэргээх програм хангамжийн бүтээгдэхүүнүүд. Дэлгэрэнгүй мэдээллийг авна уу WWW.datanumen.com