Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Typowe błędy DBA w MS SQL Server

W tym artykule przyjrzymy się błędom DBA, których konsekwencje były dość zauważalne i z którymi musiałem się zmierzyć.

Celem artykułu jest uniemożliwienie użytkownikom powtarzania tych błędów. Czasami złe doświadczenie jest nawet cenniejsze niż pozytywne.

  1. Procent przyrostu plików bazy danych
    Ponieważ wzrost plików bazy danych jest operacją dość zasobożerną, może się wydawać, że określenie tego wzrostu w procentach może być dobrym pomysłem. Zgadzam się, że wiele wytycznych zaleca ustawienie stałego przyrostu w MB, a nie procentu. Nie wyjaśniają jednak przyczyn. Zgodnie z praktyką nie zaleca się ustawiania przyrostu pliku bazy danych powyżej 1 GB, ponieważ MS SQL Server przydzieli 1 GB 2 razy, a nie 2 GB naraz.
    Ponadto, jeśli przydzielisz mniej niż 32 MB , prędzej czy później baza danych po prostu zwolni. Dlatego lepiej ustawić stały przyrost plików bazy danych od 32 do 1024 MB. Dlaczego jednak nie można określić przyrostu plików bazy danych w procentach? Okazuje się, że jak tylko plik ma mniej niż 1 MB, DBMS zaokrągla tę wartość do 0 MB i przestaje powiększać ten plik. W rezultacie system nie działa. Aby dowiedzieć się, o ile potrzebujemy powiększyć plik, wystarczy wykonać codzienną analizę, aby sprawdzić, o ile każdy plik zyskuje w MB i ustawić odpowiednią liczbę w zakresie od 32 do 1024 MB. Możemy zbierać statystyki dotyczące wzrostu plików bazy danych w następujący sposób.
  2. Istnieje wiele kluczy obcych dla tabeli
    Czy kiedykolwiek próbowałeś sprawdzić plan, usuwając przynajmniej jeden wiersz z tabeli, do której odwołują się prawie setki innych tabel? Będziesz zaskoczony, gdy dowiesz się, ile jest zagnieżdżonych pętli. Wszystkie są weryfikacjami kluczy obcych. Dlatego jeśli tabele są duże (ponad milion rekordów), lepiej wyłączyć klucze obce dla tabeli, w której dane będą usuwane. Następnie musisz usunąć wszystkie niezbędne i powiązane dane. Następnie włącz klucze obce. Podobna sytuacja ma miejsce w przypadku kaskadowych aktualizacji i usuwania. Jeśli jest dużo linków zewnętrznych (setki), usunięcie nawet jednego wiersza może prowadzić do długiego i bardzo rozległego blokowania.
  3. Wiele niepotrzebnych indeksów
    Bardzo często można zauważyć we wskazówkach, że przy tworzeniu kluczy obcych konieczne jest budowanie indeksów, zwłaszcza gdy używa się tych kluczy do złączeń. Musisz sprawdzić, czy indeksy są używane, w przeciwnym razie te niepotrzebne indeksy spowalniają tylko operacje modyfikacji danych. Aby to sprawdzić, użyj następującego zapytania:

    select DB_NAME(t.database_id)		as [DBName]
    	 , SCHEMA_NAME(obj.schema_id)	as [SchemaName]
    	 , OBJECT_NAME(t.object_id)		as [ObjectName]
    	 , obj.Type						as [ObjectType]
    	 , obj.Type_Desc				as [ObjectTypeDesc]
    	 , ind.name						as [IndexName]
    	 , ind.Type						as IndexType
    	 , ind.Type_Desc				as IndexTypeDesc
    	 , ind.Is_Unique				as IndexIsUnique
    	 , ind.is_primary_key			as IndexIsPK
    	 , ind.is_unique_constraint		as IndexIsUniqueConstraint
    	 , t.[Database_ID]
    	 , t.[Object_ID]
    	 , t.[Index_ID]
    	 , t.Last_User_Seek
    	 , t.Last_User_Scan
    	 , t.Last_User_Lookup
    	 , t.Last_System_Seek
    	 , t.Last_System_Scan
    	 , t.Last_System_Lookup
    from sys.dm_db_index_usage_stats as t
    inner join sys.objects as obj on t.[object_id]=obj.[object_id]
    inner join sys.indexes as ind on t.[object_id]=ind.[object_id] and t.index_id=ind.index_id
    where (last_user_seek	is null or last_user_seek		<dateadd(year,-1,getdate()))
    and (last_user_scan		is null or last_user_scan		<dateadd(year,-1,getdate()))
    and (last_user_lookup	is null or last_user_lookup		<dateadd(year,-1,getdate()))
    and (last_system_seek	is null or last_system_seek		<dateadd(year,-1,getdate()))
    and (last_system_scan	is null or last_system_scan		<dateadd(year,-1,getdate()))
    and (last_system_lookup is null or last_system_lookup	<dateadd(year,-1,getdate()))
    and t.database_id>4 and t.[object_id]>0 -- system databases are excluded

  4. Nieefektywne wykorzystanie zasobów
    Często zaleca się przechowywanie dziennika transakcji i pliku bazy danych na różnych urządzeniach pamięci masowej. Jeśli używasz RAID 10 z 4 i więcej dyskami SSD, nie ma sensu izolować plików od siebie. W razie potrzeby, aby uzyskać większą szybkość, baza danych tempdb może być przechowywana na dysku, który jest podzielony z pamięci RAM. Ponadto zbyt duże ilości pamięci RAM dostarczonej do DBMS sprawią, że ten ostatni wypełni całą pamięć nieistotnymi planami zapytań.
  5. Złe kopie zapasowe
    Zawsze konieczne jest nie tylko sprawdzenie utworzonych kopii zapasowych, ale także przeniesienie ich na stanowisko testowe i ich odtworzenie. Wszystko to musi zostać zautomatyzowane z dalszym powiadamianiem administratorów o zarówno problematycznych, jak i udanych odzyskaniach.
  6. Zła odporność na awarie
    Przed utworzeniem klastra składającego się z dwóch lub więcej serwerów należy upewnić się, że system przechowywania danych jest również odporny na awarie. Jeśli to drugie zawiedzie, cała tolerancja na błędy zostanie zredukowana do zera.
  7. Skomplikowane diagnostyka bez prostych kontroli
    Jeśli nastąpi awaria systemu, najpierw musisz sprawdzić logi MS SQL Server, a następnie poszukać głębiej. Powinieneś najpierw przeprowadzić proste kontrole, a następnie przejść do złożonej diagnostyki.
  8. Zagubione stoły
    Tabele można rozbudować o niepotrzebne dane, które należy zarchiwizować w osobnej bazie danych lub usunąć. Ponadto tabele nie mogą być dłużej używane.

To są sytuacje, z którymi się spotkałem. Dlatego polecam, aby nie powtarzać powyższych błędów.

Jeśli chciałbyś podzielić się swoimi doświadczeniami lub takimi błędami podczas administrowania bazami danych, daj mi znać – chętnie o nich porozmawiam.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak działa funkcja FORMAT() w programie SQL Server (T-SQL)

  2. Czy możesz wywołać usługę internetową z kodu TSQL?

  3. Jak uzyskać nazwy kolumn z tabeli w SQL Server?

  4. Jak utworzyć i wypełnić tabelę w jednym kroku w ramach operacji importu CSV?

  5. Jakie są ograniczenia bazy danych?