ORACLE数据库系统是美国ORACLE(甲骨文)公司提供的一款关系数据库管理系统,可在所有主流平台上运行。Oracle数据库12c 引入了一个新的多承租方架构,使用该架构可轻松部署和管理数据库云。我发现一些网文不太严谨,甚至有误导新手的文字,希望本文不致如此。
Windows10下Oracle12c安装可参考
Oracle12.2.0.1.0 Windows安装教程、开发工具分享
https://blog.csdn.net/qq_38225558/article/details/86691112
特别提示:安装时一定要记住你为内置账户system、sys设定的口令(密码),及创建的数据库名:
后面将用到。
本文以Oracle 12C版本 为例介绍,包括:第一部分、一些基本概念;第二部分、Oracle的SQL Plus;第三部分、SQL Developer;第四部分、Oracle Enterprise Manager(Oracle企业管理器);第五部分、附录。
这部分先大体了解即可。
与MySQL、MSSQL不同,Oracle数据库有“表空间”组织数据。
Oracle数据库结构示意:
表空间
有了数据库,就可以创建表空间。表空间是数据库的最大逻辑划分区域。
表空间是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间。
表空间(TableSpace)是Oracle对物理数据库上相关数据文件(ORA或者DBF文件)的逻辑映射。一个数据库在逻辑上被划分成一到若干个表空间,每个表空间包含了在逻辑上相关联的一组结构。每个数据库至少有一个表空间(称之为system表空间)。
一个表空间由一个或多个数据文件组成,一个数据文件只属于一个表空间。
用户和表空间的关系:一个用户有一个默认的表空间,一个表空间可以为多个用户作为默认表空间,用户和用户之间的数据是隔离的,数据不会混。
表空间分为几种类型:系统表空间,永久表空间,临时表空间。
表空间的作用:可以为表空间分配磁盘空间大小;提供了一个备份和恢复单位,可以按表空间进行备份和恢复;可以将表空间设置为只读(从而保证大量的静态数据不被修改)。
段(Segment)
我们可能需要在表空间划分出不同的区域,以存放不同数据;我们将这些区域称之为段(Segment)。
一个段可以包含多个区。
区(extent):
Oracle会先配置出出一连串的数据块,知道直到这些数据块全部存满数据后,下次再配置一连串的数据块。这些连续的数据块就称之为区。
一个区可以包含多个块。
块(block):
Oracle中最小的存储单位就是块。
一个用户有一个缺省的表空间,如果我们在创 建对象时不指定表空间,则对象存储在缺省表空间中,要想让对象存储在其他表空间中,我们需要在创建对象时指定该对象的表空间。
oracle数据库、实例、服务名、SID
数据库就是存储在磁盘上的数据集合。表现为一组文件。
实例(Instance),存在于服务器的内存中,由一个大型内存块和一系列的进程组成。
ORACLE实例 = 进程 + 进程所使用的内存(SGA)
实例是一个临时性的东西,你也可以认为它代表了数据库某一时刻的状态!
实例
一个Oracle实例(instance)有一系列的后台进程(Backgound Processes)和内存结构(Memmory Structures)组成,一个数据库可以有n个实例。
数据库 = 重做文件 + 控制文件 + 数据文件 + 临时文件
数据库是永久的,是一个文件的集合。
服务名 就是对外公布的名称,为网络监听服务。一个OS(操作系统)上可以装多个Oracle数据库,一个数据库可以对外公布多个服务名(SERVICE_NAMES)。每个数据库可以对外公布多个服务名,以实现不同的目的。服务名指的是listener中的全局数据库名。
在不同的场合称谓,主机字符串,数据库服务名,数据库别名。
“主机字符串”的叫法主要在SQL*Plus中使用,是在客户端使用,一个客户端也可以用多个主机字符串连接到同一个数据库服务器上。
“数据库别名”主要用在一些开发工具连接Oracle服务器时使用,是通俗叫法。
还有像配置ODBC时的Data Source的Service Name。
它们都是一个道理,指向的都是客户端tnsnames.ora文件中的一小段文本。
SID用于实例区分各个数据库,service name用于外部链接。
每个正在运行的 Oracle 数据库至少与一个实例相关联。因为实例存在于内存中,而数据库存在磁盘上,所以实例可以独立于数据库存在,数据库也可以独立于实例存在。
Oracle数据库与实例之间是1对1或n的关系,在非并行的数据库系统中每个Oracle数据库与一个实例相对应,这是一般常见的情况;在并行的数据库系统中,一个数据库会对应多个实例,同一时间用户只与一个实例相联系,当某一个实例出现故障时,其他实例自动服务,保证数据库正常运行。配置成RAC(Real Application Cluster)的安装则可以允许多个存在于不同机器上的实例访问存在于一个共享磁盘上面的数据库。
【Oracle数据库和数据库实例补充说明
1) 数据库是一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等);
2) Oracle数据库实例则是一组Oracle后台进程/线程以及在服务器分配的共享内存区。
在启动Oracle数据库服务器时,实际上是在服务器的内存中创建一个Oracle实例(即在服务器内存中分配共享内存并创建相关的后台内存),然后由这个Oracle数据库实例来访问和控制磁盘中的数据文件。
全局数据库名:是将数据库与任何其他数据库唯一标识出来的数据库全称。全局数据库名的格式为
SID(System Identifier,系统标识符):用来标识Oracle数据库的特定实例。对于任何一个数据库,都至少有一个引用数据库的实例。SID可以是未被此计算机上其他实例使用的任何名称。SID是Oracle数据库实例的唯一标识符,最多只能有8个字母、数字字符。每个数据库实例对应一个SID和一系列数据库文件。例如,当创建SID为XXX的数据库时,将同时创建数据库实例及其数据库文件(初始化参数文件、控制文件、重做日志文件和数据文件)。
数据库实例名(instance_name)用于对外部连接。在操作系统中要取得与数据库的联系,必须使用数据库实例名。比如我们作开发,要连接数据库,就得连接数据库实例名:
jdbc:oracle:thin:@localhost:1521:orcl(orcl就为数据库实例名)】
方案(Schema)
oracle中的schema可以理解为用户下的所有对象的集合,每个用户都有一个对应的方案——一个用户有一个默认(缺省)的schema,其schema名和用户名相同,换句话说,在创建一个用户的同时为这个用户创建一个与用户名同名的schem并作为该用户的缺省 shcema。
方案(Schema),是用户所拥有的数据库对象的集合,在Oracle数据库中,对象是以用户来组织的,用户与模式是一一对应的关系,并且两者名称相同。
在同一个模式中不能存在同名对象,但是不同模式中的对象名称则可以相同。
用户可以直接访问自己模式对象,但如果要访问其他模式对象,则必须具有该对象的相应访问权限。例如用户HR要查看scott模式中的emp表时,则必须在emp表上具有select操作的权限,同时必须附上模式名作为前缀。
查看系统所有用户,必须以sysdba身份登陆
select username ,account_status from dba_users;
在数据库中一个对象的完整名称为schema.object。如果我们访问一个表时,没有指明该 表属于哪一个schema中的,系统就会自动给我们在表上加上缺省的sheman名。比如我们在访问数据库时,访问scott用户下的emp表,通过 select * from emp; 其实,这sql语句的完整写法为select * from scott.emp。
Oracle内存结构:
Oracle内存结构主要可以分为共享内存区和非共享内存区,共享内存区主要由SGA(System Global Area)组成,非共享区主要由PGA(Program Global Area)组成。
SGA:系统全局区,SGA是由用户进程共享的一块内存区域,所以它也简称共享内存区,SGA几个重要区域包括数据库缓存区、重做日志缓存区、共享池、其他区域。
PGA:用户存放服务器进程的数据和控制信息,它是独立于SGA的一块内存区域。当用户进程连接到Oracle服务器时,Oracle服务器会为每个服务器进程分配相应的PGA。PGA由排序区(Sort Area)、会话信息(Session Information)、游标状态(Cursor State)、堆栈空间(Stack Space)等四个部分组成。
SQL*Plus® User's Guide and Reference
https://docs.oracle.com/cd/E11882_01/server.112/e16604/toc.htm
SQL Plus 是 Oracle 数据库提供的一个专门用于数据库管理的交互式工具,使用 SQL Plus 可以管理 Oracle 数据库的所有任务,SQL Plus 通过命令的方式对数据库进行管理,也可以通过 SQLPlus 执行 SQL 语句的操作。
查看sqlplus版本号
法一、在cmd中查看,输入
sqlplus -v;
参见下图:
【其中> 是windows操作系统的命令提示符】
法二、启用sqlplus后,输入
select * from V$VERSION;
【其中SQL> 是SQLPlus工具的提示符】
Windows10环境进入sqlplus的方法:
★开始菜单,找到SQLPLUS单击打开,参见下图:
★windows键+R键打开运行窗口输入sqlplus ,参见下图:
★【windows键+R键打开运行窗口输入cmd打开cmd窗口】在cmd窗口中,输入SQL*Plus命令,参见下图:
Sqlplus命令格式:
sqlplus [用户名/密码][@数据库名]
如果没有@数据库名, 将连接到默认数据库。
Oracle的SQL Plus中不能输入口令?
输入口令是不会显示的 输入正确后 按回车即可,参见下图:
如上图所示,您已连接到Oracle数据库服务器。
也可以将用户名和密码一块输入,如此可见输入的密码,格式如下:
用户名/密码
参见下图:
sys、system、sysman 这三个用户的密码是你装的时候设置的那个密码。
sys as sysdba 就是以sysdba登录,oracle登录身份有三种:normal 普通身份 sysdba 系统管理员身份 sysoper 系统操作员身份 每种身份对应不同的权限。
【提示:
Oracle中SYS和SYSTEM用户的区别
SYS用户是超级用户,有最高权限,具有SYSDBA角色,具有数据库管理员权限,可以建立数据库——有create database权限。
SYSTEM用户是管理操作员,具有SYSOPE角色,具有数据库操作员权限,不能建立数据库——没有create database权限。
】
登录后,可以查看oracle数据库全局数据库名和sid
查看全局数据库名:
select name from v$database
查看sid:
select instance_name from v$instance
参见下图:
【登录后,可以使用help index查看SQL Plus有关命令,参见下图:
】
oracle之sql中使用注释
☆单行注释
单行注释以--开头,例如:
select user from dual --注释以--开头,本句查看当前用户名
☆多行注释,以/*开始其后面有一空格,以*/结束其前面有一空格,例如:
/* 多行注释,
下面语句是查看当前用户名 */
select user from dual
参见下图:
连接到数据库
CONN[ECT] [logon] [AS {SYSOPER | SYSDBA}]
其中
CONNECT可以简写为CONN
logon为
{username[/passwd] | /}[@connect_identifier] [edition={edition_name | DATABASE_DEFAULT}]
说明:
/:用于连接请求的外部认证,这种验证类型不需要数据库密码。最常见的外部认证形式为操作系统认证。数据库用户由已登录主机操作系统的主机帐号验证并授权。
AS {SYSOPER | SYSDBA}:用户以SYSOPER、SYSDBA系统权限连接.仅某些预定义的管理员用户或添加到密码文件的用户可以如此方式连接。以SYS用户身份连接,必须指定AS SYSDBA。
username:合法数据库用户名。
passwd:合法数据库用户密码,如果不指定,且不是以 AS SYSDAB方式登录时,会弹出密码输入提示。
connect_identifier:Oracle网络连接标示符,用于远程连接。如果忽略,sqlplus连接到本地实例。常用连接标示符为网络服务名(net service name),网络服务名为Oracle网络连接描述符的别名(网络地址和数据库服务名)。通常通过解析本地主机上的tnsnames.ora文件得到网络服务名。
connect_identifier的简易语法:
"host:[port][/service_name][:server][/instance_name]"
注:指定/service_name选项,可不在(本地)电脑客户端上配置Oracle网络服务。
host:远程数据库主机IP或主机名。
port:Oracle网络监听器监听的端口。
service_name:要连接的数据库服务名。如果远程数据库网络服务监听器配置了缺省的服务名,可以忽略,否则必须提供。通常每个数据库提供了一个和全局数据库名相同的服务名。全局数据库名由DB_NAME和DB_DOMAIN初始参数组成:DB_NAME.DB_DOMAIN,如果DB_NAME为orcl,DB_DOMAIN为us.example.com,那么标准服务名为orcl.us.example.com
server:服务处理器类型,可接受值含dedicated(专用服务器)、shared(共享服务器)、pooled(共享池)。
instance_name:指定要连接的实例。
edition={edition_name | DATABASE_DEFAULT}:指定启动数据库会话时版本。如果指定版本,则该版本必须存在且拥有对它的USE权限,不指定则使用默认版本。
【connect可以简写成conn】
关于CONNECT可参考:
https://docs.oracle.com/cd/E11882_01/server.112/e16604/ch_twelve015.htm#SQPUG036
https://docs.oracle.com/cd/E11882_01/server.112/e25494/dba.htm#BABFGEGG
例如
用system用户连接
conn system/密码@数据库名
【密码也称为口令,使用你的实际密码;数据库名使用你的实际数据库名】
用sys用户连接
conn /@数据库名 as sysdba
【数据库名使用你的实际数据库名】
示例参见下图:
断开用户与Oracle数据库服务器的连接
要断开用户与Oracle数据库服务器的连接,请使用EXIT命令,参见下图:
SQL Plus的常用编辑命令
注意:SQL Plus命令需要在 SQL> 提示符下执行。
在SQL Plus中,可以编写由多个语句或命令组成的语句块,这些语句块将暂存在缓存区中,SQL语句以分号“;”结尾时,按“Enter”键将执行该SQL语句,否则将换到下一行,自动产生行号,继续等待输入;已经输入的语句自动进行缓冲区暂存。
【在空行中直接按回车或行中只有分号回车,结束语句块,输入run或/执行缓冲区中的SQL语句】
显示缓冲区内容:
在SQL语句块执行完后,可以用分号(;)或list命令,重新显示缓冲区中的内容。
在SQL Plus中,只能对缓冲区中的当前行进行编辑,要想编辑某一行,首先要将其切换为当前行;在显示缓冲区时,当前行前面有一个星号(*)。
缓冲区中有内容时,可以使用ED[IT]命令打开缓冲区编辑器,编辑程序
清除缓冲区中的内容。
clear buffer
sqlplus执行sql文件
在SQL*PLUS环境下,可以通过@, start执行sql脚本.
举个例子,假设你的sql文件是test.sql ,保存路径是D:\script,那么在sqlplus里执行它,用如下语法:
sqlplus> @D:\script\test.sql
@ 加上完整文件名(绝对路径+文件名+文件扩展名)
【run只能执行sql命令.
execute只能执行存储过程。】
创建一个表空间进行SQL语句实践
创建表空间后,就可以创建表和用户进行SQL语句学习了。先简要介绍其过程,再举例说明。
创建表空间需要以具有相应的权限,如使用system登录。
1).创建表空间:
create tablespace 表空间的名 datafile '数据文件' size xxxm;
数据文件:全名如d:\data.dbf,表空间的存储位置
xxx表空间的大小,m单位为兆(M)
【为用户指定表空间:
alter user 用户名 default tablespace 表空间名
为用户指定临时表空间:
alter user 用户名 temporary tablespace 表空间名】
【删除空的表空间,但是不包含物理文件:
drop tablespace 表空间名
删除空表空间,包含物理文件(数据文件):
drop tablespace 表空间名 including datafiles
如果其他表空间中的表有外键等约束关联到了本表空间中的表的列,就要加上CASCADE CONSTRAINTS,如:drop tablespace 表空间名 including datafiles cascade constraint
注意:如果多个用户使用相同的表空间,删除用户时不要删除表空间】
2).创建用户:
create user 用户名 identified by 密码
【创建用户同时可以指定表空间
create user 用户名 identified by 密码
default tablespace 表空间名】
【删除用户及级联关系
drop user 用户名 cascade
指定 cascade 会删除用户下的所有对象(包括表、视图、主键、外键、索引等;但不会删除存储过程、函数、包)。如果不指定则仅仅只删除用户,一般建议指定】
【查询用户信息:
oracle 查看当前用户名:
show user 或 select user from dual
oracle 查看所有用户名:
select * from all_users
查看数据库里面所有用户相关信息(前提是你是有dba权限的帐号,如sys、system):
select * from dba_users
注意SELECT查询语句中的星号*代表所有列
查看你能管理的所有用户:
select * from all_users
查看当前用户信息:
select * from user_users
查询用户所对应的表空间:
select username,default_tablespace from dba_users
使用限制条件查询用户所对应的表空间:
select username, default_tablespace from dba_users where username='大写用户名'】
3).将空间分配给用户:
alert user 用户名 default tablespace表空间名
4).给用户授权:
Grant 权限 to 用户名
创建的用户默认没有任何权限,需要分配权限。
【不同用户登录到同一数据库中,可能看到不同数量的表,拥有不同的权限。Oracle 的权限分为系统权限和数据对象权限,共一百多种,如果单独对用户授权,很麻烦,有一些用户需要的权限是相同的,就把这些用户归为同一类——某种角色,通过设立一些有预定权限的角色简化和明确授权操作,角色出现的动机也就是为了简化权限管理,它是权限的集合。一般做法是:系统把权限赋给角色,然后把角色赋给用户,当然也可以直接把某权限赋给用户。Oracle 提供细粒度的权限,可以对表的某一列单独设置权限,可以对某用户查询某表自动增添 where 限制条件。
权限分类
系统权限:系统规定用户使用数据库的权限。(系统权限是对用户而言)。
实体权限:某种权限用户对其它用户的表或视图的存取权限。(是针对表或视图而言的)。
系统权限分类:
DBA: 拥有全部特权,是系统最高权限,只有DBA才可以创建数据库结构。
RESOURCE:拥有Resource权限的用户只可以创建实体,不可以创建数据库结构。
CONNECT:拥有Connect权限的用户只可以登录Oracle,不可以创建实体,不可以创建数据库结构。
实体权限分类
select、update、insert、alter、index、delete、all(all包括所有权限)、execute(执行存储过程权限)。
角色
角色是一组权限的集合,将角色赋给一个用户,这个用户就拥有了这个角色中的所有权限。
预定义角色是在数据库安装后,系统自动创建的一些常用的角色。下介简单的介绍一下这些预定角色。
查看所有角色:
select * from dba_roles;
查看角色所包含的权限可以用以下语句查询:
select * from role_sys_privs where role='角色名'
查看当前登录用户拥有的所有角色和系统权限:
select * from session_privs】
5).然后用创建的用户登录,登录之后创建表。
conn 用户名
创建表的语法:
CREATE TABLE 表名(
列名 数据类型 [[CONSTRAINT 约束名] 约束][DEFAULT 默认值],
列名 数据类型 [[CONSTRAINT 约束名] 约束][DEFAULT 默认值],
...
列名 数据类型 [[CONSTRAINT 约束名] 约束][DEFAULT 默认值]
)
【为已创建(已存在)的表插入表数据
插入单条记录:
INSERT INTO 表名(列名1,列名2,...) VALUES(值1,值2,...)
插入多条记录:
INSERT ALL
INTO 表名(列名1,列名2,...) VALUES(值1,值2,...)
INTO 表名(列名1,列名2,...) VALUES(值1,值2,...)
...
SELECT 1 FROM dual
查询表数据:
SELECT 列1,列2,,... FROM 表名 WHERE 条件
删除表:
DROP TABLE 表名
查询用户创建的表
当前登录用户查询自己的表,使用以下语句:
SELECT table_name FROM USER_TABLES;
当前登录用户查询查询自己或其它用户的表(前提是有权限):
SELECT table_name FROM ALL_TABLES WHERE OWNER='大写用户名'
查看表结构:
desc 表名
修改表名:
RENAME 旧表名 TO 新表名
为已创建(已存在)的表添加列:
ALTER TABLE 表名 ADD 列名 数据类型
为已创建(已存在)的表删除列:
ALTER TABLE 表名 DROP COLUMN 列名
为已创建(已存在)的表修改列名:
LTER TABLE 表名 RENAME COLUMN 老列名 TO 新列名】
下面给出一个简单例子
由system系统管理员账号登录
创建表空间:
create tablespace MBspace
datafile 'd:\app\mydir\MBspce1.dbf' size 20M
autoextend on
创建用户mmm密码为mmm123,设置默认表空间是MBspace,临时表空间是temp:
create user mmm identified by mmm123
default tablespace MBspace
temporary tablespace temp
创建的用户默认没有任何权限,需要分配权限。
这里为了方便,将管理员角色(dba)权限授权给MMM用户:
grant dba to mmm
现在可以用创建的用户(用前面创建的用户mmm密码是mmm123)登录:
connect mmm/mmm123
登录之后创建表:
CREATE TABLE job(
id NUMBER(6),
code VARCHAR2(10),
name VARCHAR2(10)
)
为已创建(已存在)的表插入表数据插入单条记录:
INSERT INTO job(id,code,name) VALUES(1,'NO1','测试')
为已创建(已存在)的表插入表数据插多单条记录:
INSERT ALL
INTO job(id,code,name) VALUES(2,'NO2','开发')
INTO job(id,code,name) VALUES(3,'NO3','运维')
SELECT 1 FROM dual
查询表数据:
SELECT * FROM job where id=1
SELECT code,name FROM job where code='NO2'
查询用户创建的表:
SELECT table_name FROM ALL_TABLES WHERE OWNER='MMM'
查询用户创建的表结构:
desc job
安装ORACLE数据库系统时会自动安装SQL Developer。
Oracle SQL Developer是针对Oracle数据库的交互式开发环境(IDE)
【SQL Developer 和 PL/SQL Developer是不同的,前者是Oracle公司自己免费提供的,后者第三方工具不免费】
第一次启动PLSQL Developer,出现“配置文件类型关联”对话框
可以忽略之,单击“取消”按钮。
连接Oracle数据库
输入select user from dual执行,查看当前用户名,参见下图:
现在你可以创建一个表空间进行SQL语句实践,具体参见前面。
为了方便学习 Oracle, Oracle 提供了一个样本数据如HR、OE、PM等示例方案(Schema),但是在使用它之前,我们必须先解锁用户。
下面以HR介绍
★使用 SQL Developer 解锁用户 HR
1. 使用 SYSTEM 登录 Oracle
2. 在“其他用户”节点下找到 HR
3. 右键选择“编辑用户”
4. 去掉“账户已锁定”选项
5. 输入新口令(密码),如hr123
6、单击“应用”按钮
参见下图:
新建hr连接,参见下图:
输入select user from dual执行,查看当前用户名,参见下图:
输入
conn hr/hr123;
select table_name from tabs
输入执行,查查看当前用户的几张表,参见下图:
查看表EMPLOYEES的内容
输入
select * from EMPLOYEES;
执行,就不图示了。
查看表EMPLOYEES结构:
输入
desc EMPLOYEES;
执行,就不图示了
完成上述工作,还可以如下操作
单击hr_conn,单击表前的+展开 Tables。参见下图:
单击MPLOYEES 表,可以查看表定义,参见上图。
Oracle Enterprise Manager(OEM),该工具在 Oracle Database 10g 中首次引入,称为Enterprise Manager Database Control,是一个基于 Web 的工具,在安装 Oracle Database 时会自动安装该工具。
打开IE浏览器,输入以下 URL:
https://
说明:将
下面演示Windows10中的IE浏览器打开Oracle 12C的 Oracle企业管理器
这里用 https://localhost:5500/em ,参见下图:
单击“登录”显示如下:
oracle建立数据库与My SQL、SQL Server等有所不同,在oracle中建立数据库,比较繁琐,并会在系统中创建很多服务,所以,建议如果不是必要的情况下,还是不要随便建数据库,在原有的数据库中建立表空间就可以了,然后在表空间中建立相应的表。
Oracle数据库的创建一般使用DBCA(Database Configuration Assistant、数据库配置助手),它可以自动的完成数据库的一些基本配置。也可以使用create database语句创建数据库,但比前者麻烦。
Oracle创建数据库有两种方法:1)使用DBCA创建数据库, 2)手动创建数据库。
这两种方法,详见:
https://blog.csdn.net/cnds123/article/details/103918768