原帖由
chenfeng825 于 2008-6-4 08:33 发表

看需求似乎是删除一次的动作,并且有replication。
如果是,不需要写procedure,直接删除,如过慢,还有一个方法可以使用,直接把复制定义停止,把需要的数据倒入新表,然后改名,然后重起复制,了不得就是一次 ...
我们那个表中的数据有3000万条记录,要删除07年6月份之前的表中的记录,数据库日志空间只有10g,不够一次性删除记录的日志使用。
暂时用了下面一个方法
要删除四张表HIS_EWS_TASK ,HIS_EWS_SERV_PARA ,HIS_EWS_SERV ,HIS_EWS 。只有HIS_EWS 表中有日期,所以其他表只能用ews_id字段进行关联,创建每天删除数据的存储过程如下
create proc del_one_day_data_not_to_RS ( @beg_date varchar(32), @end_date varchar(32) )
as
begin
set replication off--关闭RS
delete from HIS_EWS_TASK where ews_id in
(select ews_id from HIS_EWS where crt_date >= @beg_date and crt_date < @end_date )
delete from HIS_EWS_SERV_PARA where ews_id in
(select ews_id from HIS_EWS where crt_date >= @beg_date and crt_date < @end_date)
delete from HIS_EWS_SERV where ews_id in
(select ews_id from HIS_EWS where crt_date >= @beg_date and crt_date < @end_date)
delete from HIS_EWS where crt_date >= @beg_date and crt_date < @end_date
set replication on--开启RS
end
然后写了一个sql脚本,填写好每个要删除的日期
use awsdyndb
go
del_one_day_data_not_to_RS '20070101','20070102'
go
del_one_day_data_not_to_RS '20070102','20070103'
go
del_one_day_data_not_to_RS '20070103','20070104'
go
del_one_day_data_not_to_RS '20070104','20070105'
go
del_one_day_data_not_to_RS '20070105','20070106'
go
del_one_day_data_not_to_RS '20070106','20070107'
go
del_one_day_data_not_to_RS '20070107','20070108'
go
del_one_day_data_not_to_RS '20070108','20070109'
go
del_one_day_data_not_to_RS '20070109','20070110'
go
del_one_day_data_not_to_RS '20070110','20070111'
go
del_one_day_data_not_to_RS '20070111','20070112'
go
del_one_day_data_not_to_RS '20070112','20070113'
go
exit
然后写了个简单的shell
#!/bin/sh
/sybase/OCS-12_5/bin/isql -数据库服务名 -U用户名 -P密码 -i /tel/bin/delet_his_ews.sql
然后写入crontab,定时晚上12点开始执行
00 0 * * * /tel/bin/delethisews.sh
这个方法的缺点是不能一次性大量的删除数据,只能分成多个事务进行执行,然后白天dump掉日志。
没有办法,对sybase不是太精通,只好暂时用这种笨方法了,希望高手补充方案。