Oracle数据库分区表 *** 作方法

Oracle数据库分区表 *** 作方法,第1张

在大型的企业应用或企业级的数据库应用中 要处理的数据量通常可以达到几十到几百GB 有的甚至可以到TB级 虽然存储介质和数据处理技术的发展也很快 但是仍然不能满足用户的需求 为了使用户的大量的数据在读写 *** 作和查询中速度更快 Oracle提供了对表和索引进行分区的技术 以改善大型应用系统的性能

使用分区的优点

·增强可用性 如果表的某个分区出现故障 表在其他分区的数据仍然可用

·维护方便 如果表的某个分区出现故障 需要修复数据 只修复该分区即可

·均衡I/O 可以把不同的分区映射到磁盘以平衡I/O 改善整个系统性能

·改善查询性能 对分区对象的查询可以仅搜索自己关心的分区 提高检索速度

Oracle数据库提供对表或索引的分区方法有三种

·范围分区

·Hash分区(散列分区)

·复合分区

下面将以实例的方式分别对这三种分区方法来说明分区表的使用 为了测试方便 我们先建三个表空间

以下为引用的内容

create tablespace dinya_space

datafile /test/demo/oracle/demodata/dinya dnf size M

create tablespace dinya_space

datafile /test/demo/oracle/demodata/dinya dnf size M

create tablespace dinya_space

datafile /test/demo/oracle/demodata/dinya dnf size M

分区表的创建

范围分区

范围分区就是对数据表中的某个值的范围进行分区 根据某个值的范围 决定将该数据存储在哪个分区上 如根据序号分区 根据业务记录的创建日期进行分区等

需求描述 有一个物料交易表 表名 material_transactions 该表将来可能有千万级的数据记录数 要求在建该表的时候使用分区表 这时候我们可以使用序号分区三个区 每个区中预计存储三千万的数据 也可以使用日期分区 如每五年的数据存储在一个分区上

根据交易记录的序号分区建表 以下为引用的内容

SQL>create table dinya_test

(

transaction_id number primary key

item_id number( ) not null

item_description varchar ( )

transaction_date date not null

)

partition by range (transaction_id)

(

partition part_ values less than( ) tablespace dinya_space

partition part_ values less than( ) tablespace dinya_space

partition part_ values less than(maxvalue) tablespace dinya_space

)

Table created

建表成功 根据交易的序号 交易ID在三千万以下的记录将存储在第一个表空间dinya_space 中 分区名为:par_ 在三千万到六千万之间的记录存储在第二个表空间

dinya_space 中 分区名为 par_ 而交易ID在六千万以上的记录存储在第三个表空间dinya_space 中 分区名为par_

根据交易日期分区建表

以下为引用的内容

SQL>create table dinya_test

(

transaction_id number primary key

item_id number( ) not null

item_description varchar ( )

transaction_date date not null

)

partition by range (transaction_date)

(

partition part_ values less than(to_date( yyyy mm dd ))

tablespace dinya_space

partition part_ values less than(to_date( yyyy mm dd ))

tablespace dinya_space

partition part_ values less than(maxvalue) tablespace dinya_space

)

Table created

这样我们就分别建了以交易序号和交易日期来分区的分区表 每次插入数据的时候 系统将根据指定的字段的值来自动将记录存储到制定的分区(表空间)中

当然 我们还可以根据需求 使用两个字段的范围分布来分区 如partition

by range ( transaction_id transaction_date)

分区条件中的值也做相应的改变 请读者自行测试

Hash分区(散列分区)

散列分区为通过指定分区编号来均匀分布数据的一种分区类型 因为通过在I/O设备上进行散列分区 使得这些分区大小一致 如将物料交易表的数据根据交易ID散列地存放在指定的三个表空间中

以下为引用的内容

SQL>create table dinya_test

(

transaction_id number primary key

item_id number( ) not null

item_description varchar ( )

transaction_date date

)

partition by hash(transaction_id)

(

partition part_ tablespace dinya_space

partition part_ tablespace dinya_space

partition part_ tablespace dinya_space

)

Table created

建表成功 此时插入数据 系统将按transaction_id将记录散列地插入三个分区中 这里也就是三个不同的表空间中

复合分区

有时候我们需要根据范围分区后 每个分区内的数据再散列地分布在几个表空间中 这样我们就要使用复合分区 复合分区是先使用范围分区 然后在每个分区内再使用散列分区的一种分区方法 如将物料交易的记录按时间分区 然后每个分区中的数据分三个子分区 将数据散列地存储在三个指定的表空间中

以下为引用的内容

SQL>create table dinya_test

(

transaction_id number primary key

item_id number( ) not null

item_description varchar ( )

transaction_date date

)

partition by range(transaction_date)subpartition by hash(transaction_id)

subpartitions store in (dinya_space dinya_space dinya_space )

(

partition part_ values less than(to_date( yyyy mm dd ))

partition part_ values less than(to_date( yyyy mm dd ))

partition part_ values less than(maxvalue)

)

Table created

该例中 先是根据交易日期进行范围分区 然后根据交易的ID将记录散列地存储在三个表空间中

分区表 *** 作

以上了解了三种分区表的建表方法 下面将使用实际的数据并针对按日期的范围分区来测试分区表的数据记录的 *** 作

插入记录

以下为引用的内容

SQL>insert into dinya_test values( BOOKS sysdate)

row created

SQL>insert into dinya_test values( BOOKS sysdate+ )

row created

SQL>insert into dinya_test values( BOOKS to_date( yyyy mm dd ))

row created

SQL>insert into dinya_test values( BOOKS to_date( yyyy mm dd ))

row created

SQL>insert into dinya_test values( BOOKS to_date( yyyy mm dd ))

row created

SQL>insert into dinya_test values( BOOKS to_date( yyyy mm dd ))

row created

SQL>mit

Commit plete

SQL>

按上面的建表结果 年前的数据将存储在第一个分区part_ 上 而 年到 年的交易数据将存储在第二个分区part_ 上 年以后的记录存储在第三个分区part_ 上

查询分区表记录 以下为引用的内容

SQL>select * from dinya_test partition(part_ )

TRANSACTION_ID ITEM_ID ITEM_DESCRIPTION TRANSACTION_DATE

BOOKS : :

BOOKS : :

SQL>

SQL>select * from dinya_test partition(part_ )

TRANSACTION_ID ITEM_ID ITEM_DESCRIPTION TRANSACTION_DATE

BOOKS

BOOKS

SQL>

SQL>select * from dinya_test partition(part_ )

TRANSACTION_ID ITEM_ID ITEM_DESCRIPTION TRANSACTION_DATE

BOOKS

BOOKS

SQL>

从查询的结果可以看出 插入的数据已经根据交易时间范围存储在不同的分区中 这里是指定了分区的查询 当然也可以不指定分区 直接执行select * from dinya_test查询全部记录

在也检索的数据量很大的时候 指定分区会大大提高检索速度

更新分区表的记录

以下为引用的内容

SQL>update dinya_test partition(part_ ) t set em_description= DESK where

t transaction_id=

row updated

SQL>mit

Commit plete

SQL>

这里将第一个分区中的交易ID= 的记录中的item_description字段更新为 DESK 可以看到已经成功更新了一条记录 但是当更新的时候指定了分区 而根据查询的记录不在该分区中时 将不会更新数据 请看下面的例子 以下为引用的内容

SQL>update dinya_test partition(part_ ) t set em_description= DESK where

t transaction_id=

rows updated

SQL>mit

Commit plete

SQL>

指定了在第一个分区中更新记录 但是条件中限制交易ID为 而查询全表 交易ID为 的记录在第三个分区中 这样该条语句将不会更新记录

删除分区表记录

以下为引用的内容

SQL>delete from dinya_test partition(part_ ) t where t transaction_id=

row deleted

SQL>mit

Commit plete

SQL>

上面例子删除了第二个分区part_ 中的交易记录ID为 的一条记录 和更新数据相同 如果指定了分区 而条件中的数据又不在该分区中时 将不会删除任何数据

分区表索引的使用

分区表和一般表一样可以建立索引 分区表可以创建局部索引和全局索引 当分区中出现许多事务并且要保证所有分区中的数据记录的唯一性时采用全局索引

局部索引分区的建立

以下为引用的内容

SQL>create index dinya_idx_t on dinya_test(item_id)

local

(

partition idx_ tablespace dinya_space

partition idx_ tablespace dinya_space

partition idx_ tablespace dinya_space

)

Index created

SQL>

看查询的执行计划 从下面的执行计划可以看出 系统已经使用了索引

以下为引用的内容

SQL>select * from dinya_test partition(part_ ) t where em_id=

Execution Plan

SELECT STATEMENT Optimizer=CHOOSE (Cost= Card= Bytes= )

TABLE ACCESS (BY LOCAL INDEX ROWID) OF DINYA_TEST (Cost=

Card= Bytes= )

INDEX (RANGE SCAN) OF DINYA_IDX_T (NON UNIQUE) (Cost=

Card= )

Statistics

recursive calls

db block gets

consistent gets

physical reads

redo size

bytes sent via SQL*Net to client

bytes received via SQL*Net from client

SQL*Net roundtrips to/from client

sorts (memory)

sorts (disk)

rows processed

SQL>

全局索引分区的建立

全局索引建立时global 子句允许指定索引的范围值 这个范围值为索引字段的范围值

以下为引用的内容

SQL>create index dinya_idx_t on dinya_test(item_id)

global partition by range(item_id)

(

partition idx_ values less than ( ) tablespace dinya_space

partition idx_ values less than ( ) tablespace dinya_space

partition idx_ values less than (maxvalue) tablespace dinya_space

)

Index created

SQL>

本例中对表的item_id字段建立索引分区 当然也可以不指定索引分区名直接对整个表建立索引 如

以下为引用的内容

SQL>create index dinya_idx_t on dinya_test(item_id)

Index created

SQL>

同样的 对全局索引根据执行计划可以看出索引已经可以使用

以下为引用的内容

SQL>select * from dinya_test t where em_id=

Execution Plan

SELECT STATEMENT Optimizer=CHOOSE (Cost= Card= Bytes= )

TABLE ACCESS (BY GLOBAL INDEX ROWID) OF DINYA_TEST (Cost

= Card= Bytes= )

INDEX (RANGE SCAN) OF DINYA_IDX_T (NON UNIQUE) (Cost=

Card= )

Statistics

recursive calls

db block gets

consistent gets

physical reads

redo size

bytes sent via SQL*Net to client

bytes received via SQL*Net from client

SQL*Net roundtrips to/from client

sorts (memory)

sorts (disk)

rows processed

SQL>

分区表的维护

了解了分区表的建立 索引的建立 表和索引的使用后 在应用的还要经常对分区进行维护和管理 日常维护和管理的内容包括 增加一个分区 合并一个分区及删除分区等等 下面以范围分区为例说明增加 合并 删除分区的一般 *** 作

增加一个分区:

以下为引用的内容

SQL>alter table dinya_test

add partition part_ values less than(to_date( yyyy mm dd ))

tablespace dinya_spa

ce

Table altered

SQL>

增加一个分区的时候 增加的分区的条件必须大于现有分区的最大值 否则系统将提示ORA partition bound must collate higher than that of the last partition 错误

合并一个分区

以下为引用的内容

SQL>alter table dinya_test merge partitions part_ part_ into partition part_

Table altered

SQL>

在本例中将原有的表的part_ 分区和part_ 分区进行了合并 合并后的分区为part_ 如果在合并的时候把合并后的分区定为part_ 的时候 系统将提示ORA cannot reuse lower bound partition as resulting partition 错误

删除分区

以下为引用的内容

SQL>alter table dinya_test drop partition part_

Table altered

SQL>

删除分区表的一个分区后 查询该表的数据时显示 该分区中的数据已全部丢失 所以执行删除分区动作时要慎重 确保先备份数据后再执行 或将分区合并

总结

lishixinzhi/Article/program/Oracle/201311/17329

oracle dg 三大模式切换

1、最大性能模式MAXIMUM PERFORMANCE --默认模式,最大性能模式特点。

192.168.1.181

SQL> select database_role,protection_mode,protection_level from v$database

DATABASE_ROLE  PROTECTION_MODE   PROTECTION_LEVEL

---------------- -------------------- --------------------

PRIMARY     MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE

SQL> col dest_name for a25

SQL> select dest_name,status from v$archive_dest_status

DEST_NAME         STATUS

------------------------- ---------

LOG_ARCHIVE_DEST_1    VALID

LOG_ARCHIVE_DEST_2    VALID

SQL> show parameter log_archive

NAME                 TYPE    VALUE

------------------------------------ ----------- ---------------------------

log_archive_config          string   dg_config=(orcl,db01)

log_archive_dest_1          string   location=/home/oracle/arch_orc

                         l valid_for=(all_logfiles,all_

                         roles) db_unique_name=orcl

log_archive_dest_2          string   service=db_db01 LGWR ASYNC val

                         id_for=(online_logfiles,primar

                         y_roles) db_unique_name=db01

SQL> archive log list

Database log mode       Archive Mode

Automatic archival       Enabled

Archive destination      /home/oracle/arch_orcl

Oldest online log sequence   31

Next log sequence to archive  33

Current log sequence      33

192.168.1.183

SQL> select database_role,protection_mode,protection_level from v$database

DATABASE_ROLE  PROTECTION_MODE   PROTECTION_LEVEL

---------------- -------------------- --------------------

PHYSICAL STANDBY MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE

SQL> col dest_name for a25

SQL> select dest_name,status from v$archive_dest_status

DEST_NAME         STATUS

------------------------- ---------

LOG_ARCHIVE_DEST_1    VALID

LOG_ARCHIVE_DEST_2    VALID

SQL> show parameter log_archive

NAME                 TYPE    VALUE

------------------------------------ ----------- ---------------------------

log_archive_config          string   dg_config=(db01,orcl)

log_archive_dest_1          string   location=/home/oracle/arch_db0

                         1 valid_for=(all_logfiles,all_

                         roles) db_unique_name=db01

log_archive_dest_2          string   service=db_orcl LGWR ASYNC val

                         id_for=(online_logfiles,primar

                         y_roles) db_unique_name=orcl

SQL> archive log list

Database log mode       Archive Mode

Automatic archival       Enabled

Archive destination      /home/oracle/arch_orcl

Oldest online log sequence   31

Next log sequence to archive  33

Current log sequence      33

192.168.1.181

SQL> alter system switch logfile

SQL> archive log list

Database log mode       Archive Mode

Automatic archival       Enabled

Archive destination      /home/oracle/arch_orcl

Oldest online log sequence   32

Next log sequence to archive  34

Current log sequence      34

192.168.1.183

SQL> archive log list

Database log mode       Archive Mode

Automatic archival       Enabled

Archive destination      /home/oracle/arch_db01

Oldest online log sequence   32

Next log sequence to archive  0

Current log sequence      34

2 、最大性能模式--切换到-->最大高可用  (默认是最大性能模式---MAXIMUM PERFORMANCE)。

192.168.1.181

SQL> select DATABASE_ROLE,PROTECTION_MODE,PROTECTION_LEVEL from v$database 

DATABASE_ROLE  PROTECTION_MODE   PROTECTION_LEVEL

---------------- -------------------- --------------------

PRIMARY     MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE

SQL> show parameter log_archive_dest_2

NAME                 TYPE    VALUE

------------------------------------ ----------- ---------------------------

log_archive_dest_2          string   service=db_db01 LGWR ASYNC val

                         id_for=(online_logfiles,primar

                         y_roles) db_unique_name=db01

192.168.1.181

SQL> shutdown immediate

192.168.1.183

SQL> alter database recover managed standby database cancel

SQL> shutdown immediate

192.168.1.181

SQL> startup mount

SQL> alter database set standby database to maximize availability

SQL> alter system set log_archive_dest_2='service=db_db01 LGWR SYNC valid_for=(online_logfiles,primary_roles) db_unique_name=db01' scope=spfile

192.168.1.183

SQL> startup nomount

SQL> alter database mount standby database

SQL> alter system set log_archive_dest_2='service=db_orcl LGWR SYNC valid_for=(online_logfiles,primary_roles) db_unique_name=orcl' scope=spfile

SQL> shutdown immediate

SQL> startup nomount

SQL> alter database mount standby database

192.168.1.181

SQL> startup

SQL> col dest_name for a25

SQL> select dest_name,status from v$archive_dest_status

DEST_NAME         STATUS

------------------------- ---------

LOG_ARCHIVE_DEST_1    VALID

LOG_ARCHIVE_DEST_2    VALID

SQL> show parameter log_archive_dest_2

NAME                 TYPE    VALUE

------------------------------------ ----------- ---------------------------

log_archive_dest_2          string   service=db_db01 LGWR SYNC vali

                         d_for=(online_logfiles,primary

                         _roles) db_unique_name=db01

SQL> select database_role,protection_level,protection_mode from v$database

DATABASE_ROLE  PROTECTION_LEVEL   PROTECTION_MODE

---------------- -------------------- --------------------

PRIMARY     MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY

SQL> archive log list

Database log mode       Archive Mode

Automatic archival       Enabled

Archive destination      /home/oracle/arch_orcl

Oldest online log sequence   34

Next log sequence to archive  36

Current log sequence      36

192.168.1.183

SQL> col dest_name for a25

SQL> select dest_name,status from v$archive_dest_status

DEST_NAME         STATUS

------------------------- ---------

LOG_ARCHIVE_DEST_1    VALID

LOG_ARCHIVE_DEST_2    VALID

SQL> show parameter log_archive_dest_2

NAME                 TYPE    VALUE

------------------------------------ ----------- ---------------------------

log_archive_dest_2          string   service=db_orcl LGWR SYNC vali

                         d_for=(online_logfiles,primary

                         _roles) db_unique_name=orcl

SQL> select database_role,protection_level,protection_mode from v$database

DATABASE_ROLE  PROTECTION_LEVEL   PROTECTION_MODE

---------------- -------------------- --------------------

PHYSICAL STANDBY MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY

SQL> archive log list

Database log mode       Archive Mode

Automatic archival       Enabled

Archive destination      /home/oracle/arch_db01

Oldest online log sequence   35

Next log sequence to archive  0

Current log sequence      36

192.168.1.181

SQL> alter system switch logfile

SQL> archive log list

Database log mode       Archive Mode

Automatic archival       Enabled

Archive destination      /home/oracle/arch_orcl

Oldest online log sequence   35

Next log sequence to archive  37

Current log sequence      37

192.168.1.183

SQL> archive log list

Database log mode       Archive Mode

Automatic archival       Enabled

Archive destination      /home/oracle/arch_db01

Oldest online log sequence   36

Next log sequence to archive  0

Current log sequence      37

3、最大高可用--切换到-->最保护能模式,DG最大保护模式Maximum protection。

192.168.1.181

SQL> shutdown immediate

192.168.1.183

SQL> shutdown immediate

192.168.1.181

SQL> alter database set standby database to maximize protection

SQL> shutdown immediate

192.168.1.183

SQL> startup nomount

SQL> alter database mount standby database

192.168.1.181

SQL> startup

SQL> col dest_name for a25

SQL> select dest_name,status from v$archive_dest_status

DEST_NAME         STATUS

------------------------- ---------

LOG_ARCHIVE_DEST_1    VALID

LOG_ARCHIVE_DEST_2    VALID

SQL> show parameter log_archive_dest_2

NAME                 TYPE    VALUE

------------------------------------ ----------- ---------------------------

log_archive_dest_2          string   service=db_db01 LGWR SYNC vali

                         d_for=(online_logfiles,primary

                         _roles) db_unique_name=db01

SQL> select database_role,protection_level,protection_mode from v$database

DATABASE_ROLE  PROTECTION_LEVEL   PROTECTION_MODE

---------------- -------------------- --------------------

PRIMARY     MAXIMUM PROTECTION  MAXIMUM PROTECTION

SQL> archive log list

Database log mode       Archive Mode

Automatic archival       Enabled

Archive destination      /home/oracle/arch_orcl

Oldest online log sequence   37

Next log sequence to archive  39

Current log sequence      39

192.168.1.183

SQL> col dest_name for a25

SQL> select dest_name,status from v$archive_dest_status

DEST_NAME         STATUS

------------------------- ---------

LOG_ARCHIVE_DEST_1    VALID

LOG_ARCHIVE_DEST_2    VALID

SQL> show parameter log_archive_dest_2

NAME                 TYPE    VALUE

------------------------------------ ----------- ---------------------------

log_archive_dest_2          string   service=db_db01 LGWR SYNC vali

                         d_for=(online_logfiles,primary

                         _roles) db_unique_name=db01

SQL> select database_role,protection_level,protection_mode from v$database

DATABASE_ROLE  PROTECTION_LEVEL   PROTECTION_MODE

---------------- -------------------- --------------------

PRIMARY     MAXIMUM PROTECTION  MAXIMUM PROTECTION

SQL> archive log list

Database log mode       Archive Mode

Automatic archival       Enabled

Archive destination      /home/oracle/arch_db01

Oldest online log sequence   37

Next log sequence to archive  0

Current log sequence      39

192.168.1.181

SQL> alter system switch logfile

SQL> archive log list

Database log mode       Archive Mode

Automatic archival       Enabled

Archive destination      /home/oracle/arch_orcl

Oldest online log sequence   38

Next log sequence to archive  40

Current log sequence      40

192.168.1.183

SQL> archive log list

Database log mode       Archive Mode

Automatic archival       Enabled

Archive destination      /home/oracle/arch_db01

Oldest online log sequence   37

Next log sequence to archive  0

Current log sequence      40

 一、将数据库 *** 作模式改为共享服务器模式

注:在Oracle数据库服务器本机 *** 作。

1、 点击开始,从程序菜单选择“Database Configuration Assistant”,如下图所示。

2、 进入“欢迎使用”界面后,点击“下一步”,如下图所示。

3、 进入“步骤1(共4步): *** 作”界面后,选择“在数据库中配置数据库选项”,点击“下一步”,如下图所示。

4、 进入“步骤2(共4步):数据库”界面后,选择可用数据库(本机Oracle数据库服务名),点击“下一步”,如下图所示。

5、 进入“步骤3(共4步):数据库特性”界面后,点击“下一步”,如下图所示。

6、 进入“步骤4(共4步):数据库连接选项”界面后,选择“共享服务器模式”,点击“编辑共享连接参数…”,如下图所示。

7、

进入“共享服务器模式”界面后,协议选择为TCP;调度程序数设置为5;每个调度程序的最大连接数设置为100;最大调度程序数设置为5;最大服务器进程数设置为600,点击“确定”,如下图所示。

8、 返回到“步骤4(共4步):数据库连接选项”界面后,点击“完成”,如下图所示。

9、 系统d出“重新启动数据库”提示,点击“是”,如下图所示。

10、进入“概要”界面后,点击“确定”,数据库配置正在进行…如下图所示。

11、系统d出“数据库配置已成功完成。是否要执行其他 *** 作?”提示,点击“否”,如下图所示。

12、数据库 *** 作模式改为共享服务器模式已完成!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9843722.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存