目录

一、前言

二、部署

1. 安装依赖

2.创建相应的组和用户

3.创建文件夹并修改权限

4.修改内核参数

5.配置用户限制

6.配置PAM限制

7.配置官方仓库

配置仓库

导入GPG密钥

更新缓存

8.安装oracle

9.配置oracle数据库

10.启动Oracle服务

11.设置oracle的环境变量

12.验证安装

13.获取连接信息

14.使用sqlplus连接

三、使用

1.基础概念

(1).数据块

(2). 区

(3). 段

(4). 表空间:

(5). 数据库

2. 语法

(1).DDL

(2).DML

(3).DQL

(4).DCL

3. 查询示例

(1). 创建表

(2). 生成插入数据

(3).提交

(4). 查询

简单查询

复杂查询

排序

聚合函数

分组


一、前言

Oracle数据库是由甲骨文公司开发的一款旗舰级关系型数据库管理系统。它以其卓越的性能、坚如磐石的可靠性、丰富的企业级功能和对大规模关键业务负载的支持而闻名,长期占据着数据库市场的主导地位。

Oracle数据库的核心特点:

1. 高性能与高并发:

采用先进的多版本并发控制(MVCC)机制,实现读写操作无阻塞,确保高并发场景下的卓越性能。配备智能的基于成本优化器(CBO),可自动为复杂SQL查询选择最优执行计划。通过精细的共享内存区(SGA)和程序全局区(PGA)管理,有效缓存数据并优化会话内存使用,显著降低物理I/O开销。


2. 企业级高可用与容灾:

RAC(实时应用集群):支持多节点同时访问同一数据库,实现故障自动切换和性能线性扩展,保障业务持续稳定运行。
Data Guard(数据卫士):通过物理/逻辑备库机制,有效实现数据保护、故障转移及读写分离。
闪回技术:提供从行级、表级到数据库级的精确时间点恢复功能,可快速修复人为操作失误。

3. 卓越的可扩展性:

支持在单机环境下实现强劲的垂直扩展能力。 采用RAC和表分区技术,可灵活进行水平扩展,轻松支撑TB至PB级别的海量数据处理。


4. 全面的安全性:

提供高级数据安全防护,包括透明数据加密、精细化访问控制和虚拟私有数据库,支持行列级别的精准权限管理。
配备完善的审计追踪功能,确保全面符合各类合规性标准。


5. 多租户架构:

自Oracle 12c版本起,引入了容器数据库架构,通过集中管理多个可插拔数据库,显著简化了数据库集群的运维工作,包括补丁更新和资源管理。这一创新成为实现数据库云化的重要基础。


6. 强大的PL/SQL:

PL/SQL作为过程化编程语言,支持开发存储过程、函数、触发器和包等数据库对象,将业务逻辑高效封装在数据库层面,显著提升执行效率。

接下来是Oracle 数据库 21c的部署过程 

二、部署

环境准备:

Red Hat Enterprise Linux 8版本,内存至少2GB,磁盘空间至少10GB可用, swap空间至少2GB

1. 安装依赖

Oracle数据库依赖很多的系统库和工具,需要安装 包括编译(gcc、gcc-c++)、异步I/O(libaio)等功能 的依赖包

dnf install -y bc binutils gcc gcc-c++ elfutils-libelf \
elfutils-libelf-devel fontconfig-devel glibc glibc-devel \
 ksh libaio libaio-devel libXrender libX11 libXau libXi \ 
libXtst libgcc libstdc++ libstdc++-devel libxcb make net-tools \
 nfs-utils smartmontools sysstat libnsl

2.创建相应的组和用户

为了实现权限的精细化管理,避免Oracle的权限过大。

需要创建两个组:

oinstall: 软件安装组,拥有安装目录权限

dba: 数据库管理员组,拥有数据库的管理权限

groupadd -g 54321 oinstall
groupadd -g 54322 dba
useradd -u 54321 -g oinstall -G dba oracle
echo "123" | passwd oracle --stdin

3.创建文件夹并修改权限

创建两个文件夹用于存放软件的安装位置

/opt/oracle: Oracle软件安装目录

/opt/oraInventory: Oracle的安装清单目录

记得修改其属主为刚刚创建的oracle用户,属组为oinstall

mkdir -p /opt/oracle
mkdir -p /opt/oraInventory
chown -R oracle:oinstall /opt/oracle /opt/oraInventory

4.修改内核参数

Oracle是内存密集型应用,需要更大的共享内存和更多的系统资源。需要向/etc/sysctl.conf添加参数,修改系统配置以满足要求

vim /etc/sysctl.conf
# Oracle database related
fs.file-max = 6815744
kernel.sem = 250 32000 100 128
kernel.shmmni = 4096
kernel.shmall = 1073741824
kernel.shmmax = 4398046511104
kernel.panic_on_oops = 1
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.default.rp_filter = 2
fs.aio-max-nr = 1048576
net.ipv4.ip_local_port_range = 9000 65500

使用sysctl -p应用配置

sysctl -p 

字段详细:

  • kernel.shmmax:定义单个共享内存段的最大尺寸

  • kernel.shmall:系统可分配的共享内存总页数

  • net.core.rmem_max:接收缓冲区大小,影响网络性能

  • net.ipv4.ip_local_port_range:本地端口范围

  • fs.file-max :增加系统最大文件打开数

5.配置用户限制

调整资源限制,防止oracle用户将系统资源耗尽

vim /etc/security/limits.conf
# Oracle Recommended Limits
oracle   soft   nofile    1024
oracle   hard   nofile    65536
oracle   soft   nproc    16384
oracle   hard   nproc    16384
oracle   soft   stack    10240
oracle   hard   stack    32768
oracle   hard   memlock    134217728
oracle   soft   memlock    134217728

字段含义

hard:硬限制
soft:软限制

nofile:每个进程可打开的文件数
nproc:最大进程数
stack:堆栈大小
memlock:允许Oracle锁定内存,避免被交换到swap
 

6.配置PAM限制

PAM确保用户登录时应用限制配置,这是让limits.conf的配置在用户登录时生效

vim /etc/pam.d/login
# Oracle database related
session    required     pam_limits.so

7.配置官方仓库

oracle官方的软件在一个仓库内,部署源后,可直接使用dnf下载

配置仓库

vim /etc/yum.repos.d/oracle-linux-ol8.repo
[ol8_appstream]
name=Oracle Linux 8 Application Stream (x86_64)
baseurl=https://yum.oracle.com/repo/OracleLinux/OL8/appstream/x86_64
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1

[ol8_baseos_latest]
name=Oracle Linux 8 BaseOS Latest (x86_64)
baseurl=https://yum.oracle.com/repo/OracleLinux/OL8/baseos/latest/x86_64
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1

导入GPG密钥

wget -O /etc/pki/rpm-gpg/RPM-GPG-KEY-oracle https://yum.oracle.com/RPM-GPG-KEY-oracle-ol8

更新缓存

dnf makecache

8.安装oracle

使用dnf -y install oracle-database-xe-21c-1.0-1.ol8.x86_64.rpm安装

dnf -y install oracle-database-xe-21c-1.0-1.ol8.x86_64.rpm

等待安装完成

9.配置oracle数据库

执行下面的命令,oracle会为你创建初始的system表空间、sysaux表空间等

/etc/init.d/oracle-xe-21c configure

接下来需要交互式输入Oracle数据库密码(为SYS、SYSTEM等用户设置密码),这里将密码设置为123

而后可能需要较长的时间加载

10.启动Oracle服务

启动数据库实例和监听器和相关后台进程,确保所有组件正常运行

systemctl enable oracle-xe-21c.service --now
systemctl status oracle-xe-21c

11.设置oracle的环境变量

切换到先前创建的oracle用户

su - oracle
vim ~/.bash_profile

在其中添加

# Oracle Environment Related
export ORACLE_HOME=/opt/oracle/product/21c/dbhomeXE
export ORACLE_SID=XE
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

这些参数包含Oracle的安装位置(ORACLE_HOME)、找到sqlplus工具(PATH)、要连接的数据库实例(ORACLE_SID)、库文件位置(LD_LIBRARY_PATH)、字符集(NLS_LANG)

使用下面的命令

source ~/.bash_profile

使配置立即生效

12.验证安装

通过连接数据库,确保功能和组件正常无差错

在oracle用户,连接到数据库

sqlplus / as sysdba

#在其中输入这些命令查看数据库状态
select name,open_mode FROM v$database
select * from v$version;

# 退出sql plus
exit;

13.获取连接信息

需要确认监听器是否正常工作

lsnrctl status

查看数据库信息,为客户端工具提供正确的连接参数

echo "Oracle Home: $ORACLE_HOME"
echo "Oracle SID: $ORACLE_SID"

14.使用sqlplus连接

sqlplus是官方的命令行工具,可以在没gui的情况下管理数据库,运行sql脚本。

登录数据库

sqlplus system/123@localhost:1521
用户名/密码@数据库ip:端口号(默认1521)

15.使用navicat连接

sqlplus 作为命令行工具,使用起来多少还有些不便,查看也不是很直观。可以尝试使用图形化工具:(这里使用navicat为例)

新建连接-> 选择oracle,像图示那样将刚刚查到的密码输入进去

oracle语法

测试连通性,然后确定保存

然后就可以使用图形化工具进行配置了

三、使用

1.基础概念

数据库 (Database) 由多个 表空间 (Tablespace) 组成。

表空间 包含多个 段 (Segment)

 由多个 区 (Extent) 组成。

 由多个连续的 数据块 (Data Block) 组成。

(1).数据块

数据库是Oracle中可分配,可读写的最小存储单位。它是Oracle数据文件在内存中的映射单位。

块大小在创建数据库时指定(通常是 8KB),并且对于一个数据库一般是是统一的。

所有数据行的增、删、改、查操作,最终都发生在数据块级别。

(2). 区

区是段中分配空间的基本单位,由一系列连续的数据块组成。当一个段被创建时,它至少包括一个区。当段增长需要更多空间时,Oracle会为它分配新的区(一次性分配一个区比一次次分配单个块更高效)。

(3). 段

段是占用磁盘空间的特定数据库对象。当一个逻辑对象(如表)被创建时,oracle就会为其分配一个段。有以下类型

表段

存储普通表的数据

索引段

存放索引的数据

回滚段/撤销段

在UNDO表空间中,用于事务回滚和一致性读

临时段

在TEMP表空间中,用于临时操作

(4). 表空间:

数据库在逻辑上被划分为了数个表空间。它是段(如表、索引)的逻辑存储容器。每个数据库在创建时至少有一个表空间(通常是SYSTEM)。

可以将不同的表空间创建在不同的磁盘上,以实现I/O负载均衡,控制磁盘的空间分配

也可以为不同的用户指定默认的表空间,并限制各个用户使用的空间大小

可以将不同类型的数据放入不同的表空间中,便于管理(如业务数据、业务数据、临时数据等)

常见表空间

用户名

描述

SYSTEM

存放 Oracle 系统内部的数据字典和元数据。

SYSAUX

SYSTEM的辅助表空间,存放一些其他Oracle特性的元数据

TEMP

存放临时数据

UNDO

存放回滚数据

USERS

用户的默认表空间,存放用户创建的普通数据

(5). 数据库

数据库是oracle中最大的逻辑单元,一个Oracle数据库就是一个完整的、自包含的数据集合

2. 语法

(1).DDL

  • create
  • drop
  • (2).DML

  • insert
  • update
  • delete
  • (3).DQL

  • select
  • (4).DCL

  • grant
  • revoke

3. 查询示例

(1). 创建表

创建学生表

CREATE TABLE students (
    student_id NUMBER PRIMARY KEY,
    name VARCHAR2(50) NOT NULL,
    gender CHAR(1) CHECK (gender IN ('M', 'F')),
    birth_date DATE,
    email VARCHAR2(100),
    enrollment_year NUMBER(4),
    major VARCHAR2(50),
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

创建课程表

CREATE TABLE courses (
    course_id NUMBER PRIMARY KEY,
    course_name VARCHAR2(100) NOT NULL,
    credit NUMBER(2,1) DEFAULT 1.0,
    course_type VARCHAR2(20) CHECK (course_type IN ('必修', '选修', '实践')),
    teacher VARCHAR2(50),
    max_students NUMBER DEFAULT 50
);

创建选课关系表

CREATE TABLE student_courses (
    student_id NUMBER,
    course_id NUMBER,
    score NUMBER(4,1) CHECK (score BETWEEN 0 AND 100),
    enroll_date DATE DEFAULT SYSDATE,
    semester VARCHAR2(20),
    PRIMARY KEY (student_id, course_id),
    FOREIGN KEY (student_id) REFERENCES students(student_id),
    FOREIGN KEY (course_id) REFERENCES courses(course_id)
);

(2). 生成插入数据

学生表

INSERT INTO students VALUES (1, '张三', 'M', DATE '2000-01-15', 'zhangsan@email.com', 2020, '计算机科学', SYSTIMESTAMP);
INSERT INTO students VALUES (2, '李四', 'F', DATE '1999-08-20', 'lisi@email.com', 2019, '软件工程', SYSTIMESTAMP);
INSERT INTO students VALUES (3, '王五', 'M', DATE '2001-03-10', 'wangwu@email.com', 2021, '数据科学', SYSTIMESTAMP);
INSERT INTO students VALUES (4, '赵六', 'F', DATE '2000-11-05', 'zhaoliu@email.com', 2020, '计算机科学', SYSTIMESTAMP);
INSERT INTO students VALUES (5, '钱七', 'M', DATE '2002-07-30', 'qianqi@email.com', 2022, '软件工程', SYSTIMESTAMP);

课程表

INSERT INTO courses VALUES (101, '数据库原理', 3.0, '必修', '张教授', 60);
INSERT INTO courses VALUES (102, 'Java编程', 4.0, '必修', '李教授', 50);
INSERT INTO courses VALUES (103, '高等数学', 5.0, '必修', '王教授', 100);
INSERT INTO courses VALUES (104, 'Web开发', 3.0, '选修', '陈教授', 40);
INSERT INTO courses VALUES (105, '数据结构', 4.0, '必修', '刘教授', 55);

选课关系表

INSERT INTO student_courses VALUES (1, 101, 85.5, DATE '2023-09-01', '2023-秋季');
INSERT INTO student_courses VALUES (1, 102, 92.0, DATE '2023-09-01', '2023-秋季');
INSERT INTO student_courses VALUES (1, 104, 88.0, DATE '2023-09-01', '2023-秋季');
INSERT INTO student_courses VALUES (2, 101, 78.0, DATE '2023-09-01', '2023-秋季');
INSERT INTO student_courses VALUES (2, 103, 88.5, DATE '2023-09-01', '2023-秋季');
INSERT INTO student_courses VALUES (3, 102, 95.0, DATE '2023-09-01', '2023-秋季');
INSERT INTO student_courses VALUES (3, 105, 82.5, DATE '2023-09-01', '2023-秋季');
INSERT INTO student_courses VALUES (4, 101, 91.0, DATE '2023-09-01', '2023-秋季');
INSERT INTO student_courses VALUES (4, 102, 79.5, DATE '2023-09-01', '2023-秋季');
INSERT INTO student_courses VALUES (4, 104, 85.0, DATE '2023-09-01', '2023-秋季');
INSERT INTO student_courses VALUES (5, 103, 76.0, DATE '2023-09-01', '2023-秋季');
INSERT INTO student_courses VALUES (5, 105, 89.0, DATE '2023-09-01', '2023-秋季');

(3).提交

Oracle需要手动提交

COMMIT;

(4). 查询

简单查询
1
SELECT * FROM students;

查询所有学生信息
2
SELECT student_id, name, major FROM students;

查询学生表的id列,姓名,专业
3
SELECT student_id AS "学号", name AS "姓名", major AS "专业" FROM students;

查询学生表的id列,姓名,专业,并为其定义别名

1.

2.

3.

复杂查询
1
SELECT * FROM students WHERE major = '计算机科学';
筛选计算机科学专业的学生
2
SELECT * FROM students 
WHERE major = '计算机科学' AND enrollment_year = 2020;
筛选计算机科学专业且入学时间是2020年的学生
3
SELECT * FROM students WHERE name LIKE '张%';
查找张同学
4
SELECT * FROM students WHERE enrollment_year BETWEEN 2020 AND 2021;
查询入学时间在2020年到2021年的学生
5
SELECT * FROM students WHERE major IN ('计算机科学', '软件工程');
查找计算机科学和软件工程专业的学生

1.

2.

3.

4.

5.

排序
1
SELECT student_id, name, enrollment_year, major
FROM students
ORDER BY enrollment_year DESC, name ASC;
按照入学年份降序,姓名升序,查看学生的id、姓名、入学年份和专业

聚合函数
1
SELECT COUNT(*) AS "总学生数" FROM students;
统计学生总数
2
SELECT COUNT(DISTINCT major) AS "专业数量" FROM students;
统计专业数量
3
SELECT AVG(score) AS "平均分", MAX(score) AS "最高分", MIN(score) AS "最低分"
FROM student_courses;

获得每门课成绩的平均分、最高分、最低分

1.

2.

3.

分组
1
SELECT major, COUNT(*) AS "学生人数" FROM students
GROUP BY major;
查找各个专业的人数
2
SELECT course_id, 
       AVG(score) AS "平均分",
       COUNT(*) AS "选课人数"
FROM student_courses GROUP BY course_id;
按课程统计平均分
3
SELECT course_id, 
       AVG(score) AS "平均分",
       COUNT(*) AS "选课人数"
FROM student_courses GROUP BY course_id HAVING AVG(score) > 85;
查询平均分超过85分的课程
4
SELECT course_id, COUNT(*) AS "选课人数"
FROM student_courses GROUP BY course_id HAVING COUNT(*) > 2;
查询选课人数超过两人的课程

1.

2.

3.

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐