(5.3.10)数据库迁移——sql server降级操作

sql server如果要把高版本数据 还原到低版本,需要一些方法和策略

【0】需求2008R2降低到2005

【1】使用生成脚本功能导出所有数据库对象及表数据(2008以上)

  

扫描二维码关注公众号,回复: 10977231 查看本文章

  

【2】使用 生成脚本功能导出表结构+链接服务器插入数据

  (1)获取表结构脚本

    

   (2)构造链接服务器,生成插入脚本

--要使用,@new_db内容用查找替换来全部替换掉,否则会有问题的

declare @old_db varchar(100),@new_db varchar(100),@sql varchar(max)
select @old_db='[10.1.4.234].db_logs',@new_db='test3'

-- 获取有自增列插入语句
    select 'use '+@new_db+';set identity_insert '+t1.name+' on;insert into '+@new_db+'.dbo.'+t1.name+'('+
(select stuff((select',['+name+']' from test3.sys.syscolumns where id=t1.object_id for xml path('')),1,1,''))+')'+
' select '+(select stuff((select',['+name+']' from test3.sys.syscolumns where id=t1.object_id for xml path('')),1,1,''))
+' from '+@old_db+'.dbo.'+t1.name+';set identity_insert '+t1.name+' off;' 
 from test3.sys.tables t1 
 where exists 
    (
        select 1 from test3.sys.columns t2 where t2.is_identity=1 and t1.object_id=t2.object_id 
    ) 
    and   t1.type='u'
    
    
-- 获取无自增列插入语句    
    
select 'use '+@new_db+';insert into '+@new_db+'.dbo.'+t1.name+' select * from '+@old_db+'.dbo.'+t1.name+';' 
    from test3.sys.tables t1  
    where not exists 
    (
        select 1 from test3.sys.columns t2 where t2.is_identity=1 and t1.object_id=t2.object_id 
    ) 
    and   t1.type='u'    

--------------核验--------------------
-- 更新统计信息
use test3
EXEC sys.sp_updatestats

use db_logs
EXEC sys.sp_updatestats
-- 根据聚集索引/堆对比行数

use master;
if object_id('temp1') is not null
drop table master.dbo.temp1
use db_tank;
select object_name(id) tab_name,rows,indid into master..temp1 from db_tank.sys.sysindexes where indid in(0,1)

use master;
if object_id('temp2') is not null
drop table master.dbo.temp2
use db_tank1;
select object_name(id) tab_name,rows,indid into master..temp2 from db_tank1.sys.sysindexes where indid in(0,1)

-- 根据聚集索引/堆对比行数,筛选行数不一致的
select t1.*,t2.*,t1.rows-t2.rows as flag from 
master..temp1 t1 join
master..temp2 t2 on t1.tab_name=t2.tab_name
where t1.rows-t2.rows>0

【3】BCP

简单思路就是

(1)生成表结构脚本到低版本数据库

(2)高版本BCP导出

(3)低版本BCP导入

参考:BCP导入导出

--打开高级选项
EXEC SP_CONFIGURE 'show advanced options', 1;
RECONFIGURE;
--启用执行CMD命令
EXEC SP_CONFIGURE 'xp_cmdshell', 1;
RECONFIGURE;

--导出
EXEC [master]..xp_cmdshell 'BCP db_tank..sys_users_detail out D:\DataBackUp\sys_users_detail.txt -c  -Uroadadmin -Ppo@#r53e%$k8(+-3 -S127.0.0.1,2433'
GO

select COUNT(1) from db_tank..sys_users_detail

--导入
use test2 
go
EXEC [master]..xp_cmdshell
'BCP test2.dbo.sys_users_detail in D:\DataBackUp\sys_users_detail.txt -c -T -Uroadadmin -Ppo@#r53e%$k8(+-3 -S127.0.0.1,2433'
GO

【4】使用发布订阅

这个百度发布订阅使用教程就是,这里不做演示了。

【必看】

不管用哪种方法,记得同步登录名,权限

-- 登录名获取
SELECT
'CREATE LOGIN [' + p.name + '] ' + CASE WHEN p.type IN ( 'U', 'G' ) THEN 'FROM windows ' ELSE '' END + 'WITH ' + CASE WHEN p.type = 'S' THEN 'password = ' + master.sys.fn_varbintohexstr(l.password_hash) + ' hashed, ' + 'sid = ' + master.sys.fn_varbintohexstr(l.sid) + ', check_expiration = ' + CASE WHEN l.is_expiration_checked > 0 THEN 'ON, ' ELSE 'OFF, ' END + 'check_policy = ' + CASE WHEN l.is_policy_checked > 0 THEN 'ON, ' ELSE 'OFF, ' END + CASE WHEN l.credential_id > 0 THEN 'credential = ' + c.name + ', ' ELSE '' END ELSE '' END + 'default_database = ' + p.default_database_name + CASE WHEN LEN(p.default_language_name) > 0 THEN ', default_language = ' + p.default_language_name ELSE '' END FROM sys.server_principals p LEFT JOIN sys.sql_logins l ON p.principal_id = l.principal_id LEFT JOIN sys.credentials c ON l.credential_id = c.credential_id WHERE p.type IN ( 'S', 'U', 'G' ) --AND p.name NOT IN ( 'sa') AND p.name NOT LIKE '%##%' AND p.name NOT LIKE '%NT SERVICE%' AND p.name NOT LIKE '%NT AUTHORITY%'

猜你喜欢

转载自www.cnblogs.com/gered/p/12736961.html