关于oracle的安装,数据库的创建略,从网络配置开始
我是直接改文件,建议用Net Configuration Assistance或者Net Manager
(因为开始用NCA在测试连接那边一直卡着,就是不显示连接成功也不显示失败,如果你遇到和我一样的问题再尝试参考这篇博客改文件的)
先了解一下实例的概念
数据库实例(instance)是一组用于管理数据库文件的内存结构。
数据库是一组位于磁盘上的物理文件,通过 CREATE DATABASE 语句创建。实例管理相关的数据,并且为数据库用户提供服务。
每个正在运行的 Oracle 数据库至少与一个实例相关联。因为实例存在于内存中,而数据库存在磁盘上,所以实例可以独立于数据库存在,数据库也可以独立于实例存在。
一台服务器上可以同时运行多个实例,每个实例管理各自的数据库。例如,某台服务器上拥有两个不同的数据库:prod1 和 prod2。一个实例管理 prod1另一个实例管理 prod2。
- SID:一个数据库可以有多个实例(如RAC),SID是用来标识这个数据库内部每个实例的名字,就好像一
个部门里,每个人都有一个自己的名字。 - SERVICE_NAME:是这个数据库对外宣称的名字,外面的人要想连接我这个数据库,你就在客户端的连接串里写上service_name。它就像一个部门的名字,这个部门的名称在看门大爷(listener)那里有登记,看门大爷一看你是要找SERVICE_NAME这个部门,就告诉你我们公司确实有这个部门,于是你就找到了,连接就建立了。
一句话来说就是:SID是对内的,是实例级别的一个名字,用来内部之间称呼用。SERVICE_name是对外的,是数据库级别的一个名字,用来告诉外面的人,我数据库叫"SERVICE_NAME"。
远程连接的原理
oracle的两个进程
- OracleOraDB19Home1TNSListener (oracle的监听器服务)
- OracleServiceORCL (oracle的数据库服务)
要使用oracle数据库,这2个服务是必须启动的
Listener和Service对应的参数文件(位置在 Oracle主目录(Oracle 数据库软件的安装位置)\network\admin\):
- listener.ora
- tnsnames.ora
用户要想访问数据库,首先要和数据库建立连接,连接到数据库实例上,通过实例访问数据库。
用户如何连接到实例上,需要借助oracle的监听
用户连接到oracle借助的是sqlplus(sqlplus 用户名/密码@ip地址:端口/数据库名)命令,
- 首先,用户根据ip地址和端口号找到监听
- 然后,监听询问用户访问的服务名
(如果数据库有域名,则数据库服务名就是全局数据库名;否则,数据库服务名与数据库名相同。)- oracle会把服务名和实例名注册到监听,并有一个映射关系
- 根据访问的服务名找到实例名
- 与实例建立连接
- 验证sqlplus提供的用户名和密码
开始实验
参考博客1:https://blog.youkuaiyun.com/shark_chili3007/article/details/104074203
参考博客2:https://blog.youkuaiyun.com/forever_river/article/details/55823875
我是先参考的博客1,然后新的监听进程出现了,listener.ora和tnsnames.ora这两个文件也自动更新了,but在测试连接的时候失败了(没保存截图)
然后我又参考了博客2,手动修改listener.ora和tnsnames.ora这两个文件,再次此时连接,完成。测试了客户端(我作为服务端,同学尝试连接了我的oracle)和服务端(自己连自己的试了一下)
出现超时的话把防火墙关了应该就没问题了,先ping一下看看
-
同学连我的
-
自测
-
我连同学的
上面两种连接都是根据ip地址+端口号,后面接的orcl是service_name(数据库全局域名)
也可以通过服务名连接【sqlplus [username]/[password]@[网络服务名,那个ORCL]】,但这个要在tnsnames.ora进行配置,得和对方统一,所以我的建议是用上面那种。
- 1521端口:sqlplus system/1234@ORCL
- 1530端口:sqlplus system/1234@ORCL1(大小写都OK)
最后附上我自己的配置文件
这个文件下:D:\Oracle\Oracle_software\network\admin,Oracle_software是我oracle软件安装的目录
listener.ora
# listener.ora Network Configuration File: D:\Oracle\Oracle_software\NETWORK\ADMIN\listener.ora
# Generated by Oracle configuration tools.
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
# IPC的只能有一个
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = D:\Oracle\Oracle_software)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:D:\Oracle\Oracle_software\bin\oraclr19.dll")
)
(SID_DESC =
(SID_NAME = ORCL )
(ORACLE_HOME = D:\Oracle\Oracle_software)
(GLOBAL_DBNAME = ORCL)
)
)
# 新的监听程序
LISTENER1 =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = [ip地址,改成自己的])(PORT = 1530))
)
)
SID_LIST_LISTENER1 =
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = D:\Oracle\Oracle_software)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:D:\Oracle\Oracle_software\bin\oraclr19.dll")
)
(SID_DESC =
(SID_NAME = ORCL )
(ORACLE_HOME = D:\Oracle\Oracle_software)
(GLOBAL_DBNAME = ORCL)
)
)
tnsnames.ora
# tnsnames.ora Network Configuration File: D:\Oracle\Oracle_software\NETWORK\ADMIN\tnsnames.ora
# Generated by Oracle configuration tools.
ORACLR_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
(CONNECT_DATA =
(SID = CLRExtProc)
(PRESENTATION = RO)
)
)
LISTENER_ORCL =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
LISTENER_ORCL1 =
(ADDRESS = (PROTOCOL = TCP)(HOST = [ip地址,改成自己的])(PORT = 1530))
# orcl是网络服务名
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
# service_name是数据库全局域名/服务名
(SERVICE_NAME = orcl)
)
)
ORCL1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = [ip地址,改成自己的])(PORT = 1530))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
不用文件,用可视化的
改这边的ip地址就行
把数据库开启到不同的状态
我理解的oracle database就是一组文件(控制文件,数据文件,联机重做日志文件等),而oracle实例(oracle instance)就是oracle的管理系统,用于操作文件。数据库和实例是一对一的关系。
-
查看数据库状态:
select status from v$instance;
-
sqlplus / as sysdba
后查询状态为open(不知道为啥我初始就是open) -
关闭数据库:
shutdown normal
后再查询数据库状态报错ORACLE not available
,因为数据库实例都被关闭了
-
然后要启动实例就是:
startup nomount
,当前状态STARTED
alter database mount
:MOUNTED
alter database open
:OPEN
-
然后再打开控制文件:
startup mount
-
再打开数据文件:
startup open
不同关闭
shutdown nomal
:正常方式关闭数据
阻止任何用户建立新的连接。
等待当前所有正在连接的用户主动断开连接
一旦所有的用户都断开连接,则立即关闭、卸载数据库,并终止实例。shutdown immediate
:立即关闭方式
阻止任何用户建立新的连接,同时阻止当前连接的用户开始任何新的事务。
不等待在线用户主动断开连接,强制终止用户的当前事务,将任何未提交的事务回退。
直接关闭、卸载数据库,并终止实例。shutdown transactional
:事务关闭方式
阻止任何用户建立新的连接,同时阻止当前连接的用户开始任何新的事务。
等待所有未提交的活动事务提交完毕,然后立即断开用户的连接。
直接关闭、卸载数据库,并终止实例。shutdown abort
:强制关闭
shutdown abort阻止任何用户建立新的连接,同时阻止当前连接的用户开始任何新的事务。
不允许新的连接、不等待会话结束、不等待事务结束、不做检查点且没有关闭数据文件。
启动时自动进行实例恢复