SQL Server 2012无人值守安装





5.00/5 (4投票s)
尽管有很多关于 Microsoft SQL Server 数据库引擎无人值守安装的资料,本文介绍的脚本经过了实际生产环境的测试,可以最小程度甚至无需修改即可使用。
引言
作为 DBA、DevOps 或开发人员,Microsoft SQL Server 数据库引擎的无人值守安装,也称为“静默”安装,是开发和运维(简称为 DevOps)任务的一个很好的例子,在这些任务中,自动化是日常工作的核心。
本文介绍了一个使用 Powershell 工具自动安装 SQL Server 2012 的脚本。涉及的操作系统版本是 Windows Server 2012 和 Windows Server 2012 R2,并且已在实际的关键生产环境中进行了测试。
如果您想查看手动安装,请在本网站上搜索名为“安装 Microsoft SQL Server 2008 Express Edition(标准版或带有高级服务)的步骤”的文章。
背景
基本上,静默或无人值守安装脚本的通用规范在名为“使用配置文件进行 SQL Server 静默无人值守安装”的文章中介绍过。但是,当提供了一个好的配方,可以品尝到以最小的自定义成功安装,或者下载后无需任何修改即可执行时,获得一些帮助是非常有用的。 其目的是提出一种替代方法来执行自动化任务,不仅适用于 DBA,也适用于开发人员、DevOps 和系统管理员角色,在这些角色中,您需要执行自定义配置的覆盖,并且需要多次执行安装。
先决条件
所有先决条件均可在 Microsoft Windows Server 2012 和 Microsoft Windows Server 2012 R2 环境中运行,但它们也可能适用于 Windows 桌面版(Windows 8.1 和 Windows 10)。无论哪种情况,这些步骤必须使用管理员帐户执行。
步骤
1. 首先,检查以下组件是否已实际安装(并经过测试)。每个组件可能需要重启机器。
1.1
. .NET FrameWork 3.5
. (图 1 和 图 2)
1.2.
Windows PowerShell 1.0
(图 3)
运行安装
此脚本假定
- SQL Server 媒体驱动器分配在驱动器 D 上
- 您必须将当前帐户管理用户更改为您机器的用户管理帐户规范。这里命名为:HELLIUM02\Administrator
- SQL Server 安装文件名为 "ConfigurationFile.ini"。
- 所有文件必须在同一目录中,此处命名为 C:\SQLInstall。因此,您必须创建 C:\SQLInstall。
脚本将创建
- SQL Server 服务的帐户
- 数据库引擎根数据目录是 C:\DATA
- 用于测试目的的 testdbv1 数据库。
- 用于连接到 SQL Server 数据库引擎实例的登录用户。
在 powershell 中编写和运行的源代码如下所示
# Version 2.0
# Date - 07/06/2016
# Author: Jesus Carroll
Clear-Host
<#*************Variable Declaration******************#>
# Script: Perform a preinstallation of Unattended SQL Server 2008 and 2012 Install, Uninstall SQL. Setup requirements
# Author: Jesus Carroll
# Version: 2.0
# Date - 07/06/2016
<#***********************************************START:Pre-installation Program********************************************#>
Write-Host "START Create DATA directory on C drive"
New-Item c:\DATA -type directory -force
Write-Host "END Create DATA directory"
Write-Host "START Create Account for SQL Server services"
$Computer = [ADSI]"WinNT://$Env:COMPUTERNAME,Computer"
$LocalAdmin = $Computer.Create("User", "services")
$LocalAdmin.SetPassword("Sqls2rv3")
$LocalAdmin.SetInfo()
Write-Host "END Create Account for SQL Server services"
<#***********************************************END:Pre-installation Program********************************************#>
<#Get Date#>
[datetime]$unow = Get-Date
Write-Host "START[SQL Install Script]: SQL INSTALL PROGRAM MAIN"
Write-Host $unow
$scriptblock={D:\Setup.exe /IACCEPTSQLSERVERLICENSETERMS /ConfigurationFile=C:\SQLInstall\ConfigurationFile.ini}
Try
{
Invoke-Command -scriptblock $scriptblock
Write-Host "END [SQL Install Script]: Finished SQL INSTALL PROGRAM"
<#***********************************************START:Post-installation Program********************************************#>
# Change the Execution Policy to enable SQL Server Module.
Write-Host "START Change the Execution Policy to enable SQL Server Module"
Set-ExecutionPolicy Unrestricted
Write-Host "END Change the Execution Policy to enable SQL Server Module"
Write-Host "****************************************************"
Write-Host "START Check presence of SQL Server PowerShell Module"
Copy-Item "C:\Program Files (x86)\Microsoft SQL Server\110\Tools\PowerShell\Modules\SQLPS" -Destination "C:\Windows\System32\WindowsPowerShell\v1.0\Modules\SQLPS" -Recurse
Write-Host "END Check presence of SQL Server PowerShell Module"
Write-Host "****************************************************"
# Wait to start slowest SQL Server machines
Write-Host "START Wait to start slowest SQL Server machines"
Start-Sleep -Seconds 5
Write-Host "END Wait to start slowest SQL Server machines"
# Import the SQL Server Module.
Write-Host "START Perform customized SQL Server Engine"
Import-Module “sqlps” -DisableNameChecking
Set-Location SQLSERVER:\SQL
Invoke-Sqlcmd "EXEC sys.sp_configure N'user options', N'512'; RECONFIGURE WITH OVERRIDE;"
Invoke-Sqlcmd "CREATE LOGIN [user1] WITH PASSWORD=N'User2016', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF;"
Invoke-Sqlcmd "ALTER SERVER ROLE [sysadmin] ADD MEMBER [user1];"
Write-Host "END Performed customized SQL Server Engine"
# Create a sample database without data.
Write-Host "START Create a sample database testdbv1"
Invoke-Sqlcmd "USE master;
IF EXISTS (SELECT * FROM sys.databases where name ='testdbv1')
BEGIN
DROP DATABASE testdbv1
SELECT * FROM sys.databases
END;
CREATE DATABASE [testdbv1]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'testdbv1', FILENAME = N'C:\DATA\testdbv1.mdf' , SIZE = 5120KB , FILEGROWTH = 1024KB )
LOG ON
( NAME = N'testdbv1_log', FILENAME = N'C:\DATA\testdbv1_log.ldf' , SIZE = 2048KB , FILEGROWTH = 10MB)
;"
Invoke-Sqlcmd "use master;
IF EXISTS (SELECT * FROM sys.databases where name ='testdbv1')
BEGIN
ALTER DATABASE [testdbv1] SET COMPATIBILITY_LEVEL = 110
ALTER DATABASE [testdbv1] SET ANSI_NULL_DEFAULT OFF
ALTER DATABASE [testdbv1] SET ANSI_NULLS OFF
ALTER DATABASE [testdbv1] SET ANSI_PADDING OFF
ALTER DATABASE [testdbv1] SET ANSI_WARNINGS OFF
ALTER DATABASE [testdbv1] SET ARITHABORT OFF
ALTER DATABASE [testdbv1] SET AUTO_CLOSE OFF
ALTER DATABASE [testdbv1] SET AUTO_CREATE_STATISTICS ON
ALTER DATABASE [testdbv1] SET AUTO_SHRINK OFF
ALTER DATABASE [testdbv1] SET AUTO_UPDATE_STATISTICS ON
ALTER DATABASE [testdbv1] SET CURSOR_CLOSE_ON_COMMIT OFF
ALTER DATABASE [testdbv1] SET CURSOR_DEFAULT GLOBAL
ALTER DATABASE [testdbv1] SET CONCAT_NULL_YIELDS_NULL OFF
ALTER DATABASE [testdbv1] SET NUMERIC_ROUNDABORT OFF
ALTER DATABASE [testdbv1] SET QUOTED_IDENTIFIER OFF
ALTER DATABASE [testdbv1] SET RECURSIVE_TRIGGERS OFF
ALTER DATABASE [testdbv1] SET DISABLE_BROKER
ALTER DATABASE [testdbv1] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
ALTER DATABASE [testdbv1] SET DATE_CORRELATION_OPTIMIZATION OFF
ALTER DATABASE [testdbv1] SET PARAMETERIZATION SIMPLE
ALTER DATABASE [testdbv1] SET READ_COMMITTED_SNAPSHOT ON
ALTER DATABASE [testdbv1] SET READ_WRITE
ALTER DATABASE [testdbv1] SET RECOVERY SIMPLE
ALTER DATABASE [testdbv1] SET MULTI_USER
ALTER DATABASE [testdbv1] SET PAGE_VERIFY CHECKSUM
ALTER DATABASE [testdbv1] SET TARGET_RECOVERY_TIME = 0 SECONDS
ALTER DATABASE [testdbv1] SET ALLOW_SNAPSHOT_ISOLATION ON
END;"
Invoke-Sqlcmd "USE [testdbv1];
IF NOT EXISTS (SELECT name FROM
sys.filegroups WHERE is_default=1 AND name = N'PRIMARY')
ALTER DATABASE [testdbv1] MODIFY FILEGROUP [PRIMARY] DEFAULT;
"
Invoke-Sqlcmd "SELECT * FROM sys.databases where name ='testdbv1';"
Write-Host "****************************************************"
Write-Host "END Create a sample database testdbv1"
Write-Host "****************************************************"
Write-Host " "
<#***********************************************END:Post-installation Program********************************************#>
}
Catch
{
Write-Host -ForegroundColor Red "Error Setup SQL Server:"$_.Exception.Message
}
powershell 脚本和 ini 配置文件这两个文件的源代码都附在此文章中。
结论和进一步改进
此脚本不会尝试在生产服务器上发出不受控制的重启问题,因此有助于保持在线业务连续性。 必须先安装先决条件和 Windows 更新包,然后才能成功执行。 在此安装中,这是通过 Setup 过程实现的,它应该发现并包含产品更新 [1]。 当组织没有集群实现时,保持在线是一个“必须”原则。正如 Colin Dembovsky 在参考 [2] 中指出的那样在安装过程中重新启动总是很棘手的。有时根本没有其他选择。。
参考文献
- [1] Microsoft Technet: https://technet.microsoft.com/en-us/library/dd239405(v=sql.110).aspx
- [2] Colin Dembovsky's Devops blog: http://www.colinsalmcorner.com/post/install-and-configure-sql-server-using-powershell-dsc