如何在Windows Server Core下安装和配置SQL Server
分类: Windows Server ◆ 标签: #PowerShell #Windows Server Core #Windows #SQL Server ◆ 发布于: 2023-08-06 17:44:13

在准备将自己的网站迁移到Windows Server Core
上时,第一个要考虑的问题就是如何在Windows Server Core
上安装和配置SQL Server
, 新网站的架构是基于OrchardCore
来开发的,虽然可以继续使用sqlite
,随着数据的增多,很担心sqlite
不能应对更多更大的数据量,同时在需要和其他的代码及进行集成时,仅仅使用sqlite
也会带来很多不方便的地方,这样就必须要将原有基于Piranha CMS
的数据转换到SQL Server
, 这又是一个伤心的故事,无论采用什么样的工具甚至是自己写代码,发现要将所有的数据从sqlite
迁移到SQL Server
的时候,仍然是困难重重。而且还得对Piranha CMS
的底层设计要非常熟悉,倒腾了很多次依然以失败告终,这更加坚定了我必须要使用主流数据库的决心。
这篇文章记录一下自己如何在Windows Server Core
上安装和配置SQL Server
。
安装之前的检查
安装SQL Server
的操作系统要求检查
第一件事是需要仔细检查SQL Server
的要求文档,这个文档里详细的列出了目前SQL Server
支持的操作系统版本,最重要的一条就是检查当你在使用云上的虚拟机时,是否对虚拟机上的操作系统支持,例如我计划是使用Windows Server 2022 Datacenter: Azure Edition
, 那么就需要自己检查该文档,检查是否支持,该文档的地址是:https://learn.microsoft.com/en-us/sql/sql-server/install/hardware-and-software-requirements-for-installing-sql-server-2022?view=sql-server-ver16, 请仔细检查操作系统支持,以及Cross-language
支持。
注意
也需要注意你需要使用的SQL Server
版本,包括企业版,开发版,标准版,Web版,以及Express
版本。这些版本并不是在所有的操作系统上都支持的。
语言的支持
关于SQL Server
多语言的支持,请参考文档:https://learn.microsoft.com/en-us/sql/sql-server/install/local-language-versions-in-sql-server?view=sql-server-ver16
注意
需要非常注意SQL Server
的语言支持,必须选择和系统相对应的语言,否则会总是安装失败。
对于操作系统主要检查以下三项:
- 操作系统使用的用户界面语言
- 操作系统的用户locale
- 操作系统的系统locale
在Windows Server Core
上使用如下的方式检查和配置:
PS C:\> Get-WinUILanguageOverride PS C:\> Get-WinSystemLocale LCID Name DisplayName ---- ---- ----------- 2052 zh-CN 中文(简体,中国) PS C:\> Get-WinUserLanguageList LanguageTag : zh-Hans-CN Autonym : 中文(中华人民共和国) EnglishName : Chinese LocalizedName : 中文(简体,中国) ScriptName : 中文(简体) InputMethodTips : {0804:{81D4E9C9-1D3B-41BC-9E6C-4B40BF79E35E}{FA550B04-5AD7-411F-A5AC-CA038EC515D7}} Spellchecking : True Handwriting : True PS C:\>
使用如下的方式设置系统的语言和Locale
PS C:\> Set-WinUILanguageOverride -Language en-US PS C:\> Set-WinSystemLocale -SystemLocale en-US PS C:\> Set-WinUserLanguageList -LanguageList en-US 确认 是否继续执行此操作? [Y] 是(Y) [N] 否(N) [S] 暂停(S) [?] 帮助 (默认值为“Y”): y PS C:\>
设置系统的时区,可以使用sconfig
, 运行sconfig
, 然后如下图更改时区:
开始安装
开始安装之前请直接到微软的官方网站下载必要的安装文件,使用此安装文件下载必要的文档,默认情况下会下载到C:\SQLServer2022
, 登录到Windows Server Core
之后,在终端上进入到该目录,使用如下的安装命令进行SQL Server
的安装:
.\Setup.exe /qs /ACTION=Install /FEATURES=SQLEngine,FullText /INSTANCENAME=MSSQLSERVER /SQLSVCACCOUNT="<本机或者域用户>" /SQLSVCPASSWORD="<本机或者域用户的密码>" /SQLSYSADMINACCOUNTS="<本机或者域用户>" /AGTSVCACCOUNT="NT AUTHORITY\Network Service" /TCPENABLED=1 /IACCEPTSQLSERVERLICENSETERMS /ADDCURRENTUSERASSQLADMIN /SECURITYMODE=SQL /SAPWD="<SA的密码>"
我们解释一下这些参数的意义:
/qs
: 执行静默安装,使用这个参数必须要带参数:/IACCEPTSQLSERVERLICENSETERMS/ACTION=Install
: 执行安装动作,这里也可以使用uninstall
卸载安装。/FEATURES=SQLEngine, FullText
: 安装选项,这里表示只安装数据库引擎和全文搜索。/INSTANCENAME
: 用于指定该安装的实例名./SQLSVCACCOUNT
: SQL Server 服务的帐户: 域\用户或系统帐户, 用于启动SQL 服务的账户,例如系统管理员, SQLSVCPASSWORD需要指定该用户的密码。/SQLSYSADMINACCOUNTS
: 要设置为 SQL Server 系统管理员的 Windows 帐户, 本机或者域账户。- '/AGTSVCACCOUNT': SQL Server代理启动的账户
/TCPENABLED=1
: 启用tcp
协议支持。/ADDCURRENTUSERASSQLADMIN
: 注意这个是Express
版本专用的选项,将当前用户添加到系统管理员。/SECURITYMODE=SQL
: 默认是采用windows认证,值SQL
表示混合认证。/SAPWD
: 用于设定sa
的密码。
完整的选项说明可以使用.\Setup.exe /?
进行仔细的查看。
当然还可以使用配置文件来安装,使用配置文件安装可以更加精细的调整和配置SQL Server
的安装,例如数据文件的大小等等。
关于通过配置文件的安装,您可以查看文档:https://learn.microsoft.com/en-us/sql/database-engine/install-windows/install-sql-server-using-a-configuration-file?view=sql-server-ver16
调整SQL Server
接受tcp
协议和命名管道协议
安装完成之后,需要调整该安装接受来自tcp/ip
和命名管道的连接,在Windows Server Core
上我们只能通过PowerShell
进行调整。
我们这里需要使用sqlps
模块,在powershell
里需要预先载入该模块:
PS C:\> Import-Module sqlps PS C:\>
TCP
协议和端口的配置
然后先查看tcp
的情况:
PS C:\> Import-Module sqlps PS C:\> $smo = 'Microsoft.SqlServer.Management.Smo.' PS C:\> $wmi = new-object ($smo + 'Wmi.ManagedComputer'). PS C:\> $wmi ConnectionSettings : Microsoft.SqlServer.Management.Smo.Wmi.WmiConnectionInfo Services : {MSSQLFDLauncher, MSSQLSERVER, SQLBrowser, SQLSERVERAGENT} ClientProtocols : {} ServerInstances : {MSSQLSERVER} ServerAliases : {} Urn : ManagedComputer[@Name='WWW'] Name : WWW Properties : {} UserData : State : Existing PS C:\> $uri = "ManagedComputer[@Name='WWW']/ ServerInstance[@Name='MSSQLSERVER']/ServerProtocol[@Name='Tcp']" PS C:\> $Tcp = $wmi.GetSmoObject($uri) PS C:\> $Tcp Parent : Microsoft.SqlServer.Management.Smo.Wmi.ServerInstance DisplayName : TCP/IP HasMultiIPAddresses : True IsEnabled : True IPAddresses : {IP1, IP2, IP3, IP4...} ProtocolProperties : {Enabled, KeepAlive, ListenOnAllIPs} Urn : ManagedComputer[@Name='WWW']/ServerInstance[@Name='MSSQLSERVER']/ServerProtocol[@Name='Tcp'] Name : Tcp Properties : {Name=DisplayName/Type=System.String/Writable=False/Value=TCP/IP, Name=HasMultiIPAddresses/Type=System.Boolean/Writable=False/Value=True, Name=IsEnable d/Type=System.Boolean/Writable=True/Value=True} UserData : State : Creating PS C:\>
以上代码可以看到我们已经启用了tcp
协议了,如果没有启用的话,可以看到IsEnabled : False
, 这时候我们可以使用如下的语句进行更改:
PS C:\> $Tcp.IsEnabled = $true PS C:\> $Tcp.Alter() PS C:\> $Tcp Parent : Microsoft.SqlServer.Management.Smo.Wmi.ServerInstance DisplayName : TCP/IP HasMultiIPAddresses : True IsEnabled : True IPAddresses : {IP1, IP2, IP3, IP4...} ProtocolProperties : {Enabled, KeepAlive, ListenOnAllIPs} Urn : ManagedComputer[@Name='WWW']/ServerInstance[@Name='MSSQLSERVER']/ServerProtocol[@Name='Tcp'] Name : Tcp Properties : {Name=DisplayName/Type=System.String/Writable=False/Value=TCP/IP, Name=HasMultiIPAddresses/Type=System.Boolean/Writable=False/Value=True, Name=IsEnable d/Type=System.Boolean/Writable=True/Value=True} UserData : State : Creating PS C:\>
到这里我们已经配置了SQL Server
的tcp
协议了。但是需要注意的是,Tcp
的连接端口是否配置了1433
, 或者仅仅是使用动态端口,我们可以继续使用如下的命令查看:
PS C:\> $wmi.GetSmoObject($uri + "/IPAddress[@Name='IPAll']").IPAddressProperties Name : TcpDynamicPorts Value : Type : System.String Writable : True Readable : True Expensive : False Dirty : False Retrieved : True IsNull : False Enabled : False Required : False Attributes : {} Name : TcpPort Value : 1433 Type : System.String Writable : True Readable : True Expensive : False Dirty : False Retrieved : True IsNull : False Enabled : False Required : False Attributes : {} PS C:\>
我们这里看到该安装没有使用动态端口,静态端口已经是1433
了。如果需要更改为其他端口,我们可以更改:
PS C:\> $wmi.GetSmoObject($uri + "/IPAddress[@Name='IPAll']").IPAddressProperties[1].Value="1445" PS C:\> $wmi.GetSmoObject($uri + "/IPAddress[@Name='IPAll']").IPAddressProperties Name : TcpDynamicPorts Value : Type : System.String Writable : True Readable : True Expensive : False Dirty : False Retrieved : True IsNull : False Enabled : False Required : False Attributes : {} Name : TcpPort Value : 1445 Type : System.String Writable : True Readable : True Expensive : False Dirty : True Retrieved : True IsNull : False Enabled : False Required : False Attributes : {} PS C:\>
这样我们就端口更改到了1445
了。
到这里我们就配置好了tcp
协议以及端口。
命名管道的配置
采用如下的命令启用命名管道的配置:
PS C:\> $uri = "ManagedComputer[@Name='WWW']/ ServerInstance[@Name='MSSQLSERVER']/ServerProtocol[@Name='Np']" PS C:\> $Np = $wmi.GetSmoObject($uri) PS C:\> $Np Parent : Microsoft.SqlServer.Management.Smo.Wmi.ServerInstance DisplayName : Named Pipes HasMultiIPAddresses : False IsEnabled : False IPAddresses : {} ProtocolProperties : {Enabled, PipeName} Urn : ManagedComputer[@Name='WWW']/ServerInstance[@Name='MSSQLSERVER']/ServerProtocol[@Name='Np'] Name : Np Properties : {Name=DisplayName/Type=System.String/Writable=False/Value=Named Pipes, Name=HasMultiIPAddresses/Type=System.Boolean/Writable=False/Value=False, Name=Is Enabled/Type=System.Boolean/Writable=True/Value=False} UserData : State : Creating PS C:\> $Np.IsEnabled = $true PS C:\> $Np.Alter() PS C:\> $Np Parent : Microsoft.SqlServer.Management.Smo.Wmi.ServerInstance DisplayName : Named Pipes HasMultiIPAddresses : False IsEnabled : True IPAddresses : {} ProtocolProperties : {Enabled, PipeName} Urn : ManagedComputer[@Name='WWW']/ServerInstance[@Name='MSSQLSERVER']/ServerProtocol[@Name='Np'] Name : Np Properties : {Name=DisplayName/Type=System.String/Writable=False/Value=Named Pipes, Name=HasMultiIPAddresses/Type=System.Boolean/Writable=False/Value=False, Name=Is Enabled/Type=System.Boolean/Writable=True/Value=True} UserData : State : Creating PS C:\>
如上配置好了命名管道的连接方式。
开放防火墙
最后我们需要开放Windows Server Core
上的防火墙,以便可以管理和使用该SQL Server
:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned #Enabling SQL Server Ports New-NetFirewallRule -DisplayName "SQL Server" -Direction Inbound –Protocol TCP –LocalPort 1433 -Action allow New-NetFirewallRule -DisplayName "SQL Admin Connection” -Direction Inbound –Protocol TCP –LocalPort 1434 -Action allow New-NetFirewallRule -DisplayName "SQL Database Management” -Direction Inbound –Protocol UDP –LocalPort 1434 -Action allow New-NetFirewallRule -DisplayName "SQL Service Broker” -Direction Inbound –Protocol TCP –LocalPort 4022 -Action allow New-NetFirewallRule -DisplayName "SQL Debugger/RPC” -Direction Inbound –Protocol TCP –LocalPort 135 -Action allow #Enabling SQL Analysis Ports New-NetFirewallRule -DisplayName "SQL Analysis Services” -Direction Inbound –Protocol TCP –LocalPort 2383 -Action allow New-NetFirewallRule -DisplayName "SQL Browser” -Direction Inbound –Protocol TCP –LocalPort 2382 -Action allow #Enabling Misc. Applications New-NetFirewallRule -DisplayName "HTTP” -Direction Inbound –Protocol TCP –LocalPort 80 -Action allow New-NetFirewallRule -DisplayName "SSL” -Direction Inbound –Protocol TCP –LocalPort 443 -Action allow New-NetFirewallRule -DisplayName "SQL Server Browse Button Service” -Direction Inbound –Protocol UDP –LocalPort 1433 -Action allow #Enable Windows Firewall Set-NetFirewallProfile -DefaultInboundAction Block -DefaultOutboundAction Allow -NotifyOnListen True -AllowUnicastResponseToMulticast True
当然您可以根据自己的实际情况考虑是否要开放所有的端口。
测试
最后使用sqlcmd
对该数据库进行测试:
PS C:\> sqlcmd -H 127.0.0.1 -U sa 密码: 1> select name, database_id, create_date from sys.databases; 2> go name database_id create_date -------------------------------------------------------------------------------------------------------------------------------- ----------- ----------------------- master 1 2003-04-08 09:13:36.390 tempdb 2 2023-08-06 11:57:10.920 model 3 2003-04-08 09:13:36.390 msdb 4 2022-10-08 06:31:57.550 MyDB 5 2023-08-03 22:42:29.140 (5 行受影响) 1>
到这里就全部结束了。