工作中,常要将linux的数据备份到windows下备用。
总结出一条最简洁路线。
如下:
一、在linux建一个临时数据库,单用户模式,sp_dboption XXdb,"single user",true
二、将要备份的库备份出来,dump database xx_db_bk to '备份路径'。
三、将备份库恢复到临时数据库中 load database xx_db_temp from '备份路径\xx_db_bk',并onlie database XX_db
四、将临时数据库备份出,并恢复到window数据库中。(以上步骤主要是因为跨平台操作,需要库是静态的)
五:依次执行以下语句:
use master
dbcc fix_text(spt_jtext)
dbcc checkdb("xx_database")(此步需要很长时间),有错误对话框可以无视,或者根据我的经验可以找到某张表重建约束索引。
dbcc checkalloc
sp_flushstats
use xx_database
sp_post_xpload(此步需要很长时间)
其实,经过以上
六、备份完的数据库,最大的问题是,很多大数据量表因为索引等破坏打不开。是sysstatistics表造成的原因。
跑以下存储过程:
create procedure appuser.stateDelete
/* [ (@param_name datatype [= default] [output] ), ... ] */
as
declare cur_ins CURSOR for
select sysobjects.name from sysobjects where name like '%' and type='U'
declare @tableName varchar(200)
declare @sql varchar(255)
begin
open cur_ins
fetch cur_ins into @tableName
while @@sqlstatus=0
begin
set @sql = 'DELETE
FROM sysstatistics WHERE id IN
(SELECT id FROM sysobjects WHERE name = ' + char(39) +@tableName + char(39) +') go'
print@sql
fetch cur_ins into @tableName
end
close cur_ins
end
建立并执行如上存储过程,将打印出来的sql拷贝下来,执行一遍。
create procedure stateUpdate
/* [ (@param_name datatype [= default] [output] ), ... ] */
as
declare cur_ins CURSOR for
select sysobjects.name from sysobjects where name like '%' and type='U'
declare @tableName varchar(200)
declare @sql varchar(255)
begin
open cur_ins
fetch cur_ins into @tableName
while @@sqlstatus=0
begin
set @sql = 'update statistics appuser.' + @tableName
EXEC @sql
fetch cur_ins into @tableName
end
close cur_ins
end
建立并执行如上存储过程,将打印出来的sql拷贝下来,执行一遍。
然后