2013. július 3., szerda

Generate a backup commands

If you have several database and you want to create a copy only backup from them the following script help you to generate a commands

DECLARE @DESTDIR VARCHAR(80);

SET @DESTDIR='C:\DIR1\';

/*------------------------------------------------------------------------*/
DECLARE @SQL nvarchar(max), @dbName sysname;
    DECLARE DBcursor CURSOR  FOR
    SELECT name FROM     master.dbo.sysdatabases
    WHERE  name NOT IN ('master','tempdb','model','msdb')
      AND  DATABASEPROPERTYEX(name,'status')='ONLINE' ORDER BY name;
    OPEN DBcursor; FETCH  DBcursor   INTO @dbName;
    WHILE (@@FETCH_STATUS = 0) -- loop through all db-s
      BEGIN
        
SET @SQL = 'BACKUP DATABASE ['+ @dbName +'] TO  DISK = N'''+@DESTDIR+''+@dbName +'_copy_only.bak'' WITH COPY_ONLY';
        
PRINT @SQL;
PRINT 'GO';
        FETCH  DBcursor INTO @dbName;
     END; -- while
   CLOSE DBcursor; DEALLOCATE DBcursor;


Result:

BACKUP DATABASE [Database_1] TO  DISK = N'C:\DIR1\Database_1_copy_only.bak' WITH COPY_ONLY
GO
BACKUP DATABASE [Database_2] TO  DISK = N'C:\DIR1\Database_2_copy_only.bak' WITH COPY_ONLY
GO
BACKUP DATABASE [Database_3] TO  DISK = N'C:\DIR1\Database_3_copy_only.bak' WITH COPY_ONLY
GO
BACKUP DATABASE [Database_4] TO  DISK = N'C:\DIR1\Database_4_copy_only.bak' WITH COPY_ONLY
GO
BACKUP DATABASE [Sales] TO  DISK = N'C:\DIR1\Sales_copy_only.bak' WITH COPY_ONLY
GO
BACKUP DATABASE [test1] TO  DISK = N'C:\DIR1\test1_copy_only.bak' WITH COPY_ONLY
GO

2013. július 2., kedd

Stuck in Single user mode with deadlocked

One day I tried to set my DB to single user mode with GUI

GUI

After I couldn't do anything with the DB I always got this message:

Msg 1205, Level 13, State 68, Server XXXXXXXXXXX, Line 1
Transaction (Process ID 53) was deadlocked on lock resources with another proces
s and has been chosen as the deadlock victim. Rerun the transaction.
Msg 5069, Level 16, State 1, Server XXXXXXXXXXX, Line 1
ALTER DATABASE statement failed.  

I tried everything but not helped...... After several hours of searching I found the solution:

USE [database] 
SET DEADLOCK_PRIORITY HIGH
exec sp_dboption '[database] ', 'single user', 'FALSE';
ALTER DATABASE [database]  SET MULTI_USER WITH NO_WAIT
ALTER DATABASE [database]  SET MULTI_USER WITH ROLLBACK IMMEDIATE