This commit is contained in:
wenyongda 2024-03-05 19:19:39 +08:00
parent 387cc8f279
commit 74898504d5
7 changed files with 537 additions and 83 deletions

View File

@ -164,6 +164,15 @@ find $(pwd) -name sample.txt /home/gliu/sample.txt
ls -l $PWD/sample.txt
```
### 文件目录:
```shell
# 列出当前目录下所有文件的大小,以及所有文件大小的统计总和
ls -lht
```
## 文件详情以home目录为例
d说明当前文件是一个目录- 代表的是文件)
@ -797,6 +806,24 @@ firewall-cmd --zone=public --add-port=3306/tcp --permanent
```
## 安装与分区
Linux分区顺序主要是boot swap /
1boot 分区因为boot是引导启动的分区所以分区的时候必须先分boot通常设置大小为200M 空间足够300 - 500M
2swap缓存分区通常设置大小为1G 通常是物理内存大小的2倍比如你电脑是4G的物理内存swap分区可以是8G
3/ (根分区,通常把硬盘剩下所有的都分配给根/
4/home分区 (可选)
![image-20240227123457743](Linux/image-20240227123457743.png)
![image-20240227123607562](Linux/image-20240227123607562.png)
![image-20240227123637191](Linux/image-20240227123637191.png)
## 查看硬盘空间
```shell
@ -1094,6 +1121,58 @@ vim /etc/sysctl.conf
vm.swappiness=60
```
## 升级内核
### centos 7.9
#### yum
查看内核版本
```shell
uname -a
```
查看CentOS的版本
```shell
cat /etc/redhat-release
```
导入一个公钥
```shell
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
```
安装一下CentOS 7.x的ELRepo包
```shell
yum install -y https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
```
然后执行下边命令
```shell
yum --enablerepo=elrepo-kernel install kernel-ml -y &&
sed -i s/saved/0/g /etc/default/grub &&
grub2-mkconfig -o /boot/grub2/grub.cfg
```
重启
```shell
reboot
```
查看内核版本
```shell
uname -a
```
升级完成
## Windows Linux子系统
### WSL2
@ -1625,3 +1704,52 @@ path = /root/mysql_bakup
read only = yes
```
## 安装 Jenkins
安装 Java
Jenkins 需要 Java JRE v8 或 v11。 因此,使用以下命令安装 Java
```shell
sudo dnf install java-11-openjdk
```
验证 Java 版本:
```shell
java -version
```
现在我们将 Jenkins 存储库添加到您的 AlmaLinux/Rocky Linux。 首先,将 Jenkins 密钥导入系统:
```shell
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
```
接下来,添加创建存储库:
```shell
cd /etc/yum.repos.d/
curl -O https://pkg.jenkins.io/redhat-stable/jenkins.repo
```
然后,使用以下命令安装 Jenkins
```shell
sudo dnf makecache
sudo dnf install jenkins
```
安装完成后,通过执行以下命令启动并验证 Jenkins 的状态:
```shell
sudo systemctl start jenkins
sudo systemctl status jenkins
```
```shell
[MIRROR] jenkins-2.440.1-1.1.noarch.rpm: Curl error (60): SSL peer certificate or SSH remote key was not OK for https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/jenkins-2.440.1-1.1.noarch.rpm [SSL certificate problem: certificate is not yet valid]
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

View File

@ -3,30 +3,38 @@ title: Oracle
date: 2021-03-23 10:30:31
author: 文永达
---
# Oracle
# Oracle Database
## 安装Oracle 19c
### Linux下安装
#### rpm方式 `没成功`
#### rpm方式
从Oracle官网下载安装包 Linux x86-64 RPM
https://www.oracle.com/database/technologies/oracle-database-software-downloads.html
![image-20240226135109613](Oracle/image-20240226135109613.png)
安装帮助文档
https://docs.oracle.com/en/database/oracle/oracle-database/19/ladbi/preface.html#GUID-071A6B76-11E3-4421-963E-41DA6F2EF07A
下载地址
下载 `preinstall` 下载地址
https://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/index.html浏览器搜索-19c
或者
```shell
curl -o oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm https://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/getPackage/oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm
```
安装,首先执行
```shell
yum install oracle-database-preinstall-19c-1.0-3.el7.x86_64.rpm
yum localinstall -y oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm
```
会提示缺少依赖
@ -44,82 +52,13 @@ rpm -ivh compat-libcap1-1.10-7.el7.x86_64.rpm
再次执行
```shell
yum install oracle-database-preinstall-19c-1.0-3.el7.x86_64.rpm
yum localinstall -y oracle-database-preinstall-19c-1.0-3.el7.x86_64.rpm
```
安装数据库
```shell
yum install oracle-database-ee-19c-1.0-1.x86_64.rpm
```
如果发生错误
```shell
Exception java.lang.UnsatisfiedLinkError: /opt/oracle/product/19c/dbhome_1/oui/lib/linux64/liboraInstaller.so: libnsl.so.1: cannot open shared object file: No such file or directory occurred..
java.lang.UnsatisfiedLinkError: /opt/oracle/product/19c/dbhome_1/oui/lib/linux64/liboraInstaller.so: libnsl.so.1: cannot open shared object file: No such file or directory
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1857)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1122)
at oracle.sysman.oii.oiip.osd.unix.OiipuUnixOps.loadNativeLib(OiipuUnixOps.java:388)
at oracle.sysman.oii.oiip.osd.unix.OiipuUnixOps.<clinit>(OiipuUnixOps.java:130)
at oracle.sysman.oii.oiip.oiipg.OiipgEnvironment.getEnv(OiipgEnvironment.java:201)
at oracle.sysman.oii.oiix.OiixIniPair.instantiateEnvVars(OiixIniPair.java:299)
at oracle.sysman.oii.oiix.OiixIniPair.updateValue(OiixIniPair.java:230)
at oracle.sysman.oii.oiix.OiixIniPair.<init>(OiixIniPair.java:148)
at oracle.sysman.oii.oiix.OiixIniFile.readFile(OiixIniFile.java:809)
at oracle.sysman.oii.oiix.OiixIniFile.readIniFile(OiixIniFile.java:978)
at oracle.sysman.oii.oiix.OiixIniFile.getProfileString(OiixIniFile.java:385)
at oracle.sysman.oii.oiix.OiixOraparam.getOraparamProfileString(OiixOraparam.java:338)
at oracle.sysman.oii.oiix.OiixOraparam.getOraparamProfileString(OiixOraparam.java:296)
at oracle.sysman.oii.oiix.OiixOraparam.usePrereqChecker(OiixOraparam.java:416)
at oracle.sysman.oii.oiic.OiicSessionContext.setVariables(OiicSessionContext.java:1325)
at oracle.sysman.oii.oiic.OiicBaseInventoryApp.execute(OiicBaseInventoryApp.java:771)
at oracle.sysman.oii.oiic.OiicBaseInventoryApp.main_helper(OiicBaseInventoryApp.java:690)
at oracle.sysman.oii.oiic.OiicDetachHome.main(OiicDetachHome.java:420)
'DetachHome' failed.
Exception in thread "main" java.lang.NullPointerException
at oracle.sysman.oii.oiic.OiicBaseInventoryApp.main_helper(OiicBaseInventoryApp.java:706)
at oracle.sysman.oii.oiic.OiicDetachHome.main(OiicDetachHome.java:420)
Exception java.lang.NoClassDefFoundError: Could not initialize class oracle.sysman.oii.oiip.osd.unix.OiipuUnixOps occurred..
java.lang.NoClassDefFoundError: Could not initialize class oracle.sysman.oii.oiip.osd.unix.OiipuUnixOps
at oracle.sysman.oii.oiip.oiipg.OiipgEnvironment.getEnv(OiipgEnvironment.java:201)
at oracle.sysman.oii.oiix.OiixIniPair.instantiateEnvVars(OiixIniPair.java:299)
at oracle.sysman.oii.oiix.OiixIniPair.updateValue(OiixIniPair.java:230)
at oracle.sysman.oii.oiix.OiixIniPair.<init>(OiixIniPair.java:148)
at oracle.sysman.oii.oiix.OiixIniFile.readFile(OiixIniFile.java:809)
at oracle.sysman.oii.oiix.OiixIniFile.readIniFile(OiixIniFile.java:978)
at oracle.sysman.oii.oiix.OiixIniFile.getProfileString(OiixIniFile.java:385)
at oracle.sysman.oii.oiix.OiixOraparam.getOraparamProfileString(OiixOraparam.java:338)
at oracle.sysman.oii.oiix.OiixOraparam.getOraparamProfileString(OiixOraparam.java:296)
at oracle.sysman.oii.oiix.OiixOraparam.usePrereqChecker(OiixOraparam.java:416)
at oracle.sysman.oii.oiic.OiicSessionContext.setVariables(OiicSessionContext.java:1325)
at oracle.sysman.oii.oiic.OiicBaseInventoryApp.execute(OiicBaseInventoryApp.java:771)
at oracle.sysman.oii.oiic.OiicBaseInventoryApp.main_helper(OiicBaseInventoryApp.java:690)
at oracle.sysman.oii.oiic.OiicAttachHome.main(OiicAttachHome.java:696)
'AttachHome' failed.
Exception in thread "main" java.lang.NullPointerException
at oracle.sysman.oii.oiic.OiicBaseInventoryApp.main_helper(OiicBaseInventoryApp.java:706)
at oracle.sysman.oii.oiic.OiicAttachHome.main(OiicAttachHome.java:696)
[SEVERE] An error occurred while registering the Oracle home. Verify logs in /var/log/oracle-database-ee-19c/results/oraInstall.log and /opt/oracle/oraInventory for more details and try again.
warning: %post(oracle-database-ee-19c-1.0-1.x86_64) scriptlet failed, exit status 1
```
解决办法
```shell
yum -y install /lib64/libnsl.so.1
```
再次执行安装
```shell
# 需要先删除 /opt/oracle/*
rm -rf /opt/oracle/*
# 再次执行安装 需要加上 --force
rpm -ivh oracle-database-ee-19c-1.0-1.x86_64.rpm --force
yum localinstall -y oracle-database-ee-19c-1.0-1.x86_64.rpm
```
配置数据库
@ -136,21 +75,23 @@ rpm -ivh oracle-database-ee-19c-1.0-1.x86_64.rpm --force
yum install libnsl
```
配置后设置当前用户下的环境变量
配置完成后设置当前用户下的环境变量
```shell
vi ~/.bashrc
# 追加oracle环境变量信息
export ORACLE_HOME=/opt/oracle/product/19c/dbhome_1
export ORACLE_SID=ORCLCDBexport
PATH=$ORACLE_HOME/bin:$PATH
vim /etc/profile.d/oracle19c.sh
export ORACLE_HOME=/opt/oracle/product/19c/dbhome_1
export PATH=$PATH:/opt/oracle/product/19c/dbhome_1/bin
export ORACLE_SID=ORCLCDB
# 保存退出,执行
source ~/.bashrc
source /etc/profile.d
```
验证安装是否正确
```shell
passwd oracle
su oracle
sqlplus / as sysdba
@ -288,6 +229,55 @@ Grant succeeded.
## SQL PLUS
### 解决乱码
```shell
sqlplus / as sysdba
col parameter for a30
col value for a25
select * from nls_database_parameters;
PARAMETER VALUE
------------------------------ -------------------------
NLS_RDBMS_VERSION 19.0.0.0.0
NLS_NCHAR_CONV_EXCP FALSE
NLS_LENGTH_SEMANTICS BYTE
NLS_COMP BINARY
NLS_DUAL_CURRENCY $
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM
TZR
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_FORMAT HH.MI.SSXFF AM
PARAMETER VALUE
------------------------------ -------------------------
NLS_SORT BINARY
NLS_DATE_LANGUAGE AMERICAN
NLS_DATE_FORMAT DD-MON-RR
NLS_CALENDAR GREGORIAN
NLS_NUMERIC_CHARACTERS .,
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_CHARACTERSET AL32UTF8
NLS_ISO_CURRENCY AMERICA
NLS_CURRENCY $
NLS_TERRITORY AMERICA
NLS_LANGUAGE AMERICAN
```
`NLS_LANG`的组成规则为 `NLS_LANGUAGE_NLS_TERRITORY.NLS_CHARACTERSET`
```shell
vim ~/.bash_profile
export NLS_LANG="AMERICAN_AMERICA.AL32UTF8"
```
### 解决控制台输错命令删除
使用`Ctrl + backspace`代替`backspace`
@ -300,6 +290,107 @@ su oracle
$ORACLE_HOME/bin/sqlplus / as sysdba
```
### 修改sys密码
```shell
sqlplus /nolog
conn as sysdba
alter user sys identified by 123456;
```
## CDB 和 PDB
- CDB :容器数据库,名称为 CDB$ROOT。其作用就是系统数据库sys等账号都保存在里面。同时它可以管理PDB数据库
- PDB 可插拔的数据库。用户可以在PDB自建数据库
- Oracle安装成功后有个默认的pdb数据库在安装Oracle的时候自己设定
- PDB中自带有PDB$SEED属于PDB的模板数据库自己创建数据库的时候以此库为模板
命令如何查看当前的位置是CDB还是PDB使用sys登录输入命令
```she
show con_name; -- 查看当前所在容器位置
show pdbs; -- 查看所有的PDB
alter pluggable database pdb1 open; -- 打开 pdb1 pdb
alter pluggable database pdb1 close immediate; -- 立刻关闭 pdb1
alter pluggable database all open; -- 打开 所有 pdb
alter session set container=cdb$root; -- pdb切换到cdb
alter session set container=pdb1; -- cdb切换到pdb1
-- 查看 cdb、pdb 信息
select name , cdb from v$database;
select name,con_id from v$services;
select name,con_id,open_mode from v$pdbs;
```
由于安装Oracle的时候设定PDB数据库为schooldb故查询到两个PDB数据库
## 表空间
### 概述
1. 表空间
1. 表空间是一个逻辑的概念,真正存放数据的是数据文件(data files)
2. 1 个数据库 = N 个表空间(N >= 1)
1 个表空间 = N 个数据文件(dbf)N >= 1
-- 1个数据文件(dbf) 只能属于 1 个表空间
2. 建立表空间的作用
1. 控制数据库占用 '磁盘空间' 的大小
2. 不同类型的数据存储到不同的位置,有利于提高 'I/O' 性能,同时有利于备份和恢复等操作
### 相关视图
```sql
-- 数据文件
select * from dba_data_files;
select * from dba_temp_files;
-- 表空间
select * from dba_tablespaces;
select * from dba_free_space;
-- 权限
select distinct t.privilege
from dba_sys_privs t
where t.privilege like '%TABLESPACE%';
select t.tablespace_name, -- 表空间
t.file_name, -- 文件名
t.autoextensible, -- 是否自增
t.bytes / 1024 / 1024 "SIZE(M)", -- 初始值
t.increment_by * 8 / 1024 "NEXT(M)", -- 步长 1blok = 8KB
t.maxbytes / 1024 / 1024 "MAXSIZE(M)" -- 最大值
from dba_data_files t;
```
![image-20240229151409259](Oracle/image-20240229151409259.png)
### 修改
```sql
-- 1 修改数据文件的大小为 20M
alter database datafile 'D:\Oracle\TBS01.dbf'
resize 20m;
-- 2 修改数据文件为自动扩展,最大值为 1G
alter database datafile 'D:\Oracle\TBS01.dbf'
autoextend on next 20m maxsize 1g;
-- 3 新增数据文件
alter tablespace "TBS01"
add datafile 'D:\Oracle\TBS01_1.dbf'
size 200m;
```
## 语法
@ -314,6 +405,23 @@ CREATE TABLESPACE ACT_DEV
EXTENT MANAGEMENT LOCAL;
```
### 新建用户
```shell
# cdb下
CREATE TABLESPACE ACT_DEV
DATAFILE
'/opt/oracle/oradata/ORCLCDB/act_dev.dbf' SIZE 100M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED LOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
create user C##act_dev identified by 123456 default tablespace ACT_DEV;
grant dba,connect to C##act_dev;
commit;
```
### 解除占用
```sql
@ -529,4 +637,222 @@ SELECT NVL(name, '未知') AS name FROM user;
SELECT DECODE(name, NULL, '未知', name) AS name FROM user;
```
以上语句中使用DECODE函数将name参数的NULL值替换为“未知”字符串。当name不为NULL时返回它本身的值。
以上语句中使用DECODE函数将name参数的NULL值替换为“未知”字符串。当name不为NULL时返回它本身的值。
## 特性
### Row Movement
ROW MOVEMENT特性最初是在8i时引入的其目的是提高分区表的灵活性——允许更新Partition Key。这一特性默认是关闭只是在使用到一些特殊功能时会要求打开。除了之前提到的更新Partition Key还有2个要求打开的ROW MOVEMENT的功能就是flushback table和Shrink Segment。
先看Flashback Table。这一功能能帮助我们及时回滚一些误操作防止数据意外丢失。在使用该功能之前必须先打开ROW MOVEMENT否则就会抛ORA-08189错误。我们看以下例子可以说明在使用Flashback Table功能时ROW MOVEMENT产生了什么作用
当开启ROW MOVEMENT后表被顺利的flashback了数据被找回。此时再比较flashback前后记录的ROWID大多数记录的物理位置都变化。这个过程的内部操作 可以通过对Flashback Table做SQL Trace来进一步观察。
通过Trace我们不难发现Flashback Table实际是通过Flashback Query将表中数据进行了一次删除、插入操作因此ROWID会发生变化。
在更新记录中的Partition Key时可能会导致该记录超出当前所在分区的范围需要将其转移到其他对应分区上因此要求开启ROW MOVEMENT。
这一操作产生影响的特殊之处在于这是个DML操作是和online transaction密切相关。对于这样一个UPDATE实际上分为3步先从原有分区将数据删除将原数据转移到新分区上更新数据。
其影响就在于以下几个方面:
- 一个UPDATE被分解为DELET、INSERT、UPDATE三个操作增加了性能负担。其中DELETE的查询条件与原UPDATE的查询条件相同新的UPDATE的查询条件是基于INSERT生成的新的ROWID
- 相应的Redo Log、Undo Log会增加
- 如果Update语句还涉及到了Local Index的字段的话新、旧2个分区上的Local Index都要被更新。
## 分区表
### 范围分区
```sql
create tablespace tetstbs1 datafile '/opt/oracle/oradata/ORCLCDB/tetstbs1.dbf' size 1m autoextend on next 5m maxsize unlimited;
create tablespace tetstbs2 datafile '/opt/oracle/oradata/ORCLCDB/tetstbs2.dbf' size 1m autoextend on next 5m maxsize unlimited;
create tablespace tetstbs3 datafile '/opt/oracle/oradata/ORCLCDB/tetstbs3.dbf' size 1m autoextend on next 5m maxsize unlimited;
-- 范围分区
create table pt_range_test1(
pid number(10),
pname varchar2(30)
) partition by range(pid)(
-- 分区 p1 pid值小于 1000 表空间 tetstbs1
partition p1 values less than(1000) tablespace tetstbs1,
-- 分区 p2 pid值小于 2000 表空间 tetstbs2
partition p2 values less than(2000) tablespace tetstbs2,
-- 分区 p3 pid值小于 number最大值 tetstbs3
partition p3 values less than(maxvalue) tablespace tetstbs3
) enable row movement;
insert into pt_range_test1 (pid, pname) values (1, '瑶瑶');
insert into pt_range_test1 (pid, pname) values (1500, '倩倩');
insert into pt_range_test1 (pid, pname) values (null, '优优');
commit;
select * from user_tab_partitions t;
select 'P1' 分区名, t.* from pt_range_test1 partition (p1) t union all
select 'P2' 分区名, t.* from pt_range_test1 partition (p2) t union all
select 'P3' 分区名, t.* from pt_range_test1 partition (p3) t;
select 'P1' 分区名, t.* from pt_range_test1 PARTITION (p1) t;
select t.* from pt_range_test1 PARTITION (p1) t;
select t.* FROM pt_range_test1 t;
```
### 列表分区
```sql
-- 列表分区
create table pt_list_test(
pid number(10),
pname varchar2(30),
sex varchar2(10)
) partition by list(sex)(
partition p1 values ('MAN', '男') tablespace tetstbs1,
partition p2 values ('WOMAN', '女') tablespace tetstbs2,
partition p3 values (default) tablespace tetstbs3
) enable row movement;
insert into pt_list_test (pid, pname, sex) values (1, '瑶瑶', '男');
insert into pt_list_test (pid, pname, sex) values (2, '倩倩', 'WOMAN');
insert into pt_list_test (pid, pname, sex) values (3, '优优', 'GOD');
insert into pt_list_test (pid, pname, sex) VALUES (4, '雨雨', '女');
insert into pt_list_test (pid, pname, sex) VALUES (5, '闫闫', 'MAN');
commit;
update pt_list_test set sex = '男' where pid = 1;
update pt_list_test set sex = '女' where pid = 1;
select 'p1' 分区名, t.*, rowid from pt_list_test PARTITION (p1) t UNION all
select 'p2' 分区名, t.*, rowid from pt_list_test PARTITION (p2) t UNION all
select 'p3' 分区名, t.*, rowid from pt_list_test PARTITION (p3) t;
```
### 哈希分区
```shell
create tablespace tetstbs4 datafile '/opt/oracle/oradata/ORCLCDB/tetstbs4.dbf' size 1m autoextend on next 5m maxsize unlimited;
-- 哈希分区
create table pt_hash_test(
pid number(10),
pname varchar2(30)
) partition by hash(pid)(
partition p1 tablespace tetstbs1,
partition p2 tablespace tetstbs2,
partition p3 tablespace tetstbs3,
partition p4 tablespace tetstbs4
);
-- 简写
create table pt_hash_test2(
pid number(10),
pname varchar2(30)
) partition by hash(pid)
partitions 4 store in (tetstbs1, tetstbs2, tetstbs3, tetstbs4);
insert into pt_hash_test (pid, pname) values (1, '瑶瑶');
insert into pt_hash_test (pid, pname) values (1500, '倩倩');
insert into pt_hash_test (pid, pname) values (null, '优优');
insert into pt_hash_test (pid, pname) values (2000, '闫闫');
commit;
select * from user_tab_partitions t;
select 'P1' 分区名, t.* from pt_hash_test partition (p1) t union all
select 'P2' 分区名, t.* from pt_hash_test partition (p2) t union all
select 'P3' 分区名, t.* from pt_hash_test partition (p3) t UNION all
SELECT 'p4' 分区名, t.* from pt_hash_test PARTITION (p4) t;
select 'P1' 分区名, t.* from pt_hash_test PARTITION (p1) t;
select t.* from pt_hash_test PARTITION (p1) t;
select t.* FROM pt_hash_test t;
```
### 组合分区
#### 范围列表
```sql
create table pt_range_list_test(
pid number(10),
pname varchar2(30),
sex varchar2(10),
create_date date
) partition by range(create_date)
subpartition by list(sex)(
partition p1 values less than(to_date('2020-01-01', 'YYYY-MM-DD')) tablespace tetstbs1(
subpartition sub1p1 values('MAN') tablespace tetstbs1,
subpartition sub2p1 values('WOMAN') tablespace tetstbs1,
subpartition sub3p1 values(default) tablespace tetstbs1
),
partition p2 values less than(to_date('2021-01-01', 'YYYY-MM-DD')) tablespace tetstbs2(
subpartition sub1p2 values('MAN') tablespace tetstbs2,
subpartition sub2p2 values('WOMAN') tablespace tetstbs2,
subpartition sub3p2 values(default) tablespace tetstbs2
),
partition p3 values less than(maxvalue) tablespace tetstbs3(
subpartition sub1p3 values('MAN') tablespace tetstbs3,
subpartition sub2p3 values('WOMAN') tablespace tetstbs3,
subpartition sub3p3 values(default) tablespace tetstbs3
)
) enable row movement;
insert into pt_range_list_test (pid, pname, sex, create_date) values(1, '瑶瑶', 'WOMAN', to_date('2019-02-02', 'YYYY-MM-DD'));
insert into pt_range_list_test (pid, pname, sex, create_date) values(2, '闫闫', 'MAN', to_date('2020-06-21', 'YYYY-MM-DD'));
insert into pt_range_list_test (pid, pname, sex, create_date) values(3, '雨雨', 'WOMAN', TO_DATE('2022-04-03', 'YYYY-MM-DD'));
commit;
delete from pt_range_list_test where pid = 1;
select 'p1' 分区名, t.* from pt_range_list_test PARTITION (p1) t UNION all
select 'p2' 分区名, t.* from pt_range_list_test PARTITION (p2) t UNION all
select 'p3' 分区名, t.* from pt_range_list_test PARTITION (p3) t;
```
### 自动分区
在Oracle Database 12.2 之前,如果使用列表分区,当插入的数据超过了分区列表值设定,则会抛出异常;而如果存在大量的列表值需要定义,则可能需要一一设置。
在12.2引入的新特性中 - Auto-List Partitioning 可以针对新的列表值,进行自动的分区创建,从而减少了维护的复杂性。
```sql
drop table enmotech purge;
CREATE TABLE enmotech (
PartID integer not null,
CretTm date not null,
PartCD varchar2(2) not null
) partition by list (partcd) automatic (
partition pBJ values ('BJ'),
partition pCD values ('CD'),
partition pGZ values ('GZ'),
partition pSH values ('SH')
);
```
如果这个自动分片的分区名不符合你的命名规则可以通过DDL语句去修改变更
```sql
alter table enmotech rename partition SYS_P290 to pKM;
```
对于已有的分区定义,可以通过关键字 automatic 和 manual 来进行分区定义的调整
```sql
alter table PEOPLE set partitioning automatic;
alter table PEOPLE set partitioning manual;
```
### 间隔分区

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB