博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL Server清空日志及所有表的数据
阅读量:7127 次
发布时间:2019-06-28

本文共 3267 字,大约阅读时间需要 10 分钟。

在查询分析器中顺序执行以下三步,其中   databasename   为你的数据库文件名 
1.清空日志:DUMP   TRANSACTION   databasename   WITH   NO_LOG   
2.截断事务日志:BACKUP   LOG   databasename   WITH   NO_LOG   
3.收缩数据库:DBCC   SHRINKDATABASE(databasename)   
--// 
SQL   Server日志清空方法   
    
一种方法:清空日志。   
1.打开查询分析器,输入命令   DUMP   TRANSACTION   数据库名   WITH   NO_LOG   
2.再打开企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了。 
方法二: 
清空日志: 
------------------------------------------ 
  BACKUP   LOG     库名   WITH   NO_LOG 
  DBCC   SHRINKFILE(   '日志文件名 ',新的大小数值型如1) 
日志文件名是这样的: 
select   name   from   sysfiles 
如: 
mastlog 
--------------------------------------------- 
backup   log     DATABASENAME 
  with   truncate_only 
  dbcc   shrinkdatabase   (DATABASENAME,SIZE)   
  若每天有whole   back   up   的话可以设置一job, 
  每隔三天或一个星期清空一次 
  这样的话日志就不会长大了哦 
------------------------------------- 
1:   删除LOG 
1:分离数据库 
2:删除LOG文件 
3:附加数据库 
此法生成新的LOG,大小只有500多K 
      再将此数据库设置自动收缩 
2:清空日志 
DUMP     TRANSACTION     库名     WITH     NO_LOG         
再: 
企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了 
方法三:   
第一步:   
backup   log   database_name   with   no_log   
或者   backup   log   database_name   with   truncate_only   --no_log和truncate_only是在这里是同义的,随便执行哪一句都可以   
第二步:   
1.收缩特定数据库的所有数据和日志文件,执行   dbcc   shrinkdatabase   (database_name,[,target_percent])--database_name是要收缩的数据库名称;target_percent是数据库收缩后的数据库文件中所要的剩余可用空间百分比   
2.收缩一次一个特定数据库中的数据或日志文件,执行   dbcc   shrinkfile(file_id,[,target_size])   --file_id是要收缩的文件的标识   (ID)   号,若要获得文件   ID,请使用   FILE_ID   函数或在当前数据库中搜索   sysfiles;target_size是用兆字节表示的所要的文件大小(用整数表示)。如果没有指定,dbcc   shrinkfile   将文件大小减少到默认文件大小   
两个dbcc都可以带上参数notruncate或truncateonly,具体意思看帮助。   
方法四:   
(这个方法在sqlserver2000的环境下做一般能成功,在sqlserver7及以下版本就不一定了):   
第一步:   
先备份整个数据库以备不测   
第二步:   
备份结束后,在Query   Analyzer中执行如下的语句:   
exec   sp_detach_db   yourDBName,true   --卸除这个DB在MSSQL中的注册信息   
第三步:   
到日志的物理文件所在的目录中去删除该日志文件或者将该日志文件移出该目录   
第四步:   
在Query   Analyzer中执行如下的语句:   
exec   sp_attach_single_file_db   yourDBName, 'd:/mssql7/data/yourDBName_data.mdf '   
--以单文件的方式注册该DB,如果成功则MSSQL将自动为这个DB生成一个500K的日志文件。   
以上方法在清除log日志中均有效。   
但,能否让sql   server   不产生log日志呢?以上方法好像均无效。   
我这儿正好有个case:   
我客户的sql   server每天都会产生4,500M的log日志,每天都清除一下,非常不便。有没有办法实现不产生log日志呢?   
我分析了一下客户产生log日志的原因,并且做了相应测试。   
客户是每天将数据库清空,从总系统中将数据导入到sql   server里。我感决sqlserver在插入时产生log不大,在delete整个库时产生log极大。   
比如:   
SELECT   *   into   test_2   from   b_bgxx   
共45000条记录,产生十几M   log,如果   
delete   from   test_2   
产生80多M   log   ,这明显存在问题。   
虽然可以换成:   
truncate   table   test_2  

 

近来发现数据库过大,空间不足,因此打算将数据库的数据进行全面的清理,但表非常多,一张一张的清空,实在麻烦,因此就想利用SQL语句一次清空所有数据.找到了三种方法进行清空.使用的数据库为MS SQL SERVER.

1.搜索出所有表名,构造为一条SQL语句

declare 
@trun_name 
varchar
(
8000
)
set 
@trun_name
=
''
select 
@trun_name
=
@trun_name 
+ 
'
truncate table 
' 
+ 
[
name
] 
+ 
' 
' 
from
 sysobjects 
where
 xtype
=
'
U
' 
and
 status 
> 
0
exec
 (
@trun_name
)

该方法适合表不是非常多的情况,否则表数量过多,超过字符串的长度,不能进行完全清理.

2.利用游标清理所有表

declare 
@trun_name 
varchar
(
50
)
declare
 name_cursor 
cursor 
for
select 
'
truncate table 
' 
+
 name 
from
 sysobjects 
where
 xtype
=
'
U
' 
and
 status 
> 
0
open
 name_cursor
fetch 
next 
from
 name_cursor 
into 
@trun_name
while 
@@FETCH_STATUS 
= 
0
begin
  
exec
 (
@trun_name
)
 
print 
'
truncated table 
' 
+ 
@trun_name
 
fetch 
next 
from
 name_cursor 
into 
@trun_name
end
close
 name_cursor
deallocate
 name_cursor

这是我自己构造的,可以做为存储过程调用, 能够一次清空所有表的数据,并且还可以进行有选择的清空表.

3.利用微软未公开的存储过程

exec
 sp_msforeachtable "
truncate 
table
 ?"

 

该方法可以一次清空所有表,但不能加过滤条件.

 

转载请注明出处[ ] 
作者赞赏
 
刚做的招标网:  请大家多意见
本文转自Sam Lin博客博客园博客,原文链接:http://www.cnblogs.com/samlin/archive/2012/09/03/Sql_truncate_data.html,如需转载请自行联系原作者
你可能感兴趣的文章
RESTClient - firefox插件
查看>>
我的友情链接
查看>>
3_整形列的可选属性
查看>>
springBoot(23):spring-security-基本
查看>>
centos6.5 常用影音播放器安装
查看>>
Android Uri命名格式
查看>>
给 System.Zip 增加了个(多文件解压时的)解压进度事件
查看>>
nginx 错误信息
查看>>
Android 后台Service : 向服务器发送心跳包
查看>>
学习笔记-Android之ContentProvider实现Notepad
查看>>
systemctl添加开机启动 & chkconfig 使用
查看>>
我的博客模板
查看>>
MapServer
查看>>
域名邮箱
查看>>
[译]从《孙子兵法》到软件开发
查看>>
xshell ssh centos7 终端乱码解决一例
查看>>
第三十五讲:tapestry表单组件详解之Palette
查看>>
Eclipse中创建maven web项目
查看>>
java加密算法简要介绍
查看>>
vue-cli脚手架里如何配置屏幕自适应
查看>>