SQLServer集群搭建

标签: Sqlserver 分类: 数据库 创建时间:2021-06-01 10:20:51 更新时间:2023-10-20 11:23:26

1.前言

今天又接到了一个新的需求,就是搭建数据库服务器集群。因为原始的服务器是Server 2008,并且使用了SQL Server 2008作为数据服务器,如果要单纯的将数据库切换到其他的数据库,可能对老的系统有一定的影响,所以需要在尽量不改变原有的客户端代码的情况下,尽量的做到平滑的升级或者是负载均衡,故障转移,灾难恢复。这也让我进入到了分布式数据库的研究行列中来,哪些好用的分布式数据库?价格如何,使用难度如何?如何和现有的数据库进行兼容或者是平滑过渡?

参考文章:
1.OceanBase、X-DB、POLARDB 分布式关系型数据库,各自的优势是什么?有什么区别? OceanBase:2021年06月01日开源的阿里分布式数据库,PolarDB也是阿里的基于Postgresql的商用数据库,其实还应该加入TiDB,也是一个开源的分布式数据库
2.双十一的数据库,数据库的双十一 这篇文章挺有意思的,OceanBase、X-DB等数据库都说自己是宇宙最牛逼的数据库,可是一篇国际论文没有,一个外部评测都没有,让人很难把握它们的不同点啊,特别是针对双十一的场景,在多少台设备上跑的,机器内存,网络,性能如何,肯定不是一半的公司能承受的起的价格。所以说,选择数据库,还是要看成本,看公司规模,看团队。

1.SQL Server集群可行性分析

参考文章:
1.SQL Server数据库读写分离提高并发性
2.Windows 2008 + SQLServer 2008 双机群集 安装了新的SQL Server故障转移集群安装功能,然后进行了故障转移配置。
3.SQL Server 集群 这就是一个理论说明,其实没有实际的操作步骤
4.安装SQL Server 2008 的Windows群集 2008 R2
5.简述SQL2008部署多实例集群(学习) 搭建了ABC三个节点,首先在C上开启2008的安装,并且选择”Add node to a SQL Server failover cluster”
6.说说SQL Server集群服务器的优缺点
7.sqlserver 2019 always on 集群 用SQL Server 2019提供的always on功能搭建集群,虽然里面有linux的身影,但是我看到大部分的截图都是windows的截图
8.sqlserver 发布订阅的弊端

Linux

参考文章:
1.SQL server 2008(Linux安装) 如何在linux上安装sql server
2.为 SQL Server 可用性组配置 RHEL 群集 官方提供的配置linux的高可用性,使用的时RHEL 7,和RHEL 8
3.Sqlserver on linux 高可用集群搭建 准备了三台sql server服务器。

2.双机热备(发布订阅模式)

SQL Server的双机热备,一种方式,就是使用发布订阅模式实现的。基本的步骤就像参考文章3中的一样,就是在复制中创建本地发布,然后在备份机上创建本地订阅,如果在使用中有什么问题,可以查看我下面写的问题。主要有几点需要注意:

  • 1.要使用SQL Server2008自带的管理工具进行发布和订阅,而不是官方提供的单独的SSMS安装包

  • 2.配置别名
    首先要在进行发布的服务器上运行 sql 命令:select @@SERVERNAME ,查找服务器名称;然后将得到的服务器名称,在需要进行订阅的服务器上,打开SQL Server配置管理工具,在两个Native Client上新键别名,填入发布服务器查询到的名称,ip地址和端口;

  • 3.修改hosts文件
    最后是在订阅服务器上,修改hosts文件,填入发布服务器ip地址,和发布服务器查询的服务名称

  • 4.进行订阅服务器登录时,用户要有sysadmin权限。

用户要有对数据库的完全访问权限,如果查看复制监视器,显示:无法作为数据库主体执行,因为主体”dbo”不存在、无法模拟这种类型的主体,或您没有所需要的权限。这就是权限的问题,可以使用如下的语句进行数据库权限的修改。

1
2
3
4
5
6
7
--修改数据库所有者
use dbname
go
sp_changedbowner sa

--或者暴力卸载
exec sp_removedbreplication dbname
  • 5.在发布时的连接到服务器的名称,最好是有较高权限的用户,还有就是订阅的时候的登录用户,和发布的用户是一个用户,这个其实我不是很确定。
  • 5.日志文件夹要第一次要同步
    (1) 新建发布时,在快照的文件夹中(右键发布属性,可以查看),会生成发布日志,要将发布的数据库文件日志,拷贝到订阅服务器中。
    (2) 新键订阅时,要将发布服务器上的unc日志文件拷贝到订阅服务器的自定义目录中,也就是同步发布服务器和订阅服务器中的unc文件夹,比如我的是:D:\sqlserver_data\PHEMS_ReplData,那么就会有D:\sqlserver_data\PHEMS_ReplData\unc 文件夹,下面有各个从发布服务拷贝来的文件。否在就会出现 进程无法读取文件“xxx.pre” 问题(当然也可以使用共享文件夹的方式,只要是能让订阅服务器读取到发布服务器的日志文件就可以了)。创建订阅后,要右键订阅的属性,将快照文件夹选择为备份文件夹,然后填入unc文件夹所在的上一级文件夹,也就是:D:\sqlserver_data\PHEMS_ReplData 文件夹。编辑完成之后,要右键订阅,重新进行初始化操作。
参考文章:
1.SQL Server 2008 R2双机热备 这篇文章讲的其实还是蛮清楚的,如果不是我这里有各种各样的问题的话
2.SqlServer双机热备技术实践笔记 这里总结了双击热备的方案,比如:发布–订阅、日志传送、数据库镜像、使用SqlServer 2012的 AlwaysOn 功能。还有对于双机热备的方案,数据库连接方案,也写了简单的操作方法,就是修改连接字符串,实现自动切换故障数据库。
3.Microsoft SQL Server 双机热备份,实时同步 和第一篇文章差不多,不过这里说的更加的详细一点,把截图上该注意的地方都标红了。
4.SQL Server 2008 R2的发布订阅配置实践 快照复制、事务复制、具有可更新订阅的事务发布、合并复制这几个发布的不同选项。
5.Microsoft SQL Server发布与订阅 这里的”配置本地端订阅之前,需要将云上信息配置在本地”,也就是通过别名的方式进行连接远程服务器,但是这个特别的地方,就是使用了select @@SERVERNAME 获取到了别名,然后进行的设置,这个别名,是包含实例名称的

3.总结

使用的SQL Server 2008 的发布订阅模式,主要有以下几个步骤:

(1) 一台服务器在数据库复制中,创建发布。
(2) 另一台服务器在同样数据库版本的复制中,创建订阅

注意:
(1) 从订阅服务器创建订阅时需要用用户名密码的方式登录到发布服务器,这个时候的用户要有数据库 sysadmin 权限。
(2) 在发布服务器上进行发布后,要将发布后的日志文件,拷贝到订阅服务器上,并右键修改订阅服务器的订阅中的快照文件夹,指向该日志文件所在的位置。

缺点
使用发布订阅模式其实只是实现了数据库的复制和备份,但是无法实现高可用,也就是数据库一个发生了故障,另一个切换为主节点。

问题

(1) 创建本地发布的时候出现无法登录问题
当我右键复制,创建发布的时候,出现了这个问题。

解决方法,就是重新使用计算机名称连接,而不是使用localhost进行数据库连接。

上面的图是我目前计算机的名称,作为服务名称,使用的Windows身份认证方法进行登录的,原先我使用的是localhost登录名, 使用Windows进行身份认证登录的。


(2) SQL Server无法将 xxx 配置为分发服务器
按照参考文章一步步的做,最后还是出现了错误,“设置连接字符串后无法更改或者读取属性LoginSecure”,

首先,查看服务名称是否一致。我执行了之后,计算机名称和服务名称两个名称一致,所以就不需要进行服务名称的修改,需要找另外的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT @@SERVERNAME,SERVERPROPERTY('SERVERNAME')


--或者,下面的命令,两个结果都一样
use master
go
select @@servername;
select serverproperty('servername')

--执行修改命令,将"服务器名", 修改为正确的计算机名
EXEC sp_dropserver '服务器名[/命名实例名]'; -- 即旧的计算机名
GO
EXEC sp_addserver '计算机名[/命名实例名]', local; -- 即新的计算机名

go

解决方法:因为我第一个问题没有解决,所以有了第二个问题,其实我先解决了第一个问题,那么第二个就不存在了。

参考文章:
1.sqlserver 无法将xxx配置为分发服务器 查看服务器名称是否一致
2.“SQLServer复制需要有实际的服务器名称才能连接到服务器,请指定实际的服务器名” 这里还有一个就是使用别名的方式进行服务器连接,也就是修改hosts文件,指向服务地址
3.SQL Server 无法将“xxx”配置为分发服务器 这里说是权限不够

(3) 对象名syservers无效
这个问题真的非常的奇怪,奇怪到我在网上都找不到相关的文章,我搜sysserver这个关键字,也没有相关的信息,似乎没有人遇到过啊。

  • 第一次尝试:数据库降级
    我创建本地发布的SQL Server版本为2008,但是我另一台服务器创建本地订阅的服务器安装的是2019,我怀疑是这个问题,于是就进行了数据库降级。但是我降级之后,在另一台虚拟机中安装了同样的2008,进行本地订阅的创建,还是出现了这个问题,也就是说,不是数据库版本的问题。

  • 第二次尝试:同样的数据库版本
    我在两台虚拟机中创建了sql server2008进行订阅和发布,也还是会出现这个问题。

参考文章:
1.SQL SERVER 2005 提示 对象名 ‘MASTER.DBO.SYSSERVERS’ 无效 这里有人说是权限问题,但是没有人说的清楚,到底该如何解决这个权限问题。
2.无效的对象名称sysservers “您不应再使用sysservers - 这是一个2000系统表,仅出于向后兼容性原因而仍然提供。您应该使用sys.servers,并且您可能希望明确指出在哪里找到它.” 这是答案,但是因为我是创建订阅的时候出现的这个问题,我没发进行语句的修改。
3.MSSQLSERVER_208 官方提供的有关208错误的相关信息
4.SQLServer 中发布与订阅 这里的发布订阅都是很顺利的,没有出现syservers无效的情况,但是我的订阅过程中,就是会出现这样的情况
5.在MSSQL2000里面 对象名 ‘sys.servers’ 无效 服务器: 消息 208,级别 16,状态 1,行 1… 这里说,在sql2000里面是sysservers,而且mssql2008里面是sys.servers
6.SQL 2008升级SQL 2008 R2完全教程或者10.00.1600升级10.50.1600 我想,会不会是因为版本的问题呢?我进行数据库发布的版本是SQL Server2008,而订阅的数据库版本是2008 R2。数据库版本说明:10.00.1600其实就是SQL 2008, 10.50.1600其实就是SQL 2008 R2, 10.50.2500其实就是SQL 2008 R2 SP1。查看数据库版本的sql语句:
1
2
3
4
5
6
7
SELECT 
SERVERPROPERTY('servername') AS 实例名,
SERVERPROPERTY('ProductVersion') AS 实例版本,
SERVERPROPERTY('Edition') AS 产品版本,
SERVERPROPERTY('ProductLevel') AS 版本级别,
@@VERSION AS 版本信息


  • 第三次尝试:管理工具的统一
    我梳理了自己安装的程序,在一台服务器上叫A吧,sql server和管理工具(在SQL Server安装介质中安装的)都是Sql Server2008,在另外的两台服务器上,安装的是Sql Server 2008 R2,管理工具安装的是SSMS 18.9.1,独立在官网(SSMS)上下的管理工具,没有使用sql server 2008R2 里面自带的管理工具。

其实很早我就怀疑过了,错误提示说是:” 无效的对象名称sysservers “,那会不会是在创建sql语句是产生的选择语句不同呢?于是,这一次,我将默认的管理工具安装上了(刚开始我也不知道自带了一个管理工具),然后再次从同一个机器上,进行发布和订阅的尝试,果然好用了。

我忘记在哪篇文章中看到的了,说是进行订阅和发布时不能隔两代,我的理解就是,SQL Server2008不能和SQL Server2016进行相互订阅和发布

参考文章:
1.SQL SERVER 2008 利用发布订阅方式实现数据库同步 这里的作者回复了我的问题,虽然他也没有遇到过,但是还是感谢他回复吧。
2.SqlServer_查看SQLServer版本信息
3.复制的向后兼容性 分发服务器的版本可以是高于或等于发布服务器版本的任何版本;发布服务器的版本可以是低于或等于分发服务器版本的任何版本;订阅服务器版本取决于发布的类型:用于事务发布的订阅服务器版本可以是两个发布服务器版本中的任何一个版本,合并发布的订阅服务器可以是等于或低于发布服务器版本的所有版本,而发布服务器版本是生命周期支持周期支持的版本。

(4) SQL Server复制需要有实际的服务器名称才能连接到服务器。不支持通过服务器别名、IP地址或者任何其他备用名称进行连接
这个问题更加的奇怪,我在使用SSMS18.9进行订阅的时候,可以使用ip地址进行连接,但是使用了SQL Server2008 R2自带的管理工具,进行连接的时候,就会出现这个问题,但是如果不用ip地址的话,怎么连接远程地址呢?如果还配置服务器名称呢?这不是让人蛋疼的事情吗?如果我知道服务器名称,那不就是本机了吗?

我在SQL Server配置管理工具中,添加了别名,在系统的hosts中添加了对应的别名地址,还是不行(简直令人头大)。

因为我的两台计算机是虚拟机,复制出来的,所以计算机名称一样,于是我尝试了修改其中的一台计算机名称,和服务名称

参考文章:
1.SQL Server复制需要实际的服务器名称才能连接服务器问题 首先通过查看数据库注册服务器名与实际服务器名是否相符;如果数据库服务器名称是别名,通过修改操作系统hosts文件的格式。如果数据库注册名与实际服务名称不符,建议首先修改数据库中被注册的服务器名称。修改完以上操作,重启数据库服务,然后在尝试是否解决此问题;否则通过sa用户登录到数据库中查看 数据库实例下用户 servername/username 对应的权限是否是否合适,如果有问题分配相应的角色权限即可。
2.“SQLServer复制需要有实际的服务器名称才能连接到服务器,请指定实际的服务器名”转 有两种情况,就是一种是修改过了服务器名称和计算机名称,一种是使用了为远程服务器添加别名的方式进行连接。我没有改过服务器名称,就是和计算机名称相同。但是我使用别名进行连接的时候,还是出现问题。
3.sql server2008发布-订阅实现异地热备份总结及常见问题分析 这里有很多的问题,”由于出现操作系统错误 3,进程无法读取文件”、”对带有“$”符号的共享文件夹的访问被拒绝”、”用服务器名连接服务器的时候报无法生成SSPI上下文,但是用IP地址可以用客户端登陆”,其中也包括了无法连接的服务器的问题,在hosts文件中增加一行,数据库服务器对应ip,但是我还是不可用
4.SQL2008 发布/订阅,非默认端口下连接发布服务器问题 这里的讨论是针对于非默认端口进行订阅的问题,楼主的解决方法:就是设一个别名和发布服务器同样名称,这样就可以查找到了
5.SQL Server 命名实例更改端口进行发布订阅 这里在设置别名的时候,要填入实例的名称,不知道管不管用,但是我自己使用的时候,是不管用的
6.sqlserver在使用发布订阅功能时,如果使用了非默认IP会连不上发布服务器 他的解决方法是,把32位和64位的别名都配置上,但是我本身就是已经配置上了的,还是不能使用。
7.超详细SQL SERVER 2016跨网段和局域网发布订阅配置图解和常见问题

(5) 仍有对服务器 ‘xxx’ 的远程登录或链接登录。
在进行服务器名称和计算机名称修改时出现的错误,我修改了计算机名称,但是进行sql server服务器名称修改的时候,总是不成功,提示:仍有对服务器 的远程登录或链接登录。解决方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
-- 1.查询服务名和计算机名
use master
go
select @@servername
select serverproperty('servername')

-- 2.删除所有之前配置的publishers('old_server_name'为之前的服务名)
select * from msdb.dbo.MSdistpublishers
DELETE FROM msdb.dbo.MSdistpublishers
select * from msdb.dbo.MSdistpublishers
exec sp_droplinkedsrvlogin 'old_server_name',null
exec sp_dropserver 'old_server_name', 'droplogins'

-- 执行完后,重启SQL Server服务

-- 3.配置计算机名与服务名一致
USE master
GO
if serverproperty('servername') <> @@servername
begin
declare @server sysname
set @server = @@servername
exec sp_dropserver @server = @server
set @server = cast(serverproperty('servername') as sysname)
exec sp_addserver @server = @server , @local = 'LOCAL'
end

-- 执行完后,重启SQL Server服务

-- 4.再次查看
sp_helpserver

(6) 没有将”xxx”配置为远程服务器
当我重新修改了一台服务器的名称之后,然后将两台服务器连接入同一个局域网中,虽然在查找服务器的时候,可以查找到这台服务器,但是选择连接这台服务器的时候,出现了这个问题:没有将”xxx”配置为远程服务器。

解决方法:因为我修改了计算机名和sql server服务器名,但是复制还是保留着以前的服务器。可以右键复制->然后选择”禁用发布和分发”,然后就可以删除这个发布了。

(6) 无法启动代理,因为该作业已应 用户 sa 的请求正在运行。该作业尚未完成就被 用户 sa 停止。 启动顺序 0 调用了该作业
在自动发布的时候,出现了这个问题。

更进一步的消息:进程无法连接到Subscriber

这个问题其实我也不知道怎么解决,只是说,删除了发布和订阅,然后重新创建了发布和订阅。

参考文章:
1.SQL Server 2008 数据库复制实现数据同步常见问题 这里也列举了进行订阅和发布的时候的几个问题:订阅状态显示”请求共享代理程序失败”, “进程未能连接到distributor…”;全部重新创建发布和订阅成功,执行却又出现”发布内容 null”的提示;

(7) 用户登录失败
在进行订阅的时候,我选择了在订阅服务器上运行代理,打开复制监视器,出现了了 “xxx” 用户登录失败的问题,但是我也很奇怪,我没有 phems 这个用户,所有的订阅和发布订阅的时候,唯一和phems相关的就是用户phems_test的名称,难道是因为直接将后面的短线忽略掉了吗?

解决方法:我把订阅和发布都删除了,然后把phems这个用户也删除了,最后重新进行发布和订阅。

(8) 由于出现操作系统错误 3,进程无法读取文件“xxx.pre”
这个问题是由于无法读取文件造成的,sql server2008发布-订阅实现异地热备份总结及常见问题分析 这篇文章中的最后给了建议。

解决方法:

  • 在发布服务器上,右键发布,打开属性,找到快照,然后找打快照的存在位置,然后拷贝文件夹下的全部文件,这里是unc文件。

  • 在订阅服务器上,右键订阅,打开属性,找到快照位置,改为备用文件夹,然后设置快照文件夹和发布服务器上的快照路径一致,这里为:“D:\sqlserver_data\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\ReplData”,然后,将发布服务器上的快照存放位置处的文件夹都拷贝到该文件夹中,这里是unc文件。

(9) 远程服务器 “IZ23TFQL1HVZ” 不存在,未被指定为有效的发布服务器,或您无权查看可用的发布服务器。
这是在A服务器上进行发布,然后B服务器上订阅的结果,因为A服务器上的端口号为5433,所以需要使用别名和hosts文件进行配置,即便是配置了hosts和别名,还是出现了错误。

解决方法:创建登录用户时,授予用户服务器角色: sysadmin

(10) 对象 WxUser 中的列 UserBill 包含类型 VarCharMax,此类型不受目标服务器版本 SQL Server 2000 支持。
这个错误,是我在sql server 2008上进行发布,然后sql server 2008 r2上进行订阅时出现的问题。

我查看了自己的数据表,发现真的有一个UserBill 字段的类型为varchar(MAX),索性就直接改掉好了,将varchar(MAX)改为了varchar(5000)。除了这个之外,还有就是time类型,也出现了不兼容,我暂时不知道这个问题怎么处理,除了修改项目类型之外,还有其他的方法吗?因为我发布使用的是SQL Server2008,订阅服务器安装的是SQL Server2008 R2啊,没有SQL Server 2000。

当我查看初始化的设置时,发现了一个:将发布服务器数据库兼容级别设置为80,这才找到了为什么是不兼容2000的原因了。


当我查看初始化的设置时,发现了一个:将发布服务器数据库兼容级别设置为80,这才找到了为什么是不兼容2000的原因了。

但是修改发布兼容性级别,这个只在发布类型为合并复制的时候才有的选项,事务性发布没有修改兼容性级别的地方。

我是用下面的语句,查看数据的兼容级别,发现我复制的数据库的兼容性级别被改为了80,我想能不能进行兼容性级别的改变呢?

1
2
-- 获取全部的数据库兼容性级别
SELECT name, compatibility_level FROM sys.databases;

根据参考文章4,修改数据库的兼容性级别如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- 获取数据库兼容级别
SELECT name ,compatibility_level ,recovery_model_desc FROM sys.databases WITH(NOLOCK)

-- 将用户设置为单用户访问模式
ALTER DATABASE test SET SINGLE_USER

-- 修改数据库的兼容级别
ALTER DATABASE TEST
SET COMPATIBILITY_LEVEL = 90
-- or
EXEC sp_dbcmptlevel TEST, 90;
GO

-- 将用户设置为多用户访问模式
ALTER DATABASE test SET MULTI_USER

订阅服务器类型 这里说,创建发布快照之后,可以在 “发布属性” 对话框的 “常规” 页上提高发布兼容级别(使其更为严格);无法降低兼容级别。但是我的发布属性的常规页面种,没有这个发布兼容级别选项

参考文章:
1.设置合并发布的兼容级别 这是官方提供的几种方式,使用 SQL Server Management Studio:在新建发布向导的 “订阅服务器类型” 页上,选择发布应支持的订阅服务器类型、;使用 Transact-SQL进行合并复制。
2.[微软官方]SQLSERVER的兼容级别 这里说了各个版本的兼容性级别,80指2000,2008是100,还有查看数据库兼容性级别的方法
3.更改数据库的兼容模式 更改数据库的兼容性的方法
4.浅析SQL Server复制的向后兼容性
5.将已发布的复制数据库的数据库兼容性级别从90更改为100的影响

(11) 由于被引用对象或列在订阅服务器上不存在,因此无法复制视图或函数。
使用事务进行复制的时候,不支持视图的复制。

(12) 订阅已在订阅数据库中
这个问题,是因为我手贱,先是把数据库删除了,然后再删除的订阅,最后订阅删除不了了,但是也新键不了,蛋疼。

解决方法,就是把订阅关连的数据库整个的都删掉就可以了。

参考文章:
1删除请求订阅 官方提供的使用TSQL语句进行删除的操作,其实也还是不可以。
2.SQL Server元数据损坏(metadata corruption)修复 没有用到
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。