Oracle 11g OCM考试考点分析 并行和传输表空间

本文永久链接地址:https://www.askmac.cn/archives/oracle-11g-ocm-parallel.html

 

1.执行并行

 

1.1 简介

使用并行执行的环境:

1.多处理器,集群或大规模并行系统

2.足够的I/O带宽

3.未充分利用或间歇使用CPUs(例如。系统的CPU使用率通常少于30%)

4.有足够的内存来支持额外的密集内存处理,例如排序,哈希和I/O缓存。

 

如果系统却上这些特性,并行执行可能不会显著的提高性能。事实上,在系统负载很高或I/O带宽很小时,并行执行会减少系统性能。

OLTP中使用并行执行处理批处理和维护是有帮助的。一般简单的SELECT语句在OLTP应用中并行执行并不会有什么好处、

不适合使用并行的场景:

1.在典型查询或事务很短(几秒或更少)的环境

这包括了大多数在线交易系统,在这些环境中,并行并不是很有用,因为对于并行服务会有一个协调器的开销。对于很短的事务,这个协调的成本可能会超过并行带来的收益。

2.CPU,内存或I/O资源都健康的利用的环境

并行执行的目的是利用额外的硬件资源,如果没有这样的资源可以使用,那么并行执行不能产生任何好处,还可能影响性能。

 

1.2 dop

 

DOP–并行深度:

degree of parallelism ,每个单独操作分配的并行执行服务的数目。并行执行是为了有效利用多个CPUs。

Oracle 的并行框架可以让你手动指定DOP或者让Oracle 数据库自动的控制。

 

手动指定DOP,例如在表级别指定:

 

ALTER TABLES sales PARALLEL 8;
ALTER TABLE customers PARALLEL 4;

 

如果同时访问 sales和customers 那么DOP是8,并且潜在的分配16个并行服务器(producer和consumer)。oracle只接受更高的不同的并行配置

 

如果PARALLER子句指定但是没有指定DOP,那么对象会获得默认的DOP。默认的并行度使用计算公式来确定系统的DOP:

对于单实例,DOP= PARALLEL_THREADS_PER_CPU x CPU_COUNT

对于RAC DOP = PARALLEL_THREADS_PER_CPU x CPU_COUNT x INSTANCE_COUNT

 

INSTANCE_COUNT一般是节点个数,如果使用的ORACLE RAC services来限制节点数目的话就是,实际属于的service的节点数。例如在 8 CPU,非 ORACLE RAC services,4节点的集群。默认的 DOP 为2 * 8 * 4=64

注意:PARALLEL_THREADS_PER_CPU (一般为2,也就是每个CPU可使用的并行线程数)

 

默认的DOP算法并设置来最大限度的利用资源。在多用户环境中,不建议使用默认的并行读。当然一个SQL语句的DOP可以通过资源管理器进行限制。

 

自动并行深度策略:

当参数PARALLEL_DEGREE_POLICY设置为AUTO。Oracle会自动的确定一个语句是否要使用并行,并且DOP应该为多少。确定资源能否满足并行,否则就顺序执行,直到资源足够。

下面是当并行策略设置为AUTO时,一个并行语句处理过程:

1.一个SQL 语句被发布

语句被解析,并且优化器决定执行计划

3.PARALLEL_MIN_TIME_THRESHOLD初始化参数的线程限制被检查(默认是10s)

a.如果执行时间小于线程限制,那么会顺序执行

b.如果执行时间超过了限制,那么语句会以优化器计算的DOP并行执行

为了不压倒系统,优化器在决定DOP的时候会进行限制,这个限制有参数PARALLEL_DEGREE_LIMIT指定。

默认是CPU,意味着进程数目限制是操作系统的CPUs(PARALLEL_THREADS_PER_CPU * CPU_COUNT * 可用的实例数),也就是default DOP。通过调整这个参数,你可以设置最大DOP。

 

1.3 使用DML,DDL 以及并行查询

 

并行查询的规则:

决定并行

一个select 语句只有在下列条件满足的时候才可以被并行执行:

1.查询包含了并行hint(parallel 或 parallel_index)或相关查询的方案对象被分配了PARALLEL申明

2.在查询中的至少一个表满足下列之一:

–一个全部扫描

–一个索引范围扫描跨越多个分区

3.在select的列中没有子查询。

对于DOP,查询使用所有表声明的最大的DOP,因此索引或表上的最大DOP决定查询使用的DOP。

 

DLL 语句的规则:

DDL可以在执行的时候指定 PARALLEL子句。并行度的声明会存储到数据字典中(这就是为什么在创建完之后,需要人工去修改)

还可以使用 ALTER SESSION FORCE PARALLEL DDL 语句覆盖在一个会话中DDL中的并行子句。

dop,被 PARALLEL子句决定,除非被ALTER SSESSION FORCE PARALLEL DDL语句覆盖。重建一个分区索引不会使用并行。

alter index … rebuild 语句只能在非分区索引上执行并行,但是 alter index .. rebuild paratition 也可以使用并行。

 

CREATE TABLE AS SELECT语句中查询部分可以被并行必须满足下列条件,和一般查询的条件类似:

1.查询包含 hint (PARALLEL 或 PARALLEL_INDEX)或者创建的语句有PARALLEL子句,或相关查询的对象有PARALLEL声明

2.至少一个表有全表扫描或者索引范围扫描跨多个分区。

CREATE 部分使用并行的条件:

必须使用PARALLEL 子句或者 ALTER SESSION FORCE PARALLEL DDL 语句。

 

DML 的并行(update,merge 和delete)

只有当在会话中启用了并行DML时,DML才能被并行:

alter session enable parallel dml;

因为 并行DML和串行DML有不同的锁,事务和磁盘空间需求。

在默认情况下并行DML在会话中是禁用的。即便使用PARALLEL hint,DML还是不会并行执行。

当然即便enable 了DML 并行,如果没有并行的hint或者表上没有并行的熟悉,那么操作仍然还是串行的。

 

–注意这个只是影响 DML语句,DML中其他扫描,join操作仍然是可以并行的。不影响SELECT语句,DDL和DML语句的查询部分。

 

在PARALLEL DML 模式开启的清下,可以使用并行子句或者使用hint 来使用并行。

 

 

当然可以使用强制语句来使用并行,即使表上没有并行属性:

ALTER SESSION FORCE PARALLEL QUERY;

–强制DML,DDL也是一样,这个语句覆盖所有随后的并行语句,但是会被hint覆盖。这种可以在OLTP环境中,表上并未设置并行,在脚本执行前运行这个,可以让脚本并行执行(并行收集数据)。从未不用来回修改表的并行度。

 

 

2 传输表空间

 

2.1 传输表空的要求和限制

要完成传输表空间,如果是不同的平台,那么compatibility至少为10.0.0.

平台支持查询:

COLUMN PLATFORM_NAME FORMAT A36 、

SELECT * FROM V$TRANSPORTABLE_PLATFORM ORDER BY PLATFORM_NAME;

 

如果源段的字节序和目标端平台不一致,那么需要进行额外的步骤,在目标端或源端进行表空间的转换,将字节序转换到目标端格式。如果有相同的字节序则不需要进行转换

 

使用传输表空间有如下限制:

  • 源端数据库和目标数据库必须是兼容的数据库字符集,下列之一必须满足:
  1. 源端和目标端数据库必须有相同的字符集

2.源端数据的字符集是目标数据库字符集的严格(二进制)子集,并且下列3个条件必须满足:

-源端数据库必须在10.1.0.3版本以上

-被传输的表空间不包含有字符长度语义的表字段,或者最大字符长度在源端和目标端数据库字符集是一致的

-被传输的表空间没有CLOB数据类型的字段,或者源端和目标端数据库字符集都是单字节或者双字节的。

  1. 源端数据的字符集是目标数据库字符集的严格(二进制)子集,并且下列2个条件必须满足:

-源数据库的版本低于10.1.0.3

-最大字符长度在源端和目标端数据库字符集是一致

  • 源端和目标端数据库使用兼容的国家字符集,特别地,下列条件之一必须满足:

1.源端和目标端数据库的国家字符集是相同的

2.源端的数据库版本在10.1.0.3以上,并且传输的表空间中不包含NCHAR,NVARVHR2或者NCLOB数据类型的字段。

  • 源端和目标端的表空间名称不能一样,如果被传输的表空间名称被使用,需要在目标端或者源端首先重命名。
  • 那些底层的对象(例如物化视图),或者被包含的对象(例如被分区的表)不会被传输,除非这些对象都在表空间集中
  • 加密表空间有如下限制:

1.如果目标端有钱包设置,必须先拷贝wallet,传输完毕后再修改密码。

2.如果目标端已经配置了wallet,那么不能传输表空间,只能用数据泵来进行

3.不能在使用不同字节序的平台上传输加密表空间

  • 没使用块加密,但是表中包含加密字段的表空间不能传输。

还有一些关于XML类型的限制

 

额外的限制包括:

–系统表空间对象:你不能传输SYSTEM表空间或者那些属于sys用户的对象。这些对象例如:PL/SQL,java类,视图,同义词,等等

兼容性需求,目标端的兼容性版本必须相等或者更高。

 

2.2 传输表空间的步骤

 

在2个数据库之间传输表空间的例子:

1.对于跨平台的传输,首先查询V$TRANSPORTABLE_PLATFORM 视图检查字节序。相同平台不用检查

 

SELECT d.PLATFORM_NAME, ENDIAN_FORMAT
FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d
WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME;

2.选择一个自包含的表空间

检查自包含:

 

EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK('sales_1,sales_2', TRUE);
SELECT * FROM TRANSPORT_SET_VIOLATIONS;

 

–如果这个视图无消息,说明是自包含的。

3.在源数据库,将表空间置为只读模式并且生成一个传输表空间集

这个表空间集包含了表空间的源数据。使用expdp来执行。

 

将所有的表空间只读:

alter tablespace sales_1 read only;

 

调用expdp工具进行导出:

 

expdp system dumpfile=expdat.dmp directory=data_pump_dir transport_tablespaces=sales_1,sales_2 logfile=tts_export.log

 

如果你想在导出的时候进行自包含检查,还可以设置TRANSPORT_FULL_CHECK 参数。这样如果表空间不是自包含的,那么导出会时报。你必须进行第2步来解决所有的问题

在源端进行切换:

 

RMAN target /

CONVERT TABLESPACE sales_1,sales_2 TO PLATFORM 'Microsoft Windows IA (32-bit)' FORMAT '/tmp/%U';

 

如果平台的字节序不同,需要进行转换

4.传输表空间集

拷贝数据文件和导出文件到目标端可访问的位置。

如果在源端没进行切换,那么在目标端进行切换

 

如果目标端和源端均为文件系统,你可以使用下列方式进行传输:

任何cp的工具(例如scp或ftp)DBMS_FILE_TRANSFER包,RMAN

如果源端和目标端是在ASM磁盘组上:

你可以使用DBMS_FILE_TRANSFER包,RMAN

 

在目标端上进行切换:

 

CONVERT DATAFILE
'C:\Temp\sales_101.dbf',
'C:\Temp\sales_201.dbf'
TO PLATFORM="Microsoft Windows IA (32-bit)"
FROM PLATFORM="Solaris[tm] OE (32-bit)"
DB_FILE_NAME_CONVERT=
'C:\Temp\', 'C:\app\orauser\oradata\orawin\'
PARALLELISM=4;

 

 

 

5.可选项。重建表空间到read/write 模式

 

ALTER TABLESPACE sales_1 READ WRITE; ALTER TABLESPACE sales_2 READ WRITE;

 

 

6.在目标端,导入表空间集-使用impdp导入。

 

impdp system dumpfile=expdat.dmp directory=data_pump_dir transport_datafiles=c:\app\orauser\oradata\orawin\sales_101.dbf,c:\app\orauser\oradata\orawin\sales_201.dbf remap_schema=sales1:crm1  remap_schema=sales2:crm2 logfile=tts_import.log

 

 

Comment

*

沪ICP备14014813号-2

沪公网安备 31010802001379号