- 博客(65)
- 问答 (1)
- 收藏
- 关注
原创 小工具-Greenplum数据库中AO表和非AO表获取
小工具-Greenplum数据库中AO表和非AO表获取–执行说明/*该脚本是用来获取数据库中每个 schema 下是否是 AO 表,如果有 AO 表,将会存储于临时表*tab_aotable中,如果是非 AO 表,那么将会存储于临时表 tab_naotable 中,由于存储非AO*表和AO表都是存储于临时表中的,因此在会话退出后,临时表将会自动销毁,如果需要获取,*请重新执行以下语句*/drop table if exists tab_aotable;drop table if exis
2022-03-07 15:36:06
640
原创 Greenplum 将表未分区的数据修改为分区表
前言在生产业务环境中,经常由于设计不规范,导致在数据库中存储的数据体量越来越庞大,那么带来的问题就是查询效率的低下和维护任务的增加。在 Greenplum 数据库中,通过使用分区,可以实现大规模并行处理,并且子分区也可以拥有自己的分区,比如数据按照年份分区,再按照月份分区。在内部处理表分区的过程中,Greenplum 在父级表和子表之间是通过被继承实现,类似于 PostgreSQL 中的继承。如何决定分区策略· 表是否足够大通常在数据仓库中,会区分维度表和事实表,而事实表通常需要存储大量的数据,
2021-12-28 11:07:20
1849
原创 Ubuntu 下编译安装 PostgreSQL
前言最近有同学问到在 Ubuntu 下如何编译安装 PostgreSQL。这次内容就来说一下如何在 Ubuntu 操作系统中安装 PostgreSQL 数据库。那么,安装 PostgreSQL 对于 DBA 来说是再简单不过的事儿了,我们知道 PostgreSQL 在 Redhat 家族系统中有三种安装方式,分别是源码安装,rpm 方式安装和yum 方式安装,当然,rpm 安装和 yum 安装可以当做是同类型的安装,除此之外,就是使用已经编译好的二进制安装。那么对于Ubuntu操作系统来说,除了一键化使用
2021-12-17 11:25:26
1684
原创 Greenplum 数据库按照指定 schema 恢复脚本
前言Greenplum 作为OLAP 系统,通过在多个服务器或主机逐渐分配负载来存储和处理大规模业务数据。组成 Greenplum 数据库集群中的每一个计算节点是由独立的 PostgreSQL 实例构成。节点之间的通过 interconnect 相互通信来流转数据。Greenplum 数据库可以运行在多种 X86 架构的平台上,性能取决于安装平台的硬件。由于数据库数据分布在每一个 PostgreSQL 实例中,因此,单个 PostgreSQL 实例的配置性能会影响整个集群的性能。为什么要构建该脚本考虑
2021-12-14 15:10:03
1420
原创 Mysql 8.0 OGG21C 安装使用
OGG安装环境介绍,为了节省资源OGG我选择和原库安装在了同一台服务器软件版本IP地址OGG21.3192.168.2.251Mysql8.0.11192.168.2.251Mysql8.0.11192.168.2.2521.1 解压ogg的安装包上传并解压mysql ogg安装包,无需安装解压即可使用# mkdir /ogg# unzip 213000_ggs_Linux_x64_MySQL_64bit.zip# tar -xvf ggs_Linux
2021-12-08 15:45:03
471
原创 PostgreSQL 跨数据库实例之间的数据访问
前言PostgresSQL 作为单示例多数据库,通常一个数据库实例会包含多个表空间和数据库,一个表空间可以存放多个数据库,在此关系中,一个表空间可以包含多个数据库,但是一个数据库只能属于一个表空间,不能跨表空间存放。而表空间是一个逻辑概念,实质上在 PostgresSQL 中,一个表空间实际上就是一个可以供安装 PostgresSQL 用户读写的目录,所以,一个数据库集簇的最大大小取决于组成数据库的这些表空间所对应目录大小的总和大小。那么这些多个数据库组成的数据库集簇可以用来隔离不同业务的数据,同时,也方
2021-11-29 15:40:01
2427
原创 PostgreSQL 之慢 SQL 语句
一 导读优化在硬件和非系统故障的情况下,对于提升数据库本身的性能非常重要。每一种类型的数据库都有自己不同的方式去跟踪优化数据库,这些方式中不仅仅包含了数据库系统本身参数层面的优化,而且也包括对 SQL 语句的优化。其中,对于 SQL 语句的优化是 DBA 经常需要接触的工作。因此需要经常关住慢 SQL 语句,以对其进行追踪优化。二 数据库参数PostgreSQL 中的慢 SQL 追踪是通过以记录日志的方式进行分析,追踪的,因此,需要优化 SQL 需要启动日志收集功能。以 RPM 方式安装的数据库日志收
2021-11-09 16:46:05
1782
原创 详解Oracle 21c 中的只读Oracle主⽬录特性 (ROOH)
1. 只读Oracle主⽬录特性(ROOH)介绍当我们安装完成Oracle Database 21c 数据库软件后,发现ORACLE_BASE⽬录中出现了dbs和homes⽬录,其实这是只读Oracle主⽬录特性(ROOH)特性所带来的变化。如下所示[oracle@ss21c ~]$ cd /u01/app/oracle[oracle@ss21c oracle]$ lscfgtoollogs dbs diag homes product只读Oracle主⽬录特性(ROOH)是在 Oracle
2021-10-25 14:18:44
491
1
原创 PostgreSQL 常见时间日期处理
前言在实际业务开发过程中,通常会遇到对时间日期相关的处理,这里列出一些常见的时间日期处理方法。1. 时间戳带时区和不带时区创建表字段时,指定带时区时间日期数据类型postgres=# CREATE TABLE tab_test(id serial,app_name varchar,app_release_date timestamp with time zone default now()); CREATE TABLE postgres=# INSERT INTO tab_test
2021-10-19 11:09:32
5434
原创 掌握TiUP工具 之 离线部署TiDB集群
TiDB数据库传统的单机数据库在移动互联网、云计算、大数据和人工智能等场景下表现的力不从心,为了解决数据平台的扩展性的问题,TiDB 分布式数据库应运而生。TiDB 是当今开源 NewSQL 数据库领域的代表产品之一。TiDB采用分布式数据库架构,因此服务器数量比较多。在部署TiDB集群时,我们使用TiUP工具来安装整个TiDB集群环境。 从 TiDB 4.0 版本开始,TiUP 作为新的工具,承担着包管理器的角色,管理着 TiDB 生态下众多的组件,如 TiDB、PD、TiKV 等。用户想要运行 Ti
2021-10-09 14:15:27
1514
1
原创 掌握TiUP工具 之 启停TiDB集群节点
TiUP工具简介从 TiDB 4.0 版本开始,TiUP 作为新的工具,承担着包管理器的角色,管理着 TiDB 生态下众多的组件,如 TiDB、PD、TiKV 等。用户想要运行 TiDB 生态中任何组件时,只需要执行 TiUP 一行命令即可,相比以前,极大地降低了管理难度。使用TiUP工具可以很轻松的对TiDB集群进行日常运维工作,如果我们想启停TiDB集群中的某一台服务器,可以使用文章中的操作流程。停止TiDB集群节点首先使用 "tiup cluster display "命令查看TiDB集群信
2021-09-28 09:39:06
1695
原创 Oracle21C 单机安装
一、说明本次安装将使用Oracle通用安装程序(OUI)安装Oracle数据库软件以及数据库1.1 Linux 下Oracle操作系统要求Oracle Linux 8.1 with the Unbreakable Enterprise Kernel 6: 5.4.17-2011.0.7.el8uek.x86_64 or laterOracle Linux 8 with the Red Hat Compatible kernel: 4.18.0-80.el8.x86_64 or laterOra.
2021-09-06 11:17:22
5036
2
原创 MySQL 有关用户密码
MySQL 介绍MySQL 是由Oracle Corporation 开发和发行的最流行的数据库管理系统。MySQL 网站地址为: www.mysql.com,提供最新的MySQL软件包及相关工具的下载。MySQL 是一个数据库管理系统,数据库是由数据的集合构成。MySQL 是关系型数据库,关系型数据库存储数据在单独的一系列表中,而不是将数据存储在一个大的存储空间中。数据库的结构是被组织在快速的优化后的物理文件中。逻辑模型和对象如数据库、表、视图、行和列,提供了灵活的编程环境。MySQL 的 SQL 部分
2021-08-25 15:12:38
586
原创 记一次oracle HAIP引发的数据库问题
No connectivity to other instances in the cluster during startup. Hence, LMON is terminating the instance. Please check the LMON trace file for details. Also, please check the network logs of this instance along with clusterwide network health for problems
2021-08-16 11:45:32
550
原创 使用TIDB BR工具进行数据库备份
1、 下载tidb工具包注意下载的版本,我选择现装到tidb节点[root@tidb ~]# wget https://download.pingcap.org/tidb-toolkit-v5.0.2-linux-amd64.tar.gz2、 创建备份目录注意:请在执行备份命令的节点及所有KV节点创建备份目录,本地节点会存放备份产生的锁文件, tidb是多副本结构,所以每一个存放数据的kv节点都会产生备份。[root@kv1 /]# mkdir /bakcup[root@kv1 /]# ch
2021-08-06 09:39:49
819
原创 PostgreSQL 中系统表 pg_attribute 膨胀现象
说明 PostgreSQL 一览表 pg_attribute存储关于表列的信息,数据库中每张表中的行都会对应在该系统表 pg_attribute 中。既然存储的是数据库中表字段相关的信息,那么对表所做的修改都会通过该表记录。如创建表指定的列,修改表,修改表的数据类型等等。创建自定义函数查看某张表的信息postgres=# CREATE OR REPLACE FUNCTION f_get_table_column_info(varchar,varchar)postgres-# RETURNS T
2021-07-26 10:36:05
674
原创 PostgreSQL中的GENERATED COLUMN
什么是 GENERATED COLUMNGENERATE COLUMN 是一个在 CREATE TABLE 时指定的标识列(特征列)。该列将会附着一个隐藏的序列,并且在插入数据时以默认的隐藏序列为数据行进行插入。该列默认约束为 NOT NULL 约束。该列后有可选 GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence _ options ) ]关键字。如果使用 ALWAYS 关键字,当在使用 INSERT 语句时接受 OVERRID
2021-07-21 16:09:11
1224
1
原创 PostgreSQL小工具脚本
授权某个用户对所有数据库下的schema的访问权限可根据实际需求修改#!/bin/bash#Defining connection information#Default user posgres#Author:Songshaohua#Date:2020-07-08#Version:defaultfunction Usage(){ if [ $# -ne 1 ];then echo "Usage: sh $0 需要被授权的用户" exit 999
2021-07-12 10:49:38
2680
原创 PostgreSQL 对象管理
概述PostgreSQL 中的所有数据都存储在对应的文件中,即我们常见到的文件。这些用来存储数据的文件共同构成了 PostgreSQL 整个数据库集簇,而数据库集簇是对 PostgreSQL 中多个数据库组成的集合的称呼。而在逻辑上,PostgreSQL 所有的数据库都是隶属于某个表空间,并且单个数据库不能跨表空间,而一个表空间中可以存放多个数据库。表空间和数据库的关系属于多对多的关系。那么数据库中的数据是如何存放在数据文件中的呢?接下来一起探究。理解 oid 和 relfilenode 的关系在 P
2021-07-09 15:07:32
210
原创 如何对TiDB进行在线扩容
1、 检查集群状态[root@tidb ~]# tiup cluster display sandata我们发现集群里只有1个TIDB节点,根据官方手册要求生产环境最少需要两个TIDB节点所以我们进行在线扩容添加一个TIDB节点。2、 创建扩容文件scale-out-tidb.yaml这里我们复制topology.yaml文件的tidb部分内容进行修改,如果找不到topology.yaml文件也可以去官方文档查找对应的参数,将注释去掉不需要的部分也删掉,注意格式,有可能格式不对会报错,目录端口根
2021-07-06 10:21:52
771
原创 ora-00245报错解决方法
更多精彩内容,请登录:ke.sandata.com.cn1.发现问题最近使用备份软件对客户11G RAC数据库进行备份,发现备份失败查看日志发现数据库报 ORA-00245: control file backup failed; target is likely on a local file system错误。2.问题分析本报错出现于oracle 11.2.0.1.0及以后的版本中,应用于所有平台仅仅RAC环境会发生,因为oracle 11Gr2控制文件备份机制的改变,集群中的任何实例
2021-06-23 10:36:29
2213
原创 PostgreSQL 密码验证功能增强
更多精彩内容,请登录:ke.sandata.com.cn密码验证介绍passwordcheck 模块是在 CREATE ROLE 或者 CREATE USER 期间检查用户密码是否符合指定的规则模块如果密码比较弱,那么在此期间将会拒绝执行密码并返回一个错误。 该模块位于 srcpkg/contrib 目录下,安装后位于 $libdir 目录下,使用 shared_preload_libraries加载并重新启动服务器后生效。在该模块中,主要有两个规则判断,一个是用户名自身的判断,一个是密码长度少于8位的
2021-06-18 10:30:01
393
原创 【晟数学院】PostgreSQL—greenplum使用gpcopy数据传输方案
更多精彩内容,请登录:ke.sandata.com.cn一 架构基础环境主机mdw和备机mdwbak节点对等,都采用2+4架构。1.1 主机列表1.2 CPU及内存所有节点都采用华为云服务器,CPU核心数为16核心,内存为32G,节点总数为12。主机备机都采用内部万兆网络。磁盘为单独挂载磁盘,采用高性能IO磁盘,实际最高读写性能为350M/s。1.3 计算节点和镜像节点计算节点primary数量为主备机都为24,镜像节点mirror数量为主备机都为24,总节点数量为48。1.4 数据库版本
2021-04-20 15:59:47
415
原创 Greenplum 数据同步方案—PostgreSQL技术文章晟数
更多精彩文章,请登录:ke.sandata.com.cn一、目的当前现有服务器状态为同机房两套 Greenplum 集群,节点数为 2 + 4。为满足未来灾备中心建设,需要构架高可用架构方案,以满足未来在生产系统集群出现不可恢复状态下,备用集群可以完全接管生产系统集群,以实现高可用架构。二、方案目前方案分为以下两种,一种为数据实时同步高可用方案,一种为允许数据同步有一定的延迟状态。2.1 数据实时同步高可用架构(本文省略)架构图如下(不做说明)当主机中心由于不可抗拒因素或者硬件及认为因素不可
2021-04-13 15:54:28
1509
2
原创 【晟数学院】多台机器之间一键化互信脚本实现—PostgreSQL数据库
前言在生产环境中,尤其是集群之间,为了能够使机器之间免密访问,通常需要配置ssh keys 互信,一两台机器手动也会很快处理好,但如果是多台机器,手动做互信就显得有点力不从心了,有可能还会配置错误,为了能够一键化完成自动配置,以下使用shell脚本实现自动互信过程。一、实现脚本脚本名称为:autoexssh.sh,执行脚本前需要在各个服务器上安装expect包,可以使用yum方式安装,也可以使用源码编译安装,Depend On You 。#!/bin/bash##################
2021-04-07 12:01:28
180
原创 【晟数学院】PostgreSQL数据库—pgweb网站工具使用
pgweb简介pgweb是用Python语言使用 Django框架构建而成。同时该网站也使用bootstrap CSS框架以及Font Awesome 图标库。pgweb中的大多数内容都是静态的HTML模板,如果需要对web页面进行编辑,只需要对 template/pages/ 目录下的内容进行编辑。安装1. 准备Python环境安装Python3.7环境./configuremake -j24make install -j24[root@pgserver ~]# python3 --ver
2021-03-30 10:41:30
772
原创 PostgreSQL HLL插件介绍—晟数学院
更多精彩内容:请登录ke.sandata.com.cn前言HLL是 HyperLogLog数据结构的简称。PostgresSQL通过插件的方式引入了这种新的数据类型hll。HyperLogLog是一个具有固定大小,类似于集合结构,用于可调精度的不同值计数。例如,在1280字节的hll数据结构中,它可以在很小的误差范围内估算出数百亿的不同值计数。算法hll可以被视为层次结构的不同集合/不同值计数算法的组合,并向上移动该层次结构的规则。为了区分上述描述算法,将其命名为以下:♠ EMPTY表示空集的常
2021-02-26 11:28:13
845
原创 晟数数据库技术文章-Oracle Database-别无选择时的EXP导出数据手记
更多精彩内容,请登录:ke.sandata.com.cn如今已经是Oracle Database 21c的时代了,你是否还考虑过使用EXP/IMIP这些9i中的工具呢?其实在特殊的场景中,这些看似“老的工具”,也是可以帮助你解决棘手的问题。比如:可以在数据库只读模式下,导出数据等。又或者将其应用在我下文中所描述的场景中。进入正题,某客户找到我,描述了其数据库无法启动的故障,经过分析得出数据库软件被注入了恶意的代码,导致TAB$表数据被删除,从而无法启动数据库,告警日志里面的输出如下:Errors
2021-02-05 11:35:16
110
原创 PGCM-PostgreSQL备份工具 pgBackRest使用
前言pgBackRest是一款开源的备份还原工具,目标旨在为备份和还原提供可靠易用的备份。特性并行备份和还原备份操作期间压缩通常是其瓶颈所在。pgBackRest通过并行处理解决了备份期间压缩出现的瓶颈问题。本地远程操作自定义协议允许 pgBackRest以最小化配置通过SSH在本地或者远程执行备份、还原和归档。并且该程序也通过协议层提供了PostgreSQL查询接口,以便于必须要再远程访问PostgreSQL,从而保证了其安全性能。全量,增量和差异备份支持全量,增量和差异备份。pgBack
2021-01-22 11:20:47
820
原创 PostgreSQL查找需要收集的vacuum表信息—晟数学院
前言通常,在PostgreSQL中,由于经常需要对表进行 UPDATE 和 DELETE,因此表会产生碎片空间。在 PostgreSQL中,使用VACUUM 仅仅对需要执行 VACUUM 表将已删除的空间标识为未使用,以便以后重用这些空间,但是不能立即将占用的空间返还给操作系统,因此需要使用 VACUUM FULL,才可以释放空间,并立即将空间返还给操作系统。实现脚本记录收集表创建CREATE TABLE IF NOT EXISTS tab_vacuum_record(sqltext text);
2021-01-11 17:17:46
431
原创 PostgreSQL libpq学习指南二
链接状态函数PQdb返回连接的数据库名称PQuser返回连接的用户名称PQpass返回连接的用户密码如果连接密码没有被提供,那么将会尝试从 password_file 文件中获取。PQhost返回连接的服务器主机名称PQhostaddr返回连接的服务器IP地址PQport返回连接服务器的端口PQtty返回连接的DEBUG 终端信息PQoptions返回命令行传递的参数信息PQstatus返回连接的状态信息示例:#include <stdio.h>#in
2021-01-08 17:31:49
452
原创 PostgreSQL libpq 客户端接口(一)
前言Libpq 是为 C 语言开发这提供的关于 PostgreSQL 的接口。Libpq 由相关库函数组成,可以允许客户端程序通过将查询传递给 PostgreSQL 后台服务器并接收这些查询返回的结果。同时,libpq 也是其它几个 PostgreSQL 应用程序接口的基础引擎,包括 C++,Perl,Python,Tcl和ECPGC编程的嵌入式 SQL。连接字符串以下函数处理 PostgreSQL 后台服务器的连接。一个应用程序同时可以有多个打开的连接,这也是 PostgreSQL 服务器能够同时访
2020-10-21 15:40:30
889
2
原创 PostgreSQL 中的shared buffer
前言通常,在任何数据库系统中,都需要面临海量用户对数数据库进行读写操作。而对数据库中的数据最直接的读写操作是读取数据库中对应的数据目录中的文件。这些文件里面包含了数据库的任何对象,如表、视图、索引、序列、函数等。PostgreSQL 也不例外,在对数据库初始化时,我们能够看到由PostgreSQL 服务端工具 initdb 创建的相关表和目录,但在一个不具有弹性伸缩的数据库系统中,海量用户对数据库的读写操作并不是很理想。因为对数据库的数据对象进行读写操作需要数据库系统查找相关文件,打开文件,然后通过相关的
2020-10-09 15:46:34
1682
原创 【晟数学院】通过 Unwrapper 解密 DBMS 程序包
一、DBMS程序包Oracle 为 Oracle 服务器提供了许多 PL/SQL 软件包,以扩展数据库功能并提供对 SQL 功能的 PL/SQL 访问。在这些 Oracle 提供的程序包中,已 DBMS 开头的程序包使用的最为广泛。如果我们想查看 DBMS 程序包的代码,你就会发现,Oracle 对程序包体部分进行了加密处理。这种加密虽然保护了程序包体的代码安全,但对我们研究 Oracle 程序包形成了阻碍。于是各种解密 DBMS 程序包的方法便层出不穷的被大家所熟知。接下来,我介绍一种使用 SQL
2020-07-31 16:46:14
352
原创 PostgreSQL-openGuassDB介绍及安装实践
一、openGuass介绍openGaussDB(openGauss)是华为云深度融合在数据库领域多年的经验,结合企业级场景需求,推出的新一代企业级分布式数据库,支持集中式与分布式两种部署形态。在支撑传统业务的基础上,持续构建竞争力特性,为企业面向5G时代的挑战,提供了无限可能。(来自华为云官方)。openGauss 于2019年9月19日正式开源,于2020年6月30日正式开放源代码,并成立openGuass社区。官方网站地址 https://opengauss.org。openGuass 底层框架源
2020-07-09 15:20:15
2972
原创 PostgreSQL中的ACID特性介绍
任何关系型数据库中,ACID 是组成数据库的重要部分,是数据库事务的一组属性,该特性目的主要确保数据库在异常情况下保证数据的有效性。数据库ACID特性A(Atomicity)原子性:事务通常由多个语句组成。原子性保证将每个事务视为单个单元,该事务要么完全成功,要么完全失败。换句话说,如果在一个事务中,任何语句都未能完成,整个事务都会失败,未完成事务中的数据条目在数据库中保持不变。一个原子系统必须保证在任何情况下都具有原子性,包括电源故障,数据库错误和实例奔溃。同时,原子性可以防止在数据库中发生部分数
2020-06-30 10:55:34
544
原创 PostgreSQL之SQL函数介绍及实践(二)
RDBMS作为管理数据安全,共享,可靠的软件管理系统,需要按照不同的数据模型组织和存储数据,为了方便用户处理数据,任何数据库为了简化业务开发复杂度,提供了丰富的不同数据类型的处理函数。而PostgreSQL除了支持 SQL 标准所支持的函数外,也可以使用不同的服务器编程接口来实现自定义函数,以针对不同的业务需要进行针对性开发。今天来给大家介绍一下PostgreSQL中的字符串处理函数。一、字符串处理函数1.1字符串操作符PostgreSQL对于字符串的操作符,支持关系型数据库中通用的符号 ||,用来多
2020-06-05 17:43:52
897
原创 PostgreSQL之SQL函数介绍和实践(一)
为了处理数据库中的业务数据,需要使用SQL函数去适当处理,通常常用的函数都内置在数据库中。但业务需求仅仅依赖于数据库内置的函数远远不够,因此一个数据库如果可以提供自定义函数来实现业务需求,对于数据库本身来说,扩展性更强。在PostgreSQL中,PostgreSQL不仅支持丰富的数据类型,也支持丰富的 SQL 函数。当在 SQL 函数中传入的参数不是 PostgreSQL 期望的数据类型,PostgreSQL 将会尝试在执行 SQL 函数之前,对传入的参数进行隐式转换。同时,PostgreSQL 也支持自定
2020-06-05 17:27:59
1075
原创 PostgreSQL之SQL操作符介绍及实践
操作符是数据库具有的运算特性,对文本字符和一些标签字符的处理,使用操作符可以简化SQL代码,同时也可以节省开发时间和提高开发效率。比较操作符在PostgreSQL中,所有的数据类型都可以使用比较操作符,比较操作符运算结果返回一个布尔值。即 TRUE 或者 FALSE。比较操作符为双目操作符,因此被比较的两个值的数据类型必须是相同的数据类型或者在彼此之间可以进行隐式类型转换。在PostgreSQL中,提供的比较操作符有 > 、< 、<= 、>= 、= 、<> 或者 !=
2020-05-25 11:48:22
1044
转载 12c OMS 日志&目录结构
以下是在 OMS 上安装的一些重要的目录:1、Middleware Weblogic home:也称为<MW_HOME>,这是安装10.3.5 Weblogic 软件的目录。2、Oracle Management Service Instance Base:也称为<EM_INSTANCE_BASE>或<EM_CONFIG_HOME>,这是一个目录,默认情况下名为gc_inst,位于<MW_HOME>下。3、Oracle Management Servic
2020-05-21 11:20:28
686
空空如也
mysql8.0 ogg21c 抽取进程一直报05011错误是为啥
2021-12-20
TA创建的收藏夹 TA关注的收藏夹
TA关注的人