一、现象
sqlserver数据库进程crash,检查时间管理器的日志,发现是oracle的某进程影响的。由于业务访问需求配置了链接服务器,访问多个oracle的数据库,因此sqlserver机器上配置了oracle的网络管理组件。

二、原因分析
经过排查,发现在配置“访问接口”时选择了“允许进程内”选项,这表明oracle 的 provider是允许运行在SQL SERVER的进程内的,这就很容易导致SQL SERVER crash。

三、解决方法
向微软提了CASE,给的修复方案如下。
1.Run DCOMCNFG . Open Component Services > My Computer > Properties and in the Default Properties tab do the following:
① Verify that Enable Distributed COM on this computer is selected.
② Verify that Default Authentication is set to Connect.
③ Verify that Default Impersonation Level is set to Identify or Impersonate.

2.Open Component Services > MyComputer > DCOM Config > MSDAINITIALIZE and do the following:
① Right-click MSDAINITIALIZE > Properties > Security.
② Add the SQL Server service account under Launch and Activation Permissions, Access Permissions, and Configuration Permissions.
③ Provide full rights to the account.

3.Restart the SQL Server.
4.Try to use out-of-process Linked Server.
四、方案分析
1、经过查询微软官方文档,并与原厂工程师确认,取消“允许进程内”选项,会影响部分引用列的使用。

2、过测试,取消“允许进程内”选项也会影响新链接服务器创建后的对oracle业务表访问。

五、总结
我从网上找了个监控sqlserver进程的脚本,如果发现进程停止就自动拉起。
脚本放到D盘check目录下。双击check-mssql.bat 执行即可
检查的脚本:check-mssql.bat
@echo off
pushd D:\check\
if "%1"=="h" goto begin
start mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit
:begin
:start
choice /t 90 /d y /n >nul
tasklist|find /i "sqlservr.exe"
if %errorlevel%==0 (
echo "yes"
) else (
echo "No"
start /b restart-mssql.bat)
goto start
拉起sqlserver进程,restart-mssql.bat
@echo on
net start mssqlserver
如果想查看后台进程是否正常,或者想杀后台进程,CMD执行下面命令,查到进程号。
手动在任务管理器中杀掉即可




