SQL Server 2005备份与还原中孤立帐号解决方法

2009年09月26日   数据库   0条评论   3243人围观过  
  本来很早就想写这篇了,在我去旅游前一周就遇到这个问题,当时我的网站快到期了,所以赶在那个时候赶紧把茶韵在线转移了空间商。一直都用的好好的,本来不想转的,那边那个空间所在服务器蛮不错的,但是这个站点几乎没什么流量,虽说每年那点空间费不算什么,但是看了看我博客所用的这家空间,也不算慢,而且相当便宜,正宗的物超所值啊,所以就有了转移的念头。

  我茶韵在线用的是.Net2.0和SQL2005的数据库,转移起来都比较麻烦,特别是数据库,转移前是SQL2000,之前就转移过一次,遇到问题了,从Bighead的博客那里学来了这篇文章——《SQL Server数据库帐号孤立解决办法》,还好当时也顺利解决了。

  所以,转移起来比较麻烦,本来不想转了,但是当我用ftp查看我站点web文件时,发现了FtpRush不能列目录了,我以为是ftp软件的问题,但是当我换了FlashFXP后,还是一样的,起初我怀疑是服务器的ftp参数配置有问题,但是经过询问客服后发现,原来是他们做了手脚,将虚拟主机还有一个月之内要到期的ftp功能关闭了,客服说来好听,是星外主机面板自动的,但是为什么要设置呢?很明显,就是防止你拷贝备份web文件到本地,从而可以阻止部分站点转移。因为有的大站文件太多了,这个功能关闭备份起来相当麻烦(在某些人眼里,这个功能关闭就基本限制了你转移站点),从而有的站长就屈服了,乖乖的续费,主机商就保住了部分的客户。

  但是我不同,你这样整我,我就越气愤,我就偏偏要转移。我赶紧查看原站点的数据库备份功能,很好,没关闭(这里申明,如果这个功能关闭了,SQL数据库应该基本没有机会备份,更别提转移了,所以所有这些文章叙述的东西都是建立在备份了数据的功能之上,关于怎么不使用ftp功能但是还能备份web文件的方法我将在下一篇文章中来叙述),我马上备份了数据,获得一个1.bak文件,这个是星外主机备份获得的文件。同时利用该面板的临时生成ftp帐号的功能下载回来,如果这个地方关闭,基本就没有什么方法可以转移你的站点了。所以呢,当空“奸”商发现这篇文章时候,关闭了这个功能,那么你就放弃转移的念头了(当然,如果你还有什么更好的方法获得SQL数据库备份文件的话可能我还没想到,因为本人是菜鸟);当众多站长发现这个功能没关,那么恭喜你,你还有救。

  越扯越远,下面直接进入正题讨论数据库还原。我转移空间还有个原因,我主站用的CMS能支持SQL Server2005了,我用的BBS是Discuz!nt,刚好发布的3.0版也支持2005,相比2000都能提高很大的性能,所以也想着趁转移空间就直接换个支持2005数据库的空间。在买好了空间后,经过查阅直接可以导入2000的备份文件的。这里再插一句,当我恢复数据库的时候提示“MODIFY FILE 失败。大小大于 MAXSIZE。”,第一念头就是尺寸超了,哪里呢?仔细看了一下,原数据库是50MB的数据库,50MB的日志,而新空间是60MB的数据,30MB的日志,很可能是日志超了,一看果然,那就在原来的空间上用日志截断功能(星外面板自带)日志,再过来恢复就搞定。

  主站不用管,传好web文件和恢复数据库就行,但是BBS涉及到从2000升级到2005的问题。所以先上传了原来的2000环境下的文件,然后上传覆盖新的3.0的文件(实际就是按照升级提示升级即可),运行update来升级。但是这些步骤都是建立在恢复好数据库上并且能正常访问的前提下的。那么我们开始讨论怎么处理孤立帐号问题。

  原理:孤立帐号,就是在原mssql数据库中备份时,会将原访问该数据库的账号一同备份下来,如果你恢复的数据刚好也是这个账号并具有相关权限,那么是不存在孤立帐号的,问题是当你更换虚拟主机,数据库的账号都不是你自己能决定的,都是自动生成的,所以当你恢复后,用新的账号去访问原来的表将会发生错误。这里要解决的就是,将原来的账号改成新的账号,或者直接改成dbo账号。改成dbo比较简单,这个账号可以说是“万精油”账号,只要是这个账号,你可以随便访问这个表或者库。

  第一个念头就是按照原来2000的方法来操作,碰碰运气嘛。可惜失败了,2005提高了权限,不能随随便便修改系统表(因为修改的账号是保存在系统表中的)。郁闷了,网上搜了半天,找到方法了。不过我这里要改两个地方的账号,一个是表,还有一个是存储过程。

  先更改表的账号:

[code language="sql"]sp_MSforeachtable @command1="EXEC sp_changeobjectowner '?','dbo'"[/code]

  执行完后,表的账号均被改为了dbo。

  然后是存储过程,网上找到了这篇文章——《批量修改数据表和存储过程的所有者(2000)或架构(2005)》,参考了里面的修改存储过程部分:

[code language="sql"]
SELECT 'ALTER SCHEMA dbo TRANSFER ' + s.Name + '.' + p.Name
FROM sys.Procedures p INNER JOIN sys.Schemas s on p.schema_id = s.schema_id
WHERE s.Name = '旧的架构名称'
[/code]

  其中“旧的架构名称”就是原来的账号。执行了这段代码后,在结果提示框内会出现很多如下的代码:

[code language="sql"]ALTER SCHEMA dbo TRANSFER a0916.bbs_getsinglepost1
ALTER SCHEMA dbo TRANSFER a0916.bbs_gettopiccountbycondition
ALTER SCHEMA dbo TRANSFER a0916.bbs_updatepost1[/code]

  其中a0916是原来的账号,这些语句不用改,全部复制下来重新再执行,即将所有存储过程的账号改成了dbo,好了,大功告成,可以访问了。
关键字: SQL,SQL2005,孤立

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。