Ubuntu上SQL Server常见问题及解决方案
安装SQL Server时,常因缺少libldap-2.4-2(LDAP库)、libssl1.1(SSL加密库)等依赖库导致失败,报错示例如error while loading shared libraries: liblber-2.4.so.2。
解决方法:手动下载对应版本的依赖包并安装。例如,libldap-2.4-2可从Deepin社区仓库下载(libldap-2.4-2_2.4.47+dfsg.4-1+eagle_amd64.deb),libssl1.1可从Ubuntu安全仓库下载(libssl1.1_1.1.1-1ubuntu2.1~18.04.23_amd64.deb),使用dpkg -i命令安装后重新运行sudo apt-get install -y mssql-server。
SQL Server 2022在Ubuntu上默认使用TLS 1.3,但部分客户端或网络环境不支持,导致连接超时或加密失败;也可能因证书信任问题无法建立安全连接。
解决方法:
/etc/ssl/openssl.cnf文件,在[system_default_sect]部分添加MinProtocol = TLSv1.2,限制使用TLS 1.2。trustServerCertificate=true参数(如sqlcmd -S server_ip -U sa -P password -Q "SELECT 1" -o output.txt -l 30 -t 10 -N -C -r 1 -b -a 32767 -e -I -H server_ip -k),避免客户端验证服务器证书。若数据库系统文件(如主数据文件、日志文件)配置在非默认路径(如/home目录),可能导致SQL Server无法启动,报错示例如Failed to start Microsoft SQL Server Database Engine。
解决方法:进入单用户模式(sudo /opt/mssql/bin/sqlservr --single-user),使用ALTER DATABASE命令修改系统数据库文件路径至/var/opt/mssql/data(默认路径)。例如:
ALTER DATABASE master MODIFY FILE (NAME = master, FILENAME = '/var/opt/mssql/data/master.mdf');
ALTER DATABASE master MODIFY FILE (NAME = mastlog, FILENAME = '/var/opt/mssql/data/mastlog.ldf');
修改后重启服务:sudo systemctl restart mssql-server。
远程计算机无法连接到SQL Server,常见原因包括:SQL Server未启用远程连接、防火墙未开放1433端口、IPv6禁用导致名称解析失败。
解决方法:
sqlcmd登录SQL Server,执行EXEC sp_configure 'remote access', 1; RECONFIGURE;开启远程访问。ufw防火墙,运行sudo ufw allow 1433/tcp开放端口。cat /proc/cmdline包含ipv6.disable=1),需修改内核参数(编辑/etc/default/grub,删除ipv6.disable=1并更新GRUB),或连接时使用服务器IP地址替代主机名。SQL Server在Ubuntu上运行缓慢,常见原因包括:内存不足(默认分配不足)、磁盘I/O瓶颈(未使用SSD)、查询未优化(全表扫描)、NUMA亲和性未设置。
解决方法:
/etc/sqlserver.conf(或使用mssql-conf命令),设置memory.memorylimitmb参数(建议分配70%-80%的物理内存,最低3.25GB)。.mdf)、日志文件(.ldf)放在SSD上;调整vm.swappiness值(sudo sysctl vm.swappiness=10)减少交换分区使用。SET SHOWPLAN_ALL ON查看查询执行计划,为频繁查询的列创建索引(如CREATE INDEX idx_column ON table_name(column_name));定期更新统计信息(UPDATE STATISTICS table_name)。mssql-conf命令设置cpu.cpuaffinity参数,将SQL Server进程绑定到特定CPU核心,提升多核性能。当SQL Server出现问题时,错误日志是定位问题的关键,但新手常不知如何查看或分析日志。
解决方法:
/var/opt/mssql/log/errorlog,使用tail -f /var/opt/mssql/log/errorlog实时查看最新日志,或cat /var/opt/mssql/log/errorlog | grep -i error过滤错误信息。sqlcmd执行xp_readerrorlog存储过程读取日志(如EXEC xp_readerrorlog 0, 1, N'error'),或使用SQL Server Management Studio(SSMS)的“管理”→“SQL Server日志”功能查看图形化日志。