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

12 KiB
Raw Blame History

title, date, author
title date author
Oracle 2021-03-23 10:30:31 文永达

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

安装,首先执行

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)

安装

rpm -ivh compat-libcap1-1.10-7.el7.x86_64.rpm

再次执行

yum install oracle-database-preinstall-19c-1.0-3.el7.x86_64.rpm 

安装数据库

yum install oracle-database-ee-19c-1.0-1.x86_64.rpm

如果发生错误

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 

解决办法

 yum -y install /lib64/libnsl.so.1 

再次执行安装

# 需要先删除 /opt/oracle/*
rm -rf /opt/oracle/*
# 再次执行安装 需要加上 --force
rpm -ivh oracle-database-ee-19c-1.0-1.x86_64.rpm --force 

配置数据库

/etc/init.d/oracledb_ORCLCDB-19c configure

过程较长,等待即可

可能会JDK报错

yum install libnsl

配置号后设置当前用户下的环境变量

vi ~/.bashrc
# 追加oracle环境变量信息
export ORACLE_HOME=/opt/oracle/product/19c/dbhome_1 
export ORACLE_SID=ORCLCDBexport 
PATH=$ORACLE_HOME/bin:$PATH 

# 保存退出,执行
source ~/.bashrc

验证安装是否正确

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

1.1.1.2 Docker方式

安装Docker

sudo wget -qO- https://get.docker.com/ | bash
docker --version
systemctl start docker
systemctl status docker
systemctl enable docker

拉取镜像 quay.io/maksymbilenko/oracle-12c

docker pull quay.io/maksymbilenko/oracle-12c

如果有本地镜像则使用

docker build -t quay.io/maksymbilenko/oracle-12c .

构建容器

# 首先创建本地目录
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

安装完成

数据库连接信息

hostname: localhost
port: 1521
sid: xe
service name: xe
username: system
password: oracle

进入容器修改账号密码设置

# 查看所有容器信息
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

2.1.2 设置代码模板

工具栏 -> 工具 -> 首选项 -> 代码编辑器 -> 代码模板

image-20221017112825105

2.1.3 同时打开多个表

工具栏 -> 工具 -> 首选项 -> 数据库 ->对象查看器

image-20221020141231505

3.1 SQL PLUS

3.1.1 解决控制台输错命令删除

使用Ctrl + backspace代替backspace

3.1.2 登录

# 以oracle账号登录
su oracle
$ORACLE_HOME/bin/sqlplus / as sysdba

4.1 语法

4.1.1 新建表空间

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 解除占用

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 修改表

-- 表重命名
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 内连接

合并具有同一列的两个以上的表的行,结果集中不包含一个表与另一个表不匹配的行

语法:

SELECT 字段列表
FROM A表 INNER JOIN B表
ON 关联条件
WHERE 条件;

类似于:

方式一
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 左外连接

语法:

SELECT 字段列表
FROM A表 LEFT JOIN B表
ON 关联条件
WHERE 条件;

类似于:

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 右外连接

语法:

SELECT 字段列表
FROM A表 RIGHT JOIN B表
ON 关联条件
WHERE 条件;

类似于:

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的使用

·语法:

SELECT column,... FROM table1
UNION [ALL]
SELECT column,... FROM table2

UNION 操作符返回两个查询的结果集的并集,去除重复记录。

UNION ALL操作符返回两个查询的结果集的并集。对于两个结果集的重复部分不去重。