Witaj na Zine.net online Zaloguj się | Rejestracja | Pomoc

[PL] Stempel czasowy czy mit ponadczasowy?

W związku z powtarzającymi się pytaniami o to, jak zrzutować dane typu TIMESTAMP na typy daty i czasu i robić inne “cuda, wianki” związane z tym typem (pytania widziałem zarówno na forum WSS.pl, jak i na forum MSDN, jak i na Experts-Exchange.com), postanowiłem napisać tę notkę. A więc po kolei:

  1. Typ TIMESTAMP zaimplementowany w SQL Server nie ma nic wspólnego z datą i czasem. Został tak nieszczęśliwie nazwany przez programistów MS, ale nie jest to typ daty i czasu ze standardu SQL-92 o tej samej nazwie. A więc, sorry folks, ale rzutowanie TIMESTAMP na DATETIME jest raczej bez sensu (chyba, że chcecie zobaczyć, która wartość jest większa, bo faktycznie ciężko to może być zweryfikować patrząc na binaria) :-)
  2. Niestety, nazwa pewnej funkcji systemowej – CURRENT_TIMESTAMP – powoduje jeszcze większe zamieszanie. Ta funkcja ma jak najbardziej związek z datą i czasem – zwraca wartość typu DATETIME (CURRENT_TIMESTAMP to synonim dla GETDATE w SQL Server). Tu MS jest zgodny ze standardem SQL-92. Cóż za (nie)konsekwencja, rzekłbym :-)
  3. Bardziej szczęśliwą nazwą dla typu TIMESTAMP jest ROWVERSION (obu nazw można używać zamiennie). MS twierdzi, że TIMESTAMP ma być "deprecated" i że należy używać właśnie ROWVERSION. Nazwa ROWVERSION lepiej oddaje podstawowe zastosowanie tego typu danych, czyli wersjonowanie wierszy (stara wersja kolumny ROWVERSION może zostać skopiowana do kolumny typu BINARY). Oczywistym zastosowaniem jest też kontrola kolejności, w jakiej rekordy w tabeli lub w całej bazie danych były dodawane lub modyfikowane.
  4. W SQL Server typ ROWVERSION (odzwyczajajmy się od TIMESTAMP) jest typem binarnym.

    CREATE TABLE #temp (
      ID int,
      Stamp rowversion
    )
    
    INSERT #temp (ID) SELECT 1
    
    SELECT Stamp FROM #temp

    Wyniki zapytania mogą się różnić, ale będzie to coś na kształt:
     

    Stamp
    ------------------
    0x00000000000007D1

  5. Kolumny typu ROWVERSION mają służyć do przechowywania informacji o tym, w jakiej kolejności rekordy w konkretnej bazie danych (a w dalszej kolejności – w konkretnej tabeli) były wstawiane/modyfikowane.
  6. MS gwarantuje unikalność dla wszystkich wartości typu ROWVERSION na poziomie pojedynczej bazy danych.
  7. Może być tylko jedna kolumna typu ROWVERSION w tabeli.
  8. Tak, jak do kolumn wyliczanych, nie można wstawiać "rękoma" danych do kolumn typu ROWVERSION (SQL Server sam wstawia odpowiednie wartości).
  9. Jeśli wstawisz wiersze do tabeli z kolumną typu ROWVERSION, a następnie usuniesz je i wstawisz nowe wiersze, wartości ROWVERSION będą różne (większe) od wartości, jakie były wstawione na usuniętych wierszy.
  10. Możesz użyć funkcji @@DBTS do zwrócenia wartości, która jako ostatnia została wstawiona do jakiejkolwiek kolumny typu ROWVERSION w bieżącej bazie danych.

I na koniec ciekawostka, a nawet dwie. Można stworzyć kolumnę typu TIMESTAMP (celowo nie ROWVERSION, o czym za chwilę) nie podając jej nazwy:

CREATE TABLE dbo.Test (
    ID int,
    timestamp
)

Kolumna automatycznie zostanie nazwama [timestamp]. Nie ma możliwości utworzenia tabeli w ten sposób wykorzystując ROWVERSION (może to i dobrze, wolę jawnie nazywać kolumny w tabelach).

I druga ciekawostka – o ile MS twierdzi, że TIMESTAMP jest "deprecated", o tyle jeśli zajrzeć do widoku sys.types na SQL Server 2005 i 2008, typ TIMESTAMP tam jest, a ROWVERSION nie...

A może masz swoje doświadczenia z TIMESTAMP/ROWVERSION i chcesz się nimi podzielić? Śmiało – czekam na komentarze lub maile.

opublikowano przez brejk | 3 komentarzy

[EN] Sample database to play with geography data type

So, you want to see some nice maps in Spatial Results tab of your SSMS console of just installed SQL Server 2008 RTM?

Perhaps something like below:

image

Well, it’s not that hard :-) Just use sample SpatialDB database I have prepared. It contains just one table – dbo.Countries. The data comes from FreeGIS Worlddata and has been loaded with Shapefile Uploader.

So, step by step:

1. Download and restore backup of SpatialDB database (1.5MB zip, backed up with compression).

2. Execute some simple query, e.g.: SELECT name, geom FROM SpatialDB.dbo.Countries.

3. Use your imagination and Books Online to play with all methods of geography data type.

4. Send all bugs and suggestions to http://connect.microsoft.com :-)

Have fun with spatials!

And for Polish readers - some thoughts on SQL Server 2008 RTM by Marcin Guzowski: http://strefa.guzowski.info/archives/112,2008,08,08.html.

opublikowano przez brejk | 3 komentarzy

[PL] “Tego jeszcze nie zrobiliśmy”

W trakcie pisania rozdziału (książki? jakiej książki? ;-)) poświęconego typowi danych XML w SQL Server 2008 przy zabawach z zapytaniami z klauzulą FOR XML natrafiłem na ciekawy komunikat błędu:

Msg 3625, Level 16, State 17, Line 1
'Inline XSD for FOR XML EXPLICIT' is not yet implemented.

Znaczy się, dany “ficzer” jest w planach, ale jeszcze go nie ma :-)

Tak się zastanawiam, czy nie lepiej po prostu pluć użytkownikowi w twarz:

Msg 102, Level 15, State 1, Line 21
Incorrect syntax near 'XMLSCHEMA'.

Ale po chwili namysłu dochodzę do wniosku, że przecież ktoś tu dobrze chciał. Poinformował usera, że prace nad implementacją schematów dla klauzuli FOR XML EXPLICIT trwają ;-)

Ciekawe, że komunikat występuje w SQL Server 2005, jak również w SQL Server 2008. Czyli że od ponad trzech (ale pewnie bliżej prawdy byłoby napisać “pięciu”) lat się nie udało tego napisać? Hmm, widocznie albo są ważniejsze rzeczy, albo... ten, kto się zdeklarował napisać “ficzera”, już w MS nie pracuje, a komunikat pozostał na pamiątkę :D

PS. Nie, żebym nalegał na szybkie zrealizowanie funkcjonalności pt. 'Inline XSD for FOR XML EXPLICIT' :-)

opublikowano przez brejk | 7 komentarzy
Filed under: , ,

[EN] PLSSUG at level 5

I am pleased to announce that Polish SQL Server User Group (PLSSUG) has been awarded the highest level of Level 5 Participation Core Service by Culminis. We are the first user group in Europe that has ever reached this level. This is a great distinction for our user group.

The Level 5 Participation Core Service recognizes and quantifies continual user group involvement with Culminis and other members of the IT Pro community. It is the basis for providing global user group and leader recognition in The VOICE, determining Event Support monetary limits, and choosing participants for special opportunities.

More about Culminis and their programs: http://new.culminisconnections.com/default.aspx.

Also, some time ago I wrote a note (it’s in Polish) about Culminis and their services: http://zine.net.pl/blogs/sqlgeek/archive/2008/05/08/pl-o-organizacji-culminis-s-w-kilka.aspx.

[PL] O SQL Server na MTS 2008 – prelegenci, tematy…

Tej informacji jeszcze nigdzie oficjalnie nie podano, także na stronie konferencji MTS 2008, ale dziś mogę już zapowiedzieć, że będę prelegentem na wspomnianej konferencji.

Wraz z Markiem Adamczukiem poprowadzimy sesję na temat…

I tu pojawia się duży znak zapytania. Właściwie tematu jeszcze nie mamy :-) Myśleliśmy trochę o sesji poświęconej… aaa, nie będę ujawniał, czemu poświęconej ;-) Ale do ustalenia tematu jeszcze nam daleko (i na dodatek zaczął się okres urlopowy, więc pewnie podjęcie ostatecznej decyzji odłożymy trochę w czasie). Prawie na pewno temat będzie związany z SQL Server 2008 (ma być “glamour” ;-)).

W każdym razie już teraz w imieniu swoim i Marka zapraszam na naszą prezentację :-)

opublikowano przez brejk | 8 komentarzy
Filed under: , ,

[PL] András Belokosztolszki na ZineDay 2008

Miło mi poinformować, że András Belokosztolszki będzie jednym z prelegentów na ZineDay 2008 (6 września 2008 w Warszawie).

Kim jest András Belokosztolszki ?

Andras (2)
Dr András Belokosztolszki jest architektem oprogramowania w firmie Red Gate Software Ltd (firma Red Gate jest sponsorem wielu grup pasjonackich, w tym także PLSSUG). W firmie Red Gate András zaprojektował i prowadził proces tworzenia narzędzi do porównywania struktur danych i wersjonowania w bazach danych (SQL Compare – wersje od 4 do 7), refaktoryzacji kodu T-SQL (SQL Refactor) oraz analizy dziennika transakcji (SQL Log Rescue). András zdobył tytuł doktora na Uniwersytecie Cambridge oraz tytuł magistra inżyniera na Uniwersytecie ELTE w Budapeszcie.

András jest częstym prelegentem na wszelkiego rodzaju konferencjach związanych tematycznie z systemem SQL Server. Jego prezentacje na temat projektowania baz danych oraz śledzenia zmian w bazach cieszą się dużą popularnością wśród uczestników konferencji i wydarzeń (także tych organizowanych przez grupy pasjonackie – jak chociażby konferencja SQLBits III organizowana przez UK SQL Server Community). András napisał także kilka artykułów dla serwisu SimpleTalk oraz SQL Server Magazine.

Sesja Andrása będzie zatytułowana “Managing change in the database world”. Abstrakt, jaki dostałem od niego, przedstawia się następująco:

Databases, like applications, evolve. However, unlike applications, databases can be modified directly. This is like modifying an application via a hex editor. In this session, Andras will contrast the two most common database development styles: working on a live database directly vs. working with creation SQL scripts. He will show some of his own techniques and Red Gate technologies to display how to avoid some change related problems, to manage database changes and to set up source control for databases.

Zapowiada się smakowite ciacho do strawienia przez programistów .NET i SQL ;-)

Jeśli nie wiesz, co to takiego ZineDay 2008, odwiedzaj systematycznie blog Michała Grzegorzewskiego i witrynę-bloggernię Zine.net.

opublikowano przez brejk | 1 komentarzy
Filed under: ,

[PL] Mój log jest za duży

Niedawno pisałem o tym, jak poradzić sobie z problemami, jakie mogą wyniknąć ze stosowania metody zmniejszania pliku dziennika transakcji bazy danych w SQL Server polegającej na usunięciu pliku loga.

Tym razem skupię się na metodzie najbardziej prawidłowej i właściwie jedynej zalecanej – wykorzystującej kombinację poleceń BACKUP LOG + DBCC SHRINKFILE.

Do dzieła!

Na początek utwórzmy mały poligon, na którym pokażemy w obrazkach, jak to się robi.

CREATE DATABASE TestLogDB
GO

ALTER DATABASE TestLogDB SET RECOVERY FULL
GO

USE TestLogDB
GO

CREATE TABLE TestLogTable
(
    col1 int identity(1,1),
    col2 nvarchar(4000) DEFAULT (REPLICATE(N'a',4000))
)
GO

BACKUP DATABASE TestLogDB
TO DISK = N'C:\TestLogDBFull.bak'
GO

INSERT TestLogTable DEFAULT VALUES
GO 1000

W nowo utworzonej bazie TestLogDB, której ustawiam recovery model na FULL (celowo robię to jawnie, ponieważ nie na każdym serwerze będzie to domyślne ustawienie dal nowych baz danych – patrz Express Edition lub sytuacja, w której ktoś zmienił opcję dla bazy model). Pełny backup bazy robię, gdyż tylko tak baza wchodzi w rzeczywisty FULL recovery model (backup jest punktem zaczepienia do rejestrowania zmian w logu). Wreszcie tworzę prostą tabelę i wypełniam ją rekordami (tu używam mechanizmu dostępnego w SSMS – wsad może wykonać się określoną ilość razy).

Zobaczmy teraz, jak wygląda log bazy. Na początek jego rozmiar:

DBCC SQLPERF(LOGSPACE)
GO

Database Name Log Size (MB) Log Space Used (%) Status
------------- ------------- ------------------ -----------
TestLogDB     9,929688      95,65794           0

Czyli log urósł (na początku miał 1MB) i na dodatek jest prawie pełny (czyli za moment prawdopodobnie znów się zwiększy).

A więc masz za dużego (?) loga bazy i chcesz go zmniejszyć :-)

Zmniejszamy loga

Zobaczmy VLF-y – czyli Virtual Log Files – czyli logiczne pliki dziennika transakcji, na które podzielony jest plik .ldf (użyję do tego nieudokumentowanego polecenia DBCC LOGINFO):

DBCC LOGINFO(N'TestLogDB')
GO

FileId      FileSize             StartOffset          FSeqNo      Status      Parity CreateLSN
----------- -------------------- -------------------- ----------- ----------- ------ -----------------
2           253952               8192                 27          2           64     0
2           253952               262144               28          2           64     0
2           270336               516096               29          2           64     0
2           262144               786432               30          2           64     29000000024900007
2           262144               1048576              31          2           64     30000000023100007
...
2           253952               8585216              56          2           64     55000000027200011
2           253952               8839168              57          2           64     55000000027200011
2           344064               9093120              58          2           64     55000000027200011
2           253952               9437184              59          2           64     58000000039300011
2           253952               9691136              60          2           64     58000000039300011

2           475136               9945088              0           0           0      58000000039300011

Poza tym, że jest ich trochę (w moim przykładzie było 35, a na samym początku, przed wstawieniem rekordów były ledwie 3) można o nich powiedzieć jeszcze jedno – prawie wszystkie są zajęte (status = 2 oznacza zajęty VLF, zaznaczyłem je na czerwono). Wolny pozostał tylko ostatni (status = 0 oznacza wolny VLF, zaznaczyłem go na zielono).

Co zrobić, żeby “opróżnić” log? Jak nakazują dobre praktyki i prawie wszystkie “guide’y”, należy wykonać backup loga.

BACKUP LOG TestLogDB
TO DISK = N'C:\TestLogDBLog.bak'

Backup zrobiony, zobaczmy ponownie rozmiar loga:

DBCC SQLPERF(LOGSPACE)
GO

Database Name Log Size (MB) Log Space Used (%) Status
------------- ------------- ------------------ -----------
TestLogDB     9,929688      24,69512           0

Rozmiar bez zmian, ale tym razem log jest zajęty w niewielkiej części – czyli nowe transakcje mają się gdzie logować.

Zobaczmy VLF-y:

DBCC LOGINFO(N'TestLogDB')
GO

FileId      FileSize             StartOffset          FSeqNo      Status      Parity CreateLSN
----------- -------------------- -------------------- ----------- ----------- ------ -----------------
2           253952               8192                 27          0           64     0
2           253952               262144               28          0           64     0
2           270336               516096               29          0           64     0
2           262144               786432               30          0           64     29000000024900007
2           262144               1048576              31          0           64     30000000023100007
...
2           253952               8585216              56          0           64     55000000027200011
2           253952               8839168              57          0           64     55000000027200011
2           344064               9093120              58          0           64     55000000027200011
2           253952               9437184              59          0           64     58000000039300011

2           253952               9691136              60          2           64     58000000039300011
2           475136               9945088              0           0           0      58000000039300011

Liczba VLF-ów się nie zmieniła (u mnie 35). Natomiast zmieniły się statusy. Widać, że zaznaczone na pomarańczowo VLF-y mają status 0, czyli są wolne i mogą przyjąć nowe wpisy – dziennik transakcji może być wypełniany od początku (angielskie określenie na takiego zachowania to log reuse), jeśli na początku pliku .ldf znajdują się wolne VLF-y. Dwa ostatnie VLF-y w pliku pozostały bez zmian.

Czas na zmniejszenie loga. Spróbujmy użyć polecenia DBCC SHRINKFILE.

DBCC SHRINKFILE(N'TestLogDB_log')
GO

Cannot shrink log file 2 (TestLogDB_log) because all logical log files are in use.
DbId   FileId      CurrentSize MinimumSize UsedPages   EstimatedPages
------ ----------- ----------- ----------- ----------- --------------
18     2           1214        96          1208        96

Hmmm, ale o co chodzi? :-)

Zobaczmy, czy log się zmniejszył (miał ponad 9MB).

DBCC SQLPERF(LOGSPACE)
GO

Database Name Log Size (MB) Log Space Used (%) Status
------------- ------------- ------------------ -----------
TestLogDB     9,476563      28,36459           0

A zatem praktycznie bez zmian… Można by pomyśleć, że coś źle robimy… Zobaczmy VLF-y.

DBCC LOGINFO(N'TestLogDB')
GO

FileId      FileSize             StartOffset          FSeqNo      Status      Parity CreateLSN
----------- -------------------- -------------------- ----------- ----------- ------ ---------------------------------------
2           253952               8192                 61          2           128    0
2           253952               262144               62          2           128    0

2           270336               516096               29          0           64     0
2           262144               786432               30          0           64     29000000024900007
2           262144               1048576              31          0           64     30000000023100007
2           262144               1310720              32          0           64     31000000023100007
...
2           344064               9093120              58          0           64     55000000027200011
2           253952               9437184              59          0           64     58000000039300011

2           253952               9691136              60          2           64     58000000039300011

Po pierwsze liczba VLF-ów się zmniejszyła (u mnie został usunięty ostatni VLF i mam ich teraz 34). A więc polecenie DBCC SHRINKFILE coś jednak zrobiło! Ostatnim zajętym VLF-em jest teraz drugi VLF w pliku .ldf. A więc przez wykonanie próby zmniejszenia loga tenże log się “obrócił” i teraz będzie wypełniany od początku.

Jeśli teraz wykonamy ponownie backup loga:

BACKUP LOG TestLogDB
TO DISK = N'C:\TestLogDBLog.bak'

to być może okaże się (nie jest to regułą, o czym przeczytasz we wnioskach), że nasz plik .ldf będzie wreszcie gotowy do zmniejszenia:

DBCC LOGINFO(N'TestLogDB')
GO

FileId      FileSize             StartOffset          FSeqNo      Status      Parity CreateLSN
----------- -------------------- -------------------- ----------- ----------- ------ -----------------
2           253952               8192                 61          0           128    0
2           253952               262144               62          2           128    0
2           270336               516096               29          0           64     0
2           262144               786432               30          0           64     29000000024900007
2           262144               1048576              31          0           64     30000000023100007
...
2           344064               9093120              58          0           64     55000000027200011
2           253952               9437184              59          0           64     58000000039300007
2           253952               9691136              60          0           64     58000000039300007

Liczba VLF-ów – bez zmian. Ale tym razem począwszy od trzeciego wszystkie są wolne i gotowe do usunięcia.

Dopełnienie formalności:

DBCC SHRINKFILE(N'TestLogDB_log')
GO

Database Name Log Size (MB) Log Space Used (%) Status
------------- ------------- ------------------ -----------
TestLogDB     0,7421875     38,55263           0

Uff… Ileż się trzeba było napracować. Ale wreszcie sukces (?) – log jest mniejszy (gdyby sprawdzić liczbę VLF-ów, to okazałoby się, że jest ich bardzo niewiele – na przykład 3). I teraz…

I teraz rekomendowana jest operacja ALTER DATABASE ... MODIFY FILE ... na pliku logów, by zwiększyć go do właściwego rozmiaru (zalecane od 10 do 25% rozmiaru plików danych bazy – ale wszystko zależy od paru czynników, m.in. od ilości transakcji w bazie, ilości użytkowników, etc.).

Wnioski i zalecenia

Cały ten ciąg czynności miał na celu wyciągnięcie niekoniecznie banalnych wniosków oraz przedstawienie pewnych zaleceń przydatnych w pracy z logiem:

  1. DBCC SHRINKFILE na pliku loga działa od razu, a nie z opóźnieniem, jak czasem można sądzić (choć jego działanie może być opóźnione przez aktywne transakcje lub inne operacje wykonywane na logu).
  2. DBCC SHRINKFILE nie przesuwa niczego w pliku .ldf (w plikach danych potrafi przemieszczać dane ku początkowi pliku).
  3. DBCC SHRINKFILE w pliku .ldf działa na VLF-ach (VLF jest atomową jednostką).
  4. Przed wykonaniem DBCC SHRINKFILE robimy backup dziennika transakcji (żeby go opróżnić).
  5. Jeśli nie uda się raz zmniejszyć loga tą metodą, trzeba spróbować drugi :-) A jak nie uda się za drugim razem, to i trzeci (a bywa, że i czwarty – musisz “wstrzelić się” z DBCC SHRINKFILE w moment, gdy ostatni aktywny VLF leży na początku pliku .ldf).
  6. Operacje zmniejszania loga najlepiej jest przeprowadzać przy braku aktywności użytkowników w bazie (można ustawić tryb SINGLE_USER). Wtedy mamy pełną kontrolę nad tym, co dzieje się w logu.
  7. Jeśli pokazana metoda zawodzi notorycznie, sprawdź, czy nie ma otwartej transakcji na bazie danych (w widoku sys.databases w bazie master jest kolumna log_reuse_wait_desc, możesz też użyć polecenia DBCC OPENTRAN).
  8. Liczba VLF-ów powinna być jak najmniejsza i nie powinna przekraczać 50 (ma to wpływ na wydajność operacji zapisu i zmniejszania pliku loga).
  9. Szalenie ważna dla utrzymania loga jest strategia backupowania loga. Wykonuj backupy loga, jeśli nie chcesz, by rósł on “w nieskończoność”.
  10. Zaraz po wykonaniu operacji zmniejszenia loga, zwiększ rozmiar pliku .ldf do rozmiaru właściwego. Wykonanie jednorazowego zwiększenia loga w miejsce wielu automatycznych operacji powiększenia spowoduje, że w logu będzie mniej VLF-ów. To dlatego wykonywanie operacji zmniejszania loga nierzadko mija się z celem. Czasem po prostu lepiej go opróżnić, skontrolować liczbę VLF-ów i – jeśli wszystko jest w porządku – zostawić nieco większy plik loga (i uniknąć jego “poszatkowania” przy operacjach automatycznego powiększania).

Ciekawostką może być fakt, że wiele razy próbowałem w tym procesie wykorzystać polecenie CHECKPOINT (celowo nie umieściłem go ani razu w kodzie, by nie psuć obrazu całości). Jednak nie zauważyłem istotnego wpływu CHECKPOINTa na VLF-y i problem zmniejszania pliku .ldf.

Dodatki

O poleceniu DBCC LOGINFO i innych nieudokumentowanych poleceniach DBCC poczytasz w artykule: SQL Server 2005 - nieudokumentowane polecenia DBCC.

Swego czasu o utrzymaniu loga bardzo mądrze i ciekawie napisała Kimberly L. Tripp: 8 Steps to better Transaction Log throughput.

Credits

W przeprowadzeniu pokazanego tu doświadczenia i wyciąganiu słusznych, jak się wydaje, wniosków, uczestniczyli Jarek Kuśmierek oraz Marek Adamczuk. Jarkowi składam osobne podziękowania za dążenie do prawdy w kwestii działania DBCC SHRINKFILE i obalenie mylnego przekonania, jakoby polecenie to mogło być wykonywane z pewnym naturalnym “odłożeniem” w czasie (deferred log shrink umarł ponoć wraz z SQL Server 7.0 - http://msdn.microsoft.com/en-us/library/aa902689(SQL.80).aspx).

opublikowano przez brejk | 0 komentarzy
Attachment(s): transaction_log.txt

[PL] Nowe DMV w SQL Server 2008

Podłączyłem wczoraj instancję SQL Server 2005 (9.0.3233) jako linked server do instancji SQL Server 2008 RC0. Zrobiłem to, by zrobić parę zestawień porównawczych. Zacząłem od widoków i funkcji dynamicznych (DMV – Dynamic Management View). Napisanie prostego zapytania:

SELECT SCHEMA_NAME(v1.[schema_id]) + '.' + v1.name 
FROM master.sys.all_objects v1
LEFT JOIN [0704-002].master.sys.all_objects v2
ON v1.name = v2.name
WHERE v1.[schema_id] = schema_id('sys') 
AND v1.name LIKE 'dm\_%' ESCAPE '\'
AND v2.name IS NULL
ORDER BY v1.name

i uruchomienie go na instancji Katmai’a (0704-002 to oczywiście nazwa linked servera) dało następujący wynik:

sys.dm_audit_actions
sys.dm_audit_class_type_map
sys.dm_cdc_errors
sys.dm_cdc_log_scan_sessions
sys.dm_cryptographic_provider_algorithms
sys.dm_cryptographic_provider_keys
sys.dm_cryptographic_provider_properties
sys.dm_cryptographic_provider_sessions
sys.dm_database_encryption_keys
sys.dm_db_mirroring_auto_page_repair
sys.dm_db_mirroring_past_actions
sys.dm_db_persisted_sku_features
sys.dm_exec_procedure_stats
sys.dm_exec_trigger_stats
sys.dm_filestream_file_io_handles
sys.dm_filestream_file_io_requests
sys.dm_fts_fdhosts
sys.dm_fts_index_keywords
sys.dm_fts_index_keywords_by_document
sys.dm_fts_outstanding_batches
sys.dm_fts_parser
sys.dm_os_dispatcher_pools
sys.dm_os_dispatchers
sys.dm_os_memory_brokers
sys.dm_os_memory_node_access_stats
sys.dm_os_memory_nodes
sys.dm_os_nodes
sys.dm_os_process_memory
sys.dm_os_spinlock_stats
sys.dm_os_sys_memory
sys.dm_resource_governor_configuration
sys.dm_resource_governor_resource_pools
sys.dm_resource_governor_workload_groups
sys.dm_server_audit_status
sys.dm_sql_referenced_entities
sys.dm_sql_referencing_entities
sys.dm_tran_commit_table
sys.dm_xe_map_values
sys.dm_xe_object_columns
sys.dm_xe_objects
sys.dm_xe_packages
sys.dm_xe_session_event_actions
sys.dm_xe_session_events
sys.dm_xe_session_object_columns
sys.dm_xe_session_targets
sys.dm_xe_sessions

Ładnie - 46 nowych DMV. Oczywiście, niespecjalnie to dziwi, zwłaszcza, gdy popatrzy się na ilość nowych funkcjonalności w Katmai. I, jak widać, część z tych DMV jest związana z nowymi mechanizmami (sys.dm_xe*, sys.dm_resource_governor*, sys.dm_audit*, sys.dm_filestream*). Są na powyższej liście także DMV związane z nową obsługą zależności między obiektami baz danych: sys.dm_sql_referenced_entities oraz sys.dm_sql_referencing_entities (na stronach Technet Polska dostępny jest screencast mojego autorstwa na ten temat).

Z nowych DMV zainteresowały mnie trzy:

  • sys.dm_exec_procedure_stats – pokazuje statystyki użycia procedur składowanych wraz z ich zbuforowanymi planami wykonania,
  • sys.dm_db_persisted_sku_features – pokazuje “features” używane w bieżącej bazie danych, które są specyficzne dla danej edycji SQL Server 2008 i mogą uniemożliwić przeniesienie bazy na “mniejszą” edycję,
  • sys.dm_tran_commit_table – wyświetla jeden wiersz dla każdej transakcji wysłanej przez mechanizm Change Tracking.

Oprócz tego ciekawy wynik zwraca zapytanie do sys.dm_os_sys_memory. W kolumnie system_memory_state_desc widok ten wyświetla na przykład: “Available physical memory is high” :-) Jeszcze parę takich DMV w SQL Server i konsultanci będą mogli spakować manatki i szukać nowego zajęcia ;-)

opublikowano przez brejk | 2 komentarzy
Filed under: , ,

[EN] Five things I would change in SSMS

SQL Server Management Studio (SSMS) is the most often used environment in my everyday work. I got used to all those dockable windows and I stopped complaining about the loading time or the clipboard smaller than the one in Query Analyzer (QA) - at least it seems to be smaller :-) But there are some things that are quite annoying to me. Here are my five most wanted changes to implement in SSMS by Microsoft’s developers.

  1. Custom keyboard shortcuts working in Results and Messages windows. I use those shortcuts a lot and I really miss the old behavior from QA.
  2. Persistent windows numbers in Window menu. When working with multiple windows in QA I have been using Alt+W and then Alt+<<Number>> to switch to another window. In SSMS this feature works slightly different because the active query window has always number 1 which makes the numbers dynamic and it becomes impossible to remember the numbers (it’s impossible to remember something that changes everytime you use the shortcut...). Anyway, Microsoft folks claim this behavoir is identical with the one from Visual Studio and is not going to be changed...
  3. Filters on databases in Object Explorer. This problem does not touch me explicitly. But sometimes there are many databases on the instance and finding the proper database with Object Explorer window in SSMS can be very painful. Also, filters could remain active when user re-opens SSMS. In SQL Server 2008 there is a new feature called Object Search but it can be used with Object Explorer Details window and it can search for database objects only (you can’t find the database this way). Besides, this new search mechanism need some improvement also, because it is unable to find an object when you enter a qualified object name. There is an article on how to create an add-in for enhanced object filtering in SSMS (including databases) written by Joseph Cooney - The Black Art of Writing a SQL Server Management Studio 2005 Add-In.
  4. Automatic or semi-automatic refresh in Object Explorer. This problem seems to have a beard already. When you perform any action outside the Object Explorer window even collapsing and expanding of the proper folder in this window do not refresh the tree (you have to perform right-click and Refresh which makes me mad).
  5. Changes in options do not require the application restart. Sometimes (especially during presentations) I have to change some options in SSMS. I feel very uncomfortable with the requirement of the application restart after some small changes like font size of grid results.

Do this changes have some chances to be implemented? Well, I guess they are not very hard to add! Some of them have been posted to connect.microsoft.com as suggestions. See the links below.

Management Studio - Windows List Order (status: closed)

Customize Keyboard stored procedures do not work in results pane in SSMS (status: closed)

Expand the Management Studio Object Explorer Filter (status: closed)

Refreshing Object explorer (status: closed)

Finally, I’m not as frustrated as the author of this suggestion: Usability of Management Studio is worst between all DB managers (see Proposed Solution – my favourite :-)). However, it would be nice to see some of the wishes listed above added to SSMS in SQL Server 2008 or some of its Service Packs, wouldn’t it?

If you have any suggestion or most wanted things to repair or to implement in SSMS, feel free to post a comment to this note.

opublikowano przez brejk | 1 komentarzy

[PL] Chcę oglądać Twoje logi

Temat zmniejszania rozmiaru pliku dziennika transakcji bazy i wszelkich katastrof z tym procesem związanych wraca na forum mojego ulubionego portalu - WSS.pl - jak bumerang. Jedną z metod zmniejszania loga wykorzystywanych namiętnie i bez opamiętania przez użytkowników jest metoda “brute force” – czyli metoda oparta o usunięcie pliku loga i podłączenie tylko pliku danych do instancji SQL Server przy użyciu procedury systemowej sp_attach_single_file_db. Czasem działa…

Upadek mitu

Do czasu… Niekiedy może skończyć się katastrofą zwizualizowaną na przykład takim komunikatem błędu:

File activation failure. The physical file name "C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\Test_log.ldf" may be incorrect.
The log cannot be rebuilt because the database was not cleanly shut down.
Msg 1813, Level 16, State 2, Line 1
Could not open new database 'test'. CREATE DATABASE is aborted.

Tak najczęściej weryfikuje się mity – na własnej skórze. Niestety.

Co, jak już się dałem złapać na mit?

Czyli jednak to niekoniecznie jest dobra metoda… Ok, ale co, jeśli już log został usunięty i nie ma szybkiej (lub wręcz żadnej) możliwości przywrócenia go?

Wtedy trzeba wykonać następujące kroki:

  1. Stworzyć bazę o nazwie identycznej z nazwą świeżo “zepsutej” bazy, lokalizując pliki w innym katalogu niż pliki bazy “zepsutej” (żeby nie trzeba było kopiować “osieroconego” pliku .mdf bazy, której log nieszczęśliwie skasowaliśmy). Najlepiej od razu ograniczyć dostęp do nowej bazy dla jednego użytkownika. W SSMS można to ustawić podczas tworzenia bazy danych w zakładce Options okna New Database. Można też wykonać polecenie ALTER DATABASE: 

    ALTER DATABASE Test SET SINGLE_USER WITH ROLLBACK IMMEDIATE


  2. Przenieść bazę w tryb OFFLINE:

    ALTER DATABASE Test SET OFFLINE WITH ROLLBACK IMMEDIATE

     

  3. Podmienić plik .mdf bazy na plik bazy “zepsutej”.
  4. Przenieść bazę w tryb ONLINE: 

    ALTER DATABASE Test SET ONLINE


  5. Przenieść bazę w tryb EMERGENCY:

    ALTER DATABASE Test SET EMERGENCY

    Przy tej okazji zapewne SQL Server uraczy nas komunikatami błędów w stylu:

    Msg 5173, Level 16, State 1, Line 1
    One or more files do not match the primary file of the database. If you are attempting to attach a database, retry the operation with the correct files.  If this is an existing database, the file may be corrupted and should be restored from a backup.

    Log file 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\Test_log.ldf' does not match the primary file.  It may be from a different database or the log may have been rebuilt previously.
    Msg 945, Level 14, State 2, Line 1
    Database 'Test' cannot be opened due to inaccessible files or insufficient memory or disk space.  See the SQL Server errorlog for details.
    Msg 5069, Level 16, State 1, Line 1
    ALTER DATABASE statement failed.


  6. Wykonać polecenie DBCC CHECKDB (tu czas trwania i komunikaty zwracane przez SQL Server mogą być różne, ale koniec końców baza powinna być w statusie SINGLE_USER): 

    DBCC CHECKDB(Test, REPAIR_ALLOW_DATA_LOSS)


  7. Przywrócić dostęp do bazy użytkownikom: 

    ALTER DATABASE Test SET MULTI_USER

Po całym tym procesie należy też wykonać oczywiście pełny backup bazy.

Wnioski i sugestie

Z podobnych historii płyną liczne wnioski:

  1. Metoda na zmniejszenie pliku dziennika transakcji bazy polegająca na usuwaniu tegoż pliku jest niebezpieczna i zdecydowanie niezalecana. Mówiąc po mojemu – za takie rzeczy ucinamy rączki :-)
  2. Tą i podobne metody pokazują i czasem polecają (sic!) szczęśliwi ludzie, którzy powinni chyba częściej grywać w totka. Niestety, ponoć także niektórzy MCT należą do tych farciarzy i uczą swoich kursantów takich metod na szkoleniach. A zatem…
  3. Nawet, jak coś bierzemy za pewnik, “bo tak powiedział jeden trener”, weryfikujmy zasłyszane “dobrze znane prawdy” empirycznie. Unikniemy rozczarowań i przykrych niespodzianek w najmniej oczekiwanych momentach.
  4. Do ewentualnego zmniejszania pliku dziennika transakcji używamy zestawu – backup dziennika transakcji + DBCC SHRINKFILE. A tak w ogóle, nim zmniejszysz plik loga, zadaj sobie pytanie, po co właściwie chcesz to zrobić? :-)
  5. Przy bazie danych działającej w trybie FULL (recovery mode) niezbędna jest odpowiednia strategia backupowania loga (inaczej – trzeba go backupować, jeśli nie chcemy mieć problemów – narastającego wiecznie pliku logów czy długiego czasu podnoszenia bazy po restarcie serwera).

Inni mówią i piszą o logu

Bardzo interesująco o logu opowiadali swego czasu na konferencji Microsoft Technology Summit 2006 Marcin Szeliga i Maciej Pilecki (“Strojenie SQL Server 2005”). O złym nawyku usuwania loga wspomniał też wymieniony Maciej Pilecki w swojej sesji o mitach na konferencji Communities to Communities 2008 (“Największe mity na temat SQL Server”). Bardzo dobry artykuł o zasadach funkcjonowania dziennika transakcji i metodach utrzymania go napisał dla Technet Polska Marcin Guzowski (“Log transakcyjny w SQL Server 2005”). Firma Microsoft w swoich artykułach także opisuje, jak radzić sobie z rosnącymi plikami dziennika transakcji (KB873235, KB272318).

Suma sumarum

Na zakończenie chciałbym zaznaczyć, że opisana metoda ratowania się z opresji po usunięciu pliku dziennika transakcji nie jest wynikiem moich własnych przeżyć. Po prostu przeprowadziłem w ramach testów małą symulację i okazało się, że opisana wyżej procedura pozwoliła mi przywrócić bazę danych online. Ze swojej strony nie gwarantuję, że procedura ta pomoże każdemu. Ale – z drugiej strony - po przeczytaniu niniejszej notki, powinieneś już wiedzieć, jak uniknąć podobnych sytuacji.

Mam nadzieję, że opisany problem w przyszłości będzie pojawiał się coraz rzadziej i ludzie zaczną jednak stosować najlepsze praktyki w odniesieniu do dziennika transakcji. I nie będzie nam już dane urządzać konkursu pt. “Kto ma największego loga?”… :-)

I jeszcze jedno. Tytuł notki to oczywiście parafraza tytułu znanej piosenki znanego zespołu Czarno-Czarni ;-) Zasugerował mi go Marek Adamczuk. Szczypta ironii wobec poruszonego wyżej tematu pasuje jak ulał.

Jeśli masz jakieś komentarze lub może nie zgadzasz się z tym, co napisałem, komentuj tę notkę. Przecież może właśnie podjąłem próbę stworzenia kolejnego mitu na temat SQL Server?! ;-)

opublikowano przez brejk | 7 komentarzy

[PL][OT] MVP Party? ;-)

Oj, ależ tego off-topica u mnie ostatnio. Obiecuję, że to już ostatni raz ;-) Szybko i bez owijania w bawełnę...

Koleżanki i koledzy z zaprzyjaźnionych grup pasjonackich WG.NET i PLSSUG Warszawa postanowili uczcić fakt mojej nominacji do tytułu MVP i organizują małe party z tej okazji. Impreza rozpocznie się w czwartek 10 lipca o godzinie 18:00 w siedzibie Microsoft w Warszawie, Al. Jerozolimskie 195A (a gdzie i jak się skończy, to już inna sprawa). Organizatorzy ponoć przewidują jakieś specjalne atrakcje z tortem i balonikami na czele, ale ja udam, że nie wiem, "o so chosi" :-) Zapraszam wszystkich chętnych do udziału. Jeśli masz ochotę, po prostu przyjdź się pointegrować z ludźmi, którzy na codzień nie potrafią rozmawiać o niczym innym, tylko o technologii ;-)

Raz jeszcze serdecznie dziękuję wszystkim za gratulacje, które znaczą dla mnie naprawdę wiele, bo dzięki temu czuję, że rzeczywiście zasłużyłem na wyróżnienie. Wracam na ziemię po chwilowym uniesieniu - "Houston, nie mamy żadnego problemu" :-)

opublikowano przez brejk | 2 komentarzy
Filed under: ,

[EN][OT] Me, SQL MVP...

Yesterday, late in the afternoon, I got an e-mail titled: "[MVP] Congratulations!  You have received the Microsoft MVP Award".

The beginning of this e-mail was like below:

"Dear Pawel Potasinski,

Congratulations! We are pleased to present you with the 2008 Microsoft® MVP Award! The MVP Award is our way to say thank you for promoting the spirit of community and improving people’s lives and the industry’s success every day. We appreciate your extraordinary efforts in SQL technical communities during the past year."

Wow! It's a great honour to become the third Polish SQL MVP in the history! The other SQL MVPs from Poland are: Marcin Szeliga (congratulations on your reaward, Marcin!) and Maciej Pilecki (who's currently in Latvia but I still count him as Polish MVP ;-)).

Many thanks to all those people in community and Microsoft who have supported me until this day.

opublikowano przez brejk | 5 komentarzy
Filed under: ,

[PL] Ekstra spacje w SSMS 2008

Jeśli właśnie zamierzasz zainstalować SQL Server 2008 RC0 na swojej maszynie (nie wirtualnej), na której już masz SQL Server 2005, to pomyśl dwa razy. Ja parę dni temu to próbowałem zrobić i teraz odrobinę żałuję :-)

Zaczęło się całkiem dobrze, instalator ruszył jak z kopyta, ale już po wybraniu niezbędnych opcji opluł mnie błędem, że niby mam jakieś narzędzia, które wg niego są narzędziami SQL Server 2005 Express Edition (oczywiście takiej edyji na mojej maszynie jak raz nie ma – mam za to Developer Edition). “No nic”, pomyślałem, “zainstaluję to cudo na VPC”. Jak pomyślałem, tak zrobiłem.

Tego samego dnia przyszło mi, jak codzień, pracować na laptopie z SSMS do wersji 2005. Ku mojemu zdziwieniu, całkiem nieźle dotąd pracujące środowisko, zaczęło zachowywać się cokolwiek nieswojo. W czym rzecz? Otóż, bardzo często zdarza mi się generować kod T-SQL innym kodem T-SQL (na tym opierają swe działanie moje utilsy). Zazwyczaj w celu łatwego kopiowania wygenerowanego kodu, przełączam SSMS w tryb “Results to Text”. I tu niespodzianka. Do każdego wiersza w kolumnach typu varchar SSMS zaczęło doklejać spacje. Suma sumarum, jeśli teraz napiszę w SSMS taki kod:

SELECT CAST('a' AS varchar(8000))

to otrzymam w wyniku literkę 'a' plus… 7999 spacji!!!

Myślałem, że pomoże przeinstalowanie SQL Native Client’a, ale nie. Teraz stoję przed dylematem – używać starego dobrego Query Analyzera z wersji 2000 czy może “dać w łeb” systemowi i stawiać SQL Server 2005 od nowa?!

Cokolwiek zainstalowało się na starcie instalatora SQL Server 2008 RC0, skutecznie popsuło mi SSMS 2005 (odinstalowałem wszystko to, co dotyczyło wersji 2008 i znalazła konsola “Programy i funkcje” w mojej Viście) :-)

Po sprawdzeniu, jak na VPC zachowuje się SSMS w wersji 2008 (niestety, zachowuje się równie niefajnie), zgłosiłem opisaną sytuację jako bug na connect.microsoft.com. Możesz poprzeć mój głos klikając na poniższy link.

https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=353163

opublikowano przez brejk | 3 komentarzy

[PL] UGTV – kwietniowe nagrania z Seattle

Wczoraj pojawił się nowy materiał video UGTV. Tym razem film zawiera nagrania z kwietnia br. dokonane w Seattle przy okazji MVP Global Summit i User Group Leaders Summit. Wśród nagrań jest wywiad z Davem Sandersem i Frankiem V. Tutone z organizacji Culminis, o której pisałem całkiem niedawno (rozmawia z nimi Graham Watson z Microsoft, a za oszklonymi drzwiami sali, w której wywiad ma miejsce, odbywa się kolacja z udziałem uczestników User Group Management Summit, w tym mojej skromnej osoby :-)). W nagraniach znalazły się też fragmenty wywiadów z liderami grup pasjonackich i członkami organizacji takich jak Ineta. Szkoda, że nie doszukałem się polskich akcentów, ale nic straconego! Kiedyś i my zostaniemy gwiazdami show UGTV ;-) Miłego oglądania.


UGTV – It’s class not Glass!

opublikowano przez brejk | 2 komentarzy

[PL][OT] Hero Happened Here

Tytuł chwytliwy, nieprawdaż? :-)

Tak sobie pomyślałem, że my - ludzie branży IT - szukamy bohaterów wśród nas samych. Znajdujemy "obiekty uwielbienia" w ludziach, którzy prezentują ponadprzeciętną wiedzę lub którzy swą aktywnością pobudzają nas do nadążania za technologiami i rozwoju własnego. I dobrze.

Ważne jednak, by dostrzegać też tych bohaterów, którzy nie działają w naszej branży, a którzy swą postawą są w stanie zainspirować innych i wskazać właściwą drogę do osiągnięcia sukcesu. Takim człowiekiem dla mnie jest moja żona, Ania. Wczoraj właśnie została doktorem nauk społecznych i historycznych (konkretnie doktorem socjologii). Może nie byłoby w tym nic wielkiego, w końcu tyle ludzi teraz prze w edukację dalej niż tylko do poziomu wyższego wykształcenia. A jednak twierdzę, że moja małżonka jest prawdziwym bohaterem :-)

Napisanie doktoratu zajęło jej parę lat (dokładnie pewnie 5-6 lat). W tym czasie urodziła dwóch wspaniałych synków i zajmowała się domem. Każdy, kto jest rodzicem, wie, jak trudno o chwile dla siebie, gdy w rodzinie pojawia się dziecko (dzieci). Doba kurczy się znacząco. A tu jeszcze mąż niekoniecznie jest wielkim oparciem dla kobiety - a to spotkanie grupy pasjonackiej, a to konferencja i wyjazd na tydzień za granicę, a to działania na jakimś portalu społeczności (nie wspominam o czasach, gdy pracowałem jako trener i jeździłem po kraju na szkolenia)... Jednym słowem, momentów, gdy kobieta zostaje sama z całym tym bałaganem (dom + dzieci), jest bardzo wiele. O czym więc świadczy fakt, że mimo tego udało się Ani napisać i obronić doktorat, jednocześnie nie rozwodząc się z mężem i nie zaniedbując dzieci? O wielkiej sile woli, ogromnej determinacji i systematyczności nie do przecenienia.

Moja bohaterko, szacunek dla Ciebie za to co zrobiłaś i za to, co robisz każdego dnia.

opublikowano przez brejk | 7 komentarzy
Filed under: ,
Więcej wypowiedzi Następna strona »