<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Rollback &#187; mssql</title>
	<atom:link href="http://blog.rollback.hu/tag/mssql/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.rollback.hu</link>
	<description>SQL, üzemeltetés kicsiknek és nagyoknak.</description>
	<lastBuildDate>Thu, 17 Nov 2011 16:38:59 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>SQL teljesítményelemzés morzsák</title>
		<link>http://blog.rollback.hu/2010/10/sql-teljesitmenyelemzes-morzsak/</link>
		<comments>http://blog.rollback.hu/2010/10/sql-teljesitmenyelemzes-morzsak/#comments</comments>
		<pubDate>Sat, 09 Oct 2010 02:10:06 +0000</pubDate>
		<dc:creator>Erik</dc:creator>
				<category><![CDATA[Magyar]]></category>
		<category><![CDATA[error]]></category>
		<category><![CDATA[mssql]]></category>
		<category><![CDATA[üzemeltetés]]></category>

		<guid isPermaLink="false">http://blog.rollback.hu/?p=287</guid>
		<description><![CDATA[Az egyik visszatérő kérdés: mit nézzek, ha baj van? Erre több megközelítés is lehetséges: lehet az Indexet, majd elmúlik a baj; esetleg olvasgatni dokumentációt vagy guglizni; vagy álláskereső portált nézni; netán a szerver teljesítményét megvizsgálni.
Ja, de hogyan? Hát, elmondom, hogy én kb. miket csinálok, amikor döglődik az SQL. Ez részben szisztematikus, részben nem, ugyanis vannak [...]]]></description>
			<content:encoded><![CDATA[<p>Az egyik visszatérő kérdés: mit nézzek, ha baj van? Erre több megközelítés is lehetséges: lehet az Indexet, majd elmúlik a baj; esetleg olvasgatni dokumentációt vagy guglizni; vagy álláskereső portált nézni; netán a szerver teljesítményét megvizsgálni.</p>
<p>Ja, de hogyan? Hát, elmondom, hogy én kb. miket csinálok, amikor döglődik az SQL. Ez részben szisztematikus, részben nem, ugyanis vannak dolgok, amiket lehet párhuzamosan csinálni, vagy felcserélhetőek, vagy esetleg egyik a másikat feleslegessé teszi, vagy valami tök más is beugorhat, ha valami tök mást látok. De mondjuk, hogy az esetek 85%-ában az általam üzemeltetett szerverek 90%-a ilyenekkel kezelhető. Ezek kis ötletgombócok, nem egy script, amit le kell futtatni.</p>
<p>Először is: ne csak performance countert nézzünk, hanem minden mást is. Tipikusan DMV-ket és perfocuntert. Az activity monitort csak indikátornak ajánlom: ha működik, akkor nem lehet nagy baj. Valahogy igen erőforrásigényes szegényke, és amikor jön a terhelés, rendszeresen aszongya, h timeout. Én a következő útvonalon haladok:</p>
<p>Kezdetnek írjuk fel egy papírra, és tegyük a monitor mellé: Memória, CPU, Diszk I/O. Ez a három dolog kell a SQL-nak. Egyszerű rendszer, egyszerű lelkeknek.<br />
<span id="more-287"></span></p>
<ul>
<li>Oprendszer CPU és memória. Ha ki van ültetve a CPU vagy nincs szabad memória, akkor már világos, hogy a fizikai erőforrás fogyott el. Megosztott gépen kérdés, h mennyi jutott a SQL-nek.</li>
<li>Ha véletlenül működik az activity monitor, akkor  a recent expensive queries gombócot érdemes megnézni, a végrehajtások számával együtt!</li>
<li>Megnézem, h hova lett az az erőforrás, amiből kifutottunk. Extrém esetekben lehet, h van szabad fizikai erőforrás, ebben az esetben a háromság harmadik lábát, a diszk I/O-t is érdemes megnézni. Azaz perfcounter, Physical disk &#8211; Avg Disk (Read/Write) queue Length. Emellett hasznos lehet a % Disk Read/Write time is, DE vegyük be a counterek közé a % Idle time-ot is, mert a % Disk Read/Write time hajlamos többet hazudni, mint a tényleges (azaz az idle a megbízható a történetben).</li>
<li>A háromból az egyik tuti nem jó. Megnézem hogy ki gyilkolja azt. Ezt különféle DMV-kből lehet kiszippantani, kezdjük barátunkkal, a sys.dm_exec_sessions nevűvel. A memory_usage oszlop adja magát, ez 8KB-os lapokban mondja meg a használatot, és vele a legegyszerűbb dolgozni. A cpu_usage, a reads és writes meg azért nehezebb, mert ott bizony változást kell számolni, mivel az aktuális érték semmitmondó magában. Kétmillió olvasás két hét alatt azért nem olyan sok például. Ezt persze a sysprocessesből is ki lehet venni, majdnem ugyanaz, nekem még erre van egy scriptem:
<pre class="brush: sql;">
if object_id('tempdb..##c1') is not null
begin
drop table ##c1 drop table ##c2
end
select session_id, login_time, sum(cpu_time) cpu, sum(reads) reads, sum(writes) writes into ##c1 from sys.dm_exec_sessions group by session_id, login_time
waitfor delay '000:00:10'
select session_id, login_time, sum(cpu_time) cpu, sum(reads) reads, sum(writes) writes  into ##c2 from sys.dm_exec_sessions s group by session_id, login_time
select c2.cpu-c1.cpu cpudiff, c2.reads-c1.reads [read], c2.writes-c1.writes write, p.memory_usage/128 mem_used_MB, p.login_name, p.cpu_time, p.*
from sys.dm_exec_sessions p
join ##c1 c1
on p.session_id= c1.session_id
join ##c2 c2
on p.session_id= c2.session_id
where
c2.cpu &gt; c1.cpu
or c2.writes &gt; c1.writes
or c2.reads &gt; c1.reads
or p.memory_usage &gt; 15*128 -- 15 MB
order by c2.cpu-c1.cpu desc
-- majd tessék dropni a temptáblát. Azért nincs itt a végén, hátha bogarászni akarunk még bennük
</pre>
</li>
<li>Ekkorra már nagyjából illene, hogy legyen sejtésünk a drágaság forrásáról, legalább olyasmi, h melyik alkalmazás. Jöhet a DBCC INPUTBUFFER(<spid>) vagy nekieshetünk profilerrel is, ízlés dolga. Aztán egyszer eljutunk egy objektumhoz. Ha tempdb, akkor valaki valami beteg joinokat csinál általában, nézzünk ilyen szemmel a futtatott kverire. Ha pedig vmi user tábla, akkor vagy full table scan futkos rajta sokat, vagy kéne venni memóriát.</spid></li>
<li>Személyes tapasztalatom az, hogy az esetek 30%-ában valaki kiülteti a procit, azt a fenti script lokalizálja, aztán a kill paranccsal orvoslom. 70% az erős memóriahiányos állapot, ekkor meg a BOL-ból kiveszek két scriptet, a sys.dm_os_buffer_descriptors oldaláról: az első (azaz A.) megmondja, hogy mennyi memóriát esznek az adatbázisaim:
<pre class="brush: sql;">
		SELECT count(*)AS cached_pages_count
    ,CASE database_id
        WHEN 32767 THEN 'ResourceDb'
        ELSE db_name(database_id)
        END AS Database_name
FROM sys.dm_os_buffer_descriptors
GROUP BY db_name(database_id) ,database_id
ORDER BY cached_pages_count DESC;
</pre>
<p>		Itt nézzük meg, hogy az összeg meg a használt memória stimmelnek-e nagyjából. Pl. elszúrt alkalmazás tele tudja hányni a procedure cache-t, ami meghízik szép csendben két gigára, aztán néz az ember, mert az adatbázis lapoknak nem maradt hely. A B kveri meg ugyanezt tudja, adatbázis szinten.  Itt is jól látszik, h ki lakik a memóriában, még az is, h melyik index (vagy a tábla maga). Ilyenkor lehet kiválóan procedure cache-t üríteni (DBCC CLEANPROCCACHE &#8211; ez az egész szerverre lefut, szóval odavághat kicsit a teljesítménynek, mert mindent újra kell fordítani, de itt talán már mindegy).
</li>
</ul>
<p>Majd valaki rúgjon oldalba, ha még idén nem írok a latchekről is valamit.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rollback.hu/2010/10/sql-teljesitmenyelemzes-morzsak/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>SQL Server Standard Edition és Lock Pages in memory 64 biten</title>
		<link>http://blog.rollback.hu/2009/04/sql-server-standard-edition-es-lock-pages-in-memory-64-biten/</link>
		<comments>http://blog.rollback.hu/2009/04/sql-server-standard-edition-es-lock-pages-in-memory-64-biten/#comments</comments>
		<pubDate>Mon, 27 Apr 2009 16:05:10 +0000</pubDate>
		<dc:creator>Erik</dc:creator>
				<category><![CDATA[Magyar]]></category>
		<category><![CDATA[mssql]]></category>
		<category><![CDATA[patch]]></category>
		<category><![CDATA[sql2005]]></category>
		<category><![CDATA[sql2008]]></category>
		<category><![CDATA[üzemeltetés]]></category>

		<guid isPermaLink="false">http://blog.rollback.hu/?p=83</guid>
		<description><![CDATA[Ha az ember egy erősebb vason SQL Server Standard Editiont futtat, akkor találkozhat a kedves hibaüzenettel az errorlogban:
A significant part of sql server process memory has been paged out. This may result in performance degradation
Ez kellemetlen lehet, a oprendszer kitalálja, hogy neki másra (is) kell memória, és kiülteti az SQL-t a kispadra, aminek a teljesítménye [...]]]></description>
			<content:encoded><![CDATA[<p>Ha az ember egy erősebb vason SQL Server Standard Editiont futtat, akkor találkozhat a kedves hibaüzenettel az errorlogban:<br />
A significant part of sql server process memory has been paged out. This may result in performance degradation<br />
Ez kellemetlen lehet, a oprendszer kitalálja, hogy neki másra (is) kell memória, és kiülteti az SQL-t a kispadra, aminek a teljesítménye tényleg leromolhat ilyenkor, nem viccel az errorlog. </p>
<p>Enterprise Edition esetén ez nem probléma, mivel az rendelkezik a mágikus &#8220;Lock pages in memory&#8221; képességgel (feltéve, hogy a futtató user megkapta a szükséges OS-szintű jogot), de a standardon bizony sokat szívtak ezzel emberek, beleértve engemet is. Éppen ezért örülök nagyon annak, hogy végre kivették ezt a bosszantó korlátozást, pontosabban kiveszik hamarosan. Még pontosabban egy trace flag segítségével be lehet majd kapcsolni azt, hogy lehessen lockolni a memóriába a lapokat. A várható szállítási idők:</p>
<ul>
<li>SQL 2008 SP1 CU 2 &#8211; 2009 május</li>
<li>SQL 2005 SP3 CU 4 &#8211; 2009 június</li>
</ul>
<p>Én már felírtam a naptáramba :) A PSS blogon az eredeti post <a href="http://blogs.msdn.com/psssql/archive/2009/04/24/sql-server-locked-pages-and-standard-sku.aspx">itt olvasható</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rollback.hu/2009/04/sql-server-standard-edition-es-lock-pages-in-memory-64-biten/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A három legfontosabb dolog az életben</title>
		<link>http://blog.rollback.hu/2009/04/a-harom-legfontosabb-dolog-az-eletben/</link>
		<comments>http://blog.rollback.hu/2009/04/a-harom-legfontosabb-dolog-az-eletben/#comments</comments>
		<pubDate>Thu, 23 Apr 2009 22:08:59 +0000</pubDate>
		<dc:creator>Erik</dc:creator>
				<category><![CDATA[Magyar]]></category>
		<category><![CDATA[errorlog]]></category>
		<category><![CDATA[mssql]]></category>

		<guid isPermaLink="false">http://blog.rollback.hu/?p=82</guid>
		<description><![CDATA[A fenti kérdésre a válasz mindenkinél változó, de az SQL Server egyszerű lélek: 

master adatbázis data file
master adatbázis log file
errorlog

Ha ezt a három fájlt meg tudja nyitni, már boldog. És ha nem? Mindig az errorloggal kezdjük vizsgálódásainkat. Ha nem találjuk az errorlogot, nézzük meg, hogy van-e joga oda írni a SQL-t futtató accountnak. Ha megtaláljuk [...]]]></description>
			<content:encoded><![CDATA[<p>A fenti kérdésre a válasz mindenkinél változó, de az SQL Server egyszerű lélek: </p>
<ul>
<li>master adatbázis data file</li>
<li>master adatbázis log file</li>
<li>errorlog</li>
</ul>
<p>Ha ezt a három fájlt meg tudja nyitni, már boldog. És ha nem? Mindig az errorloggal kezdjük vizsgálódásainkat. Ha nem találjuk az errorlogot, nézzük meg, hogy van-e joga oda írni a SQL-t futtató accountnak. Ha megtaláljuk az errorlogot, akkor meg olvassuk el.<br />
A fenti paraméterek egyébként az SQL Server Configuration Managerben láthatóak és állíthatóak (meg a registryben).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rollback.hu/2009/04/a-harom-legfontosabb-dolog-az-eletben/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gyorsan jogot az összes tárolt eljárásra</title>
		<link>http://blog.rollback.hu/2009/04/gyorsan-jogot-az-osszes-tarolt-eljarasra/</link>
		<comments>http://blog.rollback.hu/2009/04/gyorsan-jogot-az-osszes-tarolt-eljarasra/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 19:14:02 +0000</pubDate>
		<dc:creator>Erik</dc:creator>
				<category><![CDATA[Magyar]]></category>
		<category><![CDATA[mssql]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[scripting]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[T-SQL]]></category>

		<guid isPermaLink="false">http://blog.rollback.hu/?p=80</guid>
		<description><![CDATA[Éppen építem a félautomata SQL Servert (mint már párszor említettem), és ennek egyik állomása az, hogy a szakmailag kevéssé felkészült, ámde elszánt fejlesztők ellen, akik hibernate-ben mindent összedobálnak, elveszem az alkalmazások dbo jogát, és helyette csak írni-olvasni tudnak majd. Ez jó ötlet, hiszen ott van a beépített db_datareader és db_datawriter role minden adatbázisban, de&#8230; 
A [...]]]></description>
			<content:encoded><![CDATA[<p>Éppen építem a félautomata SQL Servert (mint már párszor említettem), és ennek egyik állomása az, hogy a szakmailag kevéssé felkészült, ámde elszánt fejlesztők ellen, akik hibernate-ben mindent összedobálnak, elveszem az alkalmazások dbo jogát, és helyette csak írni-olvasni tudnak majd. Ez jó ötlet, hiszen ott van a beépített db_datareader és db_datawriter role minden adatbázisban, de&#8230; </p>
<p>A problémát a tárolt eljárások és függvények okozzák, amelyekhez külön-külön kell jogot grantolni. Ezt persze lehet scriptből is, de azért elég jó esély van arra, hogy ezt el fogom izélni valamikor, és nem lesz joga az alkalmazás usernek vmit csinálni, mire azt mondják, hogy azonnal adjam vissza a dbo jogot. Ennek a problémának a kivédésén agyaltam, és már-már kezdtem hajlani a DDL triggerek felé (minden SP gyártás után automatikusan adjuk rá jogot a megfelelő usernek), amikor egy számomra sokkal szimpatikusabb ötletbe botlottam.<br />
<span id="more-80"></span><br />
Hozzunk létre egy új role-t, és az új role-nak grantoljunk execute jogot a dbo schema-n (ha van más séma használatban, akkor azon is). Ez azt jelenti, hogy egy háromsoros scriptet kell lefuttatnom a model adatbázison, az adatbázis generáló scriptemhez pedig egy sort kell hozzáadnom, és már kész is vagyok. A háromsoros script a modelhez:</p>
<pre class="brush: sql;">
CREATE ROLE db_spexecution AUTHORIZATION dbo
GO
GRANT EXECUTE ON SCHEMA::[dbo] TO db_spexecution
</pre>
<p>A plusz egy sor az adatbázis gyártáshoz:</p>
<pre class="brush: sql;">
sp_addrolemember 'db_spexecution', 'dbusername'
</pre>
<p>Mivel a függvényekhez is execute jog kell, megoldottam a kívánságaimat. Remélem. Teszt következik&#8230; :)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rollback.hu/2009/04/gyorsan-jogot-az-osszes-tarolt-eljarasra/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Az légy, aki lenni akarsz</title>
		<link>http://blog.rollback.hu/2009/04/az-legy-aki-lenni-akarsz/</link>
		<comments>http://blog.rollback.hu/2009/04/az-legy-aki-lenni-akarsz/#comments</comments>
		<pubDate>Mon, 20 Apr 2009 22:14:01 +0000</pubDate>
		<dc:creator>Erik</dc:creator>
				<category><![CDATA[Magyar]]></category>
		<category><![CDATA[mssql]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[sql2005]]></category>
		<category><![CDATA[T-SQL]]></category>

		<guid isPermaLink="false">http://blog.rollback.hu/?p=79</guid>
		<description><![CDATA[A cím nem a személyiségfejlődéshez, inkább a más accountok megszemélyesítéséhez kapcsolódik. Az SQL Server ugyanis lehetőséget ad arra, hogy egy megfelelő jogosultságokkal rendelkező login alól egy másik loginra (vagy userre) váltsunk át, és annak a nevében futtassunk lekérdezéseket. Ez különösen hasznos lehet például hibakeresésnél vagy ha vissza akarunk élni a hatalmunkkal.
SQL 2000 alatt már megvolt [...]]]></description>
			<content:encoded><![CDATA[<p>A cím nem a személyiségfejlődéshez, inkább a más accountok megszemélyesítéséhez kapcsolódik. Az SQL Server ugyanis lehetőséget ad arra, hogy egy megfelelő jogosultságokkal rendelkező login alól egy másik loginra (vagy userre) váltsunk át, és annak a nevében futtassunk lekérdezéseket. Ez különösen hasznos lehet például hibakeresésnél vagy ha vissza akarunk élni a hatalmunkkal.</p>
<p>SQL 2000 alatt már megvolt a SETUSER nevű parancs, ami átváltott egy megadott user alá, és viszonylag lehetett használni, de az igazi boldog élet a 2005-tel köszöntött be, ő hozta el az EXECUTE AS utasítást. Itt már megmondhatjuk, hogy database user vagy server login szinten akarunk imperszonálni, lehet ezt a privilégiumot bárkinek megadni (SETUSER csak sysadmin vagy dbo joggal megy), illetve lehet több szint mélyre lemászni, és onnan visszajönni.<br />
<span id="more-79"></span><br />
Az EXECUTE AS parancs kiváló huncutkodásokra ad lehetőséget, de persze azért van mód megtudni, hogy ki vagyok én valójában:</p>
<pre class="brush: sql;">
-- nézzük meg, hogy ki vagyunk
SELECT SUSER_NAME() [login], USER_NAME() [user]
-- legyünk sa
EXECUTE AS LOGIN = 'sa'
GO
SELECT SUSER_NAME() [login], USER_NAME() [user]
-- de honnan tudom, hogy ki voltam?
SELECT ORIGINAL_LOGIN()
-- menjünk vissza
REVERT
</pre>
<p>Hát ennyi. Illetve&#8230; van itt még valami: definiálhatunk UDF-et, SP-t sőt triggert is EXECUTE AS clause-zal, ami meghatározza, hogy kinek a nevében fog lefutni a lefutnivaló. Az alábbi SP-t egy user adatbázisban hoztam létre, ahol a mytestdbuser nevű SQL loginhoz mappelt azonos nevű db user lakik, mindenféle jog nélkül:</p>
<pre class="brush: sql;">
CREATE PROCEDURE uspKivagyok
WITH EXECUTE AS 'mytestdbuser'
AS
BEGIN
SELECT SUSER_NAME(), ORIGINAL_LOGIN()
END
</pre>
<p>Ez nagyon jó, de mi a haszna? Még finomabban tudom hangolni a jogosultságokat, ott is, ahol egyébként nem tudnám. Pl. nem lehet a TRUNCATE TABLE jogot delegálni &#8211; ha egy SP-be csomagolom, az SP-re annak adok jogot, akinek akarok, az SP pedig fut egy dbo nevében.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.rollback.hu/2009/04/az-legy-aki-lenni-akarsz/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

