oracle热点表online rename

对于在线的繁忙业务表的任何操作都可能带来意想不到的风险。
一张业务表,对partition key进行升位,其步骤是:

  1. rename原表

  2. 新建临时表

  3. 交换分区到临时表

  4. 升位临时表的字段的长度

  5. 交换临时表到第二张临时表

  6. rename第二种临时表为业务表

整个的操作过程如果顺利,预计在10s左右,如果放在文件中,速度会很快。
下面模拟繁忙表进行测试:

  


#!/bin/sh
. /home/oracle/.bash_profile
sqlplus -S /nolog<<EOF
conn test/test
declare
type arraylist is table of varchar2(20 byte);
arr_account arraylist;
ran number;
error varchar2(4000);
begin
arr_account := arraylist();
arr_account.extend(5);
arr_account(1):=‘001‘;arr_account(2):=‘002‘;
arr_account(3):=‘003‘;arr_account(4):=‘004‘;
arr_account(5):=‘005‘; ran :=dbms_random.value(1,5);
while(1>0) loop
begin
execute immediate ‘insert into test(col1,col2,col3) values(:1,:2,:3)‘
using ‘1‘,arr_account(ran),dbms_random.string(‘|‘, 2000);
commit;
exception when others then
error:=SQLERRM;insert into log values(error);
commit;
end;
DBMS_LOCK.SLEEP(0.5);
end loop;
end;
/
EOF

现在打开100个线程进行并发的插入,因为每个insert都sleep 0.5秒钟,基本上1s钟插入的记录约等于线程数*2。

  


#!/bin/sh
for((i=1;i<=$1;i++))
do
/home/oracle/insert.sh &
done

因为表比较繁忙,所以用loop来进行ddl操作:
declare
begin
loop
begin
execute immediate‘alter table test rename to test_bak‘;
exit;
exception
when others then
null;
end;
end loop;
end;
/

完成rename后,发现整个db主机的cpu利用率有不小的升高。


07:43:27 PM       CPU     %user     %nice   %system   %iowait     %idle
07:43:29 PM all 5.31 0.00 0.09 5.19 89.40
07:43:31 PM all 5.44 0.00 0.13 4.85 89.59
07:43:31 PM CPU %user %nice %system %iowait %idle
07:43:33 PM all 5.38 0.00 0.12 4.62 89.88
07:43:35 PM all 6.12 0.00 0.25 4.34 89.29
07:43:35 PM CPU %user %nice %system %iowait %idle
07:43:37 PM all 6.28 0.00 0.22 4.41 89.09

cpu升高了一个百分点:trace其中的一个session:


********************************************************************************
insert into test(col1,col2,col3)values(:1,:2,:3)
values
(:1,:2,:3)
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 44 0.00 0.01 0 0 0 0
Execute 0 0.00 0.00 0 0 0 0
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 44 0.00 0.01 0 0 0 0

Misses in library cache during parse: 44
Optimizer mode: ALL_ROWS
error during execute of EXPLAIN PLAN statement
ORA-00942: table or view does not exist
parse error offset: 88

这里在20s的时间里,进行了44次insert,
每次insert都进行了parse,这也是cpu会上升的原因,因为parse是cpu密集型的操作,oracle
parse这个sql时,
发现其depend object不存在,所以在下次过来时,仍然需要解析。

所以:在对特别繁忙的表进行rename操作的时候,object不可用,会造成大量的解析,如果并发量比较大,伴随着大量的读,会操作db
hang住。所以要特别小心。

oracle热点表online rename,码迷,mamicode.com

时间: 2024-08-02 11:04:23

oracle热点表online rename的相关文章

Oracle 重建表(rename)注意事项总结

一.概述 前一段时间,有一个DBA朋友在完成重建表(rename)工作后,第二天早上业务无法正常运行,出现数据无法插入的限制和错误,后来分析才发现,错误的原因是使用rename方式重建表以后,其它引用这个表的外键约束指向没有重新定义到这个重建的新表中,从而导致这些表在插入新数据时,违反数据完整性约束,导致数据无法正常插入.影响了业务大概有1个多小时,真是一次血淋淋的教训啊. 使用rename方式重建表是我们日常DBA维护工作中经常使用的一种方法,因为CTAS+rename这种配合方式,非常实用和

白话Oracle:热点表优化总结

1.优化与热点表相关的sql,sql执行时间过长就会长时间的持有latch.对于返回结果数量较少的语句,应该检查是否用到索引和分区条件.例如我们查询已经建立分区的表,如果返回少量数据,我们可以创建索引(或分区索引)并且用到分区条件,如果没有用到查询分区表的执行效率反而更低. 2. 对于需要返回大量数据的查询语句尽量减少执行次数,一次读取数据放入缓存(如在代码逻辑中灵活使用map等数据结构作为缓存层,或者使用memcach等工具),业务层尽量通过缓存读取数据,同时根据一定逻辑更新缓存: 3. 对于

oracle的表如何跨表空间存储

oracle的一个表所在表空间,空间已经占满,其他表空间有剩余空间.实现表存在另外的表空间. 方案一:利用原表重建分区表 1:原表temp,存在字段id,time; 2:temp存在纪录; 3:根据原表temp创建新的分区表temp_new CREATE TABLE temp_new (ID, TIME) PARTITION BY RANGE (TIME) ( PARTITION P1 VALUES LESS THAN (TO_DATE('2004-7-1', 'YYYY-MM-DD')) TA

Oracle单表去重复(一)

去重有两层含义,一:是记录完全一样:二:是符合一定条件的认为是重复. 根据表的数量,去重可划分为:单表去重和多表关联去重. 对于去重,一般最容易想到的是用distinct,而distinct只能对记录完全重复的记录保留一条. distinct使用的是二重循环的方式来去重的,如果数据量非常大的时候,会导致性能急剧下降. 例如:select distinct 字段名 from 原表; 此应用案例,主要有删除表中的完全重复的记录: insert into 临时表 select distinct 字段名

Oracle建表插数据等等

Oracle的表的管理:表名和列的命名规则 . 必须以字母开头 . 长度不能超过30个字符 . 不能使用Oracle的保留字 . 只能使用如下字符 column_name-Z,column_name-z,0-9,$,#等 Oracle支持的数据类型 字符类:char 定长,最大2000个字节. 例子:char(10) 如果内容为'小杰'则前四个字节放'小杰',后添6个空格补全varchar2() 变长 最大4000个字符. 例子:varchar2(10) '小杰',Oracle分配四个字符.这样

Oracle笔记-表的管理

3.1创建和管理表在Oracle表中使用的emp,dept,sal都是系统内建好的表,那么在SQL语法中同样支持了表的创建语句,要想创建表,则应先了解下Oracle中最常用的几种数据类型3.1.1常用的数据类型--(重点)常用的数据类型,如之前的emp表中已经出现了三种NUMBER(n):表示一个整数,数字长度是n,可以使用int代替NUMBER(m,n):表示一个小数,小数长度为n,整数长度为m-n,可以使用FLOAT代替VARCHAR/VARCHAR2::表示的是一个字符串,有长度限制,为2

Oracle更改表空间文件位置

Oracle更改表空间文件位置: set oracle_sid=orcl; sqlplus /nolog conn sys/password as sysdba; shutdown immediate; 复制(移动)数据文件至新路径 startup mount; alter database rename file 'c:\oracle_data\test_data01.dbf' to 'd:\oracle_data\test_data01.dbf'; alter database open;

oracle修改表名和列名的多种方式

重命名表 对于已存在的表,还可以修改其名称.重命名表有两种语法形式,一种是使用ALTER TABLE语句,语法如下: ALTER TABLE table_name RENAME TO new_table_name: 另一种是直接使用RENAME语句,语法如下: RENAME table_name TO new_table_name; 修改列的名称 修改表中的列的名称的语法如下: ALTER TABLE table_name RENAME COLUMN column_name TO new_col

转 关于oracle 分区表 表空间以及索引的总结

关于oracle的表空间,分区表,以及索引的总结关键字: oracle, 表空间, 分区表, 索引 上周第一次做数据库测试碰到了很多问题特此总结: 表空间: Oracle的UNDOTBS01.DBF文件太大的解决办法 1..禁止undo tablespace自动增长 alter   database   datafile   'full_path\undotbs01.dbf'   autoextend   off; 2.-- 创建一个新的小空间的undo tablespace create un