mssql脚本文件无法传输:解决超大脚本问题

1. 问题背景

在进行MSSQL数据库维护时,大多数情况下需要对数据库进行备份,备份操作需要使用到.sql文件。但是,如果备份的数据量过大,生成的.sql文件也相应就会非常大,这样会导致上传和传输这个文件时出现一些问题。我在备份一个数据库文件时就遭遇到过这个问题,生成的sql文件有3GB大小,无法通过FTP上传。

2. 问题分析

一般情况下,MSSQL导出数据库的.sql文件会非常大,这也是由于数据库中包含了大量的数据以及结构定义等信息。而且,在进行文件传输时,上传/下载速度也很慢,甚至有可能因为网络问题导致文件传输失败。

根本原因是传输的数据量过大,而网络带宽有限,流量有限导致的。解决这个问题的关键就是要减少上传或下载数据的总量,并且最大限度地利用可用的网络带宽。

3. 解决方案

3.1 分割.sql文件

对于非常大的.sql文件,我们可以将其分割成若干小文件,分别进行上传或下载,这样可以避免上传或下载失败的问题。分割文件的大小可以根据网络环境和不同的需求来调整。如果是上传到远程服务器,建议使用SFTP协议,因为它比FTP更加安全和高效。

--SQL Server自带分割脚本

USE master

GO

DECLARE @path nvarchar(500)

SET @path=N'C:\backups\your_database_name\'

DECLARE @backup nvarchar(500),@copy nvarchar(500),@count smallint,@max smallint,@siz bigint

SELECT @backup=name,@count=ROW_NUMBER() OVER (ORDER BY backup_finish_date),@siz=backup_size

FROM msdb.dbo.backupset

WHERE database_name=N'your_database_name'

AND type=N'D' AND is_copy_only=0

ORDER BY backup_finish_date DESC

SELECT @max=CEILING(SUM(CONVERT(numeric(14,2),backup_size))/1048576000)

FROM msdb.dbo.backupset

WHERE database_name=N'your_database_name'

AND type=N'D' AND is_copy_only=0

GROUP BY datepart(year,backup_start_date),datepart(month,backup_start_date)

SELECT '总使用的备份文件数量为 '+CONVERT(nvarchar(3),@count)

SELECT '总文件数量为 '+CONVERT(nvarchar(3),@max)

DECLARE @name nvarchar(500),@t bigint,@n int

SELECT @n=0,@name=substring(name,0,len(name)-3)

FROM sys.files

WHERE type_desc=N'LOG' AND data_space_id=0

WHILE @n<@max

BEGIN

SET @n=@n+1

SELECT @t=@siz-COALESCE(SUM(CONVERT(numeric(14,2),size)),0)-(@max-@n)*1048576000,@siz=CEILING(SUM(CONVERT(numeric(14,2),size))+@t)

FROM msdb.dbo.backupset b,msdb.dbo.backupmediafamily f

WHERE b.backup_set_id=f.backup_set_id

AND database_name=N'your_database_name'

AND type=N'D' AND is_copy_only=0

AND ((file_number=1 AND @n=1) OR (file_number>1 AND datepart(year,backup_start_date)+(datepart(month,backup_start_date)-1)/6=(datepart(year,(SELECT backup_start_date FROM msdb.dbo.backupset WHERE database_name=N'your_database_name' AND type=N'D' AND is_copy_only=0 ORDER BY backup_finish_date DESC))+(datepart(month,(SELECT backup_start_date FROM msdb.dbo.backupset WHERE database_name=N'your_database_name' AND type=N'D' AND is_copy_only=0 ORDER BY backup_finish_date DESC))-1)/6)

ORDER BY backup_finish_date))

SELECT @name= @name + '.part'+ CONVERT(nvarchar(3),@n)+ '.bak',

@copy= 'COPY "'+@path+@name+'" /B '

SELECT @backup='BACKUP DATABASE [your_database_name] TO DISK = N'''+@path+@name+''' WITH NOFORMAT, INIT, NAME = N''Database Backup'', SKIP, NOREWIND, NOUNLOAD, STATS = 10'

PRINT(@backup)

EXEC sp_executesql @backup

PRINT(@copy+'"'+@path+@name+'" /B')

END

3.2 压缩.sql文件

由于.sql文件是纯文本文件,我们可以使用一些压缩软件来将其压缩,这样可以将文件大小大大降低,同时也可以减少传输时间。常见的压缩软件如WinRAR、7-Zip等。

3.3 通过命令行传输文件

如果使用FTP等传输工具进行文件传输时遇到了问题,可以尝试使用命令行传输文件。在Windows系统中,可以通过xcopy命令或robocopy命令来传输文件。

xcopy /s /i /q /y "source" "destination"

其中:

/s:表示包含子文件。

/i:表示如果目标路径不存在,同时包含文件或目录,就会询问你是否创建该目标路径。

/q:表示不显示文件传输信息。

/y:表示不询问是否覆盖。

3.4 使用云存储进行文件传输

目前,许多云存储服务商都提供了免费的大容量存储空间,例如阿里云、七牛云、腾讯云等。我们可以将.sql文件上传至云存储中,然后在不同的设备之间下载和同步。

4. 总结

当我们需要上传或下载大文件时,可能会遇到大小超过传输限制或传输速度过慢的问题。因此,分割文件、压缩文件、通过命令行进行传输,以及使用云存储服务等方式都是解决这些问题的有效方法。通过这些方法,我们可以更加高效地传输大文件,从而提高工作效率。

数据库标签