--- 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.(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 ``` 配置数据库 ```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操作符返回两个查询的结果集的并集。对于两个结果集的重复部分,不去重。