SQL Server数据库单用户模式诊断与恢复:从原理到实战

1. 问题场景与核心需求解析

“数据库显示单个用户”,这行字对任何一个SQL Server的DBA或开发者来说,都意味着一个熟悉的“红色警报”。它通常出现在你尝试连接数据库时,Management Studio弹出一个错误对话框,告诉你数据库处于“单用户模式”,或者更糟的是,你发现某个关键的生产库被不明原因地设置成了单用户,导致所有其他应用连接全部中断,业务直接停摆。这绝不是一个可以忽视的小问题。

简单来说,SQL Server数据库的“单用户模式”是一种特殊的数据库状态。在此状态下,同一时间只允许一个用户连接访问该数据库。这个“用户”可以是一个具体的登录名,也可以是第一个成功建立连接的任何会话。一旦这个连接建立,其他所有尝试连接该数据库的请求都会被无情地拒绝,直到当前连接释放。这个功能的设计初衷是好的,主要用于执行一些需要独占访问权限的维护操作,比如修复严重损坏的数据库、恢复模式更改、或者执行某些不允许并发操作的架构变更。

然而,问题往往出在“意外”和“残留”上。你可能在执行完一个维护脚本后忘记将数据库切换回多用户模式;也可能某个具有高权限的账户在执行操作时意外崩溃,导致连接没有正常关闭,但这个“单用户”的锁却一直挂着;更常见的是,在紧急情况下(比如处理“可疑”状态数据库)手动设置了单用户模式,事后却忘了改回来。无论原因如何,结果都是一样的:应用程序报错、用户无法登录、业务系统中断。因此,掌握如何诊断、解决并安全地操作单用户模式,是每个SQL Server从业者的必备技能。

本文将彻底拆解这个问题,不仅告诉你如何通过图形化的SQL Server Management Studio (SSMS) 和纯T-SQL代码两种方式来解决,更会深入探讨各种场景下的处理策略、背后的原理,以及我多年运维中积累的、教科书上不会写的实战避坑指南。无论你是刚接触SQL Server的新手,还是需要处理紧急故障的老手,都能在这里找到清晰、可操作的完整方案。

2. 诊断与确认:你的数据库真的“单用户”了吗?

在动手之前,准确的诊断是第一步。盲目操作可能会让情况变得更糟。我们需要从几个维度来确认数据库的状态和当前连接情况。

2.1 使用SSMS图形界面快速查看

对于习惯使用图形化工具的朋友,SSMS提供了最直观的查看方式。

  1. 对象资源管理器 :连接到你的SQL Server实例后,展开“数据库”节点。如果某个数据库处于单用户模式,你通常 不会 直接在这里看到一个特殊的图标。但是,当你尝试右键点击该数据库,选择“属性”时,可能会弹出一个错误,提示数据库正在被使用,这本身就是一个线索。
  2. 数据库属性窗口 :如果能够打开属性窗口,切换到“选项”页。查看“状态”区域下的“限制访问”属性。如果其值为“SINGLE_USER”,那么恭喜你(或者说很不幸),你找到了问题的根源。

    注意 :如果数据库已经被某个连接独占,你可能连属性窗口都无法打开。这时就需要用到更底层的查询方法。

2.2 使用T-SQL查询进行精准诊断

T-SQL命令才是DBA的“手术刀”,它能提供最精确、最可靠的信息。打开SSMS的新查询窗口,连接到你的目标服务器实例,执行以下查询:

-- 查询所有数据库的状态,重点关注用户访问模式
SELECT 
    name AS [数据库名称],
    state_desc AS [状态描述],
    user_access_desc AS [用户访问模式],
    is_in_standby AS [是否处于备用状态],
    is_read_only AS [是否只读]
FROM sys.databases
WHERE name = 'YourDatabaseName'; -- 替换为你的实际数据库名

-- 更详细的查询,包含当前连接信息
SELECT 
    DB_NAME(database_id) AS [数据库名],
    COUNT(session_id) AS [当前连接数],
    user_access_desc AS [访问模式]
FROM sys.dm_exec_sessions
LEFT JOIN sys.databases ON sys.dm_exec_sessions.database_id = sys.databases.database_id
WHERE DB_NAME(database_id) = 'YourDatabaseName'
GROUP BY DB_NAME(database_id), user_access_desc;

关键字段解读

  • user_access_desc :这是核心字段。其值可能为:
    • MULTI_USER :正常的多用户模式。
    • SINGLE_USER :单用户模式。
    • RESTRICTED_USER :限制用户模式(只有 db_owner dbcreator sysadmin 角色的成员才能连接)。
  • state_desc :数据库状态,如 ONLINE (在线)、 OFFLINE (脱机)、 EMERGENCY (紧急)等。单用户模式通常伴随着 ONLINE 状态。

实操心得 : 在执行诊断查询时,我强烈建议同时开两个查询窗口。一个用于执行上述诊断语句,另一个则准备执行后续的修复命令。因为一旦数据库处于单用户模式且已被占用,你的诊断查询本身可能就会成为那个“占用者”,或者因为无法连接而失败。如果诊断查询能成功执行并返回 SINGLE_USER ,但显示连接数为0,那说明数据库正处于“空闲”的单用户状态,这是最容易处理的情况。如果显示有一个连接(可能是你自己的查询窗口,也可能是某个未知进程),那就需要先处理这个“钉子户”连接。

3. 解决方案一:通过SSMS可视化操作解除单用户模式

对于偏好点击操作、或者情况不那么紧急的场景,使用SQL Server Management Studio (SSMS) 的图形界面是一种相对安全直观的方式。它的每一步操作都有明确的提示,适合对T-SQL命令还不那么熟悉的管理员。

3.1 标准操作流程

假设你现在能以 sysadmin (系统管理员)身份登录SSMS,并且数据库没有被其他顽固连接独占。

  1. 连接实例 :打开SSMS,连接到承载目标数据库的SQL Server实例。
  2. 定位数据库 :在“对象资源管理器”中,展开“数据库”文件夹。
  3. 打开属性对话框 :右键点击那个显示为单用户模式的数据名,在弹出的菜单中选择“属性”。
  4. 修改访问限制
    • 在“数据库属性”窗口的左侧,点击“选项”页。
    • 在右侧的选项列表中,找到“状态”分组下的“限制访问”属性。
    • 点击其下拉框,将值从“SINGLE_USER”更改为“MULTI_USER”。
  5. 确认更改 :点击窗口底部的“确定”按钮。SSMS会在后台执行等效的T-SQL命令( ALTER DATABASE [YourDB] SET MULTI_USER )。如果操作成功,你会看到“命令已成功完成”的提示,数据库图标状态也会立即刷新。

3.2 可视化操作中的常见陷阱与应对

图形化操作看似简单,但在单用户模式这个特定问题上,却暗藏玄机。

  • 陷阱一:“属性”窗口无法打开 。这是最常见的问题。当你右键点击数据库选择“属性”时,SSMS会尝试连接该数据库以获取元数据。但如果该数据库正处于单用户模式且已被另一个会话占用,SSMS的连接请求就会被拒绝,导致属性窗口打开失败,并提示“无法访问数据库”或类似错误。

    • 应对 :这说明有“钉子户”连接。此时必须放弃纯图形化操作,转而使用T-SQL来“踢掉”那个占用连接。具体方法在下一章详解。
  • 陷阱二:更改后提示“正在使用” 。即使你成功打开了属性窗口并将“限制访问”改为了 MULTI_USER ,点击“确定”时也可能失败,提示“因为数据库正在使用,所以无法获得对数据库的独占访问权”。

    • 应对 :这同样表明存在活跃连接。SSMS的 ALTER DATABASE 命令需要独占锁,而其他连接的存在阻止了这一点。你需要先设置数据库为 SINGLE_USER ,但指定由你的会话独占,或者直接终止其他连接。这通常必须通过T-SQL完成。一个在SSMS中可尝试的变通方法是:在点击“确定”前,先回到对象资源管理器,右键该数据库,选择“任务” -> “脱机”,然后再立即“联机”。脱机操作会强制断开所有连接,联机后数据库会恢复为之前的访问模式吗?不一定,这取决于版本和设置,不推荐作为标准流程。
  • 陷阱三:误操作导致连接丢失 。在图形界面下,如果你不小心(或被迫)将数据库设置为 SINGLE_USER ,而当前SSMS有多个查询窗口连接着该数据库,那么只有一个窗口能保持连接,其他窗口的后续查询都会失败。更糟的是,如果你关闭了那个唯一的连接窗口,数据库可能处于一种“无主”的单用户状态,等待下一个连接者。

    • 应对 :始终保持一个“管理员专用”查询窗口,使用 sysadmin 账户连接 master 数据库。所有对数据库状态的修改操作都在这个窗口进行,这样能确保你始终有一个可用的控制通道。

重要提示 :对于生产环境,我个人的强烈建议是, 永远不要依赖SSMS图形界面作为处理单用户模式故障的首要或唯一手段 。在紧急故障处理时,图形界面的响应速度、错误信息的明确性以及操作的原子性都不如T-SQL脚本。你应该将SSMS操作视为在稳定环境下进行计划内维护的便捷方式,而非故障救援工具。

4. 解决方案二:通过T-SQL代码精准控制与修复

当图形界面束手无策时,T-SQL代码便是你最强的武器。它精准、灵活,可以应对各种复杂情况。下面我们从易到难,分解整个代码操作流程。

4.1 基础命令:切换数据库访问模式

核心命令是 ALTER DATABASE 语句。

-- 将数据库设置为单用户模式(谨慎使用!)
ALTER DATABASE [YourDatabaseName] SET SINGLE_USER;
GO

-- 将数据库恢复为多用户模式(我们的目标)
ALTER DATABASE [YourDatabaseName] SET MULTI_USER;
GO

看起来非常简单,对吧?但魔鬼藏在细节里。直接运行 SET MULTI_USER 很可能失败,并报错:“因为数据库正在使用,所以无法获得对数据库的独占访问权。”

4.2 高级操作:处理顽固连接与指定独占者

当存在活跃连接时,我们需要更精细的控制。 SET SINGLE_USER 命令有一个非常有用的子句: WITH ROLLBACK WITH ROLLBACK AFTER

-- 方案A:立即终止所有现有连接,并将数据库设置为单用户模式,由当前会话独占。
ALTER DATABASE [YourDatabaseName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
-- 执行你的维护操作...
ALTER DATABASE [YourDatabaseName] SET MULTI_USER;
GO
  • WITH ROLLBACK IMMEDIATE :这是最“强硬”的选项。它会立即终止所有与该数据库的连接,并回滚这些连接中所有未完成的事务。数据会保持一致状态,但正在执行的操作会被强行中断。 适用于需要立即恢复服务的紧急情况。
-- 方案B:终止所有现有连接,但在指定秒数后回滚。
ALTER DATABASE [YourDatabaseName] SET SINGLE_USER WITH ROLLBACK AFTER 30; -- 30秒后回滚
GO
  • WITH ROLLBACK AFTER n :这个选项相对“温和”一些。它通知所有连接将在n秒后终止。这给了那些连接一个完成当前工作或主动退出的机会。适用于计划内的维护,希望尽量减少对应用的影响。

实操心得:如何安全地“踢人”并独占? 假设一个常见场景:数据库已是 SINGLE_USER ,但被一个未知的、僵死的连接占用(比如一个崩溃的应用程序会话)。你的 SET MULTI_USER 命令因无法获得独占锁而失败。

  1. 首先,你需要重新获得单用户控制权,并指定由 你的当前会话 独占。
  2. 执行以下命令:
    USE master; -- 确保当前连接在master库,避免意外断开自己
    GO
    ALTER DATABASE [YourDatabaseName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
    GO
    
    这条命令会强行终止那个“钉子户”连接,并将数据库设置为单用户模式,且将这个“单用户”的权限赋予 执行此命令的会话
  3. 现在,你可以安全地执行维护操作,或者直接将其恢复为多用户模式:
    ALTER DATABASE [YourDatabaseName] SET MULTI_USER;
    GO
    

4.3 完整实战脚本与错误处理

在实际运维中,尤其是通过远程脚本或自动化工具执行时,一个健壮的脚本至关重要。下面是一个包含错误处理和状态检查的完整示例。

-- 实战:安全地将数据库从单用户模式恢复为多用户模式
DECLARE @DBName NVARCHAR(128) = N'YourDatabaseName';
DECLARE @SQL NVARCHAR(MAX);
DECLARE @CurrentAccessMode NVARCHAR(60);

-- 1. 检查当前访问模式
SELECT @CurrentAccessMode = user_access_desc
FROM sys.databases
WHERE name = @DBName;

PRINT '当前数据库 [' + @DBName + '] 的访问模式为: ' + ISNULL(@CurrentAccessMode, 'NOT FOUND');

IF @CurrentAccessMode IS NULL
BEGIN
    PRINT '错误:未找到指定数据库。';
    RETURN;
END

IF @CurrentAccessMode = 'MULTI_USER'
BEGIN
    PRINT '数据库已处于多用户模式,无需操作。';
    RETURN;
END

-- 2. 如果当前是单用户模式,尝试恢复
IF @CurrentAccessMode IN ('SINGLE_USER', 'RESTRICTED_USER')
BEGIN
    PRINT '正在尝试将数据库恢复为多用户模式...';
    BEGIN TRY
        -- 先尝试温和方式
        SET @SQL = N'ALTER DATABASE [' + @DBName + N'] SET MULTI_USER;';
        EXEC sp_executesql @SQL;
        PRINT '操作成功:数据库已恢复为多用户模式。';
    END TRY
    BEGIN CATCH
        PRINT '标准切换失败,错误信息: ' + ERROR_MESSAGE();
        PRINT '尝试终止现有连接后重试...';
        
        BEGIN TRY
            -- 使用ROLLBACK IMMEDIATE强制清除连接,并立即切换为多用户
            SET @SQL = N'ALTER DATABASE [' + @DBName + N'] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; ALTER DATABASE [' + @DBName + N'] SET MULTI_USER;';
            EXEC sp_executesql @SQL;
            PRINT '强制操作成功:连接已终止,数据库已恢复为多用户模式。';
        END TRY
        BEGIN CATCH
            PRINT '强制操作也失败,严重错误: ' + ERROR_MESSAGE();
            PRINT '请检查数据库是否处于异常状态(如EMERGENCY),或联系高级DBA。';
        END CATCH
    END CATCH
END

这个脚本的优点在于它先尝试最无害的操作,仅在必要时才使用强制手段,并且提供了清晰的每一步反馈,非常适合集成到自动化运维平台或作为标准处理流程。

5. 深度排查与预防:超越简单切换

解决了眼前的单用户问题后,一个合格的DBA应该追问:是什么原因导致了这个问题?如何防止它再次发生?以下是一些深度排查方向和预防措施。

5.1 谁设置了单用户模式?——追溯元凶

SQL Server默认不直接记录 ALTER DATABASE ... SET SINGLE_USER 这样的DDL操作。但我们可以通过一些间接手段进行追溯。

  1. 查询默认跟踪文件(如果启用) : SQL Server的默认跟踪会捕获一些重要事件。

    SELECT 
        te.name AS [事件类型],
        t.DatabaseName,
        t.TextData,
        t.LoginName,
        t.StartTime
    FROM sys.fn_trace_gettable(
        (SELECT REVERSE(SUBSTRING(REVERSE(path), CHARINDEX('\', REVERSE(path)), 260)) + 'log.trc'
         FROM sys.traces WHERE is_default = 1), DEFAULT) AS t
    INNER JOIN sys.trace_events AS te ON t.EventClass = te.trace_event_id
    WHERE t.DatabaseName = 'YourDatabaseName'
        AND te.name LIKE '%Alter%'
        AND t.TextData LIKE '%SET%USER%'
    ORDER BY t.StartTime DESC;
    

    这可能会找到相关的 ALTER DATABASE 命令记录。

  2. 查询SQL Server错误日志 : 某些版本的SQL Server可能会在错误日志中记录数据库状态变更。

    EXEC sp_readerrorlog 0, 1, 'single_user', 'database'; -- 读取当前错误日志
    

    或者直接在SSMS中查看“管理” -> “SQL Server日志”。

  3. 审核与扩展事件 : 如果启用了SQL Server审核或创建了扩展事件会话来跟踪数据库更改,那么这里会有最准确的记录。检查你的审核规范或扩展事件会话目标数据。

5.2 预防单用户模式意外锁定的最佳实践

  1. 脚本化与代码审查 :所有用于生产环境的维护脚本,凡是包含 SET SINGLE_USER 的, 必须 在同一个事务或脚本块中,紧随其后包含 SET MULTI_USER 。并且,这类脚本的上线必须经过严格的同行审查。

    -- 好的脚本模板
    BEGIN TRY
        ALTER DATABASE [MyDB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
        -- 在这里执行你的维护操作,例如DBCC CHECKDB, 索引重建等
        ALTER DATABASE [MyDB] SET MULTI_USER;
        PRINT '维护完成,数据库已恢复多用户模式。';
    END TRY
    BEGIN CATCH
        -- 如果出错,尝试恢复多用户模式
        ALTER DATABASE [MyDB] SET MULTI_USER;
        THROW; -- 重新抛出错误
    END CATCH
    
  2. 使用 RESTRICTED_USER 替代 :如果维护操作只需要阻止普通用户,而不需要绝对的独占,考虑使用 RESTRICTED_USER 模式。此模式下, db_owner dbcreator sysadmin 角色的成员仍然可以连接,这为管理员留下了监控和管理的通道。

    ALTER DATABASE [YourDatabaseName] SET RESTRICTED_USER;
    -- 执行维护...
    ALTER DATABASE [YourDatabaseName] SET MULTI_USER;
    
  3. 监控与告警 :建立对数据库 user_access 状态的监控。当发现关键生产数据库的访问模式变为 SINGLE_USER 时,立即触发告警(邮件、短信、钉钉/企业微信机器人等),以便在影响扩大前及时干预。

  4. 权限最小化 :严格控制拥有 ALTER DATABASE 权限的账户。不要将此权限轻易授予应用程序账户或一般的开发人员账户。

5.3 特殊场景:单用户模式与数据库“可疑”状态

单用户模式常与数据库的“可疑”(SUSPECT)状态一起出现。当SQL Server认为数据库的元数据或关键文件可能损坏时,会将数据库标记为“可疑”。在某些恢复流程中,将数据库设置为 EMERGENCY (紧急)模式后,可能需要进一步将其设置为 SINGLE_USER 才能执行修复操作(如 DBCC CHECKDB WITH REPAIR_ALLOW_DATA_LOSS )。

处理流程示例

-- 1. 设置为紧急模式
ALTER DATABASE [DamagedDB] SET EMERGENCY;
GO
-- 2. 设置为单用户模式
ALTER DATABASE [DamagedDB] SET SINGLE_USER;
GO
-- 3. 尝试修复(可能丢失数据!)
DBCC CHECKDB ([DamagedDB], REPAIR_ALLOW_DATA_LOSS);
GO
-- 4. 恢复为多用户模式
ALTER DATABASE [DamagedDB] SET MULTI_USER;
GO
-- 5. 关闭紧急模式
ALTER DATABASE [DamagedDB] SET ONLINE;
GO

警告 REPAIR_ALLOW_DATA_LOSS 是最后的手段,可能导致数据丢失。在执行前,务必尽一切可能从备份中恢复。

6. 常见问题排查与实战技巧实录

即使掌握了命令,实战中还是会遇到各种“妖魔鬼怪”。下面是我在多年运维中积累的一些典型问题案例和解决技巧。

问题1:执行 SET SINGLE_USER WITH ROLLBACK IMMEDIATE 后,我的SSMS查询窗口也断开了,怎么办?

  • 现象 :你在一个连接着目标数据库的查询窗口里执行了上述命令,结果窗口立刻失去连接,显示“数据库不可用”。
  • 原因 WITH ROLLBACK IMMEDIATE 终止了 所有 连接,包括你执行命令的这个会话本身。数据库变成了一个“无主”的单用户状态。
  • 解决方案
    1. 永远从连接 master 数据库的查询窗口执行这些高危命令。这是铁律。
    2. 如果已经发生,立即新开一个查询窗口(连接 master ),快速执行 ALTER DATABASE ... SET MULTI_USER; 。因为数据库处于“空闲”单用户状态,第一个成功连接它的会话就会成为独占者,你新开的窗口很可能抢到这个资格。

问题2:明明显示只有一个连接,但切换模式时总是报“正在使用”。

  • 排查 :使用更详细的连接查询,看看是不是有“隐藏”的连接。
    SELECT 
        s.session_id,
        s.login_name,
        s.host_name,
        s.program_name,
        s.status,
        t.text AS [最近执行的命令]
    FROM sys.dm_exec_sessions s
    LEFT JOIN sys.dm_exec_connections c ON s.session_id = c.session_id
    OUTER APPLY sys.dm_exec_sql_text(c.most_recent_sql_handle) t
    WHERE s.database_id = DB_ID('YourDatabaseName');
    
  • 可能原因
    • 连接池 :应用程序使用了连接池,即使应用看起来空闲,连接在池中可能仍保持打开状态。
    • 事务未提交 :某个连接开启了事务但未提交或回滚,长期持有锁。
    • 快照隔离 :使用了快照隔离级别的事务可能会阻止某些元数据更改。
  • 技巧 :在尝试切换模式前,可以先尝试将数据库设置为 RESTRICTED_USER ,这样能踢掉普通用户,但保留管理员连接,然后再从管理员连接执行最终切换。

问题3:在Always On可用性组或镜像中的数据库,无法设置为单用户模式。

  • 原因 :高可用性技术(如Always On)要求数据库处于正常的多用户状态以进行数据同步。
  • 解决方案 :你必须先从可用性组中移除该数据库(或暂停数据同步),然后才能在主副本上对其进行单用户操作。操作完成后,再重新添加回可用性组。这是一个影响很大的操作,必须在变更窗口进行,并严格遵循流程。

问题4:使用T-SQL脚本在自动化作业中运行,如何确保万无一失?

  • 技巧 :在自动化脚本中加入双重验证和状态回写日志。
    -- 在脚本开头记录开始状态
    INSERT INTO DBA_OperationLog (DBName, Operation, StartTime, StartUserAccess)
    VALUES (@DBName, 'ResetToMultiUser', GETDATE(), (SELECT user_access_desc FROM sys.databases WHERE name = @DBName));
    
    -- ... 执行核心切换操作 ...
    
    -- 在脚本结尾验证并记录结束状态
    DECLARE @EndUserAccess NVARCHAR(60);
    SELECT @EndUserAccess = user_access_desc FROM sys.databases WHERE name = @DBName;
    
    UPDATE DBA_OperationLog 
    SET EndTime = GETDATE(), 
        EndUserAccess = @EndUserAccess,
        Success = CASE WHEN @EndUserAccess = 'MULTI_USER' THEN 1 ELSE 0 END
    WHERE LogId = SCOPE_IDENTITY(); -- 更新刚插入的那条记录
    
    IF @EndUserAccess != 'MULTI_USER'
    BEGIN
        -- 触发告警
        EXEC msdb.dbo.sp_send_dbmail ... ; 
        RAISERROR('数据库访问模式重置失败!', 16, 1);
    END
    

处理SQL Server数据库的单用户模式问题,核心在于理解其独占访问的本质,并熟练掌握 ALTER DATABASE 命令的 WITH ROLLBACK 选项。图形化操作适合简单明了的场景,而T-SQL代码则是处理复杂、紧急情况的终极利器。记住最关键的两条经验:第一,操作时永远从 master 数据库的会话发起;第二,任何将数据库改为单用户的脚本,都必须包含一个确保能将其改回多用户的容错机制。养成检查 sys.databases 目录视图的习惯,将数据库状态监控纳入日常巡检,就能防患于未然,避免让“单个用户”的提示变成深夜里令人头疼的报警。

「LLM那些事」系列第 4 篇《上下文窗口的边界》,文章连接:https://blog.csdn.net/houwenjin/article/details/163999753。 演示什么:在「预测」Sheet 的黄色格子里输入一句话(默认「来泡一杯」),四个「模型」——分别只统计最后 1 / 2 / 3 / 4 个字的 n-gram 查表——同时预测下一个字。同一个输入,看的上下文越长,候选越少、预测越确定: ┌────────────────┬──────────┬───────────────┬──────┐ │ 只看最后几个字 │ 用的前缀 │ 候选下一字数 │ 预测 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 1 个 │ 杯 │ 3(茶/子/水) │ 模糊 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 2 个 │ 一杯 │ 2(茶/水) │ 收窄 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 3 个 │ 泡一杯 │ 1(茶) │ 确定 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 4 个 │ 来泡一杯 │ 1(茶) │ 确定 │ └────────────────┴──────────┴───────────────┴──────┘
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值