Rozwijając katalog System Databases z poziomu MS SQL Server Managent Studio widzimy cztery bazy
MASTER
Jest główną z punktu widzenia instalacji bazą danych.
Przechowywane w niej są informacje o instancji: loginy, linked server configuration , service broker endpoints, informacje o bazach zdefiniowanych w instancji serwera.
MSDB
Jest bazą służącą do obsługi agenta SQL, przechowuje jobs i ich Schedule, alerty, operators oraz całą historię. W bazie tej przechowywane są też informacje o tworzeniu i odtwarzaniu kopii zapasowych baz (backup i restore), konfiguracja i logio database mail, maintenence plan.
TEMPDB
Jest bazą tymczasową służącą do przechowywania obiektów tymczasowych, zmiennych, kursorów, wspomaga sortowanie i przebudowania indeksów.
Baza tymczasowa jest tworzona przy każdym restarcie instancji serwera, pozwala nam to w prosty sposób sprawdzić kiedy był ostatni restart
SELECT create_date AS [ostatni restart SQL]
FROM sys.databases
WHERE name = 'tempdb'
MODEL
Jest bazą wzorcową dla instancji serwera wszystkie nowo tworzone bazy są tworzone poprzez kopiowanie tej bazy, także tempdb (dla tempdb ustaiony jest tryb recovery na simple niezależnie od tego jaki jest w model).
Jeżeli masz jakieś ustawienia które musisz zastosować w każdej nowej bazie, userów, tabele możesz je dodać w bazie model i będą się pojawiały w każdej stworzonej bazie.
Dodatkowe bazy systemowe pojawia się podczas tworzenia replikacji
DISTRIBUTION
Jest bazą służącą do przechowywania informacji potrzebnych do realizacji usługi replikacji
DISTRIBUTION MODEL
Pełni podobną rolę jak baza model tylko dla bazy distribution, nie występuje w wersji 2008
Jest jeszcze niewidoczna z poziomu management studio baza
RESOURCE
w niektórych miejscach baza ta przedstawia się MSSQLSYSTEMRESOURCE
w niektórych miejscach baza ta przedstawia się MSSQLSYSTEMRESOURCE
USE [master]
Jest bazą przechowującą obiekty systemowe: procedury, widoki, funkcje.
W folderze z innymi bazami systemowymi pojawią się pliki mssqlsystemresource.mdf i mssqlsystemresource.ldf.
Twórcy bardzo postarali się żeby ją ukryć, nie widać jej z poziomu SSMS
select name ,database_id from sys.databases
name database_id
------------------------ -----------
master 1
tempdb 2
model 3
msdb 4
mydatabase 5
Nie widać również śladu po fizycznych plikach bazy.
SELECT * FROM sys.sysaltfiles
WHERE filename LIKE '%resource%'
--------------------
(0 row(s) affected)
Dopiero po uruchomieniu serwera w trybie single-user mode i połączeniu DAC możemy się do niej odwołać
USE mssqlsystemresource
go
SELECT db_name ()
--------------------------------
mssqlsystemresource
(1 row(s) affected)
Po podłączeniu się do serwera przy pomocy DAC możemy zapytać o bazy systemowe
SELECT id,name FROM master.sys.sysdbreg
order by id
id name
----------- ----------------
1 master
2 tempdb
3 model
4 msdb
....
32767 mssqlsystemresource
(16 row(s) affected)
32767 to 0x7fff a ta wartość pojawia się w definicji widoku
sp_helptext [sys.databases]
----------
CREATE VIEW sys.databases AS
SELECT d.name, d.id AS database_id,
r.indepid AS source_database_id,
d.sid AS owner_sid,
d.modified AS create_date,
convert(tinyint, (d.category/256) & 0xff) AS compatibility_level,
convert(sysname, CollationPropertyFromID(p.cid, 'name')) AS collation_name,
p.user_access, ua.name AS user_access_desc,
sysconv(bit, d.status & 0x400) AS is_read_only, -- DBR_RDONLY
sysconv(bit, d.status & 1) AS is_auto_close_on, -- DBR_CLOSE_ON_EXIT
sysconv(bit, d.status & 0x400000) AS is_auto_shrink_on, -- DBR_AUTOSHRINK
p.state, st.name AS state_desc,
sysconv(bit, d.status & 0x200000) AS is_in_standby, -- DBR_STANDBY
sysconv(bit, d.status & 0x40000000) AS is_cleanly_shutdown, -- DBR_CLEANLY_SHUTDOWN
sysconv(bit, d.status & 0x80000000) AS is_supplemental_logging_enabled, -- DBR_SUPPLEMENT_LOG
p.snapshot_isolation_state, si.name AS snapshot_isolation_state_desc,
sysconv(bit, d.status & 0x800000) AS is_read_committed_snapshot_on, -- DBR_READCOMMITTED_SNAPSHOT
p.recovery_model, ro.name AS recovery_model_desc,
p.page_verify_option, pv.name AS page_verify_option_desc,
sysconv(bit, d.restat & 0x1000000) AS is_auto_create_stats_on, -- DBR_AUTOCRTSTATS
sysconv(bit, d.restat & 0x40000000) AS is_auto_update_stats_on, -- DBR_AUTOUPDSTATS
sysconv(bit, d.restat & 0x80000000) AS is_auto_update_stats_async_on, -- DBR_AUTOUPDSTATSASYNC
sysconv(bit, d.restat & 0x4000) AS is_ansi_null_default_on, -- DBR_ANSINULLDFLT
sysconv(bit, d.restat & 0x4000000) AS is_ansi_nulls_on, -- DBR_ANSINULLS
sysconv(bit, d.restat & 0x2000) AS is_ansi_padding_on, -- DBR_ANSIPADDING
sysconv(bit, d.restat & 0x10000000) AS is_ansi_warnings_on, -- DBR_ANSIWARNINGS
sysconv(bit, d.restat & 0x1000) AS is_arithabort_on, -- DBR_ARITHABORT
sysconv(bit, d.restat & 0x10000) AS is_concat_null_yields_null_on, -- DBR_CATNULL
sysconv(bit, d.restat & 0x800) AS is_numeric_roundabort_on, -- DBR_NUMEABORT
sysconv(bit, d.restat & 0x800000) AS is_quoted_identifier_on, -- DBR_QUOTEDIDENT
sysconv(bit, d.restat & 0x20000) AS is_recursive_triggers_on, -- DBR_RECURTRIG
sysconv(bit, d.restat & 0x2000000) AS is_cursor_close_on_commit_on, -- DBR_CURSCLOSEONCOM
sysconv(bit, d.restat & 0x100000) AS is_local_cursor_default, -- DBR_DEFLOCALCURS
sysconv(bit, d.restat & 0x20000000) AS is_fulltext_enabled, -- DBR_FTENABLED
sysconv(bit, d.restat & 0x200) AS is_trustworthy_on, -- DBR_TRUSTWORTHY
sysconv(bit, d.restat & 0x400) AS is_db_chaining_on, -- DBR_DBCHAINING
sysconv(bit, d.restat & 0x08000000) AS is_parameterization_forced, -- DBR_UNIVERSALAUTOPARAM
sysconv(bit, d.restat & 64) AS is_master_key_encrypted_by_server, -- DBR_MASTKEY
sysconv(bit, d.category & 1) AS is_published,
sysconv(bit, d.category & 2) AS is_subscribed,
sysconv(bit, d.category & 4) AS is_merge_published,
sysconv(bit, d.category & 16) AS is_distributor,
sysconv(bit, d.category & 32) AS is_sync_with_backup,
d.svcbrkrguid AS service_broker_guid,
sysconv(bit, case when d.scope = 0 then 1 else 0 end) AS is_broker_enabled,
p.log_reuse_wait, lr.name AS log_reuse_wait_desc,
sysconv(bit, d.restat & 0x00000004) AS is_date_correlation_on -- DBR_DATECORRELATIONOPT
FROM master.sys.sysdbreg d OUTER APPLY OpenRowset(TABLE DBPROP, d.id) p
LEFT JOIN sys.syssingleobjrefs r ON r.depid = d.id AND r.class = 96 AND r.depsubid = 0 -- SRC_VIEWPOINTDB
LEFT JOIN sys.syspalvalues st ON st.class = 'DBST' AND st.value = p.state
LEFT JOIN sys.syspalvalues ua ON ua.class = 'DBUA' AND ua.value = p.user_access
LEFT JOIN sys.syspalvalues si ON si.class = 'DBSI' AND si.value = p.snapshot_isolation_state
LEFT JOIN sys.syspalvalues ro ON ro.class = 'DBRO' AND ro.value = p.recovery_model
LEFT JOIN sys.syspalvalues pv ON pv.class = 'DBPV' AND pv.value = p.page_verify_option
LEFT JOIN sys.syspalvalues lr ON lr.class = 'LRWT' AND lr.value = p.log_reuse_wait
WHERE d.id < 0x7fff
AND has_access('DB', d.id) = 1
Jest możliwość podejrzenia co w nich jest możemy zatrzymać instancję SQL Server skopiować te pliki, uruchomić instancję i zrobić attach.
GO
CREATE DATABASE [rk_source] ON
( FILENAME = N'C:\TEST\mssqlsystemresource.mdf' ),
( FILENAME = N'C:\TEST\mssqlsystemresource.ldf' )
FOR ATTACH
Okazuje się że procedury, widoki systemowe są już widoczne również jako zwykłe obiekty bazy danych, pod prawym przyciskiem pojawia się opcja modify
Możemy obejrzeć tabele
select name from rk_source.sys.all_objects
where type='U'
-----------
name
-------------------
syspalvalues
spt_server_info
spt_datatype_info
role_permissions
sysbinpals
syscolrdb
spt_provider_types
syspalnames
spt_permission_names
sysobjrdb
spt_datatype_info_ext
(11 row(s) affected)
To, że baza resourse jest używana przy zapytaniach możemy sprawdzić ustawiając
SET SHOWPLAN_TEXT ON
StmtText
-------------------------------
select * from sys.sql_logins
(1 row(s) affected)
StmtText
--------------------------------------------------------------------
|--Nested Loops(Left Outer Join)
|--Nested Loops(Left Outer Join, OUTER REFERENCES:([p].[id]))
| |--Compute Scalar(DEFINE:([Expr1006]=CONVERT(bit,[master].[sys].[sysxlgns].[status] as [p].[status]&(128),0), [Expr1007]=CONVERT(bit,[master].[sys].[sysxlgns].[status] as [p].[status]&(131072),0), [Expr1008]=CONVERT(bit,[master].[sys].[sysxlgns
| | |--Filter(WHERE:(has_access('LG',[master].[sys].[sysxlgns].[id] as [p].[id])=(1)))
| | |--Clustered Index Scan(OBJECT:([master].[sys].[sysxlgns].[cl] AS [p]), WHERE:([master].[sys].[sysxlgns].[type] as [p].[type]='S'))
| |--Clustered Index Seek(OBJECT:([master].[sys].[syssingleobjrefs].[clst] AS [r]), SEEK:([r].[depid]=[master].[sys].[sysxlgns].[id] as [p].[id] AND [r].[class]=(63) AND [r].[depsubid]=(0)) ORDERED FORWARD)
|--Clustered Index Seek(OBJECT:([mssqlsystemresource].[sys].[syspalnames].[cl] AS [n]), SEEK:([n].[class]='LGTY' AND [n].[value]='S') ORDERED FORWARD)
Podczas wgrywania poprawki SQL Serwer dotyczącej obiektów systemowych podmieniana jest ta baza. Baza wprowadzona by usprawnić wgrywanie poprawek i ich wycofywanie. W niej również jest zapisana wersja serwera.
SELECT attribute_value
FROM rk_source.sys.spt_server_info
WHERE attribute_name ='DBMS_VER'
attribute_value
---------------------------------------
Microsoft SQL Server Yukon - 9.00.4285
Data ostatniej aktualizacji serwera pokrywa się z datą utworzenia plików bazy
SELECT SERVERPROPERTY('ResourceLastUpdateDateTime');
-------------------------
2009-12-03 12:18:14.130
Baza ta instaluje się w miejscu wybranym jako lokalizacja baz systemowych serwera, domyślnie w C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\
Jest jedyną bazą której lokalizacji nie można zmieniać po zainstalowaniu instancji.
Brak komentarzy:
Prześlij komentarz