数据库:sqlplus命令
客户端连接
安装和部署
参考linux安装oracle创建一个临时的测试型的oracle(注意,这是一个个人镜像,并非完全安全),使用阿里云的按量收费,在需要的时候再开启即可。
- 创建volume:
docker volume create oracle_vol
- 启动实例:
docker run -d -it -p 1521:1521 --name oracle --restart=always --mount source=oracle_vol,target=/home/oracle/app/oracle/oradata registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
- 进入实例执行一些基本配置:
1 | # a. 更改配置(root密码为:helowin) |
最后,开放云服务器上的1521端口,使用客户端测试连接。注意,连接的服务名是helowin
而不是ORCL。
术语信息
- SID和ServiceName
在安装完oracle服务器或者连接服务器的时候先要确认下
- username
- password
SERVICE_NAME
是数据库的服务名,它是一个逻辑标识符,用于唯一标识一个数据库实例。它通常由网络服务监听器(listener)使用来识别数据库实例并提供网络连接。多个数据库实例可以共享同一个服务名,从而允许客户端通过服务名连接到不同的实例ORACLE_SID
(Oracle System Identifier)是数据库实例的唯一标识符。它是一个字符串,用于标识数据库实例的名称。每个数据库实例都有一个唯一的ORACLE_SID
。在连接到数据库实例时,可以使用ORACLE_SID
来指定要连接的实例
简而言之,SERVICE_NAME
是用于网络连接的逻辑标识符,而ORACLE_SID
是用于唯一标识数据库实例的名称。在某些情况下这两个值可能相同。另外,使用客户端连接的时候需要认证填写这两个字段,否则连接服务器的时候会出现如下的一些错误:
1 | ORA-12514: TNS:listener does not currently know of service requested in connect |
那么如何获取service_name, oracle_sid
信息呢?
首先, 进入orcale容器中, 使用命令sqlplus sys as sysdba
登录客户端; 之后就可以使用SQL语句进行环境变量的查询操作:
1 | -- 1. 获取service_name,在输出列VALUE中会列出所有可用的service_name |
后续就可以使用sqlplus和sqlDeveloper进行连接测试了.
- 数据库和示例
数据库: 物理数据,内存,操作系统进程的组合体,它由数据和相关的对象(如表、视图、索引、存储过程等)组成,并在物理介质(如磁盘)上持久化存储。数据库包含了数据的结构和内容,可以由多个用户共享,并通过数据库管理系统(如Oracle数据库)进行管理和访问。获取所有数据库名:
select name from v$database;
实例:实例是指正在内存中运行的数据库的一个副本或一个单独的执行环境。每当Oracle数据库启动时,都会创建一个实例(实例就是数据库的运行环境)。实例由一组后台进程和内存结构组成,用于管理数据库的运行和访问。它负责解析和执行SQL语句,处理用户连接,管理内存和缓冲区,控制并发访问,以及记录和恢复数据。
关系:任意时刻, 一个实例只能与一个数据库关联, 访问一个数据库,同一个数据库可以由多个实例访问(RAC)
数据库实例名用于对外部连接, 在操作系统中要取得与数据库的联系,必须使用数据库实例. 注意, instance_name就是平常说的SID值.
- SID和实例
- Oracle_SID:SID(System Identifier)是指一个唯一标识符,用于标识数据库实例。实例名是与数据库实例相关联的人可读的名称。SID在启动数据库时由实例进程自动生成,并与实例的其他组件(如后台进程和内存结构)进行通信和协调
- INSTANCE_NAME:实例名是一个人可读的标识符,用于识别数据库实例。实例名在创建数据库时由DBA指定,并在启动数据库时通过配置文件(如init.ora或spfile)进行指定。
- 通常情况下,SID和实例名是相同的。
下面是获取实例名和SID的命令:
1 | --1. 实例名, 输出: ORCLCDB,另外instance_number表示实例编号 |
- 其他变量
- DB_DOMAIN: 表示域名
- GLOBAL_NAME: 表示数据库名和域名的总和
- SERVICE_NAME: 数据库服务名, 用于监听器中, 一个对外的服务名, SID 只有一个, 但是服务名可以有多个
Oracle 数据库管理系统, 由Oracle 数据库和 Oracle 实例, 这是区别于mysql的.
sqlplus
sqlplus会读取ORACLE_SID环境变量可以默认连接该SID,这个请注意。
- 版本差别
10G以上版本本地登录不需要进行网络配置, 直接连接, 基本格式如下: sqlplus 用户名/密码@ip地址[:端口]/service_name [as sysdba]
, 例如:
1 | sqlplus sys as sysdba |
对于oracle9和以前的版本, 需要配置tnsnames.ora文件:
1 | test = |
- sqlplus命令介绍
在讲解sqlplus的各种登录命令前,我们先详细的剖析下该命令:sqlplus sys as sysdba
sqlplus
:这是一个命令行工具,用于连接到 Oracle 数据库并执行 SQL 语句。sys
:这是连接数据库所使用的用户名。在这里,sys
是一个特殊的用户名,代表数据库的系统管理员用户as sysdba
:这是连接到数据库时指定的角色。SYSDBA
是 Oracle 数据库的超级用户角色,具有最高权限和特权。连接到数据库时使用as sysdba
可以获得 SYSDBA 角色的权限。
即使用 sys
用户以 SYSDBA 角色连接到 Oracle 数据库,从而可以执行SYSDBA权限的操作
- 直接登录
直接使用登录: sqlplus
,在弹出的交互框中再输入sys as sysdba
信息即可
- 用户和角色
sqlplus [username]/[password]
,操作系统权限认证的SYS 管理员登录:
1 | -- 1. 指明, 此时需要输入密码 |
- 系统管理员身份登录
sqlplus -s / as sysdba
或者sqlplus / as sysdba
是以系统管理员身份登录到 Oracle 数据库的命令。下面是对该命令的各个部分的解释:
sqlplus
是启动 SQL*Plus 工具的命令。-s
是静默模式的选项,它将禁用 SQL*Plus 的横幅和版权信息的显示,只显示结果。/
是用于指定连接字符串的占位符,表示使用本地连接。as sysdba
是用于指定以系统管理员 (SYSDBA
) 身份登录到数据库。系统管理员拥有最高权限,可以执行任何操作。
如果使用-s
,则进入界面之后没有任何输出和提示输入信息,此时输入show user
会输出当前用户信息,这点请注意,如果希望退出就按ctrl + D
。
非登录
通常情况下,当我们使用 sqlplus
命令启动 SQL*Plus 工具时,它会自动尝试连接到默认的数据库实例,这需要提供用户名和密码。但是,使用 sqlplus /nolog
命令启动时,它不会自动连接到数据库,而是在交互界面中等待用户手动输入连接命令。用户需要手动输入 connect
命令来连接到所需的数据库实例,然后提供有效的用户名和密码才能成功连接。
1 | sqlplus /nolog |
这里有一个问题, 使用sqlplus连接的时候使用ORACLE_SID连接数据库实例的时候一直报错, 我看了一下sqlplus --help
, 发现可能是命令不支持, 后续有时间再处理.
占位符
在 SQLPlus 中,/
是连接字符串的占位符。当在 sqlplus
命令后面使用 /
作为连接字符串时,它表示使用默认连接参数连接到数据库。 具体来说,使用 /
表示使用本地连接方式,使用操作系统认证登录到数据库。这意味着 SQLPlus 将直接使用当前操作系统用户的身份登录到数据库,而无需提供用户名和密码。
请注意,使用 /
进行连接需要具有适当的权限,通常需要使用 as sysdba
或类似的特权身份进行连接。
dual表
DUAL
是Oracle数据库中的一个特殊表,它是一个系统预定义的表,用于执行一些不需要访问实际表的查询和操作。它的主要作用是在执行一些不涉及实际表的查询时提供一个虚拟的数据源。
- 简单Hello查询
1 | SELECT 'Hello, World!' FROM DUAL; |
这个查询将返回一个包含字符串 'Hello, World!'
的结果集,因为 DUAL
表只有一行一列,所以无论查询的内容是什么,它都会返回一个结果。在实际开发中,DUAL
表经常用于计算、函数、查询测试等场景
USERENV
函数用于返回当前会话的各种环境信息,例如会话ID、会话实例名、客户端信息、用户名、IP地址等:
1 | --1. 判断当前用户是否为 DBA |
sys_context
用于获取当前会话或当前用户的上下文信息。它提供了一种访问数据库环境和会话相关信息的方式,其格式:SYS_CONTEXT(namespace, parameter [, length])
,其中namespace
是上下文命名空间,parameter
是上下文参数,length
是可选参数,用于指定返回值的最大长度:
1 | --1. 用户认证类型 |
视图
简要介绍
在 Oracle 数据库中,V$
视图是一组动态性能视图(Dynamic Performance Views),也被称为动态数据字典视图。这些视图提供了对数据库内部结构和运行时性能信息的访问。
这些 V$
视图包含了大量的数据库运行时信息
,如系统状态、会话信息、性能统计、内存使用、锁定信息等。通过查询这些视图,可以获取有关数据库当前状态和性能的详细信息,用于性能调优、故障排查和监控等操作。
V$DATABASE
:显示数据库的信息,如数据库名称、启动时间、日志模式等。V$INSTANCE
:显示实例的信息,如实例名称、启动时间、进程信息等。V$SESSION
:显示当前会话的信息,如会话 ID、用户名、客户端地址、会话状态等。V$SQL
:显示当前执行的 SQL 语句的信息,如 SQL_ID、执行计划、执行次数、等待事件等。V$SYSSTAT
:显示系统级别的性能统计信息,如 CPU 时间、物理读取次数、逻辑读取次数等。V$SGA
:显示系统全局区域(SGA)的信息,如共享池大小、缓冲池大小、重做日志缓冲区大小等。V$LOCK
:显示当前的锁定信息,如锁定对象、持有锁定的会话等。V$SESSION_WAIT
:显示会话等待事件的信息,如等待事件类型、等待时间、等待事件的对象等。V$DATAFILE
:显示数据库的数据文件信息,如文件名、文件大小、表空间名称等。V$LOG
:显示数据库的重做日志文件信息,如日志组号、序列号、状态等。V$TABLESPACE
:显示数据库的表空间信息,如表空间名称、大小、使用情况等。V$VERSION
视图用于显示数据库的版本信息。它包含了有关数据库版本、数据库主版本号、数据库次版本号、数据库版本字符串等信息。通过查询该视图,您可以快速了解数据库的版本和补丁级别。
版本视图
BANNER
: 数据库版本字符串,包括主版本号、次版本号和补丁级别。CON_ID
: 连接标识符,对于单一租户数据库,此值为 0。VERSION
: 数据库版本号,包括主版本号和次版本号。
例如:
1 | INSERT INTO "" ("BANNER") VALUES ('Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production'); |
数据库信息
v$database
视图在 Oracle 数据库中提供了有关当前数据库的简要信息。它包含以下列:
DBID
:数据库的唯一标识符。NAME
:数据库的名称。CREATED
:数据库的创建日期和时间。RESETLOGS_CHANGE#
:上次重置日志序列号的 SCN(系统更改号)。LOG_MODE
:数据库的日志模式,如 “ARCHIVELOG”、”NOARCHIVELOG” 或 “FORCE LOGGING”。CHECKPOINT_CHANGE#
:上次检查点发生时的 SCN。CURRENT_SCN
:当前数据库的 SCN。FLASHBACK_ON
:指示是否启用了闪回数据库功能。SUPPLEMENTAL_LOG_DATA_MIN
:指示是否启用了最小的补充日志数据记录。SUPPLEMENTAL_LOG_DATA_PK
:指示是否启用了主键列的补充日志数据记录。SUPPLEMENTAL_LOG_DATA_UI
:指示是否启用了唯一索引列的补充日志数据记录。SUPPLEMENTAL_LOG_DATA_FK
:指示是否启用了外键列的补充日志数据记录。SUPPLEMENTAL_LOG_DATA_ALL
:指示是否启用了所有其他列的补充日志数据记录。DATABASE_ROLE
:数据库的角色,如 “PRIMARY”、”STANDBY” 或 “SNAPSHOT STANDBY”。SWITCHOVER_STATUS
:如果数据库处于可切换状态,则为 “SESSIONS ACTIVE”;否则为 “NOT ALLOWED”。FORCE_LOGGING
:指示是否启用了强制记录日志。
例如:
1 | INSERT INTO "" |
数据库实例
v$instance
视图在 Oracle 数据库中提供了有关当前数据库实例的信息。它包含以下列:
INSTANCE_NUMBER
:当前实例的编号。INSTANCE_NAME
:当前实例的名称。HOST_NAME
:运行当前实例的主机名。VERSION
:Oracle 数据库的版本信息。STARTUP_TIME
:当前实例启动的时间。STATUS
:当前实例的状态,如 “OPEN”、”MOUNTED” 或 “STARTUP”.PARALLEL
:指示当前实例是否启用了并行处理。THREAD#
:当前实例所属的线程编号。ARCHIVER
:指示当前实例的归档日志模式。LOG_SWITCH_WAIT
:等待日志切换的时间(以秒为单位)。LOGINS
:指示是否允许新的客户端登录到当前实例。
例如:
1 | INSERT INTO "" ("INSTANCE_NUMBER", "INSTANCE_NAME", "HOST_NAME", "VERSION", "STARTUP_TIME", "STATUS", "PARALLEL", "THREAD#", "ARCHIVER", "LOG_SWITCH_WAIT", "LOGINS", "SHUTDOWN_PENDING", "DATABASE_STATUS", "INSTANCE_ROLE", "ACTIVE_STATE", "BLOCKED") VALUES ('1', 'helowin', '3ee35b3a5fd2', '11.2.0.1.0', TO_DATE('2023-07-10 20:41:53', 'SYYYY-MM-DD HH24:MI:SS'), 'OPEN', 'NO', '1', 'STOPPED', NULL, 'ALLOWED', 'NO', 'ACTIVE', 'PRIMARY_INSTANCE', 'NORMAL', 'NO'); |
会话信息
v$session
视图在 Oracle 数据库中提供了有关当前会话的信息。它包含以下列:
SID
:会话的标识符。SERIAL#
:会话的序列号。USERNAME
:会话的用户名。STATUS
:会话的状态,如 “ACTIVE”、”INACTIVE” 或 “KILLED”。OSUSER
:操作系统用户。MACHINE
:连接会话的客户端机器名。PROGRAM
:连接会话的客户端程序名。MODULE
:连接会话的模块名。ACTION
:连接会话的动作名。LOGON_TIME
:会话的登录时间。LAST_CALL_ET
:自上次调用以来经过的时间(以秒为单位)。SQL_ID
:当前执行的 SQL 语句的标识符。SQL_CHILD_NUMBER
:当前执行的 SQL 语句的子语句编号。
这些列提供了关于当前会话的信息,如会话标识符、用户名、状态、客户端信息等。通过查询 v$session
视图,可以了解当前活动会话的详细信息。
参数信息
V$PARAMETER
是 Oracle 数据库中的一个动态视图,用于显示当前数据库实例的参数信息。它包含了一些重要的数据库参数和其当前的设置值。
NAME
:参数的名称。VALUE
:参数的当前设置值。DISPLAY_VALUE
:参数的显示值,用于展示给用户。ISDEFAULT
:参数是否使用默认值。ISSES_MODIFIABLE
:参数是否可以在会话级别进行修改。ISSYS_MODIFIABLE
:参数是否可以在系统级别进行修改。ISINSTANCE_MODIFIABLE
:参数是否可以在实例级别进行修改。DESCRIPTION
:参数的描述信息。ISDEPRECATED
:参数是否已经被废弃。ISBASIC
:参数是否属于基本参数。ISMODIFIED
:参数是否已经被修改。ISADJUSTED
:参数是否已经被调整。
用户
用户和角色
在上面解析sqlplus sys as sysdba
解析中聊到了特殊用户和角色,下面就简单的介绍下常见的用户和角色。
- 特殊用户
- SYS:SYS 用户是 Oracle 数据库的系统管理员用户。它具有最高权限和特权,可以执行系统级别的操作,如创建和管理数据库对象、配置数据库参数、备份和恢复数据库等。
- SYSTEM:SYSTEM 用户也是一个管理员用户,但相对于 SYS 用户而言,它的权限范围稍微受限。SYSTEM 用户可以执行一些管理任务,如创建用户、授予权限、管理表空间等。
- HR:人力资源示例模式,用于演示和测试目的,包含了一些与人力资源管理相关的表和数据。
- SCOTT:另一个示例模式,用于演示和测试目的,包含了一些基本的表和数据。
- SYSMAN:用于管理 Oracle Enterprise Manager(OEM)的用户,负责监控和管理数据库和整个系统。
- DBSNMP:用于管理 Oracle Enterprise Manager(OEM)的用户,负责监控数据库的性能和状态。
- OUTLN:用于存储和管理优化器统计信息的用户,通常由 Oracle 自动创建和使用。
- APPS:用于 Oracle E-Business Suite(EBS)的用户,负责管理和维护应用程序和相关数据。
一般而言,平常只会用到SYS/SYSTEM两个用户。
- 特殊角色
- SYSDBA:SYSDBA 是一种特殊角色,用于授予用户 SYS 或其他用户以超级用户权限。具有 SYSDBA 角色的用户可以执行需要特权的操作,如启动和关闭数据库、修改数据库参数等。
- SYSOPER:SYSOPER 是另一种特殊角色,用于授予用户 SYS 或其他用户以操作员级别的权限。具有 SYSOPER 角色的用户可以执行一些管理和监控数据库的操作,如备份和恢复数据库、更改数据库状态等。
- SYSASM:SYSASM 是 Oracle 数据库中的一个特殊角色,用于管理数据库中的 ASM (Automatic Storage Management) 实例。ASM 是一个用于管理存储的磁盘管理器,专门设计用于管理数据库文件和日志文件的存储。SYSASM 角色拥有最高级别的 ASM 权限,具有完全控制 ASM 实例和存储的权限。
注意,不能在navicat
等客户端中使用sqlplus语法,否则在describe EMP;
的时候会报ORA-00900: Invalid sql statement
错误,这点非常重要。
简单命令
- 让我们先看下sys和system用户区别(注意,下面的命令请在客户端中执行):
- system是数据库内置的一个普通管理员, 手动创建并赋予dba角色后用户和system类似
- sys数据库的超级用户, sys用户必须以sysdba身份登录
- 任何用户以sysdba身份登录时都会自动转为sys
- 下面是常见的一些命令说明
查看当前用户(只能在sqlplus上执行):
show user
查看数据库用户:
select * from dba_users
,例如select * from dba_users where username='BAMBOO';
修改当前登录用户密码(sqlplus上执行):
1 | --1. 当前用户,输入之后需要在交互端输入老密码和新密码 |
用户和表空间
在创建用户之前先了解一下表空间概念, 表空间: Oracle 的表都是存储在表空间里面的, 创建表之前需要创建一个表空间. 查看所有表空间:
1 | --1. 直接查询 |
创建表空间, 其格式:
1 | create tablespace [表空间名称] |
实例:
1 | create tablespace tbspace |
正常情况下创建用户会报错invalid common user or role name
, 原因是oracle有两种概念CDB(数据库容器)
和PDB(可插拔数据库)
, 从oracle12开始允许一个 CDB承载多个 PDB, 即数据库和实例有如下关系:
- 1 - 1
- 1 - N (单数据库多实例, RAC)
- N- 1
如何查看当前数据库是否为CDB? 如何查看当前容器? 查看 PDBS?
1 | --1. 查看是否 CDB |
上面的创建用户问题出错就是数据库未切换到 PDB 上面.
1 | --1. 如果pdb没有打开, 则需要先打开pdb |
在执行完上述命令之后就可以执行上面创建用户, 另外, 上面命令执行完毕进行适用于当前打开的实例窗口, 在另外一个客户端上查询CON_NAME
会发现未发生更改创建用户命令格式:
1 | CREATE USER [用户名] |
例子:
1 | --1. 创建用户 |
表
表结构
Oracle中不能通过show create table DB.account;
查看某个表结构,但是可以通过如下几种方式查看表结构
- 使用
DESCRIBE
命令(MySQL也适用该方式):
1 | DESC table_name; |
将 table_name
替换为要查看的表的名称。
该命令将显示表的列名、数据类型、约束等信息。
- 使用
SELECT
查询USER_TAB_COLUMNS
视图:
1 | SELECT column_name, data_type, data_length, nullable |
将 table_name
替换为要查看的表的名称。
用户表
DBA_USERS
表是一个系统表,用于存储所有的数据库用户信息。该表包含了每个用户的基本信息,如用户名、用户 ID、默认表空间、临时表空间等。
以下是 DBA_USERS
表中的一些重要列及其含义:
USERNAME
:用户名称。USER_ID
:用户 ID。CREATED
:用户创建时间。DEFAULT_TABLESPACE
:用户的默认表空间。TEMPORARY_TABLESPACE
:用户的临时表空间。ACCOUNT_STATUS
:用户的账户状态,如 “OPEN”(开启)或 “LOCKED”(锁定)。LOCK_DATE
:如果账户被锁定,锁定的时间。EXPIRY_DATE
:账户过期的日期。PROFILE
:用户的配置文件,用于限制和管理用户的资源使用。
通过查询 DBA_USERS
表,可以获取有关数据库中所有用户的详细信息,包括其创建时间、默认表空间、临时表空间等。例如:
1 | INSERT INTO "" |
其他
查看用户所有表: SELECT TABLE_NAME FROM USER_TABLES;
用户可存取的表: SELECT TABLE_NAME FROM ALL_TABLES;
数据库中所有表: SELECT TABLE_NAME FROM DBA_TABLES;