oracle数据库学习
摘要:最近了解了一下oracle数据库,记录一下学习过程
数据库特征
windows
端口号: 1521
进程特征如下:
linux
端口号: 1521
进程特征如下:
[oracle@apps scripts]$ ps -ef | grep pmon
oracle 3705 1 0 20:59 ? 00:00:00 ora_pmon_EBSCDB
oracle 25737 1 0 22:14 ? 00:00:00 ora_pmon_app3cdb物理文件特征如下:
/* oracle数据库 19.0.0版本 */
control01.ctl
sysaux01.dbf
temp01.dbf
sys1.dbf
system12.dbf
undotbs001.dbf
/* oracle数据库11g版本 */
system01.dbf
sysaux01.dbf
undotbs01.dbf
users01.dbf
tbsp_1.dbf
control01.ctl基础概念
数据库:
不同于mysql中的库的概念,oracle中的一个数据库可以简单理解为一份文件。一个操作系统里面可以有很多个数据库。
实例:
前面说了,一个数据库可以简单理解为一份文件,文件不能直接被用户访问。因此,oracle为每份文件创建一个实例来让用户对这些文件进行访问。在一般情况下,数据库名和实例SID是一对一的关系,oracle会为每个数据库创造一个对应的实例。但如果在oracle并行服务器架构(即oracle实时应用集群)中,数据库名和实例SID是一对多的关系。
用户:
每个实例都有所属的用户,不同实例的用户彼此互相隔离。一个用户可以有很多一个表空间。
表空间:
每个实例可以创建多个表空间,不同实例的表空间彼此互相隔离。一个表空间可以分给很多个用户。
表:
每个表空间下面存放很多表。不同的用户在同一表空间下面可以拥有相同名字的表。
CDB(Container Database): Oracle Database 19c后出现的新玩意。CDB下面有很多PDB,PDB拿来存放数据。类似于虚拟机的概念,CDB是宿主机,PDB是客户机。
PDB(Pluggable Database):Oracle Database 19c后出现的新玩意。真正拿来存放的数据的玩意。PDB没有实例,操作系统只会为CDB创建一个实例。
CDB数据库和PDB数据库的关系如下:

CDB本身只是个概念,其由CDB$ROOT、PDB$SEED、很多个用户自定义存放数据的PDB 三个部分组成。
常用命令
1.导入oracle环境变量
export ORACLE_SID=EBSCDB
export ORACLE_HOME=/u01/install/APPS/19.0.0
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH备注:有些反弹shell的环境使用sqlplus,会提示 ,这个时候就需要导入环境变量了。
[oracle@apps scripts]$ sqlplus
-bash: sqlplus: command not found- 查询正在运行的实例SID(也叫:ORACLE_SID)
/* "ora_pmon_"后面的就是实例的SID。本例子中SID是"EBSCDB"、"app3cdb" */
[oracle@apps scripts]$ ps -ef | grep pmon
oracle 3705 1 0 20:59 ? 00:00:00 ora_pmon_EBSCDB
oracle 25737 1 0 22:14 ? 00:00:00 ora_pmon_app3cdb3.查看电脑上所有实例的SID和ORACLE_HOME
/* 这台电脑上有ebscdb、ebsdb、app3cdb三个实例的SID */
/* ORACLE_HOME为 u01/install/APPS/19.0.0 */
[root@apps ~]# cat /etc/oratab
ebscdb:/u01/install/APPS/19.0.0:N
ebsdb:/u01/install/APPS/19.0.0:N
app3cdb:/u01/install/APPS/19.0.0:N4.查看当前oracle数据库是否是集群数据库
/* 如果有结果,代表该数据库是一个集群数据库 */
ps -ef | grep crsd.bin | grep -v grep配置数据库
创建新数据库
在linux下面可以oracle提供的模板创建新的实例。
/* dbca.rsp 为oracle数据库提供的模板 */
cp -r -a /u01/install/APPS/19.0.0/assistants/dbca/dbca.rsp /u01/install/APPS/19.0.0/assistants/dbca/templates/my_db_creation.rsp
/* 根据需求修改 my_db_creation.rsp 文件中的参数后,运行下面即可创建 */
dbca -silent -createDatabase -responseFile /u01/install/APPS/19.0.0/assistants/dbca/templates/my_db_creation.rsp本文用的模板连接如下:
配置监听器
listener.ora:配置监听器监听具体哪个端口以接收客户端请求。
sqlnet.ora:配置监听器接收到请求过后,这个请求需要经过哪些规则检查,才能被传递到后续。
两者的关系如下:
1. 客户端查找 tnsnames.ora 文件获取到服务别名对应的服务器IP和端口。
2. 连接请求到达服务器的IP和端口。
3. 服务器上的监听器进程(由listener.ora配置)接收到这个请求。
4. 监听器检查自己是否在为请求的服务(Service Name)提供服务。
5. 服务器端的 sqlnet.ora 文件可能会对这个连接进行规则检查(如认证服务)。
6. 如果一切合法,监听器会将这个连接请求“交接”给一个新的专用服务器进程(Dedicated Server Process),然后监听器就回去继续等待下一个连接请求了。它本身不处理用户的SQL。listener.ora 注意点如下:
# HOST一般为 0.0.0.0 ,监听本地所有接口地址
# PORT默认为1512,监听1521端口
EBSCDB =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))
)
)sqlnet.ora 注意点如下:
如果配置不对,容易出现 ORA-12547:TNS:lost contact。
# 如果没有这个参数或者设置为 NO,监听器会接受来自任何IP地址/主机的连接请求
# 如果设置成YES,只有 tcp.invited_nodes 中的ip才能连接到数据库。
tcp.validnode_checking = YES
# 只有下列ip才被允许连接到数据库
tcp.invited_nodes = ( apps.example.com, 192.168.1.100 )连接数据库
使用 lsnrctl status 命令查询监听器状态。
[oracle@apps scripts]$ lsnrctl status
LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 03-NOV-2025 09:34:07
Copyright (c) 1991, 2022, Oracle. All rights reserved.
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias EBSCDB
Version TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date 03-NOV-2025 08:47:40
Uptime 0 days 0 hr. 46 min. 26 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/install/APPS/19.0.0/network/admin/listener.ora
Listener Log File /u01/install/APPS/19.0.0/log/diag/tnslsnr/apps/ebscdb/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
Services Summary...
Service "2809223196ec2af8e053a740d20a4db6" has 1 instance(s).
Instance "EBSCDB", status READY, has 1 handler(s) for this service...
Service "EBSCDB" has 1 instance(s).
Instance "EBSCDB", status READY, has 1 handler(s) for this service...
Service "EBSCDBXDB" has 1 instance(s).
Instance "EBSCDB", status READY, has 1 handler(s) for this service...
Service "EBSDB_ebs_patch" has 1 instance(s).
Instance "EBSCDB", status READY, has 1 handler(s) for this service...
Service "ebs_EBSDB" has 1 instance(s).
Instance "EBSCDB", status READY, has 1 handler(s) for this service...
Service "ebsdb" has 1 instance(s).
Instance "EBSCDB", status READY, has 1 handler(s) for this service...
The command completed successfully
[oracle@apps scripts]$ 其中的navicat中的服务名对应的就是上面lsnrctl status输出中的Service "ebs_EBSDB"。

服务名和数据库的对应关系如下:
CON_ID为1代表该服务名是连接到
CDB$ROOT数据库的。
CON_ID为2代表该服务名是连接到PDB$SEED数据库的。
CON_ID为3代表该服务名是连接到PDB数据库的。
在sqlplus中可以使用下列命令查询服务名和数据库的对应关系:
SQL> SET LINESIZE 500
SQL> SELECT s.name AS service_name, p.name AS pdb_name, s.con_id FROM v$services s LEFT JOIN v$pdbs p ON s.con_id = p.con_id ORDER BY s.con_id, s.name;
SERVICE_NAME PDB_NAME CON_ID
EBSCDB 1
EBSCDBXDB 1
SYS$BACKGROUND 1
SYS$USERS 1
EBSDB_ebs_patch EBSDB 3
ebs_EBSDB EBSDB 3
ebsdb EBSDB 3
常用sql语句
不使用密码登录oracle
/* 本地最高权限登录oracle */ [oracle@apps scripts]$ sqlplus sys as sysdba调整sqlplus命令输出格式
/* 调整输出格式 调整后输出就会变得像一张整齐的表格*/ /* LINESIZE 调整最大列宽*/ /* PAGESIZE 调整最大行数*/ SQL> SET LINESIZE 500 SQL> SET PAGESIZE 100查询数据文件存放位置
SQL> select name from v$datafile; NAME -------------------------------------------------------------------------------- /u01/install/APPS/19.0.0/test/oradata/APP3/system01.dbf /u01/install/APPS/19.0.0/test/oradata/APP3/sysaux01.dbf /u01/install/APPS/19.0.0/test/oradata/APP3/undotbs01.dbf /u01/install/APPS/19.0.0/test/oradata/APP3/pdbseed/system01.dbf查询控制文件存放位置
SQL> select name from v$controlfile; NAME -------------------------------------------------------------------------------- /u01/install/APPS/19.0.0/test/oradata/APP3/control01.ctl /u01/install/APPS/19.0.0/test/flash_recovery_area/APP3/control02.ctl查询实例SID
/* 如果在PDB中查询到的是CDB数据库的实例SID,对应rsp文件中的sid */ SQL> select instance_name from v$instance; INSTANCE_NAME ---------------- app3cdb查询当前连接的数据库的全局名字
/* 比如在CDB中查询到的是CDB数据库的名字,对应rsp文件中的gdbName */ /* 比如在PDB中查询到的是PDB数据库的名字,对应rsp文件中的pdbName */ [oracle@apps scripts]$ export ORACLE_SID=app3cdb [oracle@apps scripts]$ sqlplus / as sysdba SQL> SELECT * FROM global_name; GLOBAL_NAME -------------------------------------------------------------------------------- APP3 [oracle@apps scripts]$ export ORACLE_SID=app3cdb [oracle@apps scripts]$ sqlplus / as sysdba SQL> alter session set container=app3pdb; SQL> SELECT * FROM global_name; GLOBAL_NAME -------------------------------------------------------------------------------- APP3PDB查询当前连接的数据库的全局名字2
备注:这个命令没啥用。因为整个CDB共享一个控制文件,v$database读取此文件,所以不管在 CDB 和 PDB 中执行结果是一样的。SQL> select name from v$database; NAME --------- APP3 SQL> alter session set container=app3pdb; SQL> select name from v$database; NAME -------------------------------------------------------------------------------- APP3查询当前连接的数据库
备注:用于显示你当前会话(session)所连接到的容器 (Container) 的名称。/* 连接到cdb数据库,默认连接到CDB$ROOT */ [oracle@apps scripts]$ export ORACLE_SID=app3cdb [oracle@apps scripts]$ sqlplus / as sysdba SQL> show con_name; CON_NAME ------------------------------ CDB$ROOT [oracle@apps scripts]$ export ORACLE_SID=app3cdb [oracle@apps scripts]$ sqlplus / as sysdba SQL> alter session set container=app3pdb; SQL> show con_name; GLOBAL_NAME -------------------------------------------------------------------------------- APP3PDB启动CDB数据库和PDB数据库
备注:CDB数据库中有很多PDB数据库。启动CDB数据库后,PDB数据库并不会启动,还需要单独启动PDB数据库。[oracle@apps scripts]$ export ORACLE_SID=app3cdb [oracle@apps scripts]$ sqlplus / as sysdba /* 先启动名字叫做 app3cdb 的cdb数据库 */ SQL> startup /* 然后切换会话,启动app3cdb中的app3pdb数据库 */ SQL> alter session set container=app3pdb SQL> startup关闭数据库
关闭数据库的时候,应该首先使用shutdown normal 、shutdown immediate。如果都关闭失败了才应该考虑使用shutdown abort。
因为shutdown abort有概率会导致文件受损,在启动数据库的时候启动不起来。备注:渗透测试环境下直接使用 shutdown immediate 关闭数据库即可,简单干脆。
/* 正常关闭数据库app3cdb */ [oracle@apps scripts]$ export ORACLE_SID=app3cdb [oracle@apps scripts]$ sqlplus / as sysdba [oracle@apps scripts]$ shutdown normal /* 立即关闭数据库app3cdb */ [oracle@apps scripts]$ export ORACLE_SID=app3cdb [oracle@apps scripts]$ sqlplus / as sysdba [oracle@apps scripts]$ shutdown immediate /* 强制关闭数据库app3cdb */ [oracle@apps scripts]$ export ORACLE_SID=app3cdb [oracle@apps scripts]$ sqlplus / as sysdba [oracle@apps scripts]$ shutdown abort查看CDB数据库下面所属的PDB数据库
通过实例sid的方法会默认登录 CDB$ROOT 数据库 。Version 19.18.0.0.0 [oracle@apps scripts]$ export ORACLE_SID=EBSCDB [oracle@apps scripts]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Mon Nov 3 09:58:11 2025 Version 19.18.0.0.0 Copyright (c) 1982, 2022, Oracle. All rights reserved. Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.18.0.0.0 SQL> SET LINESIZE 500; SQL> show con_name; CON_NAME ------------------------------ CDB$ROOT /*查看当前cdb中有哪些pdb数据库*/ SQL> show pdbs; CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 EBSDB READ WRITE NO SQL>创建用户
-- 创建一个名为 C##adminuser 密码为 1234567 的用户 CREATE USER C##adminuser IDENTIFIED BY "1234567"; -- 提示 GRANT failed: password file missing or disabled 运行下面的命令 -- 设置密码文件的位置并且将sys用户的密码设置为1234567a@ ho orapwd file=/u01/install/APPS/19.0.0/dbs/orapwEBSCDB password=1234567a@ force=y -- 授予无限表空间权限 GRANT UNLIMITED TABLESPACE TO C##adminuser; -- 授予 SYSDBA 权限 GRANT SYSDBA TO C##adminuser;
备份文件说明
oracle数据库的备份文件一般以".dmp"后缀结尾。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。