工作中,常要將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拷貝下來,執行一遍。
然後