ITPub博客

首页 > 数据库 > Oracle > 如何将一个普通的非分区表进行分区5 ALTER TABLE方式

如何将一个普通的非分区表进行分区5 ALTER TABLE方式

原创 Oracle 作者:oracle11111 时间:2025-02-12 08:42:19 0 删除 编辑

如何将一个普通的非分区表进行分区5 ALTER TABLE方式


## 参考文档:

https://docs.oracle.com/en/database/oracle/oracle-database/19/vldbg/evolve-nopartition-table.html#GUID-5FDB7D59-DD05-40E4-8AB4-AF82EA0D0FE5


## 简介:

oracle 12.2之后可以通过ALTER TABLE modify 进行修改(如果能停机还是停机修改,虽然我测试没问题,但是怕出现bug。)


 


## 1、创建模拟环境

创建用户

create user ZC identified by ZC;

grant dba to ZC;

connect ZC/ZC

创建一个表

CREATE TABLE unpar_table (

a NUMBER, y number,

name VARCHAR2(100), date_used date);


为表添加主键

alter table unpar_table ADD (CONSTRAINT unpar_table_pk PRIMARY KEY (a,y));


在表中插入数据

++ load table with 1,000,000 rows

begin

for i in 1 .. 1000

loop

for j in 1 .. 1000

loop

insert into unpar_table values ( i, j, dbms_random.random, sysdate+j );

end loop;

end loop;

end;

/

commit;



+++++++++++++++++++++++++++++++++++++++++++++++++

收集统计信息,并查看表的行数

EXEC DBMS_STATS.gather_table_stats('ZC', 'unpar_table', cascade => TRUE);

SELECT num_rows FROM user_tables WHERE table_name = 'UNPAR_TABLE';



## 2、修改为分区表

 ALTER TABLE unpar_table MODIFY

  PARTITION BY RANGE (date_used)  

(PARTITION unpar_table_12 VALUES LESS THAN (TO_DATE('10/05/2015', 'DD/MM/YYYY')),

PARTITION unpar_table_15 VALUES LESS THAN (TO_DATE('15/05/2015', 'DD/MM/YYYY')),

PARTITION unpar_table_MX VALUES LESS THAN (MAXVALUE)) ONLINE

  UPDATE INDEXES;

  

建议最好不要online操作  


##  3、查询结果

SQL> SELECT partitioned FROM user_tables WHERE table_name = 'UNPAR_TABLE';


PAR

---

YES

  

  

## 4、查询alert table online情况下的锁情况  

4.1 准备测试数据:


创建一个表

CREATE TABLE unpar_table (

a NUMBER, y number,

name VARCHAR2(100), date_used date);


为表添加主键

alter table unpar_table ADD (CONSTRAINT unpar_table_pk PRIMARY KEY (a,y));


在表中插入数据

++ load table with 1,000,000 rows

begin

for i in 1 .. 1000

loop

for j in 1 .. 1000

loop

insert into unpar_table values ( i, j, dbms_random.random, sysdate+j );

end loop;

end loop;

end;

/

commit;



+++++++++++++++++++++++++++++++++++++++++++++++++

收集统计信息,并查看表的行数

EXEC DBMS_STATS.gather_table_stats('ZC', 'unpar_table', cascade => TRUE);

SELECT num_rows FROM user_tables WHERE table_name = 'UNPAR_TABLE';


4.2 进行转换并查询锁情况



会话1 : 进行alert 


 ALTER TABLE unpar_table MODIFY

  PARTITION BY RANGE (date_used)  

(PARTITION unpar_table_12 VALUES LESS THAN (TO_DATE('10/05/2015', 'DD/MM/YYYY')),

PARTITION unpar_table_15 VALUES LESS THAN (TO_DATE('15/05/2015', 'DD/MM/YYYY')),

PARTITION unpar_table_MX VALUES LESS THAN (MAXVALUE)) ONLINE

  UPDATE INDEXES;


会话2: 执行插入


insert into unpar_table values(1111005,11002,dbms_random.random,sysdate);

commit;

insert into unpar_table values(1111006,11003,dbms_random.random,sysdate);

commit;

insert into unpar_table values(11005557,11004,dbms_random.random,sysdate);

commit;


会话可以正常提交,也就是alter 期间可以正常插入数据。


会话3:查询锁和阻塞情况

  

SID SERIAL# SPID 锁模式 登录用户 登录机器用户名 机器名 终端用户名 被锁对象名 登录数据库时间

1 621 31371 16567 3 ZC oracle zc pts/2 UNPAR_TABLE 2025-01-21 9:05:09

2 621 31371 16567 6 ZC oracle zc pts/2 SYS_JOURNAL_19330107 2025-01-21 9:05:09

3 621 31371 16567 3 ZC oracle zc pts/2 CON$ 2025-01-21 9:05:09

4 621 31371 16567 3 ZC oracle zc pts/2 OBJ$ 2025-01-21 9:05:09

5 621 31371 16567 6 ZC oracle zc pts/2 SYS_RMTAB$$_H19330107 2025-01-21 9:05:09


  

  


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69924215/viewspace-3071735/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-05-19

  • 博文量
    81
  • 访问量
    90381