为什么备份数据库比从备份恢复的恢复数据库大?

Rau*_*han 0 sql-server backup restore

我得到了一个42 MB 的.bak 文件,恢复后,数据库大小约为 2048.00 MB。当我对此数据库进行备份时,.bak 文件大小变为277 MB

为什么 .bak 文件大小会增加?我在恢复测试后立即执行此操作。

请找到恢复脚本

IF OBJECT_ID(N'tempdb..#tmp') IS NOT NULL
BEGIN
     DROP TABLE #tmp
END
go
declare @path varchar(50)
create table #tmp
(
LogicalName nvarchar(128) 
,PhysicalName nvarchar(260) 
,Type char(1) 
,FileGroupName nvarchar(128) 
,Size numeric(20,0) 
,MaxSize numeric(20,0),
Fileid tinyint,
CreateLSN numeric(25,0),
DropLSN numeric(25, 0),
UniqueID uniqueidentifier,
ReadOnlyLSN numeric(25,0),
ReadWriteLSN numeric(25,0),
BackupSizeInBytes bigint,
SourceBlocSize int,
FileGroupId int,
LogGroupGUID uniqueidentifier,
DifferentialBaseLSN numeric(25,0),
DifferentialBaseGUID uniqueidentifier,
IsReadOnly bit,
IsPresent bit, 
TDEThumbPrint varchar(50),
SnapshotUrl varchar(50)
)
set @path = '/opt/mssql/backup/IDIT_MSSQL.bak'

insert #tmp
EXEC ('restore filelistonly from disk = ''' + @path + '''')
--select * from #tmp
Declare @RestoreString as Varchar(max)
Declare @NRestoreString as NVarchar(max)
DECLARE @LogicalName  as varchar(75)
Declare @counter as int
Declare @rows as int
set @counter = 1
select @rows = COUNT(*) from #tmp
--select @Rows as [These are the number of rows]

DECLARE MY_CURSOR Cursor 
FOR 
Select LogicalName 
From #tmp

Open My_Cursor 
set @RestoreString = 
'RESTORE DATABASE [TEST_CONTAINER] FROM DISK = N''/opt/mssql/backup/TEST_MSSQL.bak'''
+ ' with  ' 

Fetch NEXT FROM MY_Cursor INTO @LogicalName 
While (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)
select @RestoreString =
case 
when @counter = 1 then 
   @RestoreString + 'move  N''' + @LogicalName + '''' + ' TO N''/var/opt/mssql/data/'+
@LogicalName + '.mdf' + '''' + ', '
when @counter > 1 and @counter < @rows then
   @RestoreString + 'move  N''' + @LogicalName + '''' + ' TO N''/var/opt/mssql/data/'+
@LogicalName + '.ndf' + '''' + ', '
WHen @LogicalName like '%log%' then
   @RestoreString + 'move  N''' + @LogicalName + '''' + ' TO N''/var/opt/mssql/data/'+
@LogicalName + '.ldf' +''''
end
--select @RestoreString

set @counter = @counter + 1
FETCH NEXT FROM MY_CURSOR INTO @LogicalName
END

--select @RestoreString
set @NRestoreString = @RestoreString
EXEC sp_executesql @NRestoreString
CLOSE MY_CURSOR
DEALLOCATE MY_CURSOR
Run Code Online (Sandbox Code Playgroud)

备份脚本

BACKUP DATABASE TEST_CONTAINER TO DISK = N'/opt/mssql/backupNew/TEST_MSSQL.bak' WITH NOFORMAT, NOINIT, NAME = 'TEST_CONTAINER', SKIP, NOREWIND, NOUNLOAD, STATS = 10
Run Code Online (Sandbox Code Playgroud)

基本信息

选项信息

在此输入图像描述

Dav*_*oft 5

默认情况下,备份是未压缩的。因此,如果您还原压缩备份,然后对还原的数据库进行未压缩备份,则预计新备份会更大。

与 SQL Server 中的其他一些默认值一样,它是默认值并不是因为它是最佳的,而是为了匹配旧版本的行为。但对于绝大多数现代系统,您应该压缩备份。

您可以通过更改备份压缩的服务器级默认值或通过在 BACKUP DATABASE 中指定COMPRESSION选项来获取压缩备份。

BACKUP DATABASE TEST_CONTAINER 
  TO DISK = N'/opt/mssql/backupNew/TEST_MSSQL.bak' 
WITH FORMAT, 
     INIT, 
     NAME = 'TEST_CONTAINER', 
     COMPRESSION,
     STATS = 10
Run Code Online (Sandbox Code Playgroud)