Shrinkfile

Innimellom vokser  SQL data eller logfiler til gigantiske proporsjoner, uten at de nødvendigvis inneholder noe fornuftig.Du kan få en liste over  loggbruk og størrelse ved å kjøre følgende kommando:

DBCC sqlperf(logspace)

Transaksjonsloggen bør vanligvis ikke være større enn ca 25% av databasestørrelsen, men det kommer an på hvor ofte den tømmes. Dersom den plutselig blir betydelig større enn normalt for en gitt database er det grunn til bekymring og videre etterforskning.

Hvor stor databasen er og hvor mye av plassen som brukes til noe fornuftig kan du sjekke for en og en database med følgende kommandoer:

USE [DatabaseNavn];
GO
EXEC sp_spaceused @updateusage = N'TRUE';
GO

I SQL 2008 management studio kan du også få opp en Disk usage rapport som gir fancy kakediagram og forklaringer i tillegg.

For å krympe en fil må du vit hva den heter. Dette sjekkes i databaseinnstillinger. Det er ikke det faktiske filnavnet du er ute etter, men det logiske navnet.

USE [Databasenavn]
GO
DBCC SHRINKFILE ([logisk filnavn], [Ønsket størrelse i MiB])
GO

For å unngå diskfragmentering bør du angi en størrelse som er omtrent det du tror den trenger å være. For loggfiler har vi en tommelfingerregel som sier at samlet størrelse på loggfilen (og det skal helst bare være en) bør være 25% av samlet størrelse på datafil(ene). Dette vil gi et godt utgangspunkt.

Feilsøking

Innimellom vil en shrinkfile resultere i en eller annen feilmelding (sjekk messages-vinduet). Det skyldes vanligvis en av følgende:

  • For lite ledig diskplass
  • Slutten av filen er i bruk. (loggfiler er delt opp i mindre virtuelle logger)
  • Databasen/loggen er korrupt

Først og fremst bør du sjekke i feilloggen om databasen er korrupt eller om den har andre feil relatert til problemdatabasen.

Dersom du har for lite diskplass, frigjør plass om mulig. Eventuelt kan du dismounte basen og flytte den til en annen større disk først.

For å sjekke hvor mange elementer loggen består av kan man kjøre DBCC LOGINFO:

image

Status 0 angir at fragmentene kan fjernes ved krymping. Siden Shrinkfile bare sletter fra slutten av filen(som er bunnen  av listen over), kan den bare slette opp til og med den siste fragmenten med status 0.

Dersom siste fragment ikke har status 0 kan du korrigere dette. Hvordan du går frem avhenger av om du bruker Simple recovery eller ikke. Dersom du har simple recovery, kjør denne kommandoen isteden:

USE [Databasenavn]
GO
CHECKPOINT
DBCC SHRINKFILE ([logisk filnavn], [Ønsket størrelse i MiB])
GO>

Dersom det ikke virker første gang, kjør den flere ganger. Du kan sjekke fremgang ved å kjøre Loginfo som nevnt over.

Om du bruker full eller bulk logged recovery, ta en backup av loggen og prøv igjen. Kjør eventuelt flere backup etter hverandre om det ikke hjelper på første forsøk. Om alt annet feiler kan du bytte til simple recovery model midlertidig, men det bør være siste utvei. Noen anbefaler å ta basen offline og slette loggfilene. Dette er direkte farlig, da det kan føre til at basen ikke lar seg åpne igjen etterpå. Siden prosedyren over ofte brukes for å rydde opp etter en feilsituasjon er dette særdeles risikabelt. Loggfilen er den viktigste filen til databasen.

Se https://www.sqlskills.com/blogs/paul/why-you-should-not-shrink-your-data-files/ for mer informasjon (engelsk).

Maintenance plans–change owner

Problem

Sometimes you might want to change the owner of a job connected to a maintenance plan. For instance, the current owner could be a deleted account, something that will cause the jobs to fail with not so funny error messages regarding permissions or missing accounts. It is possible to change the job owner using TSQL or Management Studio, but each time the plan is updated, the owner is overwritten by the owner of the maintenance plan. To change this, you have to use TSQL AFAIK.

 

Solution

NB: Running this is dangerous if you don’t know what you are doing! The msdb.dbo.ssispackages table contains system objects as well as your manually created plans, and could also contain SSIS packages as the name indicates. Always take a backup of MSDB before making changes.

Changing the maintenance plan owner on MSSQL 2000:

update msdb.dbo.sysdbmaintplans
set
owner=’SQL Systembruker’
where owner like ‘Feil bruker’

On MSSQL 2008R2:

UPDATE msdb.dbo.sysssispackages
SET
ownersid=suser_sid(’New User’)
WHERE ownersid = suser_sid(’Old user’)

or just set sa as the owner of everything:

UPDATE msdb.dbo.sysssispackages
SET
ownersid=0x01
WHERE ownersid != 0x01

Afterwards, either save the plan to update job ownership or run the following to change the job owner as well.

update msdb.dbo.sysjobs
set
owner_sid=suser_sid(’SQL Systembruker’)
where suser_sname(owner_sid) like ‘Feil bruker’

or just set sa as the owner of everything here as well:

update msdb.dbo.sysjobs
set
owner_sid=0x01
WHERE owner_sid != 0x01

If it doesn’t seem to work as expected, restart the agent service.

Koble til en WSUS database med SQL Management studio

WESUS bruker en Windows Internal Database (WYukon) databasemotor. Dette er en embedded versjon av SQL server som gjerne ikke har management verktøy tilgjengelig. Dette er en smule upraktisk når man feks vil begrense minnebruk eller sjekke databaseintegritet. Som standard er den ikke aktivert for hverken remote eller lokal tilgang heller, så man må installere en versjon av SQL server management studio lokalt på WSUS-serveren og bruke et spesielt instansnavn:

 \\.\pipe\mssql$microsoft##ssee\sql\query