暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

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

原创 黑獭 2025-02-12
179

如何将一个普通的非分区表进行分区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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论