-
SQL Server On Linux:基于实际项目案例,总结功能支持情况及相关问题解决方案
上个月,有个朋友问我说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.04、18.04 |
Docker 引擎 | 1.8+ |
系统要求
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的其他更高端版本。 |
1
2
3
4
5
6
7
8
9
|
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.coma) 创建目录下载RPM包
1
2
3
|
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 |
1
|
yum localinstall mssql-server-14.0.3048.4-1.x86_64.rpm |
配置
1
|
/opt/mssql/bin/mssql-conf setup |
- 请确保为 SA 帐户指定强密码(最少 8 个字符,包括大写和小写字母、十进制数字和/或非字母数字符号)。
- Developer (free, no production use rights)(版本选择2,Developer)
验证服务
1
|
systemctl status mssql-server |
服务启停
1
2
3
|
systemctl stop mssql-server systemctl start mssql-server systemctl restart mssql-server |
安装 sqlcmd 和 bcp SQL Server 命令行工具
a) 下载
1
2
|
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 |
1
2
|
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
SA
,密码是在安装过程中为 SA 帐户提供的密码。sqlcmd -S localhost -U SA -P '<YourPassword>' sqlcmd -S 192.168.1.XXX -U userName
1
2
3
|
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) 下载
1
|
wget https: //packages.microsoft.com/rhel/7/mssql-server-2017/mssql-server-agent-14.0.3015.40-1.x86_64.rpm |
1
|
yum localinstall mssql-server-agent-14.0.3015.40-1.x86_64.rpm |
使用 sqlagent.enabled 设置可启用 SQL Server 代理。 默认情况下,SQL Server 代理处于禁用状态。 如果 mssql.conf 设置文件中不存在 sqlagent.enabled,则 SQL Server 在内部假定已禁用 SQL Server 代理。若要更改此设置,请使用以下步骤:
1
2
|
sudo /opt/mssql/bin/mssql-conf set sqlagent.enabled true sudo systemctl restart mssql-server |
sqlpagent.errorlogfile 和 sqlpagent.errorlogginglevel 设置允许你分别设置 SQL 代理日志文件路径和日志记录级别。
sudo /opt/mssql/bin/mssql-conf set sqlagent.errorfile <path>
SQL 代理日志记录级别是位掩码值,等于:
1 = 错误
2 = 警告
4 = 信息
如果要捕获所有级别,请使用
7
作为值。
1
|
sudo /opt/mssql/bin/mssql-conf set sqlagent.errorlogginglevel 7 |
设置默认语言与排序规则
a) 若要获取支持的排序规则的列表,请运行 sys.fn_helpcollations 函数SELECT NAME FROM SYS.FN_HELPCOLLATIONS()
b) 如果安装时没有指定环境变量参数,会按默认设置安装,字符集会是拉丁字符集,默认语言是英语,此时中国用户需要进行另外设置。
1
2
3
|
systemctl stop mssql-server /opt/mssql/bin/mssql-conf set -collation Chinese_PRC_CI_AS |
MSSQL_LCID='2052' MSSQL_COLLATION='Chinese_PRC_CI_AS' /opt/mssql/bin/mssql-conf setup
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
1
|
sudo systemctl restart mssql-server |
更改TCP端口
使用 network.tcpport 设置可更改 SQL Server 侦听连接的 TCP 端口。 默认情况下,此端口设置为 1433。 若要更改端口,请运行以下命令:a) 使用“network.tcpport”的“set”命令以根用户身份运行mssql-conf 脚本
1
|
sudo /opt/mssql/bin/mssql-conf set network.tcpport <new_tcp_port> |
1
|
sudo systemctl restart mssql-server |
例如,要使用 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
数据目录的上一级目录必须设置mssql用户才会有权限!!!!(与Mysql的不同)
1
2
3
4
|
sudo chown mssql /mssql sudo chgrp mssql /mssql sudo chown mssql /mssql/data sudo chgrp mssql /mssql/data |
sudo /opt/mssql/bin/mssql-conf set filelocation.defaultdatadir /mssql/data
d) 更改新数据库的日志文件 (.ldf) 位置,可以使用下面的“set”命令
1
2
3
4
|
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 |
sudo systemctl restart mssql-server
更改默认转储目录位置
使用 filelocation.defaultdumpdir 设置可更改每当系统崩溃时生成内存和 SQL 转储的默认位置。 默认情况下,这些文件在 /var/opt/mssql/log 中生成。若要设置新位置,请使用以下命令:
a) 新的转储文件创建目标目录。 以下示例创建一个新的 /mssql/mssqldump 目录
1
|
sudo mkdir /mssql/mssqldump |
1
2
|
sudo chown mssql /mssql/mssqldump sudo chgrp mssql /mssql/mssqldump |
1
|
sudo /opt/mssql/bin/mssql-conf set filelocation.defaultdumpdir /mssql/mssqldump |
1
|
sudo systemctl restart mssql-server |
启用可用性组(默认不用开启)
使用 hadr.hadrenabled 选项可在 SQL Server 实例上启用可用性组。 下面的命令通过将 hadr.hadrenabled 设置为 1 来启用可用性组。 必须重启 SQL Server,该设置才能生效。
1
2
|
sudo /opt/mssql/bin/mssql-conf set hadr.hadrenabled 1 sudo systemctl restart mssql-server |
验证创建库
a) 创建创建库的存储过程,如有这个存储过程就不用创建了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
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 |
1
|
EXEC PROC_CREATE_DB '库名' , '/mssql/data/' --库名、路径 |
查询当前时间
如果与当前时间不符,则需要修改系统时间:
1
2
|
clock -- set --date= "2020-10-19 19:30:39" clock –hctosys |
select GETDATE()
如果一台服务器同时部署了mysql,则修改时间后要去mysql查询当前时间
1
|
select now() |
创建用户并分配权限
需要SA用户登录才有权限设置。a) 应用程序和管理人员账号
Linux上的SQL Server不支持ADMINISTER BULK OPERATIONS权限或bulkadmin角色。只有sysadmin可以在Linux上对SQL Server执行批量插入。
sysadmin读写权限比较高,专门给系统相关程序或管理员使用,不得通过任何人为方式使用。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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 |
1
2
|
EXEC sys.sp_addsrvrolemember @rolename = 'bulkadmin' , @loginame = @loginName EXEC sys.sp_addsrvrolemember @rolename = 'dbcreator' , @loginame = @loginName |
删除用户(不要手贱!)
a) 在删除该登录名之前,请更改相应数据库的所有者。
1
2
|
USE [SLSW_YN]; EXEC dbo.sp_changedbowner @loginame = N 'sa' , @map = false ; |
找到对应用户所拥有的数据库权限,并转给其他用户,如SA用户。
1
2
3
4
|
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 = '用户名' |
c) 杀掉账号所有线程再删除账号(不杀的话,禁用以后,原来打开的进程依然可以运行)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
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 |
1
2
|
EXEC 库名.[dbo].[PROC_mgr_login_process_kill_all] '用户名' ; EXEC sys.sp_droplogin @loginame = '用户名' ; |
mssql.conf格式配置
类似mysql的etc/my.cnf/var/opt/mssql/mssql.conf文件提供了每个设置的示例
1
|
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 作为解释器:
1
2
3
4
5
6
|
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 |
如果使用 RHEL 7,请将以下路径更改为 /rhel/7 而不是 /rhel/8。
安装mssql-server
下载SQL Server 2017 Red Hat 存储库配置文件并安装
1
2
|
sudo curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/8/mssql-server-2019.repo sudo yum install -y mssql-server |
1
2
|
sudo curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/8/mssql-server-2019.repo sudo yum install -y mssql-server |
配置
1
|
/opt/mssql/bin/mssql-conf setup |
安装 sqlcmd 和 bcp SQL Server 命令行工具
下载 Microsoft Red Hat 存储库配置文件
1
|
sudo curl -o /etc/yum.repos.d/msprod.repo https://packages.microsoft.com/config/rhel/8/prod.repo |
sudo yum remove unixODBC-utf16 unixODBC-utf16-devel
1
|
sudo yum install -y mssql-tools unixODBC-devel |
其他参考脱机安装章节
无人参与安装
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
#!/bin/bash -e # Use the following variables to control your install: # Password for the SA user (required) MSSQL_SA_PASSWORD= '<YourStrong!Passw0rd>' # Product ID of the version of SQL server you 're installing # Must be evaluation, developer, express, web, standard, enterprise, or your 25 digit product key # Defaults to developer MSSQL_PID=' evaluation ' # Install SQL Server Agent (recommended) SQL_ENABLE_AGENT=' y ' # Install SQL Server Full Text Search (optional) # SQL_INSTALL_FULLTEXT=' y ' # Create an additional user with sysadmin privileges (optional) # SQL_INSTALL_USER=' <Username> ' # SQL_INSTALL_USER_PASSWORD=' <YourStrong!Passw0rd> ' if [ -z $MSSQL_SA_PASSWORD ] then echo Environment variable MSSQL_SA_PASSWORD must be set for unattended install exit 1 fi echo Adding Microsoft repositories... sudo curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/7/mssql-server-2017.repo sudo curl -o /etc/yum.repos.d/msprod.repo https://packages.microsoft.com/config/rhel/7/prod.repo echo Installing SQL Server... sudo yum install -y mssql-server echo Running mssql-conf setup... sudo MSSQL_SA_PASSWORD=$MSSQL_SA_PASSWORD \ MSSQL_PID=$MSSQL_PID \ /opt/mssql/bin/mssql-conf -n setup accept-eula echo Installing mssql-tools and unixODBC developer... sudo ACCEPT_EULA=Y yum install -y mssql-tools unixODBC-devel # Add SQL Server tools to the path by default: echo Adding SQL Server tools to your path... echo PATH="$PATH:/opt/mssql-tools/bin" >> ~/.bash_profile echo ' export PATH= "$PATH:/opt/mssql-tools/bin" ' >> ~/.bashrc source ~/.bashrc # Optional Enable SQL Server Agent : if [ ! -z $SQL_ENABLE_AGENT ] then echo Enable SQL Server Agent... sudo /opt/mssql/bin/mssql-conf set sqlagent.enabled true sudo systemctl restart mssql-server fi # Optional SQL Server Full Text Search installation: if [ ! -z $SQL_INSTALL_FULLTEXT ] then echo Installing SQL Server Full-Text Search... sudo yum install -y mssql-server-fts fi # Configure firewall to allow TCP port 1433: echo Configuring firewall to allow traffic on port 1433... sudo firewall-cmd --zone=public --add-port=1433/tcp --permanent sudo firewall-cmd --reload # Example of setting post-installation configuration options # Set trace flags 1204 and 1222 for deadlock tracing: #echo Setting trace flags... #sudo /opt/mssql/bin/mssql-conf traceflag 1204 1222 on # Restart SQL Server after making configuration changes: echo Restarting SQL Server... sudo systemctl restart mssql-server # Connect to server and get the version: counter=1 errstatus=1 while [ $counter -le 5 ] && [ $errstatus = 1 ] do echo Waiting for SQL Server to start... sleep 5s /opt/mssql-tools/bin/sqlcmd \ -S localhost \ -U SA \ -P $MSSQL_SA_PASSWORD \ -Q "SELECT @@VERSION" 2>/dev/null errstatus=$? ((counter++)) done # Display error if connection failed: if [ $errstatus = 1 ] then echo Cannot connect to SQL Server, installation aborted exit $errstatus fi # Optional new user creation: if [ ! -z $SQL_INSTALL_USER ] && [ ! -z $SQL_INSTALL_USER_PASSWORD ] then echo Creating user $SQL_INSTALL_USER /opt/mssql-tools/bin/sqlcmd \ -S localhost \ -U SA \ -P $MSSQL_SA_PASSWORD \ -Q "CREATE LOGIN [$SQL_INSTALL_USER] WITH PASSWORD=N' $SQL_INSTALL_USER_PASSWORD', DEFAULT_DATABASE=[master], CHECK_EXPIRATION= ON , CHECK_POLICY= ON ; ALTER SERVER ROLE [sysadmin] ADD MEMBER [$SQL_INSTALL_USER]" fi echo Done! |
检查已安装的 SQL Server 版本
若要验证 Linux 上的 SQL Server 的当前版本和版本,请先安装 SQL Server 命令行工具。使用“sqlcmd”运行显示 SQL Server 版本的 Transact-SQL 命令。
1
|
sqlcmd -S localhost -U SA -Q 'select @@VERSION' |
1
|
select @@VERSION |
1
|
SELECT SERVERPROPERTY( 'Edition' ) |
卸载
若要删除 Linux 上的“mssql-server”包,不同平台命令会不一样:平台 | 包删除命令 |
RHEL | sudo yum remove mssql-server |
SLES | sudo zypper remove mssql-server |
Ubuntu | sudo apt-get remove mssql-server |
1
|
sudo rm -rf / var /opt/mssql/ |
更新或升级
若要将“mssql-server”包更新到最新版本,请根据你的平台使用以下命令之一:平台 | 包更新命令 |
RHEL | sudo yum update mssql-server |
SLES | sudo zypper update mssql-server |
Ubuntu |
sudo apt-get update sudo apt-get install mssql-server |
/opt/mssql/
下的二进制文件。 此操作不会影响到用户生成的数据库和系统数据库。 若要升级 SQL Server,请首先将配置的存储库更改为所需的 SQL Server 版本。
然后使用同一个 update 命令升级 SQL Server 版本。
存储库的作用:用于获取数据库引擎包、mssql-server 以及相关 SQL Server 包 。
现有五个主要存储库:
存储库 | 名称 | 说明 |
2019 | mssql-server-2019 | SQL Server 2019 累积更新 (CU) 存储库。 |
2019 GDR | mssql-server-2019-gdr | SQL Server 2019 GDR 存储库仅用于关键更新。 |
2019 预览版 | mssql-server-preview |
SQL Server 2019 预览版和 RC 存储库。 |
2017 | mssql-server-2017 | SQL Server 2017 累积更新 (CU) 存储库。 |
2017 GDR | mssql-server-2017-gdr | SQL Server 2017 GDR 存储库仅用于关键更新。 |
回滚
若要将 SQL Server 回滚或降级到以前的版本,请使用以下步骤:a)标识要降级到的 SQL Server 包的版本号。 有关包版本号的列表,请参阅发行说明。
b)降级到 SQL Server 的早期版本。 在以下命令中,将
<version_number>
替换为步骤 1 中标识的 SQL Server 版本号。平台 | 包更新命令 |
RHEL | sudo yum downgrade mssql-server-<version_number>.x86_64 |
SLES | sudo zypper install --oldpackage mssql-server=<version_number> |
Ubuntu |
sudo apt-get install mssql-server=<version_number> sudo systemctl start mssql-server |
功能支持情况
相比Windows,Linux会有些功能不完全支持。类别 | Windows | Linux | 说明 |
表 | √ | √ | |
SQL基础语法 | √ | √ | |
存储过程 | √ | √ | |
函数 | √ | √ | 包括CLR函数。不支持设置了EXTERNAL_ACCESS或UNSAFE权限的CLR程序集 |
索引 | √ | √ | |
作业 | √ | √ | |
视图 | √ | √ | |
事务 | √ | √ | |
数据库分区 | √ | √ | |
链接服务器 | √ | √ | 只支持SQLServer链接服务器,不支持Mysql。低版本连接高版本会出现部分问题 |
系统表 | √ | √ | |
备份、还原 | √ | √ | |
调用bat | √ | × | 旧版本工单创建、更新会用到 |
BCP | √ | × | xp_cmdshell、bulk insert,数据库入库会乱码 |
文件操作 | √ | × | xp_cmdshell、bulk insert,数据库入库会乱码 |
维护计划 | √ | × |
整库迁移
把Sqlserver2008(Windows)的数据库迁移到Sqlserver2017(Linux)a) 从Sqlserver2008(Windows)备份
1
2
3
4
5
6
7
8
9
|
SELECT 'BACKUP DATABASE ' + name + ' TO DISK = N' '' + 'D:' + '\' + name + ' .bak '' WITH COMPRESSION,NOFORMAT, NOINIT, NAME = N '' ' + name + ' -完整 数据库 备份 '' , SKIP, NOREWIND, NOUNLOAD, STATS = 10 ' FROM SYS.DATABASES WHERE NAME IN (' 库名1 ',' 库名2') ORDER BY NAME |
b) 在Sqlserver2017(Linux)还原
1
2
3
4
5
6
7
|
exec PROC_CREATE_DB '库名' , '/mssql/data/' RESTORE DATABASE 库名 FROM DISK = '/home/slddsw1009/SLDDSW.bak' WITH MOVE '库名' TO '/home/mssqldata/SLDDSW.mdf' , MOVE '库名_log' TO '/home/mssqldata/SLDdSW.ldf' , STATS = 1, REPLACE , RECOVERY GO |
恢复数据库时出现Exclusive access could not be obtained because the database is in use错误,那是因为库正在使用。
运行以下query语句将数据库离线(把[db_name]替换成你的数据库名,下同)
1
2
|
use master alter database [db_name] set offline with rollback immediate |
RESTORE DATABASE SLSW FROM DISK = '/home/slddsw1009//SLDDSW.bak' WITH MOVE '库名' TO '/home/mssqldata/SLDDSW.mdf', MOVE '库名_log' TO '/home/mssqldata/SLDDSW.ldf', STATS = 1, REPLACE, RECOVERY GO
use master alter database [db_name] set online with rollback immediate;
备份路径要有mssql用户的权限
1
2
3
|
mkdir -p /home/mssqlbackup chown mssql /home/mssqlbackup chgrp mssql /home/mssqlbackup |
1
2
3
|
BACKUP DATABASE TestDB TO DISK = N '/home/mssqlbackup/TestDB.bak' WITH COMPRESSION,NOFORMAT, NOINIT, NAME = N 'TestDB_BACKUP' , SKIP, NOREWIND, NOUNLOAD, STATS = 10 |
已知问题
a) 安装SQL Server的主机名的长度必须为15个字符或更少解决方法:将/ etc / hostname中的名称更改为15个字符以下的长度。
b) 手动将系统时间倒退设置为时间会导致SQL Server停止更新SQL Server中的内部系统时间
解决方法:重新启动SQL Server。
c) 仅支持单实例安装
建议在主机上运行多个容器以具有多个不同的实例。使用docker可以轻松实现这一点,但是每个容器都需要侦听不同的端口
d) Linux上不支持用户权限ADMINISTER BULK OPERATIONS(bulkadmin服务器角色)
e) SQLServer和相关工具目前不支持在Windows 10上运行的Linux
f) SQL Server数据和日志目录不支持符号链接
g) 重置系统管理(SA)密码
1
2
3
|
sudo systemctl stop mssql-server sudo /opt/mssql/bin/mssql-conf setup sqlcmd -S myserver -U sa -P Test\$\$ |
https://tldp.org/LDP/abs/html/special-chars.html(特殊字符)
2017新函数,让人眼前一亮的特性,有时间再补测试用例了。
Translate 函数(实现批量替换)
string_agg函数(分组合并字符串)
trim函数(移除左右空格、指定字符)
string_split函数(拆分字符串)
数据转成JSON格式(2016特性)
出处:https://www.cnblogs.com/camelliabloglyf/p/14262631.html
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式