451 lines
12 KiB
Markdown
451 lines
12 KiB
Markdown
---
|
||
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.
|
||
```
|
||
|
||
启动监听
|
||
|
||
|
||

|
||
|
||
#### 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
|
||
```
|
||
|
||
|
||
|
||

|
||
|
||
安装完成
|
||
|
||
数据库连接信息
|
||
|
||
```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 设置自动提示
|
||
|
||
工具栏 -> 工具 -> 首选项 -> 代码编辑器 -> 完成设置
|
||
|
||

|
||
|
||
### 2.1.2 设置代码模板
|
||
|
||
工具栏 -> 工具 -> 首选项 -> 代码编辑器 -> 代码模板
|
||
|
||

|
||
|
||
### 2.1.3 同时打开多个表
|
||
|
||
工具栏 -> 工具 -> 首选项 -> 数据库 ->对象查看器
|
||
|
||

|
||
|
||
|
||
|
||
## 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操作符返回两个查询的结果集的并集。对于两个结果集的重复部分,不去重。
|