上一篇说了如何在Linux里安装SQL Server 2017。
这里说一下安装时及安装后一些注意的地方和技巧
关于安装要求里内存的问题
在我安装的时候,第一台使用了2G内存的VPS,但是安装时候提示内存不足2G,不能安装。估计因为部分内存被系统占用,只有1.8G左右。这个检测,也有点傻。查看过网上其他博客上安装文章,要求都是3.5G内存,估计是微软后来改过了吧。这里推荐一篇文章,教你如何破解SQL Server安装内存限制,让你在低于3.5G内存的机器上安装。我没有尝试过,也不知道还是不是适用于现在的版本。步骤比较复杂,有兴趣的童鞋可以试一下。切记,备份数据后再尝试。以免造成不必要的损失。
破解SQLServer for Linux预览版的3.5GB内存限制 (RHEL篇)")
更新:上面这篇文章似乎已经是老版的修改方法。这里我给出一个新版的修改方法,已经试过!
cd /opt/mssql/bin/
# mv sqlservr sqlservr.bak
# python
>>> oldfile = open("sqlservr.bak", "rb").read()
>>> newfile = oldfile.replace("\x00\x94\x35\x77", "\x00\x80\x84\x1e")
>>> open("sqlservr", "wb").write(newfile)
>>> quit()
# chmod +x sqlservr
关于SQL Server Agent的问题
我这里安装完是默认没有开启(XPs disabled)。新版的SQL Server 2017是已经集成了Agent的安装,也就是说装完Server以后,Agent也已经安装上。我们只需打开它就可以了。以下命令请在SQLCMD
中执行
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Agent XPs', 1;
GO
RECONFIGURE
GO
然后修改配置,重启sql服务
sudo /opt/mssql/bin/mssql-conf set sqlagent.enabled true
sudo systemctl restart mssql-server
关于如何更换SQL Server的版本
如果你一开始安装了Evaluation版,现在已经购买了正版的SQL Server,那你需要重新配置SQL,并选择你需要的版本就可以了。重新配之前,请先停止SQL服务
systemctl stop mssql-server
sudo /opt/mssql/bin/mssql-conf setup
附上完整的版本查看命令
1> :setvar SQLCMDMAXVARTYPEWIDTH 35
2> :setvar SQLCMDMAXFIXEDTYPEWIDTH 35
3> SELECT SERVERPROPERTY('productversion') as Version, SERVERPROPERTY ('productlevel') as Level ,SERVERPROPERTY ('edition') as Edition
4> go
更新,回滚及卸载SQL Server。
#更新
sudo yum update mssql-server
#查看SQL Server的版本
sqlcmd -S localhost -U SA -Q 'select @@VERSION'
#回滚
sudo yum downgrade mssql-server-<version_number>.x86_64
#卸载
sudo yum remove mssql-server
关于如何限制IP来使用sa账户登录SQL Server
这里用触发器实现,但是SQL job不使用sa账户登录的,所以对Job无效
# 新建触发器
CREATE TRIGGER connection_limit_trigger ON ALL SERVER WITH EXECUTE AS 'sa' FOR LOGON
AS
BEGIN
DECLARE @ClientHost nvarchar(max);
SELECT @ClientHost = EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]','nvarchar(max)');
IF @ClientHost NOT IN ('' ,'192.168.0.150' ,'192.168.13.250' ,'127.0.0.1' ,'localhost')
ROLLBACK;
END;
# 如果创建了,增加或减少IP(修改)
Alter TRIGGER connection_limit_trigger ON ALL SERVER WITH EXECUTE AS 'sa' FOR LOGON
AS
BEGIN
DECLARE @ClientHost nvarchar(max);
SELECT @ClientHost = EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]','nvarchar(max)');
IF @ClientHost NOT IN ('' ,'192.168.0.150' ,'192.168.13.250' ,'127.0.0.1' ,'localhost')
ROLLBACK;
END;
关于数据同步的问题
这里我还没完成数据同步,先记录两篇博客的文章