diff --git a/source/_posts/Linux.md b/source/_posts/Linux.md index 0c8a25e..2002ee9 100644 --- a/source/_posts/Linux.md +++ b/source/_posts/Linux.md @@ -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 /) + +1,boot 分区(因为boot是引导启动的分区,所以分区的时候必须先分boot,通常设置大小为200M 空间足够300 - 500M) + +2,swap(缓存分区,通常设置大小为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] +``` + diff --git a/source/_posts/Linux/image-20240227123457743.png b/source/_posts/Linux/image-20240227123457743.png new file mode 100644 index 0000000..55c6662 Binary files /dev/null and b/source/_posts/Linux/image-20240227123457743.png differ diff --git a/source/_posts/Linux/image-20240227123607562.png b/source/_posts/Linux/image-20240227123607562.png new file mode 100644 index 0000000..ab25cc6 Binary files /dev/null and b/source/_posts/Linux/image-20240227123607562.png differ diff --git a/source/_posts/Linux/image-20240227123637191.png b/source/_posts/Linux/image-20240227123637191.png new file mode 100644 index 0000000..eea1854 Binary files /dev/null and b/source/_posts/Linux/image-20240227123637191.png differ diff --git a/source/_posts/Oracle.md b/source/_posts/Oracle.md index febb31c..feabd68 100644 --- a/source/_posts/Oracle.md +++ b/source/_posts/Oracle.md @@ -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.(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.(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.(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时,返回它本身的值。 \ No newline at end of file +以上语句中,使用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; +``` + +### 间隔分区 + diff --git a/source/_posts/Oracle/image-20240226135109613.png b/source/_posts/Oracle/image-20240226135109613.png new file mode 100644 index 0000000..4054bfe Binary files /dev/null and b/source/_posts/Oracle/image-20240226135109613.png differ diff --git a/source/_posts/Oracle/image-20240229151409259.png b/source/_posts/Oracle/image-20240229151409259.png new file mode 100644 index 0000000..696eee2 Binary files /dev/null and b/source/_posts/Oracle/image-20240229151409259.png differ