本人新书上市,请多多关照:《SQL Server On Linux运维实战 2017版从入门到精通》
接上文:SQL Server On Linux(4)——Linux 初步配置
随着数据库的使用时间越来越久,空间问题越显突出。这个时候其中一个手段就是加空间。很多时候是通过加磁盘来实现。在很多规范化的企业里面,有专门的IT人员负责运维服务器,DBA通常只负责管理数据库。但是作为新时代的DBA,有必要了解DB以外的内容。那么下面来演示一下如何在Linux上添加磁盘以满足SQL Server的空间要求。
要添加磁盘,首先要了解当前环境的情况,Linux相对于Windows Server而言这部分不够直观,但是用久了就习惯了。这里我们先使用lsblk
命令来查看所有所有块设备,在前面安装的环境下查看会得出下面的截图。
接下来边实操边做相关的介绍,但是注意不管是Windows还是Linux,其实都有很多知识点,所以不可能讲解太深入,够用就好。
本环境是使用基于Hyper-v的虚拟机,下面先关闭Linux机器。然后在Hyper-v控制台添加磁盘:这里添加3个盘,一个用于数据库文件,一个用于日志文件,一个用于TempDB。不同的虚拟化软件有不同的添加方法,这里仅能演示Hyper-V的添加方法。
分别用SQLDBFiles、SQLLogFiles和SQLTempDBFiles作为实际磁盘文件名称,以便在服务器管理员巡检时不至于误删。同时为了简化,这里全部设置为50GB每个。下面以SQLDBFiles为例。
在添加磁盘后,会有磁盘类型的选择,这里可以选择IDE、SCSI,对于SQL Server磁盘,SCSI会更具有可管理性和性能更佳。在添加过程中,下图的【位置】部分要注意,选择没有显示(使用中)的位置,否则添加会失败。
添加成功后,重启机器,登录进去并执行lvmdiskscan
命令,如果不是使用sudo或者root用户的话,需要提权执行这个命令。可以使用这个命令检查lvm现在看到的磁盘。
从上图中可以看到,有3个50GB的目录,根据Linux驱动命名转换规则, 新磁盘会被标识为sdb/sdc/sdd。
LVM:Logical Volume Manager ,逻辑卷管理器,以物理卷的形式组织存储空间,并分组为一个或多个卷组。这些卷组可以被分割成逻辑卷(logical volume),应用程序可以使用这些逻辑卷来存储数据。跟Windows对驱动器(物理硬盘)、分区和卷所做的操作非常类似。
下一步就是在LVM上创建物理卷(physical volumnes)。
创建物理卷的其中一个方式是使用pvcreate
命令,可以一个一个创建,也可以一起创建,比如下面的例子就是一次性创建物理卷。
pvcreate /dev/sdb /dev/sdc /dev/sdd
接下来使用vgcreate
命令对每个物理卷创建一个卷组(volumn group),以/dev/sdb为例,创建一个卷组名为vg_data01:
vgcreate vg_data01 /dev/sdb
vg_data01这个卷组就是针对/dev/sdb这个物理卷。按同样方法把 剩下两个创建完。
最后就是创建逻辑卷的时候了,使用lvcreate
命令,对每个卷组创建一个逻辑卷。逻辑卷实现了“存储虚拟化”,使得在调整容量过程中,数据可以继续联机等好处。
lvcreate -l 100%FREE vg_data01
使用lsblk
再次检查,可以发现所有卷已经挂载成功。
和Windows一样,分好了逻辑卷之后,还要进行格式化,特别是Linux平台,支持的文件系统类型有很多,SQL Server On Linux目前官方建议是etx4和XFS两种。根据国外专家的建议,ext4是标准的文件系统类型,并且略快于XFS,而XFS提供更多面向服务器的特性,有更好的稳定性,高级日志记录和更好的大文件支持。所以对于数据库这种核心应用,建议使用XFS。
下面使用mkfs.xfs
命令对逻辑卷进行格式化:
mkfs.xfs -f /dev/vg_data01/lvol0
mkfs.xfs -f /dev/vg_log01/lvol0
mkfs.xfs -f /dev/vg_tempdb/lvol0
到这一步,文件系统已经可以使用这些卷了,但是我们需要再做异步,让它们“适应”SQL Server,接下来分别创建三个对应的目录到SQL Server On Linux的默认路径(/var/opt/mssql/data/)下:
mkdir /var/opt/mssql/data/data01
mkdir /var/opt/mssql/data/log01
mkdir /var/opt/mssql/data/tempdb
创建完毕之后进行授权,这个非常重要,因为在Windows上,虽然也有很严格的权限控制,但是就本人过去所在的企业内部,对权限管理都很弱,而Linux上就不一样,很多操作都需要进行授权,在作者一开始做这篇文章的实践时,就出现了很多奇怪的问题。其中一个就是返回系统错误2,就是找不到文件。后来翻了不少资料之后发现可能是mssql这个SQL Server On Linux的默认服务账号权限是否不够,用ls -l
检查了/var/opt/mssql/data之后发现确实是只有root用户及其组才有权限。经过授权之后问题解决。
chown -R mssql:mssql /var/opt/mssql/data01
chown -R mssql:mssql /var/opt/mssql/log01
chown -R mssql:mssql /var/opt/mssql/tempdb
授权之后检查可以看到下图3个红框部分,证明这三个目录已经对mssql用户及其组有足够的权限。
下面这一步虽然非必须,但是很实用,目的是为了让这三个目录在服务器重启之后依旧存在,不需要每次重启都重新配置。需要修改/etc/fstab文件。在文件后面添加下图三行内容:
/dev/vg_tempdb/lvol0 /var/opt/mssql/data/tempdb xfs defaults,nobarrier 1 2
/dev/vg_data01/lvol0 /var/opt/mssql/data/data01 xfs defaults,nobarrier 1 2
/dev/vg_log01/lvol0 /var/opt/mssql/data/log01xfs defaults,nobarrier 1 2
注意不要敲错,本人当时也吧nobarrier敲成novarrier(键盘的b和v相邻),导致系统启动之后只能本机登录,不能使用ssh连接,查找问题过程也是比较痛苦(请体谅本人对Linux的不熟悉)。
下面可以手动或者通过重启来实现挂载新磁盘,然后使用df
命令检查,如下图可见成功创建了三个目录:
如果到这一步都没有任何问题,证明添加磁盘操作已经成功,下面使用T-SQL创建一个测试数据库进行校验,这里把数据文件和日志文件分别放置在上面新创建的目录下面,然后使用sys.database_files检查:
CREATE DATABASE [testdb]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'testdb', FILENAME = N'/var/opt/mssql/data/data01/testdb.mdf' , SIZE = 8192KB , FILEGROWTH = 65536KB )
LOG ON
( NAME = N'testdb_log', FILENAME = N'/var/opt/mssql/data/log01/testdb_log.ldf' , SIZE = 8192KB , FILEGROWTH = 65536KB )
GO
USE testdb
GO
SELECT * FROM sys.database_files
结果如下图:
另外保险起见再用ls
命令检查一下目录内容:
到此为止,这个操作已经基本完成。作为多年来在Windows平台上操作的DBA,并且有专门的运维人员管理服务器,实操完之后感觉确实不容易。但是多操作几次应该就不会有太多的困惑。接下来我们总结一下。
为了实现Linux上的磁盘添加。首先需要在服务器外层(可能是虚拟环境下的虚拟机管理软件,或者物理机的磁盘管理)中添加实际磁盘。磁盘建议使用SCSI。
使用pvcreate命令创建,参数是通过lvmdiskscan
命令获得的信息。为了简便这里使用了同等大小,但是除非你是一个盘全流程完成后再做另外一个,不然可能不容易识别lvmdiskscan中显示的是哪个盘,当然如果盘的性能及大小是等同的就无所谓。如果不是,那么可能要考虑使用不同的空间大小来识别或者一个一个全流程创建。
LVM卷组类似于非LVM系统中的物理硬盘,其由物理卷组成。可以在卷组上创建一个或多个“LVM分区”(逻辑卷),LVM卷组由一个或多个物理卷组成。
卷组使用vgcreate
命令创建。
使用lvcreate
命令创建,逻辑卷创建后需要进行格式化,使用mkfs.xfs
命令实现。
虽然创建逻辑卷以后就可以使用,但是为了避免每次服务器重启都要重新挂载和创建,需要修改/etc/fstab文件。
下一篇我们先介绍一下SQL Server On Linux的配置:SQL Server On Linux(6)—— SQL Server On Linux 安装及配置细节(1)