摘要:最近了解了一下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数据库的关系如下:

oracle数据库学习1.png

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
  1. 查询正在运行的实例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_app3cdb

3.查看电脑上所有实例的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:N

4.查看当前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

本文用的模板连接如下:

模板.zip

配置监听器

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"

oracle数据库学习2.png

服务名和数据库的对应关系如下:

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语句

  1. 不使用密码登录oracle

    /* 本地最高权限登录oracle */
    [oracle@apps scripts]$ sqlplus sys as sysdba
  2. 调整sqlplus命令输出格式

    /* 调整输出格式 调整后输出就会变得像一张整齐的表格*/
    /* LINESIZE 调整最大列宽*/
    /* PAGESIZE  调整最大行数*/
    SQL> SET LINESIZE 500
    SQL> SET PAGESIZE 100
  3. 查询数据文件存放位置

    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
    
  4. 查询控制文件存放位置

    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
  5. 查询实例SID

    /* 如果在PDB中查询到的是CDB数据库的实例SID,对应rsp文件中的sid */
    SQL> select instance_name from v$instance;
    
    INSTANCE_NAME
    ----------------
    app3cdb
  6. 查询当前连接的数据库的全局名字

    /* 比如在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
  7. 查询当前连接的数据库的全局名字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
  8. 查询当前连接的数据库
    备注:用于显示你当前会话(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
  9. 启动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
  10. 关闭数据库

    关闭数据库的时候,应该首先使用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
  11. 查看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> 
  12. 创建用户

    -- 创建一个名为 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"后缀结尾。

文章目录