15th April 2009
Problem
In einem MS-SQL 2005 Mirroring Setup können Datenbanken auf dem MIRROR nicht angesprochen werden und somit kann ein Backup nur auf dem PRINCIPAL stattfinden. Ein Job im SQL-Server-Agent würde bei einem Failover nicht mehr funktionieren.
Lösung A
If Exists (Select * from sys.database_mirroring where database_id=yourdbid and mirroring_role=1) Backup database dbname to disk='Path\filename.bak' With INIT
- Quelle: Backup Scenarios with Mirroring
Lösung B
Macht ein Backup aller Datenbanken außer den Systemdatenbanken und Datenbanken, die nicht angesprochen werden können.
DECLARE @DBName varchar(255) DECLARE @DATABASES_Fetch int DECLARE DATABASES_CURSOR CURSOR FOR select DATABASE_NAME = db_name(s_mf.database_id) from sys.master_files s_mf where -- ONLINE s_mf.state = 0 -- Only look at databases to which we have access and has_dbaccess(db_name(s_mf.database_id)) = 1 -- Not master, tempdb or model and db_name(s_mf.database_id) not in ('Master','tempdb','model') group by s_mf.database_id order by 1 OPEN DATABASES_CURSOR FETCH NEXT FROM DATABASES_CURSOR INTO @DBName WHILE @@FETCH_STATUS = 0 BEGIN declare @DBFileName varchar(256) set @DBFileName = datename(dw, getdate()) + ' - ' + replace(replace(@DBName,':','_'),'\','_') exec ('BACKUP DATABASE [' + @DBName + '] TO DISK = N''c:\db backup\' + @DBFileName + ''' WITH NOFORMAT, INIT, NAME = N''' + @DBName + '-Full Database Backup'', SKIP, NOREWIND, NOUNLOAD, STATS = 100') FETCH NEXT FROM DATABASES_CURSOR INTO @DBName END CLOSE DATABASES_CURSOR DEALLOCATE DATABASES_CURSOR
Hier macht es vor allem die Funktion has_dbaccess
möglich, dass der Job auch auf dem MIRROR laufen kann und das Backup nach einem Failover weiter funktioniert.