简体   繁体   中英

Sql server SMO partial backup

I have a database in SQL Server 2008 R2, that uses the Simple recovery model.

The database contains a filegroup, where the bulk of the data resides (>20GB of images). These images are not critical for the application.

I want to backup the database from C# using Sql Server SMO. But I only want to backup the database structure (the PRIMARY filegroup; everything except the non-essential images). I want to do this in order to keep the backup size small.

In my C# code, I am setting the backup action to BackupActionType.Files , and I am only including the PRIMARY filegroup inside the DatabaseFileGroups collection, so it should only backup the database structure, and not the images.

But when I run the backup, I get this exception:

System.Data.SqlClient.SqlError: The primary filegroup cannot be backed up as a file backup because the database is using the SIMPLE recovery model. Consider taking a partial backup by specifying READ_WRITE_FILEGROUPS.

My question is, how can I specify READ_WRITE_FILEGROUPS from inside C# code, using Sql Server SMO? The exception shows me how to do so in T-SQL, but I want to do the same thing in C#.

Here is the code I am using:

class Program
{
    static string DbName = PATH_TO_DATABASE;
    static string connString = CONNECTION_STRING;

    static void Main(string[] args)
    {
        ServerConnection serverConn = new ServerConnection();
        serverConn.ConnectionString = connString;
        Server server = new Server(serverConn);

        Backup backup = new Backup() { Database = DbName };

        backup.Action = BackupActionType.Files;
        backup.DatabaseFileGroups.Add("PRIMARY");
        backup.Devices.AddDevice("D:\\backup.bak", DeviceType.File);

        backup.Initialize = true;
        backup.ContinueAfterError = false;
        backup.Incremental = false;

        backup.Complete += (snd, e) => { Console.WriteLine("Complete"); };
        backup.PercentComplete += (snd, e) => { Console.WriteLine("Percent " + e.Percent); };

        backup.SqlBackup(server);

        serverConn.Disconnect();
    }
}

solution is very simple. Just in SQLSERVER rigth-click on database and in Properties Window in Option tab change Recovery Mode To Bulk-logged

secound Solution by T-SQL:

USE [master]
GO
ALTER DATABASE [databasename] SET RECOVERY BULK_LOGGED WITH NO_WAIT
GO

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM