SQL Server On Linux(4)——Linux 初步配置

本人新书上市,请多多关照:《SQL Server On Linux运维实战 2017版从入门到精通》

在这里插入图片描述

接上文:SQL Server On Linux(3)——SQL Server 2019 For Linux 下载并部署示例数据库

本文聊一下Linux,因为这个系列是Linux上的SQL Server,所以我们有必要初步了解一下这个基石,地基不稳那么上面搭建的东西也必然摇摇晃晃。

  Linux的研究是一个比SQL Server还要大的课题,由于操作系统不仅搭载了数据库,还作为其他配置服务的载体而运行着,所以专业的Linux内容是无法在一文中介绍清楚。本文把关注点集中在与SQL Server相关的部分。
  纵观身边的朋友所在企业使用的Linux版本,通常都是CentOS和Ubuntu ,其中CentOS居多。一些第三方软件会要求使用Red Hat,所以Linux版本的选择其实就没那么多了。从个人学习过程来看,如果可以选择的话,我会选择Ubuntu,很多地方确实比CentOS便利,但是这个选型并不是个人能够左右的。因此版本就不多说了。本系列还是使用CentOS 7来做演示。
  与Windows有所不同的是,Linux只是一个“内核”,在正式使用之前需要做大量的配置操作,而且在后期,配置的变更也是有可能的,那么对Linux的配置需要做些什么?如果没头绪的话,我建议先从官方配置中着手。但是这里仅仅是初步配置,因为后续配置涉及性能优化和运维工作,到时再说。这里的目的是让SQL Server能够稳定地在Linux机器上运行。

题外话,除了各种技术因素之外,作者这10年经历中,越来越感受到各种规范化的重要性,所以如果可能,建议先从统一化、规范化着手。

当前环境

  在开始之前我们先来了解一下默认情况下SQL Server所使用到的文件目录,这个时候对于初学者而言比较合适的办法是通过SSMS工具来查看。用SSMS打开服务器属性,首先关注的是当前内存,本机是3025MB,稍后会演示如何扩充。

在这里插入图片描述

  上面的图可以理解为“服务器内存”,而下面的图可以理解为“SQL Server 内存”,如果没配置,默认的【最大服务器内存(MB)】值为2147483647(即2TB),所以通常看到这个值意味着最大内存没有配置。

在这里插入图片描述

  再看一下下图,可以看到SQL Server的数据、日志及备份的初始化路径都在/var/opt/mssql/data下,在大部分情况下并不需要进行改动,但是在实际环境中,建议使用专用目录,同时这个目录是由专用设备(如SSD、RAID等)挂载出来的。

在这里插入图片描述

  如果要知道SQL Server中新数据库的默认位置,那就要看系统库model中的配置,因为新数据库除非手工指定,否则都按model库的配置来创建。model库的默认位置如下图:

在这里插入图片描述

  修改这些配置,一般有3个工具可以使用:第一个是mssql-conf,它类似于Windows平台的配置管理器,但是是命令行形式。第二个是环境变量。第三个就是我们熟悉的客户端管理工具如SSMS。接下来先演示mssql-conf。

使用mssql-conf修改

环境准备

  看到这里我们就尝试第一个配置——修改目录。假设我们已经挂载了一个目录,在/root下的/data(为了模拟,这里用mkdir来创建),创建之后,先检查一下权限,那到底检查什么权限?在SQL Server On Linux(1)——CentOS 7 安装SQL Server2019中的【信息总结】部分提到过,默认SQL Server On Linux的服务账号是一个叫mssql的账号,所以为了让SQL Server能使用这个新建的目录,要检查mssql账号及其组对/data的权限。

在这里插入图片描述

  首先看一下/data的当前权限情况:# ls -l /,可以看到/data这个目录由root创建,属于root用户和root组。下面把它修改成mssql。(其实可以授权给mssql使其可读可写可执行即可)

在这里插入图片描述

  这里使用# chown mssql:mssql -R /data同时修改用户及其组。然后再使用# ls -l /查看,下图显示已经更改成功:

在这里插入图片描述

修改默认文件目录

  下面演示修改默认的数据文件路径,对于日志和备份目录是相类似的,就不累赘了。在前面的SSMS截图中可以看到是显灰的,意味着不能使用SSMS直接修改,这一点跟Windows平台的不同,所以在Linux平台上,需要使用Linux的指令来实现。借助SQL Server On Linux的mssql-conf命令,设置filelocation.defaultdatadir(日志文件是filelocation.defaultlogdir):

sudo /opt/mssql/bin/mssql-conf set filelocation.defaultdatadir /data

  成功之后会出现下图所示,并提醒你重启服务:
在这里插入图片描述

  再次打开SSMS查看,可以发现已经修改成功:
在这里插入图片描述

  接下来我们开始修改内存,首先把服务器的内存加大,因为一开始我们只使用了3GB的内存。作者的是虚拟机,扩容很容易。这里作者把内存扩大到20G,以备后续其他演示之用。

修改SQL Server 内存

  从上面第一个图可以看到内存是3025MB,在虚拟机已经扩容20G并启动之后,下面再次检查一下当前服务器内存:
在这里插入图片描述

  再次通过SSMS查看,显示15927MB,这个值怎么来的?19908(上图的值)*80%≈15926.4。所以,SQL Server这里显示的操作系统内存是物理内存的80%。这个行为由memory.memorylimitmb控制。其目的是限制SQL Server“可见”的内存,保留20%给操作系统,由于Linux对内存倾向于申请多少给多少,到达极限且没有设置swap时会kill掉最大内存消耗(也就是常说的out of memory,OOM)从而影响服务的运行,为了避免SQL Server在运行时把内存耗尽被Linux选择性kill掉。因此微软对SQL Server设置了80%的可用内存的默认值,大部分情况下这个值是合理的,但是对于超大内存的服务器比如1TB,那么20%也就是200G的空闲显然是很浪费,所以可以用memory.memorylimitmb来调整实际内存使用。

在这里插入图片描述

  在Linux上,暂时没有建议值可参考,这里只演示如何修改,具体修改值根据实际环境而定,暂时建议对128G左右的服务器(这个比较常见)预留10G左右的内存给操作系统。
  这里同样使用mssql-conf工具来修改,比如我想把它改成10GB(10240MB),可以使用以下命令:

sudo /opt/mssql/bin/mssql-conf set memory.memorylimitmb 10240

  然后重启服务sudo systemctl restart mssql-server,再次检查可以看到已经修改成功:

在这里插入图片描述

  接下来,我们来看看tcp端口。

修改TCP端口

  众所周知,SQL Server使用的是1433端口,也恰恰由于众所周知,所以当需要攻击SQL Server时,首先会检查1433端口,那么除了使用一些网络技术来防御之外,有必要对生产环境的端口进行修改,使其“不默认”。首先检查一下当前端口情况,在以前的版本中,netstat足矣,但是作者发现在CentOS 7上却发现不了这个命令,虽然网上说可以自行安装,但是秉着与时俱进的想法(也因为SQL Server On Linux的Linux版本要求),我选择使用新版带来的新工具,ss指令。作者使用下面指令获取端口情况,后面的管道“|”和column -t选项是为了格式化,否则会很难看清。读者可以自行尝试:

# ss -antp|column -t

在这里插入图片描述

  1. ESTAB:establish的意思,建立连接,正在通信。
  2. LISTEN:listening,正在侦听,但是没被连接,就像房门开了但是没人进来。
  3. TIME_WAIT:结束本次连接,也就是曾经被访问过但是结束了。

  我们在连接时使用1433端口也是可以的:

在这里插入图片描述

  下面开始来修改端口,端口控制由network.tcpport来实现,同样使用mssql-conf来修改,假设我们改成10240:

sudo /opt/mssql/bin/mssql-conf set network.tcpport 10240

  修改后同样需要重启SQL Server服务,命令参照上面修改内存部分。接下来测试一下1433和不加端口(默认就是1433)是否能连接成功,从下面两图可以看到是不可以的,证明修改成功:
在这里插入图片描述

在这里插入图片描述

  然后我们查看一下端口情况,1433也已经消失,证明这个端口没有对外服务:

在这里插入图片描述

  那是不是就可以用10240来连接了?从下图结果可以得知还是不行:

在这里插入图片描述

  是不是意味着修改失败?不是,修改是成功的,但是别忘了防火墙!用# firewall-cmd --list-ports来查看防火墙中配置的端口,可以看到只有1433这一个:

在这里插入图片描述

  那么我们就需要对10240放行,使用下面命令:

#放行10240端口,注意这里的#是注释,如果#后有空格则是意味着以root身份执行
firewall-cmd --zone=public --add-port=10240/tcp --permanent
#重启防火墙
firewall-cmd --reload
#再次检查
firewall-cmd --list-ports

  可以看到10240已经加入防火墙白名单。

在这里插入图片描述

  现在可以在SSMS中测试连接,下图表示连接成功:

在这里插入图片描述

  再次检查端口情况可以看到已经建立连接:

在这里插入图片描述

  至此为止修改端口已经成功,但是这个对常规使用来说确实有点麻烦。

查看和恢复设置

  如果某些原因需要恢复原始设置,可以使用下面命令实现,但是目前只能一个一个恢复,所以在修改之前需要清楚地列出修改项及修改前的值。修改后同样需要重启服务。

#恢复networt.tcpport的值
sudo /opt/mssql/bin/mssql-conf unset network.tcpport

  很多时候我们需要查看设置,那么直接查看/var/opt/mssql/mssql.conf文件即可。如果在这个文件中没有发现的值,意味着就是默认值,换句话说,这个文件中的值就是有可能改动过的(但是并非全部)。比如本机:
在这里插入图片描述

  由于Linux平台没有图形化的配置管理器,所以在Linux上配置SQL Server通常需要命令行方式,配置SQL Server On Linux的方法有几种,除了在数据库内部和上面提到的mssql-conf工具之外,某些配置需要使用环境变量来实现或者配合。接下来演示部分可能平时会用到的配置。但是要注意很多环境变量的配置可以用前面的方式来实现,比如TCP端口、文件默认目录、内存限制等。

使用环境变量配置

  下面演示一下使用环境变量配置前面没有演示的内容,包括SA密码修改、启用SQL Agent。前面使用mssql-conf是使用“set”关键字,而环境变量则使用mssql-conf工具的setup关键字。接下来我们开始演示。

SA密码修改:

  sa作为SQL Server内部最高权限的登录名,作为DBA必须要掌控同时减少可使用该账号的用户数。虽然通过SSMS可以修改,但是万一没有人记住sa的密码且环境只有这个账号可以使用,那么就只能通过外部手段(从OS层)实现。在Windows环境下,通常本机管理员账号(Administrator)已经加入进去,但是在Linux平台则不一定奏效,除非你使用了后续会介绍的集成身份验证,否则只能从Linux层修改SA账号,修改如下。
  但是如果你直接执行下面命令,会看到一个报错:

sudo ACCEPT_EULA='Y' MSSQL_SA_PASSWORD='wBbSr6UbsL'  /opt/mssql/bin/mssql-conf setup

在这里插入图片描述

  需要你停止服务。这就是其中一个环境变量跟mssql-conf使用set来配置的不同之处。我们先停止服务,然后修改。停止后重新执行会提示你选择版本,不管是否加“ACCEPT_EULA=‘Y’”都会提示。这里选择1,接下来就是提醒选择语言。完成之后,会看到下图,同时注意SQL Server已经自己启动了:
在这里插入图片描述

  读者可以自行尝试,sa密码修改成功,这一步其实类似“重置密码”。鉴于上面的操作会有用户交互的情况,所以建议修改时直接使用下面命令,注意替换密码:

sudo ACCEPT_EULA='Y' MSSQL_PID='Evaluation' MSSQL_LCID=1036 MSSQL_SA_PASSWORD='强密码'  /opt/mssql/bin/mssql-conf setup

启用SQL Agent

  不管是Linux还是Windows平台,如果没有在安装过程手动选择启动的话,SQL Agent是默认不启动的,在生产环境下,基本上不存在不使用SQL Agent的情况,因此我们需要把它启用。

在这里插入图片描述

  另外读者可以看到右键是没有启用SQL Agent的功能,所以在Linux上的SQL Server,目前只能通过mssql-conf来启用。

在这里插入图片描述

  跟SA不同,这里不需要停止服务,但是操作后需要重启SQL Server

sudo /opt/mssql/bin/mssql-conf set sqlagent.enabled true 
sudo systemctl restart mssql-server

在这里插入图片描述

  刷新一下SSMS,可以看到SQL Agent已经启动:

在这里插入图片描述

环境变量和mssql-conf

  关于这个问题,并没有官方或者其他资料说明,个人从字里行间的理解认为,对于“初始化配置”,优先选择环境变量。在运行过程中的一些变更,则使用mssql-conf工具。其实mssql-conf工具是调用/opt/mssql/lib/mssql-conf下的多个python文件,但是看源码略微麻烦。暂时先放一下。待以后有精力的时候再细看。
  另外从上面的操作工作量来看环境变量一般略多于mssql-conf,因此它更适合做“初始化”。

在这里插入图片描述

  本文篇幅已经比较多了,就不再演示,在需要用到的时候再使用。在下一篇继续介绍Linux上的配置。

总结

  本文演示了如何使用环境变量和mssql-conf工具进行Linux上的配置以满足SQL Server的合理运行。但是实际上还有很多配置还没讲到,特别是Linux本身的配置。但是站在SQL Server用户的角度来看,现在介绍Linux上的配置和调优有点过早,所以先暂缓一下,接下来打算先介绍一下SQL Server On Linux (2016、2017、2019)上的新特性。注意从2016开始SQL Server已经可以运行在Linux上。

命令总结

文件及文件目录操作

#创建目录
mkdir 
#查看目录权限
ls -l
#授权
chown [owner]:[group] -R /文件

网络

#查看端口
ss -antp|column -t
#查看防火墙配置的端口
firewall-cmd --list-ports
#防火墙放行端口
firewall-cmd --zone=public -add-port=端口号/tcp --permanent
firewall-cmd --reload

信息总结

  1. SQL Server配置信息:/var/opt/mssql/mssql.conf
  2. mssql-conf 执行文件:/opt/mssql/bin/mssql-conf

你可能感兴趣的:(数据库管理,DBA,SQL,Server,跨平台,SQL,on,Linux,SQL,On,Linux)