对 Linux 上的 SQL Server 进行故障排除

适用于:SQL Server - Linux

本文介绍如何对 Linux 上或 Linux 容器中运行的 SQL Server 进行故障排除。 在对 Linux 上的 SQL Server 进行故障排除时,请记得查看 Linux 上的 SQL Server 2017 发行说明中的支持功能和已知限制。

有关常见问题的解答,请参阅 Linux 上的 SQL Server 常见问题解答

排查连接失败

如果在连接到 Linux SQL Server 时存在问题,可以检查以下几点。

  • 如果无法使用 localhost 进行本地连接,请尝试改用 IP 地址 127.0.0.1。 localhost 可能未正确映射到此地址。

  • 验证是否可从客户端计算机访问服务器名称或 IP 地址。

    提示

    若要查找 Ubuntu 计算机的 IP 地址,可运行 ifconfig 命令,如以下示例所示:

    sudo ifconfig eth0 | grep 'inet addr'
    

    对于 Red Hat,可使用 ip addr 命令,如以下示例所示:

    sudo ip addr show eth0 | grep "inet"
    

    但如果是 Azure VM,则此方法不适用。 对于 Azure VM,请在 Azure 门户中查找 VM 的公共 IP

  • 如果适用,请检查是否已在防火墙上打开了 SQL Server 端口(默认为 1433)。

  • 对于 Azure VM,请检查是否有默认 SQL Server 端口的网络安全组规则

  • 验证用户名和密码是否存在任何拼写错误、多余空格或错误大小写。

  • 尝试以显式方式设置协议和端口号,确保服务器名称如下所示:tcp:servername,1433

  • 网络连接问题也可能导致连接错误和超时。 验证连接信息和网络连接后,请再次尝试连接。

管理 SQL Server 服务

以下部分演示如何管理 SQL Server Docker 容器的执行。 若要管理 Linux 的服务,请参阅在 Linux 上启动、停止和重启 SQL Server 服务

管理 SQL Server Docker 容器的执行

通过运行以下命令,可以获得最新创建的 SQL Server Docker 容器的状态和容器 ID(ID 位于 CONTAINER ID 列下):

sudo docker ps -l

可根据需要使用以下命令停止或重启 SQL Server 服务:

sudo docker stop <container ID>
sudo docker restart <container ID>

提示

有关 Docker 的更多故障排除提示,请参阅 SQL Server Docker 容器故障排除

访问日志文件

SQL Server 数据库引擎在 Linux 和容器安装的 /var/opt/mssql/log/errorlog 文件中进行记录。 需要启用“超级用户”模式才能浏览此目录。

安装程序在此处记录:/var/opt/mssql/setup-<time stamp representing time of install>。可使用任何 UTF-16 兼容工具(如“vim”或“cat”)浏览错误日志文件,如下所示:

sudo cat errorlog

如果愿意,还可以使用以下命令将文件转换为 UTF-8,通过“more”或“less”读取它们:

sudo iconv -f UTF-16LE -t UTF-8 <errorlog> -o <output errorlog file>

扩展的事件

可通过 SQL 命令查询扩展事件。 有关详细信息,请参阅扩展事件

故障转储

在 Linux 中查看日志目录中的转储。 在 /var/opt/mssql/log 目录下查看 Linux Core 转储(扩展名为 .tar.gz2)或 SQL 小型转储(扩展名为 .mdmp)。

例如,若要查看核心转储,请执行以下操作:

sudo ls /var/opt/mssql/log | grep .tar.gz2

对于 SQL 转储,请使用此脚本:

sudo ls /var/opt/mssql/log | grep .mdmp

在最低配置或单用户模式下启动 SQL Server

在最低配置模式下启动 SQL Server

在配置值的设置(例如,过度分配内存)妨碍服务器启动时,此模式非常有用。

sudo -u mssql /opt/mssql/bin/sqlservr -f

在单用户模式下启动 SQL Server

有时,可能必须使用启动选项 -m 在单用户模式下启动 SQL Server 的实例。 有关详细信息,请参阅启动参数。 例如,可能要更改服务器配置选项或恢复已损坏的 master 数据库或其他系统数据库。

例如,使用以下脚本在单用户模式下启动 SQL Server:

sudo -u mssql /opt/mssql/bin/sqlservr -m

此脚本使用 sqlcmd 在单用户模式下启动 SQL Server:

sudo -u mssql /opt/mssql/bin/sqlservr -m sqlcmd

应始终使用 mssql 用户启动 Linux 上的 SQL Server,以防止将来的启动问题。 例如:sudo -u mssql /opt/mssql/bin/sqlservr [STARTUP OPTIONS]

如果你不小心使用其他用户启动了 SQL Server,则必须先将 SQL Server 数据库文件的所有权更改回 mssql 用户,然后才能使用 systemd 启动 SQL Server。 例如,若要将 /var/opt/mssql 下所有数据库文件的所有权更改为 mssql 用户,请运行以下命令:

chown -R mssql:mssql /var/opt/mssql/

重新生成系统数据库

作为最后手段,可以选择将 mastermodel 数据库重新生成为默认版本。

警告

此过程非常危险,因为你可能删除已配置的所有 SQL Server 系统数据,包括有关用户数据库的信息(但不包括用户数据库本身)。

之后需要将用户数据库附加到实例。 还将删除系统数据库中存储的其他信息,包括:

  • 数据库主密钥信息
  • master 中加载的任何证书
  • SA 登录名的密码
  • msdb 中与作业有关的信息
  • msdb 中的数据库邮件信息
  • sp_configure 选项

除非还备份了证书和私钥,否则无法重新附加使用透明数据加密 (TDE) 加密的任何用户数据库。

只有在了解其含义后才能使用这些步骤。

  1. 停止 SQL Server 数据库引擎

    sudo systemctl stop mssql-server
    
  2. 在使用 force-setup 参数的情况下运行 sqlservr

    sudo -u mssql /opt/mssql/bin/sqlservr --force-setup
    

    应始终使用 mssql 用户启动 Linux 上的 SQL Server,以防止将来的启动问题。

  3. 看到消息“恢复已完成”后,请按 Ctrl+C。 这将关闭 SQL Server。

  4. 重新配置 SA 密码。

    sudo /opt/mssql/bin/mssql-conf set-sa-password
    
  5. 启动 SQL Server 并重新配置服务器,包括还原或重新附加任何用户数据库。

    sudo systemctl start mssql-server
    

提高性能

影响性能的因素有很多,包括数据库设计、硬件和工作负载需求。 如果希望改善性能,请首先查看本文中的最佳做法,适用于 Linux 上的 SQL Server 的性能最佳做法和配置指南。 然后,浏览一些可用于解决性能问题的工具。

常见问题

  1. 无法连接到远程 SQL Server 实例。

    请参阅连接到 Linux 上的 SQL Server 文章的疑难解答部分。

  2. 遇到错误消息:ERROR: Hostname must be 15 characters or less.

    这是一个已知问题,只要尝试安装 SQL Server 包的计算机名超过 15 个字符就会出现此问题。 除更改计算机名外,目前尚无其他解决方法。 可以通过编辑 /etc/hostname/etc/hosts、更改主机名、保存每个文件和重新启动计算机,从而执行此操作。

  3. 必须重置系统管理员 (SA) 密码,这将暂时停止 SQL Server 服务。

    如果忘记了系统管理员 (SA) 密码,或者出于其他原因需要重置密码,请遵循以下步骤。

    登录到主机终端,运行以下命令并按照提示重置 SA 密码:

    sudo systemctl stop mssql-server
    sudo /opt/mssql/bin/mssql-conf setup
    
  4. 登录密码中的特殊字符会导致错误或登录失败。

    如果在 SQL Server 登录密码中使用某些字符,则可能需要使用反斜杠对其进行转义,然后再将其用于 Linux 命令行。 例如,如果在终端命令/shell 脚本中使用美元符号 ($),则必须对其进行转义:

    不起作用:

    sudo sqlcmd -S myserver -U sa -P Test$$
    

    有效:

    sqlcmd -S myserver -U sa -P Test\$\$
    

获取帮助

参与编辑 SQL 文档

你是否知道你可以自行编辑 SQL 内容? 你如果这样做,不仅可以帮助改进我们的文档,还可以获得页面贡献者的殊荣。

有关详细信息,请参阅如何参与 SQL Server 文档编辑