SQL Server 2012实施与管理实战指南摘要 - 第 5 章

5 启动SQL Server服务和数据库 188 
常见问题:
·               SQL Server实例服务进程无法正常启动
·               系统数据库无法正常启动
·               网络配置失败
·               用户数据库无法正常启动
·               群集环境下SQL Server资源无法保持正常在线
5.1.  SQL Server服务启动步骤 189 
启动方法:
·               Admin Tools, then Services
·               SQL Server Configuration Manager
·               SSMS
·               Run NET Start
·               Run sqlservr.exe –c –s InstanceName (日志信息在窗口)
·               In failover cluster, bring SQL Server online or Failover to another node.
5.1.1.   从注册表读取SQL Server启动信息 190 
·               Sqlservr.exe启动会去注册表中找自己所在实例的注册表信息如Audit Level, Login Mode, startup parameters (-d, -l, -e, trace flags), 网络配置等。
·               无法读取注册表启动信息主要原因
o        启动账号权限不够
o        日志文件夹或文件问题:-e路径不再对,errorLog被病毒软件锁定等
·               排查
o        Windows System Log,
o        Windows Application Events,
o        Process Monitor (需下载) – A monitoring tool for Windows that shows real-time file system, Registry and process/thread activity. It combines the features of two legacy Sysinternals utilities: Filemon and Regmon,
5.1.2.   检测硬件,配置内存与cpu 193 
·               到这一步,ErrorLog File 可以被生成。
·               常见失败是配置内存
o        32 – enable AWE 失败
o        64 – lock page for buffer pool 失败,需手动给予启动账号Lock Page in Memory权限。
5.1.3.   数据库启动 195 
·               启动order: master, msdb, mssqlsystemresource, model, and tempdb
·               Common Problems
·               Solutions
5.1.4.   准备网络连接 195 
·               读取注册表中的设置
·               Shared, Named Pipe, TCP/IP
·               Common Problems and Solutions
o        All protocols cannot connect to the server – use DAC
o        如果SSL 连接失败 – (1) 用正确的证书;(2) 让证书为空,SQL Server生成;(3)暂时关闭SSLrestart SQL Server 
o        The service account fails to register a SPN account in the domain controller, which is to be used for Kerberos authentication.
5.2. 数据库状态切换 198 
·               Recovering
o        What is it doing?
ü      分析要做的工作:就是在事务日志文件中,找到那些事务要重做,那些事务要回滚
ü      Redo:将已经提交的但是没有写入数据文件的事务,做前滚
ü      Undo:对没有提交的事务做回滚
o        What makes a DB into the recovering state?
ü      创建数据库
ü      Alter Online,让数据库上线
ü      RESTORE WITH RECOVERY:恢复数据库
ü      Database Startup,数据库启动,如果数据库设置了自动关闭,就会在用户第一次访问的时候做这个动作。
o        What’s next?
ü      恢复正常之后,数据库会进入online状态。
ü      如数据文件或日志文件打不开,进入Recovery Pending,如数据文件或日志文件的内容有损坏,则进入Suspect
·               Online
这个状态下用户可以访问,修改。
·               Recovery Pending
如果在数据恢复的时候不能正确打开所有的数据库文件,数据库会进入RECOVERY PENDING的状态。
解决办法:(1)解决不能打开数据库文件后,用ALTER ONLINE再恢复一次,(2)放弃当前数据库,使用备份恢复。
·               Suspect
数据文件或日志文件内容有损坏, 数据库会进入SUSPECT状态。在这个状态下管理员有3个选择:
1.在一次ALTER ONLINE,命令SQL Server再恢复一次
2.放弃当前数据库,再还原一个
3.将数据库状态设置为,EMERGENCY,然后尝试修复
·               Emergency
在这个模式下,SQL Server对没有完全恢复的数据库开放一个只读窗口 DBA去挽救数据。
·               Restoring
数据库在还原状态下 (Restore Database),如果是WITH RECOVERY,还原的最后一步会进入RECOVERY状态。
·               Offline
数据库处于离线状态,可以使用ALTER ONLINE让数据库上线。
5.3. 数据库长时间处于recovering状态 201
5.3.1.   What is recovering doing? RECOVERING主要做3件事:
·               查看需要恢复那些事务 (very quick)
·               Redo事务
·               Undo事务
5.3.2.   Why takes so long?
·               有时候不是很忙的数据库恢复要很长时间,是因为有过多的VLF(虚拟日志文件),导致恢复计算量过大,导致恢复很慢。可以使用DBCC LOGINFO查看虚拟日志情况。
5.3.3.   SQL Server 2005+recovering的优化
·               多线程并行处理重做和回滚 - 在企业版上,SQL Server会启动多个线程来重做和回滚动作。
·               延迟事务
延迟事务是在恢复过程中,出现IO错误,那个事务所修改的数据都会被适当的锁定。SQL Server会放弃这个事务的回滚,继续回滚其它事务。上面的锁会在dbcc checkdb修复一致性后释放。
5.3.4.   如果在redoundo遇到问题会怎样?
数据库就会进入SUSPECT状态,在完成恢复之前数据库必须等待完成。
5.3.5.   Troubleshooting
·               Check the progress of recovering
o        Check the ErrorLog to see the progress, the remaining seconds, and the spid.
o        每隔几分钟运行一下,运行
ü      SELECT * FROM sys.sysprocesses(查看diskI/O and CPU)
ü      SELECT * FROM sys.dm_exec_requests(查看恢复进度百分比)
·               The long recovering is caused by large VLFs. You can find out the number of VLFs.
-- If the database is online
DBCC LogInfo (DBName) 
 -- If the database is offline, you can use the Windbg tool to analyze the dump file http://msdn.microsoft.com/en-us/windows/hardware/hh852365.aspx
·               If no changes on I/O and CPU for a long time, consider to restart SQL Server. In some case, you may need to install the patches.
o        See KB 2455009 or 2653893
o        Procedures for using the patches: (1) Stop SQL Server in production, (2) install the patch on the test server, (3) copy the servervr.exe and SQLOS.dll to production, and (4) restart the SQL Server in production.
·               Sometime, when you try to kill a spid, but the spid keeps rolling back, you can run the following to see how long it will be done. If it takes days to finish the roll back, you can either wait or restart SQL Server. Remember, after the restart, SQL Server will still be in recovering state (rolling back) for a long time if the VLFs are too large.
 KILL <spid> WITH statusonly
·               Best practices to prevent a long time ‘recovering’
o        Log file – auto-growth by 200-300 MB, do not use %
o        Frequently backup log files to reduce VLFs, or
o        Shrink the log files
o        Install the latest updates and patches 
5.4. 数据库不能启动的常见原因和解决办法 206 
5.4.1.   master数据库不能启动 206 
·               找不到指定的数据库的数据文件或日志文件。
·               找到了数据库文件但是没有权限,或不能以排它式打开
·               数据库数据或日志文件出现损坏,如果出现损坏,(1)从备份中恢复,(2)用mdfldf文件恢复,(3)重建master数据库
5.4.2.   资源数据库 208 
·               Mssqlsystemresouce数据库,对用户透明,用户无法直接访问这个数据库。真想看,用Single User Mode DAC连接SQL Server.
·               常出现的问题:
o        文件找不到、权限不够、内容损坏。
o        发现资源数据库的版本和数据库版本不一致。
5.4.3.   model数据库 210 
·               出现的问题和master类似。
·               Solutions也与Master数据库的相似,即(1)恢复数据库备份,但由于缺乏Model数据库,SQL Server无法正常启动,需要用参数 –m-T3608启动。
Net start mssqlserver /f /m /T3608
Restore database model from disk=’c:\model.bak’ with MOVE ‘modeldev’ to ‘d:\xxx\model.mdf’, Move ‘ModelLog’ to ‘D:\xxx\model.ldf’, replace;2)恢复文件备份, 3)重建系统数据库。
5.4.4.   tempdb数据库 212 
·               Tempdb数据库是每次服务重启就会重建,只要Model数据库没问题,一般TempDB没有问题,但当Master是从其它机器的备份恢复过来的话,则可能出现以下问题:
o        物理文件路径不正确。方法是修改之指向正确的新路径:
Net start mssqlserver /f /m /T3608
Alter database tempdb MODIFY FILE (Name= ‘ TempDev ‘, FileName = ‘c:\xxx\tempdb.mdf)
Alter database tempdb MODIFY FILE (Name= ‘ TempLog‘, FileName = ‘c:\xxx\templog.mdf)
o        Tempdb数据库文件创建失败。原因可能是权限不够或磁盘空间不够。权限不够,赋权。空间不够,可以修改之:
Net start mssqlserver /f /m /T3608
Alter database tempdb MODIFY FILE (Name= ‘ TempDev ‘, Size=100MB)
Alter database tempdb MODIFY FILE (Name= ‘ TempLog‘, Size=100MB)
5.4.5.   用户数据库 214 
·               用户数据库不能启动的常见问题是:
o        缺少或者无法打开部分文件 - 数据库进入RECOVERY_PENDING状态,
o        恢复失败 - 进入SUSPECT状态。
·               文件打开问题
o        如果是主文件组出现问题,只有当主文件组全部恢复后才能打开数据库
o        如果是辅助文件组可以先把辅助文件组offline,然后 ALTER ONLINE数据库。然后选择将数据库导入到一个新数据库,或者用文件组恢复的方式恢复那个出问题的文件组
o        如果日志文件不能打开(如在完全恢复模式下,上次没有正常关闭,就不会为这个数据库创建日志文件),要么使用备份还原,要么通过DBCC CHECKDB (YourDBA, REPAIR_ALLOW_DATA_LOSS)来恢复。
ALTER DATABASE ForEmergency SET EMERGENCY
GO
ALTER DATABASE ForEmergency SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
DBCC CHECKDB (ForEmergency, REPAIR_ALLOW_DATA_LOSS)
GO
ALTER DATABASE ForEmergency SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO
ALTER DATABASE ForEmergency SET ONLINE
GO
·               恢复失败
o        重做中遇到的Deferrable错误
ü      Some pages are corrupted and marked with Restore Pending in the Redo process
ü      But the entire database is online
ü      Solutions: restore the backup or use DBCC CHECKDB (YourDBA, REPAIR_ALLOW_DATA_LOSS) to repair the physical errors (not suggested)
o        撤销中遇到Deferrable错误
ü      The entire database is OK
ü      But some pages have errors, the transaction on these pages are deferred during the rollback process.
ü      Solutions: the best way is to restore the backup. You may also try DBCC CheckDB or DBCC CheckTable with REPAIR_ALLOW_DATA_LOSS to fix the physical problems.
o        遇到任何时候无法延迟的错误
ü      当数据库恢复失败不能延迟,会进入SUSPECT模式。一般出现这种情况,要不就是有大量的损坏,要不就是分配页出现损坏。
ü      Solutions
Ø       恢复备份是首选
Ø       绕开SUSPECT,将数据导入新库,能救多少救多少。
v       移走Log file,
v       Restart SQL Server
v       Recovery_Pending now, 进入单用户模式,
v       Run DBCC CheckDB REPAIR_ALLOW_DATA_LOSS, 会产生一个新的、空的Log File.
v       Set to multi users mode, bring the database online
v       Export the database (some damaged pages are still damaged) to a new one to rescue the data as much as you can.
5.5. 群集环境下,数据库资源不能online的常见原因 220 
5.5.1.   由于单机原因导致数据库服务无法启动 222 
·               Cluster Administrator中,让Disks, IP, Network Name上线,但将SQL Server SQL Server Agent下线。
·               然后运行Sqlservr.exe –c –s MYINSTANCE or MSSQLSERVER。这里-s 后面加的是实例名。-c 则表明用console模式。
·               Similarly, 我们用命令行方式启动SQL Server Agent: Sqlagent90.exe –I MYINSTANCE –c –v, where -I 后面加的是实例名,-v verbose模式。
·               有错误就会显示在Console
5.5.2.   由于SQL Server所依赖的资源失败所导致 223 
·               依赖于DisksNetwork Name上线
·               查看所有结点日志 注意时间是GMT
5.5.3.   由于群集服务无法连接导致数据库资源失败 224 
·               SQL Server登录中,群集账号(NT AUTHORITY\SYSTEMNetwork Service\ClusSv)都被删除,导致连接失败。
·               服务器的Alias不再正确。
·               极限运行(CPU 100%,内存耗尽,堵塞,工作线程用完)导致。
5.6. 小结 228