Oracle容器数据库的安装和使用

2022-12-02 10:37:41 浏览数 (1)

文章目录

  • 1Oracle 19c的安装和使用
  • 2Oracle容器数据库基本知识
    • 2.1容器数据库的组成
      • 2.1.1ROOT
      • 2.1.2CDB seed
      • 2.1.3PDBs
      • 2.1.4Application Containers
    • 2.2根环境的用户
  • 3容器数据库的安装及使用
    • 3.1安装
    • 3.2常用命令
      • 3.2.1查看当前的容器
      • 查看数据库是否为CDB
      • 3.2.3查看CDB中的PDB信息
      • 3.2.4启动和关闭已创建好的PDB数据库
      • 3.2.5 CDB与PDB的切换
    • 3.3通过plsql使用
      • 打开PDB
      • 3.3.2创建用户并授权
      • 3.3.3配置
  • 4容器数据库的创建
    • 4.1创建方式
    • 4.2使用CDB seed创建PDB
    • 4.3克隆已经存在的PDB
    • 4.4克隆远程PDB
    • 4.5克隆本地PDB

1Oracle 19c的安装和使用

这个是正常版本的 链接: Windows10安装Oracle19c数据库详细记录

2Oracle容器数据库基本知识

  容器数据库,又称为可插入数据库,又可以称为多租户容器数据库 Oracle Multitenant Container Database(CDB)   CDB是Oracle 12C引入的特性,指的是可以容纳一个或者多个可插拔数据库的数据库,这个特性允许在CDB容器数据库中创建并且维护多个数据库,在CDB中创建的数据库被称为PDB,每个PDB在CDB中是相互独立存在的,在单独使用PDB时,与普通数据库无任何区别。   CDB根容器数据库的主要作用就是容纳所有相关的PDB的元数据,以及在CDB中对所有的PDB进行管理。   即容器被称为CDB,容器里的子数据库被称为PDB。

2.1容器数据库的组成

2.1.1ROOT

  Root容器数据库,是CDB环境中的根数据库,在根数据库中含有主数据字典视图,其中包含了与Root容器有关的元数据和CDB中所包含的所有的PDB信息。在CDB环境中被标识为CDB$ROOT,每个CDB环境中只能有一个Root容器数据库

2.1.2CDB seed

  CDB seed为PDB的种子,其中提供了数据文件,在CDB环境中被标识为PDB

SEED,**是创建新的 PDB的模板**,你可以连接PDB

SEED,但是不能执行任何事物,因为PDB$SEED是只读的,不可进行修改

2.1.3PDBs

  PDB数据库,在CDB环境中每个PDB都是独立存在的,与传统的Oracle数据库基本无差别,每个PDB拥有自己的数据文件和objects,唯一的区别在于PDB可以插入到CDB中,以及在CDB中拔出,并且在任何一个时间点之上PDB必须拔出或者插入到一个CDB中,当用户链接PDB时不会感觉到根容器和其他PDB的存在。

2.1.4Application Containers

  Oracle在12cR2版本中,对容器功能进行了增强,在CDB root容器中可以还创建一个叫做Application root的容器,可在其内创建多个依赖于Application root的Application PDBs,架构图如下:

简单地说就是容器里还能创建容器

2.2根环境的用户

  在之前的版本中,单个PDB可以有多个用户,每个用户又可以有自己的表空间,上升到CDB级别,用户被分成了两类: 公用用户和本地用户。

  • 公用用户 公用用户是在root数据库中和所有的PDB数据库中都存在的用户,公用用户必须在根容器中创建,然后此用户会在所有的现存的PDB中自动创建,公用用户标识必须以c##或者C##开头,sys和system用户是Oracle在CDB环境中自动创建的公用用户。
  • 公用用户 本地用户指的是在PDB中创建的普通用户,只有在创建它的PDB中才会存在该用户,并且PDB中只能创建本地用户。

另外值得一提的是,PDB中没有以前默认的scott用户了,需要我们重新创建。 还有,通过“sqlplus / as sysdba”登录连接的是CDB。(重点)

3容器数据库的安装及使用

3.1安装

记得之前的版本安装时的第四步要取消勾选容器数据库吗

现在,我们只需勾选上即可创建为容器数据库;

3.2常用命令

在安装好之后,打开sqlplus,用管理员账户登录 sqlplus / as sysdba

3.2.1查看当前的容器

代码语言:javascript复制
show con_name;

可以看到当前是根容器。

查看数据库是否为CDB

代码语言:javascript复制
select name,cdb,open_mode,con_id from v$database;

Open_mode是读写权限

3.2.3查看CDB中的PDB信息

代码语言:javascript复制
show pdbs;

可以看到里面是种子和默认的PDB。

3.2.4启动和关闭已创建好的PDB数据库

先将会话切换至想用的PDB。

代码语言:javascript复制
alter session set container = orclpdb;

这里有两套命令 开启:

代码语言:javascript复制
alter pluggable database pdb1 open;

关闭:

代码语言:javascript复制
alter pluggable database pdb1 close; 

传统的shartup与shutdown 开启:

代码语言:javascript复制
shartup;

关闭:

代码语言:javascript复制
shutdown immediate;

这里给出SHUTDOWN的几个参数及含义

  • shutdown normal:shutdown的默认方式,a.不允许新的数据库连接;b.只有当所有连接都断开后才能关闭,效率较低
  • shutdown immidiate:shutdown的常用方式,a.不允许创建新连接;b.已经创建的连接,如果有未执行完的SQL语句,等待其完成,如果没有立刻断开;c.未提交事务全部回滚
  • shutdown transactional:使用率很低
  • shutdown abort:a.未提交事务不回滚;b.终止所有SQL操作;c.所有连接都断开。数据库关闭迅速,但是下一次开启需要进行实例恢复,启动慢;而且回滚段数据与数据文件可能不一致。

3.2.5 CDB与PDB的切换

代码语言:javascript复制
alter session set container=ORCLPDB; --PDB
alter session set container=CDB$ROOT;--CDB
show con_name   --查看当前容器

3.3通过plsql使用

但是,我们日常使用时是用plsql的,这里与我们平时使用的又有一点区别。

打开PDB

首先,还是用管理员账户登录(此时数据库选项里是没有我们想用的PDB的)

打开一个命令窗口吗,看一下当前CDB里PDB的信息

利用上面刚学的命令,切换会话,打开想用的PDB,自己做哦

3.3.2创建用户并授权

上面说了,PDB里是没有我们所知道的Scott用户的,这里需要我们重新创建他

代码语言:javascript复制
create user scott identified by tiger;
--给用户授予权限 
grant connect,resource,dba to scott; 
--删除用户
drop user truedata scott;

创建表空间,为用户指定表空间及为用户授予权限都与以前的使用方式一样。

3.3.3配置

想要用plsql登录PDB,我们需要更改一个配置文件

安装目录下的tnsnames.ora文件,复制里面的ORCL,更改名字即可

然后用plsql登录即可

单个PDB的使用,与我们日常所用的数据库并无区别

如果连接可插拔数据库时出现: ORACLE 正在初始化或关闭。 这个错误,参考我的博客: 链接: PLSQL报ORA-01033: ORACLE正在初始化或关闭的解决方法 或者可能是PDB没打开,参考3.2.4打开即可。

4容器数据库的创建

  PDB数据库的创建可以从现存的数据库中复制数据文件,包括种子容器、可插拔数据库、non-CDB数据库,创建时可以使用CREATE PLUGGABLE、RMAN、DBCA以及EM等。   在12.1版本中在创建PDB时,Source PDB必须处于read only状态,在12.2版本中,因为undo local mode新特性的推出,在创建PDB时,Source PDB在read write状态,依然可以创建。   另外在12.2版本中Oracle推出了refresh PDB特性,具有对Source PDB进行增量同步的功能。

4.1创建方式

使用CREATE PLUGGABLE命令可以使用以下资源创建PDB:  CDB seed (PDB$SEED)  克隆已经存在的PDB  Local PDB  Remote PDB  non-CDB数据库

代码语言:javascript复制
	如果把数据库从11g 升级到12c,或者在12c中创建的,就是NON CDB,那么这样的数据库就是普通的单实例,和12c 之前的数据库没有区别

链接: Oracle 12c系列(七)| Non-CDB转换为PDB

拔下的PDB

使用DBCA可以使用以下资源创建PDB: DBCA也就是我们常用的数据库配置工具、图形化界面 CDB seed (PDB$SEED) RMAN备份 拔下的PDB 示例:(这里只演示使用create pluggable database命令方式创建PDB)

4.2使用CDB seed创建PDB

  1. 在SQL*Plus中输入CREATE PLUGGABLE DATABASE语句 (这里创建为ypdb1的pdb,管理用户为ypdb1)
代码语言:javascript复制
CREATE PLUGGABLE DATABASE ypdb1 ADMIN USER ypdb1 IDENTIFIED BY oracle
STORAGE (MAXSIZE 2G)
DEFAULT TABLESPACE ypdb1
DATAFILE '/u01/app/oracle/oradata/ora12c/ypdb1/ypdb01.dbf' SIZE 100M AUTOEXTEND ON
PATH_PREFIX = '/u01/app/oracle/oradata/ora12c/ypdb1/'
FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/ora12c/pdbseed', 
'/u01/app/oracle/oradata/ora12c/ypdb1');
  1. 语句执行完毕之后查看创建完成的PDB:
代码语言:javascript复制
sys. ora12c>show pdbs
CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
 2 PDB$SEED                       READ ONLY  NO
 3 YPDB1                          MOUNTED

4.3克隆已经存在的PDB

这种方式可以通过使用当前CDB中的其他PDB,以及复制远端CDB中的PDB,还可以复制non-CDB数据库创建成PDB。

Clone a Local PDB 在Clone本地PDB时需要注意一下几点: 使用的用户必须拥有’CREATE PLUGGABLE DATABASE’的权限(测试里使用sys用户) 源PDB不可以是关闭状态 如果CDB为shared undo,PDB必须为READ-ONLY状态 如果CDB不是归档模式,那么PDB必须为READ-ONLY状态

代码语言:javascript复制
	(说明:如果是Oracle Database 版本为12.1,那么PDB只能为READ-ONLY状态,因在12.1中undo模式,还只能选择shared undo。)
代码语言:javascript复制
sys. ora12c>show pdbs
CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
 2 PDB$SEED                       READ ONLY  NO
 3 YPDB1                          READ WRITE NO
sys. ora12c>

这里使用YPDB1做为源PDB,创建的PDB为YPDB2。 (1) 检查是否为shared undo模式

代码语言:javascript复制
COL PROPERTY_NAME FOR A30
COL PROPERTY_VALUE FOR A30
SELECT property_name, property_value
FROM database_properties
WHERE property_name='LOCAL_UNDO_ENABLED';
PROPERTY_NAME                  PROPERTY_VALUE
------------------------------ ------------------------------
LOCAL_UNDO_ENABLED             TRUE

(2) 检查是否未archivelog模式

代码语言:javascript复制
sys. ora12c>ARCHIVE LOG LIST
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /u01/app/oracle/recovery/ora12c/arch
Oldest online log sequence     21
Next log sequence to archive   23
Current log sequence           23
sys. ora12c>

(3) 创建验证数据

代码语言:javascript复制
zhaoweiqing. ypdb1>CONN /AS SYSDBA
Connected.
sys. ora12c>conn zhaoweiqing/zhaoweiqing@ypdb1
Connected.
zhaoweiqing. ypdb1>SELECT COUNT(*) FROM t;
COUNT(*)
----------
22198
Elapsed: 00:00:00.01
zhaoweiqing. ypdb1>

(4) 执行CREATE PLUGGABLE DATABASE语句(这里使用sys用户连接根容器)

代码语言:javascript复制
CREATE PLUGGABLE DATABASE ypdb2 FROM ypdb1
PATH_PREFIX = '/u01/app/oracle/oradata/ora12c/ypdb2/'
FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/ora12c/ypdb1/', '/u01/app/oracle/oradata/ora12c/ypdb2/')
SERVICE_NAME_CONVERT = ('ypdb1t','ypdb2t');

(5) 查看创建完成的YPDB2

代码语言:javascript复制
sys. ora12c>show pdbs
CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
 2 PDB$SEED                       READ ONLY  NO
 3 YPDB1                          READ WRITE NO
 4 YPDB2                          MOUNTED
sys. ora12c>SELECT pdb_id, pdb_name, con_uid, status, creation_scn, con_id FROM cdb_pdbs;
PDB_ID PDB_NAME                CON_UID STATUS     CREATION_SCN     CON_ID
---------- -------------------- ---------- ---------- ------------ ----------
 2 PDB$SEED             1453953285 NORMAL              213          2
 3 YPDB1                2376019304 NORMAL           697945          3
 4 YPDB2                3908707960 NEW              707501          4
Elapsed: 00:00:00.02
sys. ora12c>

(6) 检查数据文件

代码语言:javascript复制
sys. ora12c>ALTER PLUGGABLE DATABASE YPDB2 OPEN;
Pluggable database altered.
Elapsed: 00:00:14.02
sys. ora12c>SELECT con_id, tablespace_name, file_name FROM cdb_data_files WHERE con_id=4;
CON_ID TABLESP FILE_NAME
------ ------- ---------------------------------------------------------
4 SYSTEM  /u01/app/oracle/oradata/ora12c/ypdb2/system01.dbf
4 SYSAUX  /u01/app/oracle/oradata/ora12c/ypdb2/sysaux01.dbf
4 DEFTBS  /u01/app/oracle/oradata/ora12c/ypdb2/deftbs01.dbf
4 USERTBS /u01/app/oracle/oradata/ora12c/ypdb2/usertbs01.dbf
4 UNDO_1  /u01/app/oracle/oradata/ora12c/ypdb2/system01_i1_undo.dbf
4 YPDB1   /u01/app/oracle/oradata/ora12c/ypdb2/ypdb01.dbf
6 rows selected.
Elapsed: 00:00:00.01
sys. ora12c>

(7) 检查service_name

代码语言:javascript复制
sys. ora12c>SELECT service_id, name, network_name, enabled, pdb, con_id FROM cdb_services;
SERVICE_ID NAME                NETWORK_NAME         ENA PDB           CON_ID
---------- ------------------- -------------------- --- --------- ----------
 1 SYS$BACKGROUND                           NO  CDB$ROOT           1
 2 SYS$USERS                                NO  CDB$ROOT           1
 3 ora12c.linux.com    ora12c.linux.com     NO  CDB$ROOT           1
 6 ypdb1.linux.com     ypdb1.linux.com      NO  YPDB1              3
 1 ypdb1t              ypdb1t               NO  YPDB1              3
 1 ypdb2t              ypdb2t               NO  YPDB2              4
 2 ypdb2.linux.com     ypdb2.linux.com      NO  YPDB2              4
7 rows selected.
Elapsed: 00:00:00.00
sys. ora12c>

源PDB中的service_name已经被更改指定的service_name.

(8) 检查验证数据

代码语言:javascript复制
sys. ora12c>conn zhaoweiqing/zhaoweiqing@ypdb2
Connected.
zhaoweiqing. ypdb2>SELECT COUNT(*) FROM t;
COUNT(*)
----------
22198
Elapsed: 00:00:00.11
zhaoweiqing. ypdb2>

4.4克隆远程PDB

Clone远端PDB时需要注意以下几点:

如果PDB被Clone到的CDB的字符集不是AL32UTF8,那么源与目标字符集必须兼容。

源端与目标端的字节顺序必须相同。

连接的用户在CDB中必须拥有’CREATE PLUGGABLE DATABASE’的权限。

源PDB不可以是关闭状态。

如果远端CDB为shared undo,源PDB必须为READ-ONLY状态。

如果远端CDB不是归档模式,源PDB必须为READ-ONLY状态。

这里测试将win平台ORA12CW中的PDB(ORA12CWPDB)复制到Linux的,目标PDB为PDB2。

(1) 查看源端与目标的字符集

代码语言:javascript复制
col parameter for a30
col value for a30
select * from nls_database_parameters where parameter='NLS_CHARACTERSET'
or parameter='NLS_LANGUAGE' or parameter='NLS_NCHAR_CHARACTERSET';
``
`
**(2) 查看源端与目标端字节顺序**

```sql
col platform_name for a40
SELECT d.inst_id, t.platform_id, t.platform_name, t.endian_format, d.name FROM v$transportable_platform t, gv$database d
WHERE t.platform_name = d.platform_name;

(3) 查看源端归档模式

代码语言:javascript复制
archive log list

(4) 查看源端undo模式

代码语言:javascript复制
SELECT property_name, property_value
FROM database_properties
WHERE property_name='LOCAL_UNDO_ENABLED';

(5) 目标端创建dblink

代码语言:javascript复制
CREATE DATABASE LINK ora12cw CONNECT TO system IDENTIFIED BY oracle USING 'ORA12CW';

(6) 运行CREATE PLUGGABLE DATABASE语句进行复制PDB

代码语言:javascript复制
CREATE PLUGGABLE DATABASE pdb2 FROM ORA12CWPDB@ora12cw
PATH_PREFIX = '/u01/app/oracle/oradata/ora12cl/pdb2/'
FILE_NAME_CONVERT = ('D:U01APPORACLEORADATAORA12CWORA12CWPDB', '/u01/app/oracle/oradata/ora12cl/pdb2/');

(7) 创建完成后目标端查看PDB2

代码语言:javascript复制
sys. ora12cl>show pdbs
CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
 2 PDB$SEED                       READ ONLY  NO
 4 PDB2                           MOUNTED
 5 PDB1                           MOUNTED
sys. ora12cl>SELECT pdb_id, pdb_name, con_uid, status, creation_scn, con_id FROM cdb_pdbs;
PDB_ID PDB_NAME                CON_UID STATUS     CREATION_SCN     CON_ID
---------- -------------------- ---------- ---------- ------------ ----------
 2 PDB$SEED             3409233005 NORMAL          1408788          2
 4 PDB2                 2218727525 NEW             1824437          4
 5 PDB1                 1058019921 NORMAL          1535445          5
Elapsed: 00:00:00.00
sys. ora12cl>

(8) 目标查看数据文件

代码语言:javascript复制
sys. ora12cl>alter pluggable database pdb2 open;
Pluggable database altered.
Elapsed: 00:00:14.02
sys. ora12cl>SELECT con_id, tablespace_name, file_name FROM cdb_data_files WHERE con_id=4;
CON_ID TABLESPACE_NAME FILE_NAME
------ --------------- --------------------------------------------------
4 SYSTEM          /u01/app/oracle/oradata/ora12cl/pdb2/SYSTEM01.DBF
4 SYSAUX          /u01/app/oracle/oradata/ora12cl/pdb2/SYSAUX01.DBF
4 UNDOTBS1        /u01/app/oracle/oradata/ora12cl/pdb2/UNDOTBS01.DBF
4 USERS           /u01/app/oracle/oradata/ora12cl/pdb2/USERS01.DBF
Elapsed: 00:00:00.00
sys. ora12cl>

克隆远端的PDB成功。

4.5克隆本地PDB

在克隆已有的PDB或者non CDB时,我们也可以将克隆语句中加入NO DATA子句,在使用NO DATA子句时,仅仅会克隆源PDB中的模型定义,并不会克隆PDB中的数据。(Oracle数据库内自动创建的schemas下的对象会被成功克隆,而用户创建的schemas下的对象仅仅会克隆对象的定义结构)。

测试克隆本地PDB时使用no data子句

这里将WOQUPDB克隆为PDBTEST.

(1)源PDB

代码语言:javascript复制
sys. woqu>show pdbs
CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
 2 PDB$SEED                       READ ONLY  NO
 3 WOQUPDB                        READ WRITE NO
sys. woqu>COL PROPERTY_NAME FOR A30
sys. woqu>COL PROPERTY_VALUE FOR A30
sys. woqu>

(2)检查UNDO模式及归档模式

代码语言:javascript复制
sys. woqu>SELECT property_name, property_value
2  FROM database_properties
3  WHERE property_name='LOCAL_UNDO_ENABLED';
PROPERTY_NAME                  PROPERTY_VALUE
------------------------------ ------------------------------
LOCAL_UNDO_ENABLED             TRUE
Elapsed: 00:00:00.04
sys. woqu>sys. woqu>archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     7
Next log sequence to archive   9
Current log sequence           9
sys. woqu> 

(3)创建测试数据表t,注意这里的t表位于sys用户下

代码语言:javascript复制
05:51:10 sys. woqupdb>create table t as select * from dba_objects where rownum<=10;
Table created.
Elapsed: 00:00:00.10
05:52:41 sys. woqupdb>select count(*) from t;
COUNT(*)
----------
10
Elapsed: 00:00:00.01
05:52:50 sys. woqupdb>

表t中共有10条数据。 (4)创建测试数据表t_tab,注意这里的t表位于zhaoweiqing用户下

代码语言:javascript复制
05:51:46 zhaoweiqing. woqupdb>create table t_tab as select * from dba_objects where rownum<=999;
Table created.
Elapsed: 00:00:01.84
05:52:15 zhaoweiqing. woqupdb>select count(*) from t_tab;
COUNT(*)
----------
999
Elapsed: 00:00:00.01
05:52:19 zhaoweiqing. woqupdb>

(5)使用create pluggable database NO DATA子句创建pdb:pdbtest

代码语言:javascript复制
sys. woqu>CREATE PLUGGABLE DATABASE pdbtest FROM woqupdb NO DATA
2  PATH_PREFIX = '/u01/app/oracle/oradata/woqu/pdbtest'
3  FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/woqu/woqupdb', '/u01/app/oracle/oradata/woqu/pdbtest');
Pluggable database created.
Elapsed: 00:00:09.35
sys. woqu>

(6)检查克隆完成的pdbtest

代码语言:javascript复制
sys. woqu>show pdbs
CON_ID CON_NAME    OPEN MODE  RESTRICTED
---------- ----------- ---------- ----------
 2 PDB$SEED    READ ONLY  NO
 3 WOQUPDB     READ WRITE NO
 5 PDBTEST     MOUNTED
sys. woqu>SELECT pdb_id, pdb_name, con_uid, status, creation_scn, con_id FROM cdb_pdbs;
PDB_ID PDB_NAME       CON_UID STATUS     CREATION_SCN     CON_ID
---------- ----------- ---------- ---------- ------------ ----------
 3 WOQUPDB     1167267009 NORMAL          1443334          3
 2 PDB$SEED     399989944 NORMAL          1408751          2
 5 PDBTEST     3356573055 NEW             1956581          5
Elapsed: 00:00:00.05
sys. woqu>alter pluggable database pdbtest open;
Pluggable database altered.
Elapsed: 00:00:07.09
sys. woqu>show pdbs
CON_ID CON_NAME    OPEN MODE  RESTRICTED
---------- ----------- ---------- ----------
 2 PDB$SEED    READ ONLY  NO
 3 WOQUPDB     READ WRITE NO
 5 PDBTEST     READ WRITE NO
sys. woqu>SELECT pdb_id, pdb_name, con_uid, status, creation_scn, con_id FROM cdb_pdbs;
PDB_ID PDB_NAME     CON_UID STATUS CREATION_SCN     CON_ID
---------- --------- ---------- ------ ------------ ----------
 3 WOQUPDB   1167267009 NORMAL      1443334          3
 2 PDB$SEED   399989944 NORMAL      1408751          2
 5 PDBTEST   3356573055 NORMAL      1956581          5
Elapsed: 00:00:00.02
sys. woqu>

(7)查看测试数据

代码语言:javascript复制
sys. woqu>alter session set container=pdbtest;
Session altered.
Elapsed: 00:00:00.07
sys. woqu>show user con_id
USER is "SYS"
CON_ID
------------------------------
5
sys. woqu>select count(*) from t;
COUNT(*)
----------
10
Elapsed: 00:00:00.00
sys. woqu>select count(*) from zhaoweiqing.t_tab;
COUNT(*)
----------
 0
Elapsed: 00:00:00.02
sys. woqu>

通过测试可以看到sys下的对象中的数据依然克隆成功,而自建用户下的对象中数据并没有跟着一起克隆。

0 人点赞