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

适用于:Linux 上的 SQL Server

本文介绍如何对 Linux 上或 Linux 容器中运行的 SQL Server 进行故障排除。

在 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 Linux 容器的执行。 若要管理 Linux 的服务,请参阅在 Linux 上启动、停止和重启 SQL Server 服务。

管理 SQL Server Linux 容器的执行

你可以通过执行以下命令获取最近创建的 SQL Server Linux 容器的状态和容器 ID。 ID 在 CONTAINER ID 列下方。

sudo docker ps -l

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

sudo docker stop <container_id>
sudo docker restart <container_id>

提示

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

访问日志文件

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

安装程序会写入日志到 /var/opt/mssql/setup-<installation_timestamp>。

你可以 errorlog 用任何兼容 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 核心转储(.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

此脚本在单用户模式下启动SQL Server,限制与sqlcmd客户端的连接(应用程序名称SQLCMD必须大写):

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/

重新生成系统数据库

作为最后手段,可以选择将 master 和 model 数据库重置为默认版本。

警告

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

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

  • 数据库主密钥 (DMK) 信息
  • master 中加载的任何证书
  • sa 帐户的密码
  • msdb 中与作业有关的信息
  • 数据库邮件信息来自msdb
  • sp_configure 选项

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

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

  1. 停止 SQL Server 数据库引擎

    sudo systemctl stop mssql-server
    
  2. 使用sqlservr参数运行force-setup:

    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
    

    注意

    密码应遵循 SQL Server 默认密码策略。 默认情况下,密码必须为至少八个字符且包含以下四种字符中的三种:大写字母、小写字母、十进制数字、符号。 密码可最长为 128 个字符。 使用的密码应尽可能长,尽可能复杂。

  5. 启动 SQL Server 并重新配置服务器,包括还原或重新附加任何用户数据库。

    sudo systemctl start mssql-server
    

提高性能

影响性能的因素有很多,包括数据库设计、硬件和工作负载需求。 如果要提高性能,请先查看最佳做法文章:

然后,探索一些可用于排查性能问题的工具。

常见问题

  1. 无法连接到远程 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
    

    注意

    密码应遵循 SQL Server 默认密码策略。 默认情况下,密码必须为至少八个字符且包含以下四种字符中的三种:大写字母、小写字母、十进制数字、符号。 密码可最长为 128 个字符。 使用的密码应尽可能长,尽可能复杂。

  4. 登录密码中的特殊字符可能会导致错误或登录失败。

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

    • 不起作用:

      sudo sqlcmd -S myserver -U sa -P Test$$
      
    • 是否有效

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

获取帮助

参与编辑 SQL 文档

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

有关详细信息,请参阅 “编辑Microsoft Learn 文档。