提交
This commit is contained in:
parent
387cc8f279
commit
74898504d5
@ -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分区 (可选)
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
## 查看硬盘空间
|
||||
|
||||
```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]
|
||||
```
|
||||
|
||||
|
||||
BIN
source/_posts/Linux/image-20240227123457743.png
Normal file
BIN
source/_posts/Linux/image-20240227123457743.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 65 KiB |
BIN
source/_posts/Linux/image-20240227123607562.png
Normal file
BIN
source/_posts/Linux/image-20240227123607562.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 63 KiB |
BIN
source/_posts/Linux/image-20240227123637191.png
Normal file
BIN
source/_posts/Linux/image-20240227123637191.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 64 KiB |
@ -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
|
||||
|
||||

|
||||
|
||||
安装帮助文档
|
||||
|
||||
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;
|
||||
```
|
||||
|
||||

|
||||
|
||||
### 修改
|
||||
|
||||
```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;
|
||||
```
|
||||
|
||||
### 间隔分区
|
||||
|
||||
|
||||
BIN
source/_posts/Oracle/image-20240226135109613.png
Normal file
BIN
source/_posts/Oracle/image-20240226135109613.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 15 KiB |
BIN
source/_posts/Oracle/image-20240229151409259.png
Normal file
BIN
source/_posts/Oracle/image-20240229151409259.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 54 KiB |
Loading…
x
Reference in New Issue
Block a user