alin的学习之路(数据库篇:一)(数据库简介、oracle简介、oracle基础开启实例开启监听、一些问题的解决)
1. 数据库概述
可以理解为数据库是将内容存放在磁盘中,如果使用文件方式进行存储,会浪费很多的CPU时间,因为文件IO操作会很费时,所以有数据库的话可以缩短数据存储的时间,并且还可以提高存储的效率。
- 数据库
- DB 的全称是 Data Base ,即数据库的意思。 数据库 实际上 就是一个文件集合 ,是一个存储数据的仓库,本质就是一个文件系统,数据库是按照特定的格式把数据存储起来,用户可以对存储的数据进行增删改查操作;
- 数据库管理系统
- DBMS 的全称是 Database Management System ,即数据库管理系统的意思,是一个软件,用来管理数据库文件的软件,用户可以访问DBMS对数据进行增删改查操作,常见DBMS有:MySQL 、 Oracle 、 DB2 、 SQLite 、 SQLServer 等
2. Oracle 概述
分两部分:
- oracle的客户端
- 不存储数据
- 向服务器发送请求, 对oracle服务器上的数据进行 添删查改
- oracle官方给我们提供了相关的客户端
- 终端类型
- 桌面程序终端
- 我们也可以使用第三方的客户端终端 -> plsqldevloper
- oracle的服务器
- 存储数据
- 接收客户端的请求, 并且处理请求
- 一般情况下, 可客户端和服务器并不在同一台主机上, 这两个节点的通信需要基于 tcp协议 , 这样能保证数据在传输过程中是安全的
总之:服务器用来存数据,而客户端只是向服务器发送请求。
oracle服务器端物理结构
Oracle服务器主要由 实例 、 数据库 、 程序全局区 和 前台进程 组成,其中:
- 实例就是用来提供管理数据库的功能;
- 进程+内存(操作系统的)
实例可以进一步划分为系统全局区(SGA)和后台进程(PMON、SMON等)两部分,其中:
- SGA是所有用户进程共享的一块内存区域,使用操作系统的内存资源;
- 后台进程需要使用CPU与内存资源。
- 数据库由 数据文件 、 控制文件 和 重做控制文件 组成,用来存储系统数据,数据存放在硬盘中。
- 程序全局区(PGA)是一个非共享的内存区域,用于管理用户进程的私有资源。
- 前台进程可以再划分为用户进程和服务器进程,他们需要使用CPU与内存资源。
要理解的内容:
- oracle服务器端启动之后(在centos的镜像中安装的oracle的服务器端)就得到一个实例
- 实例的组成: 内存 + 进程
- 内存作用就是加载磁盘文件中的数据, 可以提高数据的访问效率
- 空间换的时间的思想
- 磁盘文件就是数据库文件
- 对数据库数据的操作变成了对内存数据的操作
- 后台进程来维护共享数据库实例共享内存中的数据
- 数据库
- 数据库在数据库管理系统中
- 数据库管理系统: oracle, mysql, seqlserver, …
- 数据库管理系统管理数据, 因为数量很大, 因此称之为数据库
- 数据库的本质就是磁盘文件
- 数据库相比文件的优势:以空间换时间。效率高。
- 逻辑结构
逻辑结构由
表空间(tablespace)
、段(segment)
、区间(extent)
、数据块(data block
)组成 。
表空间:
表空间是一个逻辑容器,它位于逻辑存储结构的顶层。表空间内的数据被物理存放在数据文件中。一个表空间可以包含一个或多个数据文件。但是一个数据文件只能属于一个表空间。
在oracle中可以创建多个表空间, 每个表空间都是一个磁盘文件, 用来存储用户创建的数据库表
- 我们创建的所有的数据库表的表数据都是存储在表空间对应的文件中的
段:
段是占用存储空间的数据库对象,用于存储和隔离不同数据库对象的数据。
- 一个oracle数据库中, 可以创建很多个用户, 多个用户之间的数据的相互隔离的
- 每个用户都有一个属于自己的段
区间:
区间是Oracle存储空间最小的分配单位。
- 区间就是每个用户对应的数据库表
数据块:
数据块是Oracle最小的I/O单位。
- 数据库表中的数据类型
- 整形
- 字符串
- …
- oracle数据库中如何存储数据
- 在oracle数据库中有多个用户
- 每个用户之间的数据的相互隔离互不影响的, 每个用户只能访问自己的数据
- 用户下的 数据如何划分?
- 用户个人信息
- 用户上传数据
- 用户下载数据
在每个用户名下可以有若干个数据表, 每个表中存储不同类型的数据
- 数据库表也是用来隔离数据的, 表之间的数据是相互独立的
- 数据库表中的数据是如何存储的?
- 多行多列
- 行代表一条数据的信息
- 列代表当前数据的若干属性
- 多行多列
- 在oracle数据库中有多个用户
# oracle数据库是如何存储数据的?
1. oracle数据启动之后会创建一个实例, 申请一块非常大的内存, 加载数据库文件中的数据
2. oracle数据库的实例名是在安装的时候指定的, 如果不改就叫 `orcl`
3. 通过用户名来隔离数据, 各个用户之间的数据是独立的, 互不影响的
- 结论: 在oracle数据库中会有很多的用户
4. 一个用户的数据如果量很大, 属性也不同, 是不能存储到一起的, 这样不利于管理和维护
- 通过数据库表来存储数据, 可以把不同属性的信息存储到不同的数据库表中
- 价格信息: 价格信息表
- 商品信息: 商品表
3. oracle 基础
1. 用户名和角色
-
Role
-- normal: 普通用户, 权限是最低的, normal需要管理员授权才能拥有某些操作权限 - 默认情况下, 创建一个新的普通用户基本什么操作权限也没有 - 如果需要某些权限, 需要管理员授权 - 我们使用的存储数据的用户, 一般都是普通用户 -- sysoper: 数据库操作员, 权限比管理员要低 1、打开数据库server 2、关闭数据库server 3、备份数据库 4、恢复数据库 5、日志归档 6、会话限制 -- sysdba: 数据库管理员, 权限最高 1、打开数据库server 2、关闭数据库server 3、备份数据库 4、恢复数据库 5、日志归档 6、会话限制 7、管理功能 8、创建数据库
-
User
-- oracle数据库中支持很多用户, 可以创建新的用户, 创建的新用户默认都是普通用户 -- oracle中默认的用户 - sys: 这是一个用户名, 角色: sysdba(数据库管理员), sys用户拥有最高权限, 只有一个 - system: 这是一个用户名, 角色: normal(虽然是是普通用户, 但是权限要比普通用户高, 有特权)-VIP - scott: 这是一个测试用户, 角色: normal (普通的普通用户) - 创建的新用户: 和scott地位的一样的
2. SQL*PLUS
Oracle的
sql*plus
是与oracle数据库进行交互的客户端工具,借助sql*plus
可以查看、修改数据库记录。在sql*plus
中,可以运行sql*plus命令与sql语句。
在oracle中, 如果要连接到oracle的服务器, 客户端工具必须使用
sql*plus
- 原生的
sql*plus
- 终端
- 被封装过的
sql*plus
- 官方封装过的桌面应用程序 -> 需要配置java环境, 放弃使用
- 第三方公司封过的桌面应用程序
3. 启动和关闭数据库
我们如果想要使用oralce数据库, 需要先启动数据库实例
启动这个数据库实例必须要登录到linux操作系统的oracle用户进行相关的操作
- oracle用户是怎么来的?
- 在linux上安装oracle之前, 必须要先创建一个oracle用户, 在这个用户下进行数据库的安装
启动数据库实例
-
第一种方式 (简单)
- 使用管理员账户登陆oracle服务器
sqlplus / as sysdba
- 使用
startup
启动数据库实例
# 在打开的终端中执行如下命令就可以了, 为什么如下命令可以被解析, 是因为在安装oracle服务器的时候在当前主机上客户端程序也一并被安装了 # 语法格式: sqlplus sys/sys用户的密码 as sysdba # 因为管理员本地登录不需要密码, sysdba 身份的用户只有一个, 就是 sys # 简化的语法格式: sqlplus / as sysdba # 连接并登录oracle服务器 [oracle@oracle-itcast ~]$ `sqlplus / as sysdba SQL*Plus: Release 11.2.0.1.0 Production on Thu Aug 13 10:42:37 2020 Copyright (c) 1982, 2009, Oracle. All rights reserved. Connected to an idle instance. # 启动oracle实例 SQL> `startup ORACLE instance started. Total System Global Area 759943168 bytes Fixed Size 2217224 bytes Variable Size 566233848 bytes Database Buffers 188743680 bytes Redo Buffers 2748416 bytes Database mounted. Database opened. # 实例被创建成功了
- 使用管理员账户登陆oracle服务器
-
第二种方式 (比较繁琐)
# 登录的linux的oracle用户, 打开终端, 通过命令启动oracle客户端, 通过客户端进行服务器连接 # /nolog 的意思是只连接不登录 [oracle@oracle-itcast ~]$ sqlplus /nolog (表示无登陆连接) SQL*Plus: Release 11.2.0.1.0 Production on Thu Aug 13 10:46:58 2020 Copyright (c) 1982, 2009, Oracle. All rights reserved. # 使用管理员身份登录到oracle服务器 # conn == connect(两个都对, 用谁都行) SQL> `conn / as sysdba Connected. # 登录成功 # 启动实例 SQL> `startup ORACLE instance started. Total System Global Area 759943168 bytes Fixed Size 2217224 bytes Variable Size 566233848 bytes Database Buffers 188743680 bytes Redo Buffers 2748416 bytes Database mounted. Database opened.
-
关闭数据库实例
- 首先进入到sqlplus客户端中,然后使用命令:
shutdown immediate
# 通过sqlplus工具执行这个命令 SQL> `shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. # 关闭成功
- 首先进入到sqlplus客户端中,然后使用命令:
4. 启动和关闭oracle监听器
oracle实例启动之后, 外部的远程客户端是不能连接成功的
- 在服务器内部有一个监听器, 如果这监听器的监听不启动, 是无法检测到外部连接的
- 启动oracle服务器的监听器之后, 就可以检测到远程的连接请求了
# 启动oracle服务器监听, 需要退出sqlplus客户端, 如果没有退出, 直接通过下面的命令退出
# 客户端退出对服务器端没有任何影响
SQL> exit / quit
-
启动监听器:
lsnrctl start
# 在oracle用户下打开一个终端, 执行如下命令: [oracle@oracle-itcast ~]$ `lsnrctl start LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 13-AUG-2020 10:57:31 Copyright (c) 1991, 2009, Oracle. All rights reserved. Starting /u01/app/oracle/product/11.2.0/db_1/bin/tnslsnr: please wait... TNSLSNR for Linux: Version 11.2.0.1.0 - Production System parameter file is /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora Log messages written to /u01/app/oracle/diag/tnslsnr/oracle-itcast/listener/alert/log.xml Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))) Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))) Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521))) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 11.2.0.1.0 - Production Start Date 13-AUG-2020 10:57:31 Uptime 0 days 0 hr. 0 min. 5 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora Listener Log File /u01/app/oracle/diag/tnslsnr/oracle-itcast/listener/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))) (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))) The listener supports no services The command completed successfully
-
关闭监听器
[oracle@oracle-itcast ~]$ `lsnrctl stop LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 13-AUG-2020 10:58:12 Copyright (c) 1991, 2009, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521))) The command completed successfully
2.5 使用sqlplus登录oracle服务器
sqlplus对应的是应进程 -> 客户端进程 -> 对服务器进行连接和操作
- exit/quit , 退出客户端对服务器没有影响
- 如果要连接服务器必须保证服务器实例已经启动了
- 使用任意的客户端工具
sqlplus
(原生, 非原生)进行服务器的连接和登录
- 本地
- 远程(需要指定服务器的ip地址和端口号,以及实例名)
- 只要数据库实例被创建了, 可以使用任意用户向服务器发起连接
-
登录
-
sys用户 -> sysdba
# 本地服务器登录 # 本地登录是不会进行秘钥校验的, 因此用户名和密码都可以省略不写 $ sqlplus / as sysdba $ sqlplus sys/密码 as sysdba # 远程的服务器登录 # 使用远程的客户端工具 # 语法: sqlplus 用户名/密码@oralce服务器对应的主机的IP地址:端口/实例名 as sysdba # oralce服务器对应的主机的IP地址: 通过 ifconfig 可以得到 # oracle服务器默认绑定的端口: 1521 (安装的时候指定的, 不修改端口: 1521) # oracle服务器默认的实例名:orcl (安装的时候指定的, 不修改实例名: orcl) # 远程登录管理员的用户名和密码也是不能省略的 $ sqlpus usr/passwd@ip:1521/orcl as sysdba
-
其他用户
# 本地登录 $ sqlplus 用户名/密码 # 远程登录 # 语法: sqlplus 用户名/密码@oralce服务器对应的主机的IP地址:端口/实例名 $ sqlpus usr/passwd@ip:1521/orcl
-
-
用户的切换
在oracle服务器中, 可以运行多个用户登录, 当前使用哪个用户就切换到那个用户
切换用户使用的命令:
conn
或者connect
在进行用户切换的时候, 要保证已经使用sqlplus连接到了oracle服务器上
# 什么时候才能切换用户? -- 必须要保证数据库实例的已经存在了 # 语法格式: conn 用户名/密码 or connect 用户名/密码 # 举例: [oracle@oracle-itcast ~]$ `sqlplus scott/tiger # 查看用户 SQL> `show user USER is "SCOTT" # 切换到管理员, 需要添加 as sysdba SQL>`conn / as sysdba Connected. SQL> `show user USER is "SYS" # 切换到scott用户 SQL> `conn scott/tiger Connected. # 切换到system用户 SQL> `conn system/system Connected. SQL> `show user USER is "SYSTEM"
-
查看当前用户
SQL> `show user
-
查看当前用户下的表
select* from tab; -- 举例 SQL> conn scott/tiger ERROR: ORA-28002: the password will expire within 7 days Connected. SQL> select * from tab; TNAME TABTYPE CLUSTERID ------------------------------ ------- ---------- BIN$mMnkyUVCz7zgUAB/AQAblQ==$0 TABLE -- 被删除的数据库表, 在回收站, 是可以还原的 BIN$mMnkyUVFz7zgUAB/AQAblQ==$0 TABLE BIN$mMnkyUVGz7zgUAB/AQAblQ==$0 TABLE BIN$mMnocU69zc3gUAB/AQAbmQ==$0 TABLE BONUS TABLE -- 正常的数据库表 DEPT TABLE EMP TABLE SALGRADE TABLE 8 rows selected.
2.6 锁定或解锁用户
在oracle中比如创建新用户, 创建出来之后这个用户是不能使用
- 新创建的用户默认是锁定的状态, 被锁定的用户我们是不能做任何操作的
- 通常我们遇到oracle用户
密码输入多次错误
或者长时间不登录
之后,那么用户就会变成锁定状态 。- 登录密码过期了, 账号有可能被锁定
如果用户被锁定了, 就不能对用户名下的任何数据做任何操作
用户的锁定和解锁都是通过管理员用户在完成操作的
-sys用户
-
语法
-- 解锁用户 alter user 用户名 account unlock; -- 锁定用户 alter user 用户名 account lock;
-
锁定用户举例
# 登录到sys用户 SQL> `conn / as sysdba Connected. # 用户锁定 SQL> `alter user scott account lock; User altered. # 登录到scott用户 SQL> `conn scott/tiger; ERROR: ORA-28000: the account is locked Warning: You are no longer connected to ORACLE.
-
用户解锁举例
# 切换到sys用户 SQL> `conn / as sysdba Connected. # 用户解锁 SQL> `alter user scott account unlock; User altered. # 登录解锁用户 SQL> `conn scott/tiger; ERROR: ORA-28002: the password will expire within 7 days Connected. # 查看用户 SQL> `show user; USER is "SCOTT"
2.7 修改用户密码
# 当前用户可以修改自己的密码
# 比当前用户权限高的用户也可以修改这个用户的密码, 比如: sys
# 语法:
alter user 用户名 identified by 密码;
-
举例
SQL> `conn scott/tiger; ERROR: ORA-28002: the password will expire within 7 days Connected. SQL> `show user; USER is "SCOTT" SQL> alter user scott identified by 123456; User altered. SQL> `conn scott/tiger; ERROR: ORA-01017: invalid username/password; logon denied Warning: You are no longer connected to ORACLE. SQL> `conn scott/123456; Connected.
2.8 查看当前语言环境(了解)
# 使用sqlplus先登录到oracle服务器
$ sqlplus / as sysdba
SQL> `select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.AL32UTF8
2.9 sqlplus下查询数据的显示
-
设置每行显示的最大字节数
-- 是通过sqlplus客户端进行设定 sql> set linesize 当前行的最大字节数(整数);
-
设置显示的行数
-- 一个分页显示的最大行数 sql> set pagesize 最大行数(整数);
4. 一些问题的解决方式
1. 数据导入
-
提供了脚本文件, 里边是测试数据
SCOTT.sql
使用plsql 客户端工具连接oracle服务器->
使用sys用户登录
-
从工具栏中找
打开
图标打开磁盘上的脚本文件
scott.sql
-
执行 这个脚本文件
-
切换到scott用户
下查询数据是否被成功导入
2. ora-12541
通过客户端
sql*plus
远程连接oracle服务器, 在连接的时候, 会出现这个错误错误描述:
ora-12541: TNS: 无监听程序
-
解决方案
# 1. 确定服务器的监听是是不是打开了 主要在服务器端执行一个shell命令: $ lsnrctl start # 确定这个命令执行了, 并且成功了, 监听启动之后, 需要等一会儿, 半分钟左右再去连接 # 2. 如果上边的操作已经做过了, 但是还是出现这个错误, 需要修改当前linux主机的主机名 # 修改主机名的操作步骤如下: 1. 切换到root用户, 主要是通过root用户的权限做后续的操作 $ su root 2. 打开 /etc/hostname 配置文件 $ vim /etc/hostname 1>. 将这个文件中原来的内容删除, 得到空文件 2>. 指定一个主机名, 写到第一行, 保存退出 3. 打开 /etc/hosts $ vim /etc/hosts 1>. 将第二步指定的主机名添加到文件第一行的最后 2>. 保存退出 4. 重启linux $ reboot
3. 中文乱码的问题解决
在window中添加一个环境变量NLS_LANG 值为 AMERICAN_AMERICA.AL32UTF8, 重启或者注销电脑使其生效