2022-11-19 01:05:17 +08:00

451 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: Oracle
date: 2021-03-23 10:30:31
author: 文永达
---
# Oracle
## 1.1 安装Oracle 19c
### 1.1.1 Linux下安装
#### 1.1.1.1 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
下载地址
https://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/index.html浏览器搜索-19c
安装,首先执行
```shell
yum install oracle-database-preinstall-19c-1.0-3.el7.x86_64.rpm
```
会提示缺少依赖
可以去RPM源网站下载
http://www.rpmfind.net/linux/rpm2html/search.php?query=compat-libcap1(x86-64)
安装
```shell
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
```
安装数据库
```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
```
配置数据库
```shell
/etc/init.d/oracledb_ORCLCDB-19c configure
```
过程较长,等待即可
可能会JDK报错
```shell
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
# 保存退出,执行
source ~/.bashrc
```
验证安装是否正确
```shell
su oracle
sqlplus / as sysdba
# 提示
SQL*Plus: Release 19.0.0.0.0 - Production on Mon Oct 17 12:25:27 2022
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to an idle instance.
```
启动监听
![image-20221017123327552](http://markdownhexo.oss-cn-hangzhou.aliyuncs.com/img/image-20221017123327552.png)
#### 1.1.1.2 Docker方式
安装Docker
```shell
sudo wget -qO- https://get.docker.com/ | bash
docker --version
systemctl start docker
systemctl status docker
systemctl enable docker
```
拉取镜像 `quay.io/maksymbilenko/oracle-12c`
```shell
docker pull quay.io/maksymbilenko/oracle-12c
```
如果有本地镜像则使用
```shell
docker build -t quay.io/maksymbilenko/oracle-12c .
```
构建容器
```shell
# 首先创建本地目录
mkdir /oracle/data
# 授予权限
chmod -R 777 /oracle/data
docker run --name o12c -d -p 8080:8080 -p 1521:1521 -v /oracle/data:/u01/app/oracle quay.io/maksymbilenko/oracle-12c
# 查看日志
docker logs -f # 字符串ID
```
![image-20221017145702216](http://markdownhexo.oss-cn-hangzhou.aliyuncs.com/img/image-20221017145702216.png)
安装完成
数据库连接信息
```yaml
hostname: localhost
port: 1521
sid: xe
service name: xe
username: system
password: oracle
```
进入容器修改账号密码设置
```shell
# 查看所有容器信息
docker ps -a
docker exec -it [containerID] /bin/bash
# 切换成oracle用户
su oracle
# 进入sqlplus
$ORACLE_HOME/bin/sqlplus / as sysdba
SQL*Plus: Release 12.1.0.2.0 Production on Sun Aug 1 03:15:37 2021
Copyright (c) 1982, 2014, Oracle. All rights reserved.
Connected to:
Oracle Database 12c Standard Edition Release 12.1.0.2.0 - 64bit Production
# 设置密码有效期为无限制
SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
Profile altered.
SQL> alter user SYSTEM account unlock;
User altered.
# 创建一个账号为act_test的用户密码设置为test
SQL> create user act_test identified by test;
User created.
# 为这个用户赋予管理员的权限
SQL> grant dba to act_test;
Grant succeeded.
# ctrl + p + q 退出容器注意不要exit退出防止容器直接关闭了
```
## 2.1 Oracle SQL Developer
### 2.1.1 设置自动提示
工具栏 -> 工具 -> 首选项 -> 代码编辑器 -> 完成设置
![image-20221017111632399](http://markdownhexo.oss-cn-hangzhou.aliyuncs.com/img/image-20221017111632399.png)
### 2.1.2 设置代码模板
工具栏 -> 工具 -> 首选项 -> 代码编辑器 -> 代码模板
![image-20221017112825105](http://markdownhexo.oss-cn-hangzhou.aliyuncs.com/img/image-20221017112825105.png)
### 2.1.3 同时打开多个表
工具栏 -> 工具 -> 首选项 -> 数据库 ->对象查看器
![image-20221020141231505](http://markdownhexo.oss-cn-hangzhou.aliyuncs.com/img/image-20221020141231505.png)
## 3.1 SQL PLUS
### 3.1.1 解决控制台输错命令删除
使用`Ctrl + backspace`代替`backspace`
### 3.1.2 登录
```shell
# 以oracle账号登录
su oracle
$ORACLE_HOME/bin/sqlplus / as sysdba
```
## 4.1 语法
### 4.1.1 新建表空间
```sql
CREATE TABLESPACE ACT_DEV
DATAFILE
'\oracle\data\oradata\xe\FILE_SPECIFICATION1.dbf' SIZE 52428800 AUTOEXTEND ON NEXT 52428800 MAXSIZE 2147483648
EXTENT MANAGEMENT LOCAL;
```
### 4.1.2 解除占用
```sql
select l.session_id,o.owner,o.object_name
from v$locked_object l,dba_objects o
where l.object_id=o.object_id;
SELECT sid, serial#, username, osuser FROM v$session where sid = sid;
alter system kill session 'sid,serial#';
```
### 4.1.3 修改表
```sql
-- 表重命名
ALTER TABLE BOOK
RENAME TO BIND_PHONE_NUMBER;
-- 添加表字段Column
ALTER TABLE BIND_PHONE_NUMBER
ADD (USERNAME VARCHAR2(20) );
-- 修改表字段Column名
ALTER TABLE BIND_PHONE_NUMBER RENAME COLUMN NAME TO APPNAME;
```
### 4.1.4 使用关键字做完表名,列名
使用""形式,如"INDEX"
## 5.1 内连接与外连接
### 5.1.1 内连接
合并具有同一列的两个以上的表的行,结果集中不包含一个表与另一个表不匹配的行
语法:
```sql
SELECT 字段列表
FROM A表 INNER JOIN B表
ON 关联条件
WHERE 条件;
```
类似于:
```sql
方式一
SELECT e.employee_id, e.last_name, e.department_id,
d.department_id, d.location_id
FROM employees e JOIN departments d
ON (e.department_id = d.department_id);
方式二:
SELECT employee_id,department_name
FROM employees e,departments d
WHERE e.`department_id` = d.department_id;
```
这种查询方式它会把所有的符合where条件的字段查询出来。但是有这样一种情况就是两张表的数据有的不存在某种关系。
缺点:如果我们想要把不满足条件的数据也查询出来,内连接就做不到。
于是引入外连接。
### 5.1.2 外连接
查询多表时一般要求中出现:查询所有的数据时,就一定会用到外连接。
两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行,这种连接称为左(或右)外连接。没有匹配的行时,结果表中相应的列为空(NULL)。
#### 5.1.2.1 满外连接
`FULL JOIN`
`LEFT JOIN UNION RIGHT JOIN`
#### 5.1.2.2 左外连接
语法:
```sql
SELECT 字段列表
FROM A表 LEFT JOIN B表
ON 关联条件
WHERE 条件;
```
类似于:
```sql
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
LEFT OUTER JOIN departments d
ON (e.department_id = d.department_id) ;
```
`employees`表中的数据会全部显示出来
#### 5.1.2.3 右外连接
语法:
```sql
SELECT 字段列表
FROM A表 RIGHT JOIN B表
ON 关联条件
WHERE 条件;
```
类似于:
```sql
SELECT e.last_name, e.department_id, d.department_name
FROM employees e
RIGHT OUTER JOIN departments d
ON (e.department_id = d.department_id) ;
```
`departments`表中的数据会全部显示出来
### 5.1.3 UNION的使用
·语法:
```sql
SELECT column,... FROM table1
UNION [ALL]
SELECT column,... FROM table2
```
UNION 操作符返回两个查询的结果集的并集,去除重复记录。
UNION ALL操作符返回两个查询的结果集的并集。对于两个结果集的重复部分不去重。