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




