wtorek, 10 grudnia 2013

Usuwanie plików baz danych

Dzisiaj troche hardcorowo. Czasami zdarza się, że na serwerze baz danych z jakiegoś powodu brakuje miejsca na dysku na odtworzenie kolejnej bazy. W dodatku na nieszczęście dostęp do folderów gdzie te miejsce potencjalnie mogłoby się znaleść jest zakazany.

W poszukiwaniu miejsca na dysku zidentyfikowałem ostatnio, że sporo baz danych pomimo tego, że zostało “usuniętych” pozostawiło swoje pliki na serwerze. Szkoda tylko, że nie miałem dostępu a do otrzebnych mi folderów a administrator systemu był zajęty innymi tematami. Z racji tego, że to serwer baz danych deweloperskich to po bandzie czasami można pojechać.

Na serwerach produkcyjnych lub też takich gdzie usuwanie plików może mieć poważne konsekwencje nie polecam tego typu zabaw.

Tak wiec będąc administratorem serwera baz danych mozna włączyć małe co nieco.
Poniższy skrypt włancza opcje zaawansowane oraz command shell
   1: --Enable advanced options
   2: EXEC SP_CONFIGURE 'SHOW ADVANCED OPTIONS', 1;
   3: GO
   4: RECONFIGURE
   5: GO
   6:  
   7: --Enable command shell
   8: EXEC SP_CONFIGURE 'XP_CMDSHELL', 1
   9: GO
  10: RECONFIGURE
  11: GO
No to teraz do dzieła. Usuwamy wszystkie pliki ldf i mdf. A niech sie dzieje. Kod opisany komentarzami dla ulatwienia.
   1: SET NOCOUNT ON
   2:  
   3: DECLARE @DIRCOMMAND VARCHAR (8000)
   4: DECLARE @ROOTPATH VARCHAR (8000)
   5: DECLARE @DATAFOLDERPATH VARCHAR (8000)
   6: DECLARE @BACKUPFOLDERPATH VARCHAR (8000)
   7: DECLARE @FILE VARCHAR (8000)
   8: DECLARE @COMMAND VARCHAR (8000)
   9: DECLARE @THRESHOLDDATE VARCHAR (30)
  10:  
  11: DECLARE @DIRTABLE TABLE
  12: (NAME VARCHAR (8000))
  13:  
  14: SET @ROOTPATH = 'C:\PROGRAM FILES\MICROSOFT SQL SERVER\MSSQL10.SQL2008\MSSQL\'
  15:  
  16: SET @DATAFOLDERPATH = @ROOTPATH + 'DATA\'
  17: SET @BACKUPFOLDERPATH = @ROOTPATH + 'BACKUP\'
  18: --Directory listing command
  19: SET @DIRCOMMAND = 'DIR ' + '"' + @DATAFOLDERPATH + '"'
  20: SET @THRESHOLDDATE = CONVERT( VARCHAR(30 ), GETDATE (), 106)
  21:  
  22: --Delete database backup files
  23: EXECUTE MASTER .DBO. XP_DELETE_FILE 0 , @BACKUPFOLDERPATH, N'BAK', @THRESHOLDDATE
  24:  
  25: --Get all files from Data folder
  26: INSERT @DIRTABLE EXECUTE MASTER. DBO.XP_CMDSHELL @DIRCOMMAND
  27:  
  28: --Remove everything apart from log and data files
  29: DELETE FROM @DIRTABLE WHERE ( NAME NOT LIKE '%.LDF' AND NAME NOT LIKE '%.MDF') OR NAME IS NULL
  30:  
  31: --Iterate through files table
  32: DECLARE GOODBYEFILE CURSOR FAST_FORWARD FOR
  33: SELECT SUBSTRING (NAME, LEN( NAME) - CHARINDEX (' ', REVERSE( NAME))+2 , LEN(NAME )) FROM @DIRTABLE
  34: OPEN GOODBYEFILE
  35:  
  36: FETCH NEXT FROM GOODBYEFILE INTO @FILE
  37: WHILE @@FETCH_STATUS = 0
  38: BEGIN
  39:  
  40: --Delete command
  41: SET @COMMAND = 'DEL "' + @DATAFOLDERPATH + @FILE + '"'
  42:  
  43: --This will remove the specified file as long as it isn't used by any database on the server.
  44: --If the database was detached the file will be gone!!!
  45: EXECUTE MASTER .DBO. XP_CMDSHELL @COMMAND , NO_OUTPUT
  46:  
  47: FETCH NEXT FROM GOODBYEFILE INTO @FILE
  48: END
  49:  
  50: CLOSE GOODBYEFILE
  51: DEALLOCATE GOODBYEFILE
  52: GO
  53: --Job done!
Wykonując ten kod robicie to na własną odpowiedzialność. Można sobie narobić sporo kłopotów jeżeli coś pójdzie nie tak jak powinno.

Prześlij komentarz