当前位置 博文首页 > SQL Server On Linux:基于实际项目案例,总结功能支持情况及相

    SQL Server On Linux:基于实际项目案例,总结功能支持情况及相

    作者:赖天卓水 时间:2021-01-12 06:02

      上个月,有个朋友问我说Sql Sever向Mysql迁移有什么好的经验分享,他们公司客户明确提出不再提供Windows服务器,现在计划Mysql迁移。我说Mysql迁移成本太高了,不妨可以了解一下SQL Server On Linux再做决定。于是,我把之前给运维分享的Word文档发给了他,告诉他,如果可以接受一些不支持的功能,选择成本,风险小的,如果项目中用到的技术知识刚好避开了那些不支持的功能,3~5个小时可以完成一个项目的迁移。我们公司也有案例,在Linux平台上,同时安装了Sqlserver2017和Mysql,旧功能升级Sql Server,新功能用Mysql。

      上周他很高兴的告诉我,他们公司最终选择了SQL Server On Linux,已经完成了一个大项目的升级了,目前使用稳定,项目在正常运行中,他说他今年升职加薪有戏了。后来了解到,他们选择Mysql迁移,是因为他们不知道Sqlserver2017及以上版本也是支持Linxu平台的,于是强烈建议我把内容分享到博客园,让一些人少走一些弯路。

     

    背景

      在过去的20多年中,微软的各大产品靠Windows绑定市场,众多的微软ISV围绕着Windows开发系列产品,形成一个以Windows为核心的生态系统。随着互联网的发展,出现了Google,Facebook,Tencent,Baidu,Alibaba 都是以Linux 操作系统构建的产品生态系统,他们不再是具体的产品,而是提供服务,而且服务所用技术都是开源的,和原来Windows的生态不是同一个维度的世界,微软封闭的生态系统只有慢慢的瓦解。微软也意识到问题的严重性,换了那个称Linux为毒瘤的CEO史蒂夫·鲍尔默,用领导微软云的萨提亚·纳德拉来带领微软走出原来封闭的生态系统,走入开放的云生态系统。

      a)     云计算机会比 Windows 大,Windows占微软的营收越来越少。

      b)     服务器版操作系统市场份额基本是Linux稳占第一把交椅,微软要让自家的数据库市场份额扩大来挤占其他数据库的份额,必然要做出SQL Server on Linux的决定。

    支持的平台

      SQL Server 在 Red Hat Enterprise Linux (RHEL)、SUSE Linux Enterprise Server (SLES) 和 Ubuntu 上受支持。 此外,它也可作为 Docker 映像提供,可在 Linux 上的 Docker 引擎或用于 Windows/Mac 的 Docker 上运行。

    平台

    支持的版本

    Red Hat Enterprise Linux

    7.3、7.4、7.5、7.6、8

    SUSE Linux Enterprise Server

    v12 SP2

    Ubuntu

    16.0418.04

    Docker 引擎

    1.8+

      You need to have at least Ubuntu 16.04 or you will face unmet dependencies problems.

    系统要求

      SQL Server 对 Linux 具有以下系统要求:

    内存:

    2 GB

    文件系统:

    XFS 或 EXT4(其他文件系统均不受支持,如 BTRFS)

    磁盘空间:

    6 GB

    处理器速度:

    2 GHz

    处理器核心数:

    2 个核心

    处理器类型:

    仅兼容 x64

    版本选择

    SQL Server版本

    描述

    企业

    SQL Server Enterprise Edition是高级产品,可提供全面的高端数据中心功能,并具有超快的性能,可为任务关键型工作负载提供高服务水平。可用性组支持总副本(一个主副本,八个辅助副本)

    标准

    SQL Server Standard Edition为部门和小型组织提供了运行其应用程序的基本数据管理,并支持用于内部部署和云的通用开发工具-以最少的IT资源实现有效的数据库管理。

    网页

    SQL Server Web版是Web托管者和Web VAP的总拥有成本低的选项,可为小型到大型Web属性提供可伸缩性,可负担性和可管理性。

    开发者

    SQL Server Developer版本使开发人员可以在SQL Server之上构建任何类型的应用程序。它包含企业版的所有功能,但已获许可用作开发和测试系统,而不用作生产服务器。SQL Server Developer是构建和测试应用程序的人们的理想选择。

    速成版

    Express Edition是入门级的免费数据库,非常适合学习和构建台式机和小型服务器数据驱动的应用程序。对于构建客户端应用程序的独立软件供应商,开发人员和爱好者来说,这是最佳选择。如果需要更高级的数据库功能,则可以将SQL Server Express无缝升级到SQL Server的其他更高端版本。

    Choose an edition of SQL Server:
       1. Evaluation (free, no production use rights, 180-day limit)
       2. Developer (free, no production use rights)
       3. Express (free)
       4. Web (PAID)
       5. Standard (PAID)
       6. Enterprise (PAID)
       7. Enterprise Core (PAID)
       8. I bought a license through a retail sales channel and have a product key to enter.

    脱机安装(推荐使用)

      下面安装以Red Hat为例。

    Wget安装

     yum -y install wget

      已经安装了就跳过此步。

    安装mssql-server

      如果 Linux 计算机无法访问联机存储库,则可以直接下载包文件。 这些包位于 Microsoft 存储库中,地址为 https://packages.microsoft.com

      a)   创建目录下载RPM包

    mkdir -p /opt/sqlserver2017 
    cd /opt/sqlserver2017/
    wget https://packages.microsoft.com/rhel/7/mssql-server-2017/mssql-server-14.0.3048.4-1.x86_64.rpm

           b)   Yum安装mssql-server

    yum localinstall mssql-server-14.0.3048.4-1.x86_64.rpm

      

     配置

    /opt/mssql/bin/mssql-conf setup

      运行 mssql-conf setup,按照提示设置 SA 密码并选择版本。

    • 请确保为 SA 帐户指定强密码(最少 8 个字符,包括大写和小写字母、十进制数字和/或非字母数字符号)。
    • Developer (free, no production use rights)(版本选择2,Developer)

     验证服务

    systemctl status mssql-server
    

      

    服务启停

    systemctl stop mssql-server
    systemctl start mssql-server
    systemctl restart mssql-server

    安装 sqlcmd 和 bcp SQL Server 命令行工具

      a)  下载

    wget https://packages.microsoft.com/rhel/7.3/prod/msodbcsql-13.1.6.0-1.x86_64.rpm
    wget https://packages.microsoft.com/rhel/7.3/prod/mssql-tools-14.0.5.0-1.x86_64.rpm

       b)  安装

    yum localinstall msodbcsql-13.1.6.0-1.x86_64.rpm
    yum localinstall mssql-tools-14.0.5.0-1.x86_64.rpm
    

    添加环境变量

      为方便起见,向 PATH 环境变量添加 /opt/mssql-tools/bin/。 这样可以在不指定完整路径的情况下运行这些工具。 

      运行以下命令以修改登录会话和交互式/非登录会话的路径:

    echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile
    echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
    source ~/.bashrc

    设置远程连接,打开端口

      默认的 SQL Server 端口为 TCP 1433。 如果为防火墙使用的是 FirewallD,则可以使用以下命令:

    sudo firewall-cmd --zone=public --add-port=1433/tcp --permanent
    sudo firewall-cmd --reload

      使用 SQL Server 名称 (-S),用户名 (-U) 和密码 (-P) 的参数运行 sqlcmd 。 用户名为 SA,密码是在安装过程中为 SA 帐户提供的密码。

     sqlcmd -S localhost -U SA -P '<YourPassword>'
     sqlcmd -S 192.168.1.XXX -U userName

      接着输入密码:

    SELECT Name FROM Master..SysDatabases ORDER BY Name
    SELECT Name FROM Sys.Databases ORDER BY Name
    go

      此时可以用Navicat或者SqlServer2017验证连接情况。

    安装设置Agent(SQL Server代理)

      SQL Server Agent 也叫SQL Server代理,以前称为SQL执行者,这是SQL Server的任务日程表。

      这种服务主要是用于在设定的时间备份、复制数据,以及在自动执行调度表上设置的其他项目。启动这个服务后,设定好在什么时候做什么事,这个服务会让它自动运行,不需要人工干预。

      a)  下载

    wget https://packages.microsoft.com/rhel/7/mssql-server-2017/mssql-server-agent-14.0.3015.40-1.x86_64.rpm

      b)  安装

    yum localinstall mssql-server-agent-14.0.3015.40-1.x86_64.rpm

      c)  启用代理(作业)

      使用 sqlagent.enabled 设置可启用 SQL Server 代理。 默认情况下,SQL Server 代理处于禁用状态。 如果 mssql.conf 设置文件中不存在 sqlagent.enabled,则 SQL Server 在内部假定已禁用 SQL Server 代理。若要更改此设置,请使用以下步骤:

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

      d)  代理错误日志设置

      sqlpagent.errorlogfile 和 sqlpagent.errorlogginglevel 设置允许你分别设置 SQL 代理日志文件路径和日志记录级别。

      sudo /opt/mssql/bin/mssql-conf set sqlagent.errorfile <path>

      SQL 代理日志记录级别是位掩码值,等于:

      1 = 错误

      2 = 警告

      4 = 信息

      如果要捕获所有级别,请使用 7 作为值。

     sudo /opt/mssql/bin/mssql-conf set sqlagent.errorlogginglevel 7

    设置默认语言与排序规则

      a)   若要获取支持的排序规则的列表,请运行 sys.fn_helpcollations 函数

    SELECT NAME FROM SYS.FN_HELPCOLLATIONS()

      b)   如果安装时没有指定环境变量参数,会按默认设置安装,字符集会是拉丁字符集,默认语言是英语,此时中国用户需要进行另外设置。

    systemctl stop mssql-server
    /opt/mssql/bin/mssql-conf set-collation
    Chinese_PRC_CI_AS

      c)   可以通过预先设置环境变量来按照指定的字符集及本地语言等设置参数,这样的话无需安装后再进行配置。

    MSSQL_LCID='2052' MSSQL_COLLATION='Chinese_PRC_CI_AS'
    /opt/mssql/bin/mssql-conf setup

      d)   查询当前排序规则

    select serverproperty('Collation')

    设置内存限制

      使用 memory.memorylimitmb 设置可控制 SQL Server 可用的物理内存量(以 MB 为单位)。 默认值为物理内存的80%。(我们根据情况而定,更改此设置时,不要将此值设置得太高。 如果不留出足够的内存,则可能会遇到 Linux 操作系统和其他 Linux 应用程序的问题)

      a)   使用 memory.memorylimitmb 的 set 命令以根用户身份运行 mssql-conf 脚本 。 以下示例将 SQL Server 可用的内存更改为 3.25 GB (3328 MB)。

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

      b)   重启 SQL Server 服务以应用更改

    sudo systemctl restart mssql-server
    

    更改TCP端口

      使用 network.tcpport 设置可更改 SQL Server 侦听连接的 TCP 端口。 默认情况下,此端口设置为 1433。 若要更改端口,请运行以下命令:

      a)  使用“network.tcpport”的“set”命令以根用户身份运行mssql-conf 脚本

    sudo /opt/mssql/bin/mssql-conf set network.tcpport <new_tcp_port>

      b)  重启 SQL Server 服务

    sudo systemctl restart mssql-server

      c)  连接到 SQL Server 后,必须在主机名或 IP 地址后用逗号 (,) 指定自定义端口。 

      例如,要使用 SQLCMD 进行连接:

      sqlcmd -S localhost,<new_tcp_port> -U test -P test

    # iptables -A INPUT -p tcp --dport 1433 -j ACCEPT
    # iptables-save > /etc/sysconfig/iptables
    # firewall-cmd --add-port=1433/tcp --permanent
    # firewall-cmd --reload

    更改默认数据或日志目录位置

      使用 filelocation.defaultdatadir 和 filelocation.defaultlogdir 设置可更改创建新数据库和日志文件的位置 。 默认情况下,此位置为 /var/opt/mssql/data。 若要更改这些设置,请使用以下步骤:

      a)   为新的数据库数据和日志文件创建目标目录。 以下示例创建一个新的/mssql/data目录

    mkdir -p /mssql/data

      b)   将目录的所有者和组更改为 mssql 用户

      数据目录的上一级目录必须设置mssql用户才会有权限!!!!(与Mysql的不同)

    sudo chown mssql /mssql
    sudo chgrp mssql /mssql
    sudo chown mssql /mssql/data
    sudo chgrp mssql /mssql/data

      c)   使用 mssql-conf 通过 set 命令更改默认数据目录

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

      现在,为新数据库创建的所有数据库文件都将存储在此新位置。 

      d)   更改新数据库的日志文件 (.ldf) 位置,可以使用下面的“set”命令

    mkdir -p /mssql/mssqllog
    sudo chown mssql /mssql/mssqllog
    sudo chgrp mssql /mssql/mssqllog
    sudo /opt/mssql/bin/mssql-conf set filelocation.defaultlogdir /mssql/mssqllog  

      e)   重启 SQL Server 服务

    sudo systemctl restart mssql-server

    更改默认转储目录位置

      使用 filelocation.defaultdumpdir 设置可更改每当系统崩溃时生成内存和 SQL 转储的默认位置。 默认情况下,这些文件在 /var/opt/mssql/log 中生成。

      若要设置新位置,请使用以下命令:

      a)   新的转储文件创建目标目录。 以下示例创建一个新的 /mssql/mssqldump 目录

    sudo mkdir /mssql/mssqldump

      b)   将目录的所有者和组更改为 mssql 用户

    sudo chown mssql /mssql/mssqldump
    sudo chgrp mssql /mssql/mssqldump

      c)   使用 mssql-conf 通过 set 命令更改默认数据目录

    sudo /opt/mssql/bin/mssql-conf set filelocation.defaultdumpdir /mssql/mssqldump

      d)   重启 SQL Server 服务

    sudo systemctl restart mssql-server

    启用可用性组(默认不用开启)

      使用 hadr.hadrenabled 选项可在 SQL Server 实例上启用可用性组。 下面的命令通过将 hadr.hadrenabled 设置为 1 来启用可用性组。 必须重启 SQL Server,该设置才能生效。

    sudo /opt/mssql/bin/mssql-conf set hadr.hadrenabled  1
    sudo systemctl restart mssql-server
    

    验证创建库

      a)   创建创建库的存储过程,如有这个存储过程就不用创建了。

    CREATE PROCEDURE [dbo].[PROC_CREATE_DB]
        @DB_NAME  varchar(100),
        @data_path_root varchar(256) = 'D:\DBData\' --'/mssql/data/'
    AS
    BEGIN
        IF DB_ID (@DB_NAME) IS NOT NULL
        EXECUTE ('DROP DATABASE ' + @DB_NAME)
        
        -- execute the CREATE DATABASE statement 
        EXECUTE ('CREATE DATABASE ' + @DB_NAME + '
        ON 
        ( NAME = '''+ @DB_NAME +''',
            FILENAME = '''+ @data_path_root + @DB_NAME + '.mdf'',
            SIZE = 500,
            MAXSIZE = UNLIMITED,
            FILEGROWTH = 500 )
        LOG ON
        ( NAME = '''+ @DB_NAME +'_log'',
            FILENAME = '''+ @data_path_root + @DB_NAME + '_log.ldf'',
            SIZE = 50MB,
            MAXSIZE = UNLIMITED,
            FILEGROWTH = 50 )'
        )
        EXECUTE ('ALTER DATABASE ' + @DB_NAME  + ' SET RECOVERY SIMPLE')
    END 

      b)   执行创建库的存储过程,注意路径

    EXEC PROC_CREATE_DB '库名','/mssql/data/'  --库名、路径

    查询当前时间

      如果与当前时间不符,则需要修改系统时间:

    clock --set --date="2020-10-19 19:30:39"
    clock –hctosys
    select GETDATE()

      如果一台服务器同时部署了mysql,则修改时间后要去mysql查询当前时间

    select now()

     

    创建用户并分配权限

      需要SA用户登录才有权限设置。

      a)   应用程序和管理人员账号

      Linux上的SQL Server不支持ADMINISTER BULK OPERATIONS权限或bulkadmin角色。只有sysadmin可以在Linux上对SQL Server执行批量插入。

      sysadmin读写权限比较高,专门给系统相关程序或管理员使用,不得通过任何人为方式使用。

    DECLARE @loginName VARCHAR(50) = '用户名'
    DECLARE @loginPassword VARCHAR(50) = '密码'
    IF EXISTS(SELECT 1 FROM sys.syslogins WHERE name = @loginName)
    BEGIN
    	PRINT '登录名【' + @loginName + '】已存在。'
    	RETURN
    END
    
    DECLARE @sql VARCHAR(8000)
    SET @sql = 'CREATE LOGIN ' + @loginName + ' WITH PASSWORD = ''' + @loginPassword + ''''
    EXEC(@sql) 
    --分配角色
    EXEC sys.sp_addsrvrolemember @rolename = 'sysadmin', @loginame = @loginName

      所以,如果是部署在Windows的话,程序账户用bulkadmin、dbcreator。建议不用sysadmin。

    EXEC sys.sp_addsrvrolemember @rolename = 'bulkadmin', @loginame = @loginName
    EXEC sys.sp_addsrvrolemember @rolename = 'dbcreator', @loginame = @loginName

    删除用户(不要手贱!)

      a)      在删除该登录名之前,请更改相应数据库的所有者。

    USE [SLSW_YN]; 
    EXEC dbo.sp_changedbowner @loginame = N'sa', @map = false;

      @map: 将别名及其权限移交给新的数据库所有者

      找到对应用户所拥有的数据库权限,并转给其他用户,如SA用户。

    SELECT 'use ['+A.NAME+']; exec dbo.sp_changedbowner @loginame = N''sa'', @map = false; '
    FROM SYS.DATABASES A
    INNER JOIN SYS.SYSLOGINS B ON A.OWNER_SID=B.SID
    WHERE B.NAME='用户名'

      b)   执行a)产生的所有SQL语句

        c)   杀掉账号所有线程再删除账号(不杀的话,禁用以后,原来打开的进程依然可以运行)

    CREATE PROC [dbo].[PROC_mgr_login_process_kill_all]
    @loginName VARCHAR(255)
    AS
    BEGIN
    DECLARE @processes TABLE
    (
    ID INT IDENTITY(1, 1),
    spid INT,
    ecid INT,
    status VARCHAR(50),
    loginname VARCHAR(255),
    hostname VARCHAR(255),
    blk INT,
    dbname VARCHAR(255),
    cmd VARCHAR(8000),
    request_id INT
    )
    
    DECLARE @sql VARCHAR(8000)
    SET @sql = 'EXEC sp_who ''' + @loginName + ''''
    
    INSERT INTO @processes
    (
    spid,
    ecid,
    status,
    loginname,
    hostname,
    blk,
    dbname,
    cmd,
    request_id
    )
    EXEC(@sql)
    
    DECLARE @iLoop INT
    DECLARE @totalCount INT
    
    SELECT @iLoop = 1,
    @totalCount = COUNT(*)
    FROM @processes
    
    WHILE @iLoop <= @totalCount
    BEGIN
    DECLARE @spid INT
    SELECT @spid = spid FROM @processes WHERE ID = @iLoop
    
    SET @sql = 'KILL ' + CAST(@spid AS VARCHAR(20))
    EXEC(@sql)
    
    SET @iLoop += 1
    END
    EN

     

    EXEC MTNOH_AAA_DB.[dbo].[PROC_mgr_login_process_kill_all] '用户名';
    EXEC sys.sp_droplogin @loginame = '用户名';
    

    mssql.conf格式配置

      类似mysql的etc/my.cnf

      /var/opt/mssql/mssql.conf文件提供了每个设置的示例

      cat /var/opt/mssql/mssql.conf

    在线安装

    CU20 起,SQL Server 2017 开始支持 RHEL 8 以下用于 SQL Server 2017 的命令指向 RHEL 8 存储库。 RHEL 8 未预安装 SQL Server 所需的 python2 在开始 SQL Server 的安装步骤之前,请执行以下命令,并验证是否选择了 python2 作为解释器:

    sudo alternatives --config python
    # If not configured, install python2 and openssl10 using the following commands:
    sudo yum install python2
    sudo yum install compat-openssl10
    # Configure python2 as the default interpreter using this command:
    sudo alternatives --config python

      有关详细信息,请参阅以下博客,了解如何安装 python2 并将其配置为默认解释器: https://www.redhat.com/en/blog/installing-microsoft-sql-server-red-hat-enterprise-linux-8-beta 

      如果使用 RHEL 7,请将以下路径更改为 /rhel/7 而不是 /rhel/8

    安装mssql-server

    下一篇:没有了