【DB宝50】Oracle异构平台迁移之完全可传输导出导入(Full Transportable Export & Import)
一、简介
完全可传输导出导入(Full Transportable Export & Import)可以认为是TTS的一个升级版,如下所示:

官网:
1.1、使用场景
完全可传输导出/导入功能可以让数据库迁移更快、更容易,比exp更有效,可用于多种情形:
•版本升级至新发行版Oracle DB:可以使用完全可传输导出/导入功能将数据库从11.2.0.3或更高版本升级至Oracle Database 12c。要执行上述升级操作,请安装Oracle Database 12c并创建一个空数据库。接着,使用完全可传输导出/导入功能将11.2.0.3数据库移动到Oracle Database 12c数据库。
•将数据库移动到新计算机系统:可以使用完全可传输导出/导入功能将数据库从一个计算机系统移动到另一个计算机系统。您可能想要将数据库移动到新计算机系统以升级硬件,或将数据库移动到其他平台上。
•将非CDB移动到非CDB或CDB:移动到CDB后,移动的数据库将成为与CDB关联的PDB。完全可传输导出/导入功能可以高效地将11.2.0.3或更高版本的数据库移动到Oracle Database 12c数据库。
1.2、限制条件
执行完全可传输导出时有以下限制:
•如果要导出的数据库包含加密表空间或具有加密列(透明数据加密(TDE)列或SecureFile LOB列)的表,则还必须提供ENCRYPTION_PASSWORD参数。
•如果源数据库中含有加密表空间,则源数据库和目标数据库必须位于具有相同字节排列顺序(endianness)的平台上。
•如果源平台和目标平台的字节排列顺序(endianness)不同,则必须转换要移动的数据,使其格式与目标平台的格式相同。使用DBMS_FILE_TRANSFER程序包或RMAN CONVERT命令。
•完全可传输导出无法重新启动。
•具有存储且已选定要导出的所有对象中的所有存储段,必须完全位于不可移动的管理表空间(SYSTEM/SYSAUX)中或完全位于用户定义的可移动表空间中。单个对象的存储不能跨越这两种表空间。
•使用完全可传输导出通过网络移动数据库时,含有LONG或LONG RAW列且位于管理表空间(例如SYSTEM或SYSAUX)中的表不受支持。
•使用完全可传输导出通过网络移动数据库时,如果审计线索信息本身存储在用户定义的表空间中,则无法为存储在管理表空间(例如SYSTEM和SYSAUX)中的表启用审计。
•如果源数据库和目标数据库都运行Oracle Database 12c发行版1(12.1),则必须至少将Oracle数据泵VERSION参数设置为12.0或将COMPATIBLE数据库初始化参数设置为12.0或更高版本,才能执行完全可传输导出。
•从11.2.0.3源数据库开始才支持完全可传输导出。完全可传输导出功能用于11.2.0.3或更高版本的数据库,完全可传输导入功能用于Oracle 12c数据库。
执行完全可传输导入时有以下要求:
•如果您使用的是网络链接,则在NETWORK_LINK参数中指定的数据库必须为Oracle Database 11g发行版2(11.2.0.3)或更高版本,且Oracle数据泵VERSION参数必须至少设置为12。(在非网络导入中,会从转储文件隐式确定VERSION=12。)
•如果源平台和目标平台的endian格式不同,则必须转换要移动的数据,使其格式与目标平台的格式相同。可使用DBMS_FILE_TRANSFER程序包或RMAN CONVERT命令转换数据。
•如果源平台和目标平台的endian格式不同,则在网络模式或转储文件模式下不支持对加密表空间进行完全可传输导入。
•使用完全可传输导入功能通过网络移动数据库时,含有LONG或LONG RAW列且位于管理表空间(例如SYSTEM或SYSAUX)中的表不受支持。
•使用完全可传输导入功能通过网络移动数据库时,如果审计线索信息本身存储在用户定义的表空间中,则无法为存储在管理表空间(例如SYSTEM和SYSAUX)中的表启用审计。
• 目标库字符集需要和源库保持一致。
二、完全可传输操作步骤

要执行完全可传输操作,请执行下列步骤:
1.在导出之前,将数据库中的所有用户定义的表空间置于只读状态,排除SYSTEM、SYSAUX、TEMP和Undo表空间。
2.以具有DATAPUMP_EXP_FULL_DATABASE角色的用户身份调用Oracle数据泵导出实用程序,并指定完全可传输导出选项:FULL=Y、TRANSPORTABLE=ALWAYS。LOGFILE参数很重要,因为它将包含导入操作需要移动的数据文件的列表。要在11.2.0.3数据库上执行该操作,请使用VERSION参数。只有Oracle Database 12c数据库才支持完全可传输导入。
3.将导出的转储文件拷贝到目标端。
4.将相关只读表空间的数据文件拷贝到目标端。
5.(可选)转换文件的字节序。如果要将数据库移动到与源平台不同的平台中,则请确定源平台和目标平台是否都支持跨平台数据库移动。如果两个平台的endian格式相同,则不必进行转换。否则,必须使用DBMS_FILE_TRANSFER或RMAN CONVERT命令转换源平台或目标平台中数据库内的每个表空间。
6.将源表空间置于读写状态。
7.以具有DATAPUMP_IMP_FULL_DATABASE角色的用户身份调用Oracle数据泵导入实用程序,并指定完全可传输导入选项:FULL=Y、TRANSPORT_DATAFILES。
三、案例演示
需求:将11.2.0.3中的表空间ts_lhr、users、example,迁移到12.1.0.2的CDB数据库的lhrpdb1中作为一个PDB存在。
3.1、环境
| 源库 | 目标库 | |
|---|---|---|
| 版本 | 11.2.0.3 | 12.1.0.2 |
| ORACLE_SID | LHR11G | lhrcdb1 |
| 用户表空间 | ts_lhr、users、example | ts_lhr、users、example |
| 平台 | Linux x86 64-bit | Linux x86 64-bit |
| 字节序 | Little | Little |
| IP地址 | 172.17.0.3 | 172.17.0.15 |
| 字符集 | AMERICAN_CHINA.AL32UTF8 | AMERICAN_CHINA.AL32UTF8 |
-- 查询平台和字节序
SELECT d.PLATFORM_NAME, ENDIAN_FORMAT
FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d
WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME;
-- 查询字符集
select userenv('language') from dual;
3.2、源库操作
3.2.1、将需要传输的用户表空间设置为RO状态
将除'SYSTEM','SYSAUX','UNDOTBS1','TEMP'之外的表空间都设置为read only模式:
select 'ALTER TABLESPACE '||name||' READ ONLY;' exec_sql
from v$tablespace
where NAME not in ('SYSTEM','SYSAUX','UNDOTBS1','TEMP');
select tablespace_name,status from dba_tablespaces;
执行过程:
SYS@LHR11G> create table lhr.test tablespace ts_lhr as select * from dba_tables;
Table created.
SYS@LHR11G> select count(*) from lhr.test;
COUNT(*)
----------
2835
SYS@LHR11G> select 'ALTER TABLESPACE '||name||' READ ONLY;' exec_sql
2 from v$tablespace
3 where NAME not in ('SYSTEM','SYSAUX','UNDOTBS1','TEMP');
EXEC_SQL
--------------------------------------------------------------------------------------------------------------------
ALTER TABLESPACE USERS READ ONLY;
ALTER TABLESPACE EXAMPLE READ ONLY;
ALTER TABLESPACE TS_LHR READ ONLY;
SYS@LHR11G> ALTER TABLESPACE USERS READ ONLY;
Tablespace altered.
SYS@LHR11G> ALTER TABLESPACE EXAMPLE READ ONLY;
Tablespace altered.
SYS@LHR11G> ALTER TABLESPACE TS_LHR READ ONLY;
Tablespace altered.
SYS@LHR11G> select tablespace_name,status from dba_tablespaces;
TABLESPACE_NAME STATUS
------------------------------------------------------------ ------------------
SYSTEM ONLINE
SYSAUX ONLINE
UNDOTBS1 ONLINE
TEMP ONLINE
USERS READ ONLY
EXAMPLE READ ONLY
TS_LHR READ ONLY
7 rows selected.
SYS@LHR11G> select DIRECTORY_PATH from dba_directories where DIRECTORY_NAME='DATA_PUMP_DIR';
DIRECTORY_PATH
---------------------------------------
/u01/app/oracle/admin/LHR11G/dpdump/
3.2.2、使用Data Pump导出工具执行full transportable export操作
-- 在执行导出时必须指定transportable=always,它用来判断是否使用传输选项。full参数用来指定将导出整个数据库
expdp system/lhr dumpfile=expdp_lhr_`date +%Y%m%d`.dmp directory=DATA_PUMP_DIR \
transportable=always full=y EXCLUDE=STATISTICS PARALLEL=4 version=12 logfile=expdp_lhr_`date +%Y%m%d`.log
-- 或者可以将不需要的内容排除掉
cat > /tmp/exclude_schema.par <<"EOF"
transportable=always
full=y
PARALLEL=4
version=12
EXCLUDE=STATISTICS,SCHEMA:"in ('MDSYS','DBSNMP','SCOTT','WMSYS','SH','HR','BI','OE','IX','SYSMAN','XDB','OUTLN','MGMT_VIEW','FLOWS_FILES','ORDSYS','EXFSYS','APPQOSSYS','APEX_030200','OWBSYS_AUDIT','ORDDATA','CTXSYS','ANONYMOUS','ORDPLUGINS','OWBSYS','SI_INFORMTN_SCHEMA','OLAPSYS','ORACLE_OCM','XS$NULL','PM','MDDATA','DIP','APEX_PUBLIC_USER','SPATIAL_CSW_ADMIN_USR','SPATIAL_WFS_ADMIN_USR')"
EOF
expdp system/lhr dumpfile=expdp_lhr_`date +%Y%m%d`.dmp directory=DATA_PUMP_DIR \
parfile=/tmp/exclude_schema.par logfile=expdp_lhr_`date +%Y%m%d`.log
执行过程:
[oracle@lhrora11203 ~]$ expdp system/lhr dumpfile=expdp_lhr.dmp directory=DATA_PUMP_DIR transportable=always EXCLUDE=STATISTICS full=y version=12 logfile=expdp_lhr.log
Export: Release 11.2.0.3.0 - Production on Thu Apr 8 10:03:26 2021
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Starting "SYSTEM"."SYS_EXPORT_FULL_02": system/******** dumpfile=expdp_lhr.dmp directory=DATA_PUMP_DIR transportable=always full=y version=12 logfile=expdp_lhr.log
Estimate in progress using BLOCKS method...
Processing object type DATABASE_EXPORT/PLUGTS_FULL/FULL/PLUGTS_TABLESPACE
Processing object type DATABASE_EXPORT/PLUGTS_FULL/PLUGTS_BLK
Processing object type DATABASE_EXPORT/EARLY_OPTIONS/TABLE_DATA
Processing object type DATABASE_EXPORT/EARLY_OPTIONS/VIEWS_AS_TABLES/TABLE_DATA
Processing object type DATABASE_EXPORT/NORMAL_OPTIONS/TABLE_DATA
Processing object type DATABASE_EXPORT/NORMAL_OPTIONS/VIEWS_AS_TABLES/TABLE_DATA
Processing object type DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 90.06 MB
Processing object type DATABASE_EXPORT/PRE_SYSTEM_IMPCALLOUT/MARKER
Processing object type DATABASE_EXPORT/PRE_INSTANCE_IMPCALLOUT/MARKER
Processing object type DATABASE_EXPORT/TABLESPACE
。。。。。。。。。。。。
. . exported "XDB"."XDB$H_INDEX" 1.177 MB 306 rows
. . exported "XDB"."XDB$H_LINK" 811.9 KB 7666 rows
. . exported "XDB"."XDB$ACL" 13.64 KB 11 rows
。。。。。。。。。。。。
. . exported "SYSTEM"."REPCAT$_TEMPLATE_TARGETS" 0 KB 0 rows
. . exported "SYSTEM"."REPCAT$_USER_AUTHORIZATIONS" 0 KB 0 rows
. . exported "SYSTEM"."REPCAT$_USER_PARM_VALUES" 0 KB 0 rows
. . exported "SYSTEM"."SQLPLUS_PRODUCT_PROFILE" 0 KB 0 rows
Master table "SYSTEM"."SYS_EXPORT_FULL_02" successfully loaded/unloaded
******************************************************************************
Dump file set for SYSTEM.SYS_EXPORT_FULL_02 is:
/u01/app/oracle/admin/LHR11G/dpdump/expdp_lhr.dmp
******************************************************************************
Datafiles required for transportable tablespace EXAMPLE:
/u01/app/oracle/oradata/LHR11G/example01.dbf
Datafiles required for transportable tablespace TS_LHR:
/u01/app/oracle/oradata/LHR11G/ts_lhr01.dbf
Datafiles required for transportable tablespace USERS:
/u01/app/oracle/oradata/LHR11G/users01.dbf
Job "SYSTEM"."SYS_EXPORT_FULL_02" successfully completed at 10:14:13
3.2.3、将dmp文件和数据文件传输到目的端
将文件/u01/app/oracle/admin/LHR11G/dpdump/expdp_lhr.dmp、/u01/app/oracle/oradata/LHR11G/example01.dbf、/u01/app/oracle/oradata/LHR11G/ts_lhr01.dbf、/u01/app/oracle/oradata/LHR11G/users01.dbf传输到目的端:
scp expdp_lhr_20210408.* oracle@172.17.0.15:/u01/app/tts/
scp /u01/app/oracle/oradata/LHR11G/example01.dbf oracle@172.17.0.15:/u01/app/oracle/oradata/lhrcdb1/lhrpdb1/
scp /u01/app/oracle/oradata/LHR11G/ts_lhr01.dbf oracle@172.17.0.15:/u01/app/oracle/oradata/lhrcdb1/lhrpdb1/
scp /u01/app/oracle/oradata/LHR11G/users01.dbf oracle@172.17.0.15:/u01/app/oracle/oradata/lhrcdb1/lhrpdb1/
另外,拷贝数据文件也可以使用dbms_file_transfer包,如下:
-- 源库执行
create database link dbl_lhrpdb1
connect to system identified by "lhr"
using '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 172.17.0.15)(PORT = 1521)) )(CONNECT_DATA =(SERVICE_NAME = lhrpdb1)))';
-- 源库执行
create or replace directory TTS_DATAFILE_SOURCE as '/u01/app/oracle/oradata/LHR11G/';
grant all on directory TTS_DATAFILE_SOURCE to public;
-- 目标库执行
create or replace directory TTS_DATAFILE_DES as '/u01/app/oracle/oradata/lhrcdb1/lhrpdb1/';
grant all on directory TTS_DATAFILE_DES to public;
-- 源库执行,拷贝文件到目标库
exec dbms_file_transfer.put_file(source_directory_object =>'TTS_DATAFILE_SOURCE',source_file_name => 'example01.dbf',destination_directory_object => 'TTS_DATAFILE_DES',destination_file_name => 'example01.dbf',destination_database => 'dbl_lhrpdb1');
exec dbms_file_transfer.put_file(source_directory_object =>'TTS_DATAFILE_SOURCE',source_file_name => 'ts_lhr01.dbf',destination_directory_object => 'TTS_DATAFILE_DES',destination_file_name => 'ts_lhr01.dbf',destination_database => 'dbl_lhrpdb1');
exec dbms_file_transfer.put_file(source_directory_object =>'TTS_DATAFILE_SOURCE',source_file_name => 'users01.dbf',destination_directory_object => 'TTS_DATAFILE_DES',destination_file_name => 'users01.dbf',destination_database => 'dbl_lhrpdb1');
3.2.4、将源数据库中的所有用户表空间设置为读写模式
select 'ALTER TABLESPACE '||name||' READ WRITE;' exec_sql
from v$tablespace
where NAME not in ('SYSTEM','SYSAUX','UNDOTBS1','TEMP');
select tablespace_name,status from dba_tablespaces;
3.3、目标库操作
3.3.1、转换字节序(可选)
若原平台和目标平台的字节序不一样,则还需要进行字节序的转换;若一样,则不需要执行转换。在rman中执行:
CONVERT DATAFILE
'/u01/app/tts/example01.dbf',
'/u01/app/tts/ts_lhr01.dbf',
'/u01/app/tts/users01.dbf'
TO PLATFORM="Linux x86 64-bit"
FROM PLATFORM="Linux x86 64-bit"
DB_FILE_NAME_CONVERT='/u01/app/tts/', '/u01/app/oracle/oradata/lhrcdb1/lhrpdb1/'
PARALLELISM=4;
3.3.2、开始导入
-- 创建目录
create or replace directory tts_dump as '/u01/app/tts/';
grant all on directory tts_dump to public;
select DIRECTORY_PATH from dba_directories where DIRECTORY_NAME='TTS_DUMP';
-- 导入
impdp system/lhr@localhost/LHRPDB1 dumpfile=expdp_lhr_20210408.dmp directory=tts_dump \
transport_datafiles='/u01/app/oracle/oradata/lhrcdb1/lhrpdb1/example01.dbf', \
'/u01/app/oracle/oradata/lhrcdb1/lhrpdb1/ts_lhr01.dbf', \
'/u01/app/oracle/oradata/lhrcdb1/lhrpdb1/users01.dbf' \
logfile=import_lhr.log
3.3.3、检查状态
sqlplus system/lhr@localhost/LHRPDB1
col TABLESPACE_NAME format a20
col FILE_NAME format a100
select tablespace_name,file_name from dba_data_files;
select tablespace_name,status from dba_tablespaces;
执行过程:
SYSTEM@localhost/LHRPDB1> col TABLESPACE_NAME format a20
SYSTEM@localhost/LHRPDB1> col FILE_NAME format a100
SYSTEM@localhost/LHRPDB1> select tablespace_name,file_name from dba_data_files;
TABLESPACE_NAME FILE_NAME
-------------------- ----------------------------------------------------------------------------------------------------
SYSTEM /u01/app/oracle/oradata/lhrcdb1/lhrpdb1/system01.dbf
SYSAUX /u01/app/oracle/oradata/lhrcdb1/lhrpdb1/sysaux01.dbf
USERS /u01/app/oracle/oradata/lhrcdb1/lhrpdb1/users01.dbf
EXAMPLE /u01/app/oracle/oradata/lhrcdb1/lhrpdb1/example01.dbf
TS_LHR /u01/app/oracle/oradata/lhrcdb1/lhrpdb1/ts_lhr01.dbf
SYSTEM@localhost/LHRPDB1> select tablespace_name,status from dba_tablespaces;
TABLESPACE_NAME STATUS
-------------------- ------------------
SYSTEM ONLINE
SYSAUX ONLINE
TEMP ONLINE
USERS ONLINE
EXAMPLE ONLINE
TS_LHR ONLINE
6 rows selected.
SYSTEM@localhost/LHRPDB1> select count(*) from lhr.test;
COUNT(*)
----------
2835
四、总结
1、完全可传输导出导入(Full Transportable Export & Import)可以认为是TTS的一个升级版,步骤基本和TTS一致
2、完全可传输导出导入的停机时间主要花费在将源库的数据文件拷贝到目标库的过程,所以,正式迁移时可以考虑临时增大带宽
3、字节序的转换建议在目标端执行
4、生产库完成迁移后,建议在目标库对整库收集统计信息
5、导入到PDB的时候,需要注意连接串的写法,确保连接到的是PDB
About Me
● 本文作者:小麦苗,部分内容整理自网络,若有侵权请联系小麦苗删除
● 本文原始发表于个人微 信公众号(DB宝)上
● QQ群号: 230161599 、618766405,微信群私聊
● 个人QQ号(646634621),微 信号(db_bao),注明添加缘由
● 版权所有,欢迎分享本文,转载请保留出处
【DB宝50】Oracle异构平台迁移之完全可传输导出导入(Full Transportable Export & Import)的更多相关文章
- ORACLE使用EXPDP和IMPDP数据泵进行导出导入的方法
ORACLE使用EXPDP和IMPDP数据泵进行导出导入的方法 (2010-05-28 12:54:34) http://blog.sina.com.cn/s/blog_67d41beb0100ixn ...
- 【Oracle】EXPDP和IMPDP数据泵进行导出导入的方法
一.expdp/impdp和exp/imp 客户端工具 1.exp和imp是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用. 服务端工具 2.expdp和impdp是服务端的工具程序,他们 ...
- oracle数据泵实现不同用户之间的导出导入
来源于:http://www.cnblogs.com/kevinsun/archive/2007/02/03/638803.aspx http://blog.sina.com.cn/s/blog_68 ...
- oracle导出/导入 expdp/impdp
Oracle使用EXPDP和IMPDP数据泵进行导出导入的方法(常用方法) 使用expdp和impdp时应该注重的事项: 1.exp和imp是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用 ...
- 异构平台同步(Mysql到Oracle)
Oracle GoldenGate学习之--异构平台同步(MySQL到Oracle) 如图所示:源端采用Mysql库,目标端采用Oracle库 一.OGG安装配置(源端) 1.OGG下载 https: ...
- Oracle GoldenGate 异构平台同步(Mysql到Oracle)
一.OGG安装配置(源端) 1.OGG下载 http://www.oracle.com/technetwork/cn/middleware/goldengate/downloads/index.htm ...
- Windows C盘格式化或者同平台迁移oracle数据库
我们知道如果是Linux 同平台迁移oracle数据库.只要是安全关闭了数据库,在新机器上创建用户组,配置了环境变量,将数据库安装目录拷贝到对应的目录就好用了. 一直在寻求Windows平台上这类的解 ...
- 【DB宝49】Oracle如何设置DB、监听和EM开机启动
目录 一.Windows系统 二.Linux系统 方法1:配置/etc/rc.d/rc.local文件(推荐) 方法2:配置service服务 三.Oracle 18c版本 四.总结 一.Window ...
- 【DB宝48】JumpServer:多云环境下更好用的堡垒机
目录 一.JumpServer简介 1.1.页面展示 1.2.特色优势 1.3.功能列表 1.4.架构图 1.5.端口说明 1.6.产品组件 二.安装JumpServer 2.1.一键自动部署 2.2 ...
随机推荐
- RabbitMQ(一)安装篇
1. RabbitMQ 的介绍➢ 什么是 MQ?MQ 全称为 Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.➢ 要解决什么样的问题?在项目中,将一些无需即时返回且耗 ...
- 如何读写拥有命名空间xmlns 属性的Xml文件(C#实现)
我们在进行C#项目Xml读写开发时经常遇到一些读写问题,今天我要介绍的是遇到多个命名空间xmlns属性时如何读写此类文件. 比如下面这个Xml文件: <?xml version="1. ...
- MySQL提权 通过UDF
目录 UDF是什么 命令执行 文本写入 Example: 远程写入 反弹Shell 提权 UDF是什么 参考:https://www.cnblogs.com/litlife/p/9030673.htm ...
- 详解JavaScript中的原型
前言 原型.原型链应该是被大多数前端er说烂的词,但是应该还有很多人不能完整的解释这两个内容,当然也包括我自己. 最早一篇原型链文章写于2019年07月,那个时候也是费了老大劲才理解到了七八成,到现在 ...
- 剑指 Offer 22. 链表中倒数第k个节点
剑指 Offer 22. 链表中倒数第k个节点 Offer 22 常规解法 常规解法其实很容易可以想到,只需要先求出链表的长度,然后再次遍历取指定长度的链接即可. package com.walega ...
- 树莓派4b通过外接ssd硬盘启动系统失败的排查和解决
树莓派4b通过外接ssd硬盘启动系统失败,症状: 屏幕卡在黑屏或提示 mmc1:Controller never released inhibit bit(s).... 先说如何设置硬盘启动,后面是解 ...
- Java 基础加强 02
基础加强·反射 和 枚举 类的加载概述和加载时机 * A:类的加载概述 * 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载.连接.初始化来实现对这个类的初始化 * 加载 * 就是指 ...
- SVHN数据集 Format1 剪裁版
SVHN数据集官网:http://ufldl.stanford.edu/housenumbers/ SVHN数据集官方提供的有两种格式 Format1是那种在街上拍的照片,每张照片的尺寸都不同,然后l ...
- 2020年12月-第02阶段-前端基础-CSS Day02
CSS Day02 复合选择器 后代选择器 并集选择器 1. CSS复合选择器 理解 理解css复合选择器分别的应用场景 为什么要学习css复合选择器 CSS选择器分为 基础选择器 和 复合选择器 , ...
- 学习版pytest内核测试平台开发万字长文入门篇
前言 2021年,测试平台如雨后春笋般冒了出来,我就是其中一员,写了一款pytest内核测试平台,在公司落地.分享出来后,有同学觉得挺不错,希望能开源,本着"公司代码不要传到网上去,以免引起 ...