oracle数据库表的管理(oracle数据库管理包括什么)
本文目录
- oracle数据库管理包括什么
- 一个数据库 两个项目的数据表 在oracle该怎么管理
- 怎么管理oracle的表空间和数据文件
- Oracle用户权限表的管理方法
- Oracle数据库自动存储管理(ASM)
- 如何管理ORACLE数据库中的数据
- Oracle数据库管理员职责(一)
- 浅谈Oracle中大数据量表的管理
oracle数据库管理包括什么
· 把监视数据库实例当作每日必做工作以保证其可用性。解决不可用的问题。
· 收集系统统计和性能信息以便定向和配置分析。
· 配置和调整数据库实例以便在应用程序特定要求下达到最佳性能。
· 分析和管理数据库安全性。控制和监视用户对数据库的访问。必要时审计数据库的使用。
· 监视备份程序。必要时提供恢复。测试备份与恢复程序。
· 升级RDBMS软件并且在必要时使用补丁。必要时升级或者迁移数据库实例。
· 通过数据库相关动作来支持应用程序开发人员。
· 跟随数据库趋向和技术。当可应用时使用新技术。安装,测试和评估Oracle新的相关产品,如果一开始没有做初级DBA学习的机会或者老师带的话,最好到像CUUG这样的机构培训一下,对整个体系有个把握。
· 执行存储和物理设计。均衡设计问题以完成性能优化。
· 创建,配置和设计信的数据库实例。
· 诊断,故障检测和解决任何数据库相关问题。必要时联系Oracle支持人员以便使问题得到较好的解决。
· 确保Oracle网络软件(**L*Net, Net8, Names, OiD)配置和运行的很好。
· 与系统管理员(Unix & NT)一起工作以保证Oracle相关事务得到很好的处理。
· 为有效的,定期的维护数据库创建任何必要的脚本。
以上是比较典型的数据库管理员职责。中级数据库管理员解决故障更熟练、效率高,心态也更成熟,高级DBA可以做数据库调试。
一个数据库 两个项目的数据表 在oracle该怎么管理
Oracle 里面, 方案 是和用户绑定的.
例如你有2个项目,
一个是 库存系统 假如这个系统里面有个 user_info 表
一个是 人力资源系统 假如这个系统里面也有个 user_info 表
那么你可以先创建2个用户,
一个叫 Storage 一个叫 hr
然后用 Storage 登录系统, 执行 库存系统 的建表语句
然后再用 hr **系统, 执行 人力资源的 建表语句。
这样。假如你要访问 库存系统的 user_info 表
可以使用 select * from storage.user_info
假如你要访问 人力资源的 user_info 表
可以使用 select * from hr.user_info
怎么管理oracle的表空间和数据文件
**L》 conn sys/xin as sysdba
已连接。
**L》 set wrap off
**L》 set linesize 100
1. 一些基本的操作
(1) 查看表空间:
**L》 select * from v$tablespace;
(2) 查看数据文件:
**L》 select * from v$datafile;
(3) 查看tablespace 和data files之间的对应关系(通过表空间的号连接在一起):
**L》 select t1.name,t2.name
2 from v$tablespace t1, v$datafile t2
3 where t1.ts#=t2.ts#
4 ;
(4) 更改表空间
**L》 alter tablespace users
2 add datafile ’E:\ORACLE\ORADATA\XINER\USERS02.DBF’ size 10m;
表空间已更改。
2. 管理表空间
在oracle 里将表空间分为系统表空间和非系统表空间。
(1) 系统表空间包括系统表,数据字典,以及系统回滚段等信息。
查看系统回滚段:
**L》 select * from dba_rollback_segs;
(2) 非系统表空间用来分离段(分开临时数据和永久性数据,索引和表放在不同的表空间等等)可以给系统的性能带来
好处,同时可以控制分配给用户的空间限额。
控制用户对空间的使用:
**L》 alter user HR
2 quota 10m on users;
用户已更改。
(3) 如何创建表空间:(均表示可选)
create tablespace xxx
---OMF时可以不指定
dictionary-managed tablespaces在oracle 9i 里已经不建议使用。
**L》 create tablespace ice
2 datafile ’e:\oracle\oradata\xiner\ice.dbf’ size 5m
3 extent management dictionary
4 default storage(
5 initial 100k
6 next 100k
7 pctincrease 10)
8 offline;
表空间已创建。
如果表空间管理指定为Local型,则不能使用default storage。此时不会和数据字典表打交道,不会和系统表产生
资源争用,也不会产生回滚数据(因为不涉及修改系统表),其次也不会有递归的资源争用。
**L》 create tablespace ice1
2 datafile ’e:\oracle\oradata\xiner\ice1.dbf’ size 5m
3 extent management local
4 uniform size 1m;
表空间已创建。
**L》 create tablespace ice2
2 datafile ’e:\oracle\oradata\xiner\ice2.dbf’ size 5m
3 extent management local autoallocate;
表空间已创建。
(4) Undo 表空间用来存储undo段,不能包括其他的数据对象,使用locally管理。
undo 段主要用来保存数据改变的旧值,可以回滚transcation(rollback)。
**L》 show parameter undo
**L》 create undo tablespace ice3
2 datafile ’e:\oracle\oradata\xiner\ice3.ora’ size 5m
3 extent management local
4 uniform size 1m; //此时不能定义uniform size
uniform size 1m
*
ERROR 位于第 4 行:
ORA-30024: CREATE UNDO TABLESPACE 的说明无效
**L》 del 4
**L》 run
1 create undo tablespace ice3
2 datafile ’e:\oracle\oradata\xiner\ice3.ora’ size 5m
3* extent management local
表空间已创建。
不能在回滚表空间建立表对象(不能放其他的数据对象):
**L》 create table tt1
2 (id int)
3 tablespace ice3;
create table tt1
*
ERROR 位于第 1 行:
ORA-30022: 无法在撤消表空间中创建段
(5) 临时表空间用来支持排序,不能包括永久的数据对象,建议使用locally管理。
**L》 create temporary tablespace ice4
2 tempfile ’e:\oracle\oradata\xiner\ice4.ora’ size 5m
3 extent management local;
表空间已创建。
**L》 create table tt1
2 (id int)
3 tablespace ice4;
create table tt1
*
ERROR 位于第 1 行:
ORA-02195: 尝试创建的PERMANENT对象在TEMPORARY表空间中
(6) 缺省的临时表空间:
**L》 alter database default temporary tablespace ice4
数据库已更改。
临时表空间不可以被置为offline,也不能指定为read only,不可以被删除,除非用另外一个表空间代替它。
**L》 alter talbespace ice4 offline
alter talbespace ice4 offline
*
ERROR 位于第 1 行:
ORA-00940: 无效的 ALTER 命令
**L》 alter tablespace ice4
2 read only;
alter tablespace ice4
*
ERROR 位于第 1 行:
ORA-03217: 变更 TEMPORARY TABLESPACE 无效的选项
(7) offline状态:对数据文件改名or搬动数据文件的位置or对数据库进行部分的修复
(7) offline状态:对数据文件改名or搬动数据文件的位置or对数据库进行部分的修复
**L》 alter tablespace users offline;
表空间已更改。
**L》 alter tablespace users online;
表空间已更改。
不可以置为offline状态的表空间包括:system表空间(如果要对系统表空间的文件进行改变则要关闭数据库);
包括active undo 段的表空间;缺省的临时表空间
(8) read only 表空间:对表空间只能进行读操作;数据对象可以从表空间删除
**L》 alter tablespace users read only;
表空间已更改。
(9) 删除表空间:
**L》 create table tt1
2 (id int)
3 tablespace ice;
表已创建。
**L》 drop tablespace ice1;
表空间已丢弃。
**L》 drop tablespace ice2
2 including contents and datafiles;
表空间已丢弃。
(10) resize表空间:自动扩张(autoextend on)、手动(resize)
3. 管理数据文件
(1) 移动data files:
表空间必须是offline(使用alter tablespace xxx rename datafile ’xx’ to ’xx’);
目标数据文件必须已经存在;
如果是不能处于offline状态的表空间则要关闭数据库,将其启动到mount状态,同时目标数据文件必须已经存在。
(使用alter database rename file ’xx’ to ’xx’)
(2) 配置OMF文件来创建表空间的时候DB_CREATE_FILE_DEST会将数据文件存放在缺省的位置。如果想要更改位置则用
alter system set db_create_file_dest=’xx’;
用OMF创建表空间:create tablespace xxx; 删除:drop tablespace xxx;
Oracle用户权限表的管理方法
我们将通过介绍命令的方式 谈谈Oracle用户权限表的管理方法 希望对大家有所帮助
我们将从创建Oracle用户权限表 开始谈起 然后讲解**等一般性动作 使大家对Oracle用户权限表有个深入的了解
一 创建
sys;//系统管理员 拥有最高权限
system;//本地管理员 次高权限
scott;//普通用户 密码默认为tiger 默认未解锁
sys;//系统管理员 拥有最高权限
system;//本地管理员 次高权限
scott;//普通用户 密码默认为tiger 默认未解锁
二 **
sqlplus / as sysdba;//**sys帐户
sqlplus sys as sysdba;//同上
sqlplus scott/tiger;//**普通用户scott
sqlplus / as sysdba;//**sys帐户
sqlplus sys as sysdba;//同上
sqlplus scott/tiger;//**普通用户scott
三 管理用户
create user zhangsan;//在管理员帐户下 创建用户zhangsan
alert user scott identified by tiger;//修改密码
create user zhangsan;//在管理员帐户下 创建用户zhangsan
alert user scott identified by tiger;//修改密码
四 授予权限
默认的普通用户scott默认未 解锁 不能进行那个使用 新建的用户也没有任何权限 必须授予权限
/*管理员授权*/
grant create session to zhangsan;//授予zhangsan用户创建session的权限 即**权限
grant unlimited session to zhangsan;//授予zhangsan用户使用表空间的权限
grant create table to zhangsan;//授予创建表的权限
grante drop table to zhangsan;//授予删除表的权限
grant insert table to zhangsan;//插入表的权限
grant update table to zhangsan;//修改表的权限
grant all to public;//这条比较重要 授予所有权限(all)给所有用户(public)
/*管理员授权*/
grant create session to zhangsan;//授予zhangsan用户创建session的权限 即**权限
grant unlimited session to zhangsan;//授予zhangsan用户使用表空间的权限
grant create table to zhangsan;//授予创建表的权限
grante drop table to zhangsan;//授予删除表的权限
grant insert table to zhangsan;//插入表的权限
grant update table to zhangsan;//修改表的权限
grant all to public;//这条比较重要 授予所有权限(all)给所有用户(public)
oralce对权限管理比较严谨 普通用户 之间也是默认不能互相访问的 需要互相授权
/*oralce对权限管理比较严谨 普通用户之间也是默认不能互相访问的*/
grant select on tablename to zhangsan;//授予zhangsan用户查看指定表的权限
grant drop on tablename to zhangsan;//授予删除表的权限
grant insert on tablename to zhangsan;//授予插入的权限
grant update on tablename to zhangsan;//授予修改表的权限
grant insert(id) on tablename to zhangsan;
grant update(id) on tablename to zhangsan;//授予对指定表特定字段的插入和修改权限 注意 只能是insert和update
grant alert all table to zhangsan;//授予zhangsan用户alert任意表的权限
/*oralce对权限管理比较 严谨 普通用户之间也是默认不能互相访问的*/
grant select on tablename to zhangsan;//授予zhangsan用户查看指定表的权限
grant drop on tablename to zhangsan;//授予删除表的权限
grant insert on tablename to zhangsan;//授予插入的权限
grant update on tablename to zhangsan;//授予修改表的权限
grant insert(id) on tablename to zhangsan;
grant update(id) on tablename to zhangsan;//授予对指定表特定字段的插入和修改权限 注意 只能是insert和update
grant alert all table to zhangsan;//授予zhangsan用户alert任意表的权限
五 撤销权限
基本语法同grant 关键字为revoke
基本语法同grant 关键字为revoke
六 查看权限
select * from user_sys_privs;//查看当前用户所有权限
select * from user_tab_privs;//查看所用用户对表的权限
select * from user_sys_privs;//查看当前用户所有权限
select * from user_tab_privs;//查看所用用户对表的权限
七 操作表的用户的表
/*需要在表名前加上用户名 如下*/
select * from zhangsan tablename
/*需要在表名前加上用户名 如下*/
select * from zhangsan tablename
八 权限传递
即用户A将权限授予B B可以将操作的权限再授予C 命令如下
grant alert table on tablename to zhangsan with admin option;//关键字 with admin option
grant alert table on tablename to zhangsan with grant option;//关键字 with grant option效果和admin类似
grant alert table on tablename to zhangsan with admin option;//关键字 with admin option
grant alert table on tablename to zhangsan with grant option;//关键字 with grant option效果和admin类似
九 角色
角色即权限的集 合 可以把一个角色授予给用户
create role myrole;//创建角色
grant create session to myrole;//将创建session的权限授予myrole
grant myrole to zhangsan;//授予zhangsan用户myrole的角色
drop role myrole;删除角色
/*但是有些权限是不能授予给角色的 比如unlimited tablespace和any关键字*/
lishixinzhi/Article/program/Oracle/201311/17543Oracle数据库自动存储管理(ASM)
关于ASM的讨论很多 但是到底什么是ASM?ASM是一个有效的抽象层 使你的Oracle数据库可以与叫做diskgroups的抽象空间一起使用 而不是直接使用datafiles 这带来了很多好处 但是也要求学习一些新的概念 命令 使用和管理任务 所以在投入你的生产系统之前 看看它解决什么 管理什么 以及对它的正反面评价
为什么创建它?
回答这个问题的最好方式是直接追溯源头 Bill Bridge——自动存储管理的最初架构师 在Oracle Press标题中的Oracle ASM Bill提供了一个链接 他在那里讨论了使用供应商特定操作系统的文件系统来管理Oracle数据文件放置所遇到的问题
对于归档日志和备份 操作系统供应商不提供共享磁盘文件系统
逻辑卷管理器隐藏了文件的位置 使得很难管理磁盘I/O和提供良好的统计
当磁盘数超过 时 现有的lvm不能工作得很好
当数据库有 以上的数据文件时 操作系统和Oracle不能很好地处理数据库
当有大量数据文件时命名就变得很困难了
特性和文件系统限制随操作系统的不同而不同
操作系统级的用户可以通过标准使用接触到Oracle文件 而Oracle并不知道
所以 他通过建立Oracle自己的文件系统开始解决这些问题 他的目标是提供这些特性
与Oracle紧密集成 并与集群一起使用(并行服务器)
自动使用新的存储 作为磁盘单元或磁盘组来管理
支持成千上万的磁盘
文件不会名字 并会在操作系统中隐藏起来
谁需要它?
现在快速浏览一下上面那些问题和解决方案会帮助你确定谁需要ASM 起初 它是用来处理现在很大型的联机数据库 所以如果它包括你的商店 那么你可能已经在关注它了 或者开始执行ASM 如果你的数据库较小 数据文件也不多 那么你可能需要再一些理由使你考虑采用它
你将要熟悉一些新技术 并且应该从在你的开发环境中建立它开始 并测试几个月
如果你想从你现有的磁盘子系统中获得更高的性能 并获得更好的统计用于预测磁盘I/O
如果你正在使用RAC 那么就需要考虑ASM了
开始
ASM是由一个实例管理 非常类似于Oracle数据库 但是初始参数是非常有限的 而且启动过程也简单得多
a 将你的ORACLE_SID设置为+ASM
b init ora
# as opposed to RDBMS for a normal Oracle instance
INSTANCE_TYPE=ASM
# these names will be used in place of datafile names when you create tablespaces
ASM_DISKGROUPS=SEAN AARON
processes=
# this parameter is platform specific and is the path to the raw disk device
ASM_DISKSTRING= /dev/cciss/c d p ′
# on g you should use diagnostic_dest instead of these
background_dump_dest=/opt/oracle/admin/+ASM/bdump
core_dump_dest=/opt/oracle/admin/+ASM/cdump
user_dump_dest=/opt/oracle/admin/+ASM/udump
c 启动ASM实例
$ sqlplus / as sysdba
**L》 startup
d 创建磁盘组
**L》 create diskgroup SEAN disk /dev/cciss/c d p ′;
e 检查表空间的创建
你可能会猜测 创建一个表空间会有轻微的改变 默认方法如下所示
**L》 create tablespace sean_space datafile +SEAN size GB;
不过想一下这个很好的特性 如果在你的数据库中init ora文件你设置参数为
db_create_file_dest=+SEAN
那么你可以这样做
**L》 create tablespace sean_space;
然后让Oracle做其余的工作 在这两种情形下 你将发现在v$datafile中列出的文件路径是和抽象的+SEAN 磁盘组有关 而不是与一个实际的操作系统数据文件
f 更多的
当然简化文件名称和表空间的创建只是ASM可以为你做的工作的冰山一角 它还可以提供一个冗余级别
在数据库方面 外部冗余***要是当你在硬件级别(RAID)上或Oracle可以看到的其它外部方法中具有冗余 换句话说 如果a *** _diskstring设备是它们自己的逻辑 隐藏物理磁盘于一些冗余的硬件层后面 那么你就会有外部冗余能力
但是 如果你没有这个冗余能力 那么ASM可以提供 你可以指定冗余 失败组和一组其它的选项来防止损失一个或多个磁盘 ***或甚至是整个SAM失效 ASM还提供了在磁盘组中均匀分布的I/O 因为ASM很好的了解背后发生了什么 所以Oracle可以自动的为你提供I/O到磁盘的一个更好的平衡
使用ASM遇到的挑战
ASM当然是一个具有很大潜能的强大技术 但是对于每一个技术解决方案 都会有很多的挑战 对于ASM 它潜在地破坏了Unix系统管理组和数据库/数据库管理员组间力量的普通平衡 以前的组管理磁盘 硬件和操作系统级别 使数据库管理员与它们协作获取新的资源 这将在某种程度上挑战这个平衡 而这会引起一些来自于这个组的阻力
最后 应该是业务需求促使了它的采用 还要注意到ASM仍然是处于企业计算认识阶段 相对还比较新 有一些供应商他们的核心业务已经放在逻辑空间管理器/文件系统空间中很多年了 一般来说 对于软件系统和可靠性来说成熟是很重要的
总结
lishixinzhi/Article/program/Oracle/201311/16542如何管理ORACLE数据库中的数据
工具/材料
ORACLE**LDeveloper
首先我们打开ORACLE**LDeveloper工具,来看一下我们接下来要操作的表的结构,如下图所示
然后先执行的是数据的插入操作,在ORACLE中,插入数据用insert语句,如下图所示
如果查询数据就需要使用select语句了,如下图所示,运用select语句的时候可以指定列名
接下来看一下如何更新数据,在Oracle中更新数据可以运用update语句,如下图所示,更新的时候需要限定更新条件
在进行更新的时候,如果你没有指定更新条件的话,那么就会进行全表数据的更新,如下图所示
接下来看一下数据的删除操作,删除操作运用delete语句即可,需要通过where条件指定删除哪些数据,如下图所示
最后要提醒大家,如果进行删除的时候不指定where条件的话,就会把整张表的数据都删除掉了,如下图所示
Oracle数据库管理员职责(一)
Oracle数据库管理员应按如下方式对Oracle数据库系统做定期监控
( ) 每天 对Oracle数据库的运行状态 日志文件 备份情况 数据库的空间使用情况 系统资源的使用情况进行检查 发现并解决问题
( ) 每周 对数据库对象的空间扩展情况 数据的增长情况进行监控 对数据库做健康检查 对数据库对象的状态做检查
( ) 每月 对表和索引等进行Analyze 检查表空间碎片 寻找数据库性能调整的机会 进行数据库性能调整 提出下一步空间管理计划 对ORACLE数据库状态进行一次全面检查
每天的工作
( ) 确认所有的INSTANCE状态正常**到所有数据库或例程 检测ORACLE后台进程: $ps –ef|grep ora
( ) 检查数据文件的状态记录状态不是 online 的数据文件 并做恢复
Select file_name status from dba_data_files where status= UN**AILABLE ;
( ) 检查日志文件和trace文件记录alert和trace文件中的错误
连接到每个需管理的系统
使用 telnet 对每个数据库 cd到bdump目录 通常是$ORACLE_BASE//bdump 使用Unix tail 命令来查看alert_ log文件 如果发现任何新的ORA 错误 记录并解决( ) 检查数据库当日备份的有效性
对RMAN备份方式: 检查第三方备份工具的备份日志以确定备份是否成功
对EXPORT备份方式: 检查exp日志文件以确定备份是否成功
对其他备份方式: 检查相应的日志文件
( ) 检查文件系统的使用(剩余空间) 如果文件系统的剩余空间小于 % 需删除不用的文件以释放空间
$df –k
( ) 检查表空间的使用情况
SELECT tablespace_name max_m count_blocks ****_blk_cnt sum_****_m to_char( *sum_****_m/sum_m ) || % AS pct_**** FROM (SELECT tablespace_name sum(bytes)/ / AS sum_m FROM dba_data_files GROUP BY tablespace_name) (SELECT tablespace_name AS fs_ts_name max(bytes)/ / AS max_m count(blocks) AS count_blocks sum(bytes/ / ) AS sum_****_m FROM dba_****_space GROUP BY tablespace_name ) WHERE tablespace_name = fs_ts_name;
( ) 检查剩余表空间
SELECT tablespace_name sum ( blocks ) as ****_blk trunc ( sum ( bytes ) /( * ) ) as ****_m max ( bytes ) / ( ) as big_chunk_k count (*) as num_chunks FROM dba_****_space GROUP BY tablespace_name;
( ) 监控数据库性能
运行bstat/estat生成系统报告或者使用statspack收集统计数据
( ) 检查数据库性能 记录数据库的cpu使用 IO buffer命中率等等
使用vmstat iostat glance top等命令
( ) 日常出现问题的处理
每周的工作
( ) 监控数据库对象的空间扩展情况
根据本周每天的检查情况找到空间扩展很快的数据库对象 并采取相应的措施
删除历史数据
扩表空间alter tablespace add datafile size
调整数据对象的存储参数next extent pct_increase
( ) 监控数据量的增长情况
根据本周每天的检查情况找到记录数量增长很快的数据库对象 并采取相应的措施
删除历史数据
扩表空间alter tablespace add datafile size
( ) 系统健康检查
检查以下内容:
init ora controlfile redo log file archiving sort area size tablespace(system temporary tablespace fragment) datafiles(autoextend location) object(number of extent next extent index) rollback segment logging &tracing(alert log max_dump_file_size sqlnet)
( ) 检查无效的数据库对象
col owner for a col object_name for a SELECT owner object_name object_type FROM dba_objects WHERE status= INVALID ;
( ) 检查不起作用的约束
SELECT owner c***traint_name table_name c***traint_type status FROM dba_c***traints WHERE status = DISABLED AND c***traint_type = P ;
( ) 检查无效的trigger
SELECT owner trigger_name table_name status FROM dba_triggers WHERE status = DISABLED ;
每月的工作
( ) Analyze Tables/Indexes/Cluster
*** yze table estimate statistics sample percent;
( ) 检查表空间碎片
根据本月每周的检查分析数据库碎片情况 找到相应的解决方法;
( ) 寻找数据库性能调整的机会
比较每天对数据库性能的监控报告 确定是否有必要对数据库性能进行调整;
( ) 数据库性能调整
如有必要 进行性能调整;
( ) 提出下一步空间管理计划
lishixinzhi/Article/program/Oracle/201311/18051浅谈Oracle中大数据量表的管理
简介
随着信息业的发展 在企业级数据库应用中 经常会有一些几十GB 上百GB的数据表 这些大数据量表的设计 维护及其备份都是数据库管理中的重点及其难点 本文就从设计 维护及其备份方面探讨一下大数据量表的管理
设计
大表时效性
大数据量表的数据量一般来说是跟时间成正比的 时间越久 数据量越大 在设计阶段首先要考虑这些大表的时效性
通常情况 在一定的时间区间 数据的访问频度比较大 超过这个区间 数据的访问频度极小 这个时间区间根据不同的应用类型而不同 通常是几个月 超过这个时间区间的数据可以认为是历史数据 数据访问的可能性不打 在企业应用中 并不是所有的数据都需要保留在生产数据库中 对于这些历史数据 可以考虑离线存放 或者是存放在另外的数据库中 比如数据仓库等
大表的时效性可以通过在表上加时间戳列来实现
使用分区表
Oracle 以后提供了分区表的功能 分区表可以把一个表的数据从物理和逻辑上分割成小的区域 Oracle支持非常大的分区表 一个对象可以允许多达 个分区 对于大表来说 使用分区表是首选方案 分区表可以改善表的维护 备份 恢复及查询性能
分区表有 种分区方式
n Range Partitioning
n Hash Partitioning
n Composite Partitioning
n List Partitioning
对于有时效性的大表 可以采用按时间分区的 Range Partitioning表 例如按天分区的分区表
CREATE TABLE Test(
DATATIME DATE NOT NULL
P NUMBER NULL
P NUMBER NULL
P NUMBER NULL
P NUMBER NULL
P NUMBER NULL
P NUMBER NULL
P NUMBER NULL
P NUMBER NULL
CONSTRAINT PK_TEST PRIMARY KEY (datatime p p ) USING INDEX LOCAL TABLESPACE USERINDEX
)
PARTITION BY RANGE (DATATIME)
(PARTITION Test_ VALUES LESS THAN (TO_DATE( YYYY MM DD ))
(PARTITION Test_ VALUES LESS THAN (TO_DATE( YYYY MM DD ))
……
);
对于按时间分区仍然不能满足性能需求的表 还可以根据应用需求 使用子分区对表进一步细化
应用设计中 要充分利用分区表的特性 对大表的访问要完全避免全表访问 缩小访问范围 在查询条件中 尽量使用分区的列
维护
大表的维护工作比较繁琐 索引的维护 存储空间的维护 历史数据的清理等等 使用分区表可以简化大表的维护工作 但是如果表很多的话 手动的创建 删除分区也是一件很繁琐 而且容易出错的事情
此章节以按天分区的分区表为例讨论大表的自动维护
分区表的命名规则
分区表分区的命名应当按照一定的规则命名 以利于自动维护的实现 本例采用按天分区的分区表 分区的命名方式为TABLENAME_YYMMDD 例如 TEST表的 年 月 日的分区命名为TEST _
维护字典
在数据库中创建维护字典表 存放需要自动维护的分区表的信息 包括表名 schema 表的类型 数据在数据库中的保留时间等信息
Table Name: H_RETENTION
Column Type Null? Description
tablename Varchar ( ) Not null 表名
schemaname Varchar ( ) Not null Schema
typeid Varchar ( ) Not null 表类型 PARTITION NORMAL …
retention Number( ) Not null 该表的保存天数
自动创建分区
对于按时间分区的分区表 若不能及时创建新的数据分区 会导致数据无法插入到分区表的严重后果 数据库会产生报错信息ORA : inserted partition key does not map to any partition 插入失败
创建分区可以手工创建 也可以根据维护字典 通过系统的任务调度来创建分区 通常是在月底创建下个月的分区
自动创建分区实现如下
/**************************************************************************
Program Name:Add_Partition
Description:
创建某个用户下个月的所有分区
***************************************************************************/
PROCEDURE add_partition (v_schema IN VARCHAR )
IS
CURSOR c_td_table
IS
SELECT tablename
FROM h_retention
WHERE typeid = PARTITION
AND schemaname = UPPER (v_schema)
ORDER BY tablename;
v_cur BINARY_INTEGER;
v_int BINARY_INTEGER;
v_partition VARCHAR ( );
v_date DATE;
v_days NUMBER;
sql_stmt VARCHAR ( ); String used to save sql statement
err_msg VARCHAR ( );
BEGIN
v_date := TRUNC (ADD_MONTHS (SYSDATE ) MM );
v_days :=
TO_NUMBER (TO_CHAR (LAST_DAY (ADD_MONTHS (SYSDATE )) DD ));
v_cur := DBMS_**L open_cursor;
FOR v_table IN c_td_table
LOOP
v_date := TRUNC (ADD_MONTHS (SYSDATE ) MM );
v_partition := v_table tablename;
FOR i IN v_days
LOOP
BEGIN
sql_stmt :=
ALTER TABLE
|| v_schema
||
|| v_table tablename
|| ADD PARTITION
|| v_partition
|| _
|| TO_CHAR (v_date YYMMDD )
||
|| VALUES LESS THAN (TO_DATE(
|| TO_CHAR (v_date + YYYY MM DD )
|| YYYY MM DD )) ;
DBMS_**L parse (v_cur sql_stmt DBMS_**L native);
v_int := DBMS_**L EXECUTE (v_cur);
EXCEPTION
WHEN OTHERS
THEN
err_msg :=
v_partition
|| : Create
|| TO_CHAR (v_date YYMMDD )
|| partition unsuccessfully! Error Information:
|| **LERRM;
log_insert (err_msg); You can define your own log_insert function
MIT;
END;
v_date := v_date + ;
END LOOP;
END LOOP;
DBMS_**L close_cursor (v_cur);
END;
自动删除过期分区
为了释放存储空间并提高大表的性能 要从数据库中删除大表中过期的历史数据 删除操作可以手工执行 也可以通过系统的任务调度来自动删除 分区表数据删除只需要删除相应的数据分区 与delete相比 有如下好处
u 速度快
u 占用回滚表空间少
u 产生日志量少
u 释放空间
如果有global的索引 删除分区后需要重建索引
自动删除分区实现如下
lishixinzhi/Article/program/Oracle/201311/18275