SQL server的奇妙之旅

昨天上班,用户反馈说软件连不上,通过截图看上去好像是数据库连不上。检查服务器,以为是断网了,同事检查又没有断开,通过远程进去看到,发现服务器重启进不去系统了。

一、问题的出现

系统是一个戴尔的刀片服务器部署的双硬盘 RAID 1,一开始通过远程,想着有什么办法修复系统,请了维护工程师来检查,折腾了半天都没有起色,这个时候业务端又来催了,没办法,只能通过PE系统拷贝数据重新布置系统了。

一开始检查以为是服务器RAID卡出故障了,下载了RAID驱动,但是不知道如何加载到已经安装好的系统里面。只能这样看着有却启动不起来。通过更改BIOS启动模式也起不来,想着用系统镜像盘来修复,但是下载了三个版本的镜像都修复不了,提示服务器不兼容,只怪当时没有做好文档记录

开了一台虚拟机来做系统,方便快捷,让同事一边装系统,我这边一边开始备份数据出来,幸亏当时有备份数据,不然真的是头大了。

装完系统装sql server 2012,中途装了半天报错,一开始以为是.NET 等环境没有,在控制面板里面开启来之后还是报错,一个老同事提示我是不是因为权限不够的问题。后来想起来之前配置过一些系统远程桌面配置会各种问题,我想可能和这个有关系,刚好下午六点多了。也要下班了,充机房到办公室去操作,点个外卖一遍等一遍配置。

还是办公室的环境好,没有机房的机器声音,有水空气也很好。通过本地进入到机器去安装SQL软件,发现一路都很顺利,没有报错,再次印证虽然同一个管理员账号,本地登录和远程登录权限是不一样的

二、附加数据库之后用户账号对应登录名

数据库装完之后,把原来系统中的数据库原始文件附加进来,附加数据库本身数据库有登录账号,但是系统新建的服务器是没有这个账号的,这里会遇到一个问题,你新建一个同名的账号是不行的,会提示你已经存在。看着两个名字一样,但是居然是没有关系的。需要通过数据库一个存储过程将两个账号关联起来。

use database-name
go
sp_change_users_login 'update_one', 'username', 'username'

这里主要涉及两个参数,一个是你要针对的数据库,因为数据库才有对应的账号,另一个是登录名和账号对应,后面那句话需要修改为实际的账号。

中途遇到一个老的数据文件附加进去有报错的,提示不是当前版本创建的数据库无法附加。我的文件是一个bak文件,我想先建立一个同样的数据库,然后把文件还原进来,发现我这个步骤是错误的。网上找到资料说,必须直接选择顶层的databases项目去还原,然后会自动新建一个原来的数据库,并且包含账号,这次是真的成功了。

三、数据库备份文件还原的问题

这里的问题是,不需要自己手动建立一个同名的数据库,必须是完全还原自动创建的数据库才行。

同样的步骤,将对应的账号新建登录名并通过上面的方式关联起来,不然也是管理不了的。

四、服务器编码排序规则修改

当我所有的数据库都附加上去了之后,原来的业务系统连上来之后发现报错乱码,问题来了。新建的数据库服务器,在默认情况下用的是拉丁语编码,我们系统是用的简体中文编码,导致查询报错。通过修改系统的排序规则来修正, 运行cmd切换到C:\Program Files\Microsoft SQL Server\110\Setup Bootstrap\SQLServer2012 目录中,执行 :

Setup /QUIET /ACTION=REBUILDDATABASE /instancename=MSSQLSERVER /SQLSYSADMINACCOUNTS=administrator /sapwd=your password /sqlcollation=Chinese_PRC_CS_AS

修改完之后,重新启动sql server 查看sql服务器属性,可以看到新的已经是我们指定的编码排序规则Chinese_PRC_CS_AS

至此,基本问题已经解决了。剩下的是如何做好日常备份,当机器出现故障的时候怎么快速恢复业务。

发布者

勿忘心安

一念净心花开遍世界!