1.1 数据库安装过程介绍
1.1.1 setup.exe执行过程
SQL Server通过执行setup.exe调用安装向导来进行数据库安装或升级。setup.exe是用native代码写的,不依赖于其他组件,在任何平台上都能运行。以SQL Server 2012为例,这个可执行文件主要做以下几件事情:
① 检测在本服务器上是否有已安装过的setup.exe文件缓存。如果有,而且缓存的setup.exe版本高于或等于正在执行的setup.exe,那么会切换到本机上的setup.exe执行。这样做的目的是为了能够支持Slipstream(集成)安装(在安装时可以同时安装服务封包(Service Pack)和累计更新(Cumulative Update))。
② 检测本机上的.net framework 2.0或3.5是否已经安装。
③ 安装程序启动ScenarioEngine.exe对全局规则(global rule)进行检查,如图1-1所示。
图1-1 安装程序对全局规则进行检查
④ 通过全局规则(global rule)检查后,ScenarioEngine.exe会扫描是否有最新的补丁,如图1-2所示。如果不想检查,可以选择“Skip Scan”,并继续进行安装。
图1-2 安装程序搜索是否有最新的补丁
⑤ 随后,ScenarioEngine.exe会对Setup files组件执行安装,如图1-3所示。
图1-3 安装程序对Setup files组件进行安装
⑥ ScenarioEngine.exe执行真正的用户请求操作,如图1-4所示。
图1-4 ScenarioEngine.exe执行真正的用户请求操作
ScenarioEngine.exe是用C#写的,它根据用户输入信息产生工作流,并根据工作流信息执行安装。跟具体的SQL安装(ScenarioEngine.exe)日志不同,setup.exe的安装日志存放在%temp%目录下的sqlsetup*.log文件中。
一般来讲,运行setup.exe这一阶段安装出错的可能性非常小。下面来讨论一下在执行工作流所产生的日志,也就是通常所说的SQL Server安装日志。执行工作流所产生的安装日志会比较多,我们在1.1.2节会介绍它们的位置,以及其中重要的几个安装日志文件。
1.1.2 重要的数据库的安装日志文件
SQL Server在安装或升级的过程中会生成日志。不同版本的SQL Server其安装日志的位置稍有不同。SQL Server 2005安装日志目录是:%programFiles%\Microsoft SQL Server\90\Setup Bootstrap\Log。在Log目录下有两个子目录Files和Hotfix。其中Files子目录包含安装日志,Hotfix子目录包含服务封包和累计更新日志,如图1-5所示。
图1-5 SQL Server 2005的安装日志路径
SQL Server 2008和SQL Server 2008 R2对安装或服务封包或累计更新不再区分,而是以时间为子目录统一放在如下目录:%programFiles%\Microsoft SQL Server\100\Setup Bootstrap\Log。SQL Server 2012也是以时间为子目录放在%programFiles%\Microsoft SQL Server\110\Setup Bootstrap\Log下,如图1-6所示。
图1-6 SQL Server 2012的安装日志路径
子目录的时间以<YYYYMMDD_HHMMSS>格式(如20120419_222544)表明我们的安装或升级是在2012年4月19日晚上10点25分44秒开始的。
以时间为单位的子目录下有很多日志文件,如图1-7所示。
图1-7 具体的安装日志文件
下面对其中重要的日志文件进行介绍。
Summary_<机器名>_<YYYYMMDD_HHMMSS>.txt
该文件是安装小结,读者看安装日志的时候,建议首先看这个文件。下面是这个小结的一个例子:有部分删除,并加有部分注释。
Overall summary: Final result: Passed but reboot required, see logs for details Exit code (Decimal): 3010 Start time: 2012-04-19 22:28:44 End time: 2012-04-19 23:07:09 Requested action: Install
== 上面的小结表明安装成功,但是安装后,需要重新启动机器,安装是从2012-04-19晚上10:28分开始,23:07分结束。我们的操作是Install(安装)。这里开始的时间比文件夹的时间要晚一些。
Machine Properties: Machine name: xxxx Machine processor count: 4 OS version: Windows Server 2008 R2 OS service pack: Service Pack 1 OS region: United States OS language: English (United States) OS architecture: x64 Process architecture: 64 Bit OS clustered: No == 上面显示我们的机器环境是Windows Server 2008 R2 SP1英文版,64位操作系统,机器有4个CPU,而且该机器不在群集环境里。 Product features discovered: Product Instance Feature Version SQL Server 2008 KATMAI Database Engine Services 10.0.1600.22 SQL Server 2008 KATMAI SQL Server Replication 10.0.1600.22 SQL Server 2008 Management Tools – Basic 10.0.1600.22 SQL Server 2008 Management Tools – Complete 10.0.1600.22 == 在安装前,显示在该服务器上,已经装有的数据库服务 Package properties: Description: Microsoft SQL Server 2012 ProductName: SQL Server 2012 Type: RTM Version: 11 SPLevel: 0 Installation location: C:\SQLServer2012\x64\setup\ Installation edition: Developer == 显示我们要安装的数据库服务版本,以及安装介质路径 User Input Settings: ACTION: Install ADDCURRENTUSERASSQLADMIN: false AGTSVCACCOUNT: NT Service\SQLAgent$DENALI AGTSVCPASSWORD: ***** AGTSVCSTARTUPTYPE: Manual ASBACKUPDIR: Backup ASCOLLATION: Latin1_General_CI_AS ASCONFIGDIR: Config ASDATADIR: Data ASLOGDIR: Log ASPROVIDERMSOLAP: 1 ASSERVERMODE: MULTIDIMENSIONAL ASSVCACCOUNT: <empty> ASSVCPASSWORD: <empty> ASSVCSTARTUPTYPE: Automatic ASSYSADMINACCOUNTS: <empty> ASTEMPDIR: Temp BROWSERSVCSTARTUPTYPE: Automatic CLTCTLRNAME: <empty> CLTRESULTDIR: <empty> CLTSTARTUPTYPE: 0 CLTSVCACCOUNT: <empty> CLTSVCPASSWORD: <empty> CLTWORKINGDIR: <empty> COMMFABRICENCRYPTION: 0 COMMFABRICNETWORKLEVEL: 0 COMMFABRICPORT: 0 CONFIGURATIONFILE: C:\Program Files\Microsoft SQL Server\110\Setup Bootstrap\ Log\20120419_222608\ConfigurationFile.ini CTLRSTARTUPTYPE: 0 CTLRSVCACCOUNT: <empty> CTLRSVCPASSWORD: <empty> CTLRUSERS: <empty> ENABLERANU: false ENU: true ERRORREPORTING: false FEATURES: SQLENGINE, REPLICATION,DQ, SSMS, ADV_SSMS FILESTREAMLEVEL: 0 FILESTREAMSHARENAME: <empty> FTSVCACCOUNT: NT Service\MSSQLFDLauncher$DENALI FTSVCPASSWORD: <empty> HELP: false INDICATEPROGRESS: false INSTALLSHAREDDIR: C:\Program Files\Microsoft SQL Server\ INSTALLSHAREDWOWDIR: C:\Program Files (x86)\Microsoft SQL Server\ INSTALLSQLDATADIR: <empty> INSTANCEDIR: C:\Program Files\Microsoft SQL Server\ INSTANCEID: DENALI INSTANCENAME: DENALI ISSVCACCOUNT: NT AUTHORITY\Network Service ISSVCPASSWORD: <empty> ISSVCSTARTUPTYPE: Automatic MATRIXCMBRICKCOMMPORT: 0 MATRIXCMSERVERNAME: <empty> MATRIXNAME: <empty> NPENABLED: 0 PID: ***** QUIET: false QUIETSIMPLE: false ROLE: <empty> RSINSTALLMODE: DefaultNativeMode RSSHPINSTALLMODE: DefaultSharePointMode RSSVCACCOUNT: <empty> RSSVCPASSWORD: <empty> RSSVCSTARTUPTYPE: Automatic SAPWD: ***** SECURITYMODE: SQL SQLBACKUPDIR: <empty> SQLCOLLATION: SQL_Latin1_General_CP1_CI_AS SQLSVCACCOUNT: NT Service\MSSQL$DENALI SQLSVCPASSWORD: <empty> SQLSVCSTARTUPTYPE: Automatic SQLSYSADMINACCOUNTS: xxxx\Administrator SQLTEMPDBDIR: <empty> SQLTEMPDBLOGDIR: <empty> SQLUSERDBDIR: <empty> SQLUSERDBLOGDIR: <empty> SQMREPORTING: false TCPENABLED: 0 UIMODE: Normal UpdateEnabled: true UpdateSource: MU X86: false == 显示安装的输入参数,通过UI界面获得 Configuration file: C:\Program Files\Microsoft SQL Server\110\Setup Bootstrap\ Log\20120419_222608\ConfigurationFile.ini == 在再次安装的时候,不再需要输入这么多参数了,可以利用这个配置文件,以静默方式安装。 Detailed results: Feature: Management Tools - Complete Status: Passed Feature: Management Tools - Basic Status: Passed Feature: Database Engine Services Status: Passed Feature: Data Quality Services Status: Passed Feature: SQL Server Replication Status: Passed Feature: SQL Browser Status: Passed Feature: SQL Writer Status: Passed Feature: SQL Client Connectivity Status: Passed Feature: SQL Client Connectivity SDK Status: Passed == 显示每个功能的安装状况
如果某个功能安装不成功,则会显示信息告诉我们大致的错误信息,以及从哪个日志能更具体的看到错误信息。如对于下面安装失败的例子,其小结告诉我们Database Engine服务安装出错,群集中资源不能正常上线,要看具体的日志需要进一步查看Detail.txt。
Detailed results: Feature: Database Engine Services Status: Failed: see logs for details MSI status: Passed Configuration status: Failed: see details below Configuration error code: 0x1C2074D8@1216@1 Configuration error description: The cluster resource 'SQL Server (xxxx)' could not be brought online. Error: The resource failed to come online due to the failure of one or more provider resources. (Exception from HRESULT: 0x80071736) Configuration log: C:\Program Files\Microsoft SQL Server\110\Setup Bootstrap\ Log\20120303_102921\Detail.txt
在父目录也就是LOG目录下也会保存一份Summary.txt。其内容跟最近日期的安装小结是一样的。
Detail.txt
这是详细日志。由于是详细日志,所以里面记载的日志非常之多且详细,从头到尾把这个日志读下来是不太现实的,不过读者可以用关键字“Error:”或“Exception”来迅速定位到出错的地方。如针对前面提到的群集资源状态不正确的错误,其具体的Detail.txt相应日志如下:
2012-03-03 11:22:44 Slp: Configuration action failed for feature SQL_Engine_Core_Inst during timing Startup and scenario Startup. 2012-03-03 11:22:44 Slp: The cluster resource 'SQL Server (xxxx)' could not be#################### brought####### online. Error:The resource failed to come online due to the failure of one or more provider resources. (Exception from HRESULT: 0x80071736) 2012-03-03 11:22:44 Slp: Configuration action failed for feature SQL_Engine_Core_Inst during timing Startup and scenario Startup. 2012-03-03 11:22:44 Slp: Microsoft.SqlServer.Configuration.Cluster.ClusterException: The cluster resource 'SQL Server (xxxx)' could not be brought online. Error: The resource failed to come online due to the failure of one or more provider resources. (Exception from HRESULT: 0x80071736) ---> System.Runtime.InteropServices.COMException (0x80071736): The resource failed to come online due to the failure of one or more provider resources. (Exception from HRESULT: 0x80071736) 2012-03-03 11:22:44 Slp: at Microsoft.SqlServer.Interop.MSClusterLib.ClusResourceClass. Online(Int32 nTimeout) 2012-03-03 11:22:44 Slp: at Microsoft.SqlServer.Configuration.Cluster.ClusterResource. Online(Int32 timeout) 2012-03-03 11:22:44 Slp: --- End of inner exception stack trace --- 2012-03-03 11:22:44 Slp: at Microsoft.SqlServer.Configuration.Cluster.ClusterResource. Online(Int32 timeout) 2012-03-03 11:22:44 Slp: at Microsoft.SqlServer.Configuration.SqlEngine.SQLEngine ClusterFeature.Cluster(ClusterNetworkName networkName, ClusterResource[] disks, Cluster Group clusterGroup, String instanceName, String groupSid, String[] nodes) 2012-03-03 11:22:44 Slp: at Microsoft.SqlServer.Configuration.SqlEngine.SQLServer FailoverCluster.CreateEngineFailoverCluster(ClusterNetworkName networkName, String instanceName, String groupSid, ClusterGroup clusterGroup, ClusterPhysicalDisk[] diskResources, String[] nodes)
从日志来看,我们在把群集资源SQL Server(xxxx)上线的时候,其依赖的某一资源不能正常上线,导致SQL Server资源在线超时而处于Failed状态,数据库的整体安装失败。
这时,查看Windows的日志就能发现SQL Server(xxxx)所依赖的数据库网络名资源上线失败,其根本原因是在于域控制器上的权限不足所导致的。我们会在后面的1.4节提到如何解决这个问题。
Cluster network name resource 'SQL Network Name (xxxx)' failed to create its associated computer object in domain 'server.zzz.com' for the following reason: Unable to update password for computer account. The text for the associated error code is: Access is denied.
<Feature>_<Architecture>_<Iteration>.log
SQL Server安装程序进入工作流后,会根据用户选择不同而安装不同的组件,如SQL Server Management Studo组件,其安装源的MSI文件名为sql_ssms.msi。每一个MSI文件在安装时,会分别生成安装日志。其日志文件的命名规范是<Feature>_<Architectgure>_<Iteration>.log。如sql_ssms_Cpu64_1.log是在64位平台上安装SQL Server Management Studio组件所生成的日志。如果某个安装包在安装的时候出现问题,我们应该到安装包对应的日志文件去查看具体原因。
除了这几个重要的日志文件,SQL Server在安装或升级中还会生成其他的一些日志文件。要从这些海量信息中定位到准确的错误信息,读者需要以日志小结为基础,顺藤摸瓜,逐步寻找。根据错误信息采取相应的解决办法。如果错误的提示比较模糊,无法找到应对办法,则可能需要上网查询,看看是否有人也碰到过类似的问题,以及相应的解决方法。
下面我们会介绍各种环境下数据库安装或者打补丁需要注意的事项,以及一些常见的问题。很多问题都是通过阅读安装日志来找出失败原因的。