您好,欢迎访问一九零五行业门户网

数据库迁移:从SQL2005到SQL2008

最近我们网站新增了一台数据库服务器,需要将现有的主要数据库迁移到新服务器上。 现有的这台数据库服务器装的是sql2005。考虑到sql2008已经出来很久了,想必已经比较成熟,功能又比2005强,据说2005是个过渡产品,趁现在是台全新的服务器,索性安装sql 2008
最近我们网站新增了一台数据库服务器,需要将现有的主要数据库迁移到新服务器上。
现有的这台数据库服务器装的是sql2005。考虑到sql2008已经出来很久了,想必已经比较成熟,功能又比2005强,据说2005是个过渡产品,趁现在是台全新的服务器,索性安装sql 2008,不然以后再升级可能更麻烦。
2008肯定可以兼容2005,问题是,我们除了这台主数据库,还有好几台辅助用的数据库,它们全都是2005,并且要使用主数据库的部分数据。现在主数据库升级为2008,其他的还能正常使用吗?
花了一些时间进行测试,发现2005和2008可以协同使用。除了用2005的sql server management studio去连2008不行以外,其他并没有什么问题,程序没问题,链接服务器(2005连2008)也没有什么问题。
现在是怎么个迁移法?
我想到的有两种方案:第一是备份数据库,然后在新服务器还原;第二是停掉数据库,直接拷贝数据文件到新服务器,然后在新服务器附加。
因为数据库文件太多太大了,备份还原显然不现实,耗时太长。第二种主要是附加的时候,原先各种数据文件放得很乱,没有什么章法,可能附加的时候要稍为改一下路径。
无论是备份还原还是附加数据库,都有个问题,就是原先的数据库用户怎么办?比如权限、密码等等。我们的权限甚至细分到每个表的每个字段,如果手动重新建一遍,即使没有遗漏也会累死。
用脚本搞定:
1、    脚本一,建立登录名
create login [登录名] with password=n'密码', default_database=[默认数据库], default_language=[简体中文], check_expiration=off, check_policy=off
go
用sql server management studio创建的这个脚本,里面的密码加了密,结果跑到目标服务器运行之后,用原先的密码登录根本不行。也不知道怎么处理,所以要手动将脚本这里的密码改成明文。
另外,用sql server management studio创建的脚本,后面还有一句:
alter login [登录名] disable
会自动将该登录帐号设为禁用!不知道是何居心!所以这句也要去掉。
2、    脚本二,将数据库用户映射到登录名
主要语句是
exec sp_change_users_login'update_one', [数据库用户名],[登录名];
因为我们数据库用户比较多,所以写了个游标
use [mydb]
go
declare curt cursor for select name from sysusers where name like 'myuser%';
declare @user varchar(50);
open curt;
fetch next from curt into@user;
while @@fetch_status = 0
begin
    exec sp_change_users_login'update_one',@user,@user;
    fetch next from curt into @user;
end
close curt;
deallocate curt;
更新全过程:
1、    机器买回来,装操作系统,装sql2008
2、    机器送到机房,上架
3、    挑一个良辰吉日,夜半无人,停掉网站,停掉主数据库
4、    拷贝数据库文件到新服务器
5、    在新服务器附加数据库文件
6、    依次运行脚本1、2
7、    开网站,ok
后记
切换成功以后,我陆续在一些辅助数据库服务器上升级sql2005到sql2008。第一台,数据量不大,访问很少,升级成功,没什么问题;第二台,因为访问量非常大,结果失败,整个数据库引擎和实例都没有了!提示什么文件或卷标名错误!只好卸载所有的sql,然后直接装sql2008,幸好数据库文件还在,没出什么乱子。
另外,将sql2005升级到sql2008,数据库是停止工作的,我后来才发现,不是什么在线。
再有就是作业的迁移。从老数据库中生成作业脚本,粘贴到新数据库中运行。有些不成功,提示:
不能将值 null 插入列 'owner_sid',表 'msdb.dbo.sysjobs';列不允许有 null 值。insert 失败。
这是因为作业的所有者不同所致。比如,老数据库中作业的所有者,在新数据库中不存在,就会出现这种错误。换成sa一般都可以。
注:安装sql2008的时候,需要先安装.net framework 3.5。我们机器全都装了3.5,上面的sql2005能访问2008,不知道是不是跟这个有关系。
其它类似信息

推荐信息