sql server 备份文件没多大 还原后特别大

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql server 备份文件没多大 还原后特别大相关的知识,希望对你有一定的参考价值。

那是因为你数据库预留空间太大了,可以先用SQL工具收缩数据库,再备份,再还原 参考技术A 收缩下还原后的数据库的数据库日志看看。

sql server 2000 日志备份

现有sql 2000的数据库,对于数据库备份有向导可以完成周期性备份,如只保留一周的数据,则第八天的备份自动覆盖第一天的,但是日志却不是这样,日志已经1G多了,每天备份一次,虽然是几百G的硬盘,但每过一两个月就得手动清理日志备份文件,有没有办法让日志备份也能像数据库备份一样实现周期性,或者说不备份日志,要用数据库备份还原数据库的话会还原不了啊?数据库备份是用向导来完成的。

日志处理方法:

/*--特别注意

请按步骤进行,未进行前面的步骤,请不要做后面的步骤
否则可能损坏你的数据库.

一般不建议做第4,6两步
第4步不安全,有可能损坏数据库或丢失数据
第6步如果日志达到上限,则以后的数据库处理会失败,在清理日志后才能恢复.
--*/

--下面的所有库名都指你要处理的数据库的库名

1.清空日志
DUMP TRANSACTION 库名 WITH NO_LOG

2.截断事务日志:
BACKUP LOG 库名 WITH NO_LOG

3.收缩数据库文件(如果不压缩,数据库的文件不会减小
企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件
--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了
--选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了

也可以用SQL语句来完成
--收缩数据库
DBCC SHRINKDATABASE(库名)

--收缩指定数据文件,1是文件号,可以通过这个语句查询到:select * from sysfiles
DBCC SHRINKFILE(1)

4.为了最大化的缩小日志文件(如果是sql 7.0,这步只能在查询分析器中进行)
a.分离数据库:
企业管理器--服务器--数据库--右键--分离数据库

b.在我的电脑中删除LOG文件

c.附加数据库:
企业管理器--服务器--数据库--右键--附加数据库

此法将生成新的LOG,大小只有500多K

或用代码:
下面的示例分离 pubs,然后将 pubs 中的一个文件附加到当前服务器。

a.分离
EXEC sp_detach_db @dbname = '库名'

b.删除日志文件

c.再附加
EXEC sp_attach_single_file_db @dbname = '库名',
@physname = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\库名.mdf'

5.为了以后能自动收缩,做如下设置:
企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩"

--SQL语句设置方式:
EXEC sp_dboption '库名', 'autoshrink', 'TRUE'

6.如果想以后不让它日志增长得太大
企业管理器--服务器--右键数据库--属性--事务日志
--将文件增长限制为xM(x是你允许的最大数据文件大小)

--SQL语句的设置方式:
alter database 库名 modify file(name=逻辑文件名,maxsize=20)
参考技术A 日志文件和数据文件分开存放在各个盘(注意文件权限的设置)
数据文件自动备份
日志文件手动清除
参考技术B 你应该先搞清楚基本概念:
bakup 有三种:full/differential/log,log backup 可搭配 full backup 使用,甚至再加上 diff backup.

通常日志备份的原因是,full backup 太大了,但又需要频繁地备份以保证数据安全。

如果你不属于这种情况那么可以不备份日志。

另外个人建议不要依赖 GUI 向导来完成工作,很多时候你并不理解到底执行了什么操作。
参考技术C 新建如下数据库存储过程:

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO

*/
/* 用 途:用于清空数据库日志并备份数据库,且备份文件名根据系统时间产生, */
/* 如系统时间为2003.11.26,则备份文件为 gsj20031126.dat */
/* 使用方法:1、在查询分析器中执行命令: */
/* exec 数据库名称.dbo.自己用的名称 */
/* 2、在作业的步骤中输入‘命令: */
/* exec 数据库名称.dbo.自己用的名称 */

/** 存储过程名称:dbo.自己用的名称 **/
CREATE PROCEDURE dbo.自己用的名称
as
declare @backupname varchar(50)
declare @i int
/** 生成备份文件名 **/
set @backupname=convert(varchar(4),year(getdate()))+convert(varchar(2),month(getdate()))+convert(varchar(2),day(getdate()))
set @backupname = 'e:\xxxx+@backupname+'.dat'
set @i=1
while @i <= 5
begin
/** 清空日志 **/
backup log (需要清空的日志数据库名称) with no_log
set @i = @i + 1
end
/** 备份数据库 **/
backup database 数据库名称 to disk=@backupname with init
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

********************
在新建作业进行调度即可,如此备份就可在每次自动备份时自动删除日志
参考技术D 事物日志不是非的备份才能还原数据的,正常状态的事物日志就能还原数据库到事故点,但是事物日志有大小,根据你的设置,到达设置的大小,它会删除最早的日志来腾出空间存储新的日志,备份是为了把之前的备份下来,防止过大,把以往日志冲掉.
不知道我说明白没有

以上是关于sql server 备份文件没多大 还原后特别大的主要内容,如果未能解决你的问题,请参考以下文章

SQL server 2008还原文件时遇到的问题?

SQL server 如何用语句备份和还原数据

SQL Server 数据库备份与还原

sql server2008数据库迁移的两种方案

sql server 2000 日志备份

sql server 备份与恢复系列四 大容量模式下的备份与还原