[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ]
0x00 前言简述
描述:为了对得起作者UP主公众号【全栈工程师修炼指南】中的【全栈】二字,从今天开始作者选择一门自己工作中常常使用的到的以及全球最流行的关系型数据库 Oracle 来进行学习,并记录学习过程,以供后续的自己复习回顾和帮助各位看友快速上手,从入门到高新,请各位看友一定要关注、订阅【#Oracle学习之路】专栏。
上一章,我们以 Oracle 11g 版本为例简单介绍了Oracle 数据库体系结构,涵盖了 Oracle 11g 版本概述,以及分别针对体系结构中的逻辑存储结构、物理存储结构、内存结构、进程结构、数据库实例结构等几个方面进行简单的介绍,对于后续深入学习 Oracle DBA 打下一个坚实的基础,此章节,我们开始 Oracle 11g 数据库在企业服务器中的安装部署,以作者实践操作带领各位看友可以快速的进行Oracle 数据库相关环境的搭建部署,以及对Oracle Database 11g安装过程中存在的问题进行解决。
最后,也希望大家能关注【全栈工程师修炼指南】公众号和作者一起进行持续学习,并在看
,点赞
、转发
此文让更多的想从事DBA朋友做一个参考,算是对作者为爱发电(分享知识)的肯定与鼓励。
另外,若有需要作者近十年工作学习笔记
的可以访问《巧用 VScode 网页版 IDE 搭建个人笔记知识库!》文章获取。
0x01 Oracle 11g 数据库部署
1.环境准备
环境说明:
操作系统: Windows Server 2008 R2
Oracle 数据库版本: Oracle Database 11g Release 2 (11.2.0.1.0) for Microsoft Windows (x64)
数据库下载
特别注意: 由于Oracle 11g、12c 已经过了支持时期,Oracle 官网已经进行归档,不再官网页面提供下载,因此需要到 Oracle 归档页面进行下载,下面参考作者的操作步骤进行下载。
Step 1.浏览访问Oracle 软件交付云页面 [https://edelivery.oracle.com/ ] 并注册登录,选择 下载软件包
,输入 Oracle Database 11g
, 点击 搜索
。
Step 2.选择后点击右上角的 Continues
,进入 Oracle 11g 数据库下载页面,并选择对应的操作系统版本即可,此处为了后续学习使用我将 Windows 和 Linux 版本都进行下载。
Step 3.点击 Continues
进入到下一步,勾选同意许可,再次点击 Continues
。
Step 4.最后将进入到下载页面,选择 Download
按钮或者点击Zip分卷压缩文件后的zip包
进行下载。
Step 5.最后将下载好的分卷压缩包上传到服务器上,并解压到C盘或者当前目录下。
# 注意:依次解压下面的压缩文件
VV20610-01_1of2.zip
VV20610-01_2of2.zip
2.安装实践
描述:通过堡垒机登录到 Server 2008 R2 服务器,找到解压 Oracle 11g 数据库安装压缩包的目录,例如作者解压的根目录 C:\oracle\
,然后以管理员权限运行 C:\oracle\database\setup.exe
, 弹出如下安装界面。
Step 1.配置安全更新(可以直接跳过), 点击下一步即可进行安装选项,选择【创建和配置数据库
】, 安装类型选择【服务器版本
】,不要选择桌面版本。
Step 2.可以选择典型安装配置目录信息,依次配置Oracle根目录
/软件位置
/数据库文件位置
等参数
数据库版本: 企业版
字符集: Unicode(AL32UTF-8)
全局数据库名称: orcl
设置后面sysdba的密码,注意密码中不能出现
@.
符,如果不设置密码则默认密码为 manager。
Step 3.等待安装条件检测(然后显示出概要),此处您可以保存响应文件,以便于相同的机器进行命令行安装使用。
Step 4.点击【下一步
】,进行安装Oracle产品,注意此处需要等待几分钟安装时间。
Step 5.安装完成之后会然我们管理Oracle数据库账号密码(是否停用等打勾为确定锁定),特别注意为了安全建议各个账号的密码不能设置相同。
Step 6.此外启用了Oracle EM 服务的,还可通过客户端或者是网页端连接数据库,例如地址 https://localhost:1158/em/console/logon/logon
Enterprise Manager 配置主要功能:
管理员账号密码设置,补丁管理,封锁连接,管理包访问以及监控数据库
实例显示,主目录以及运行情况等待,备份和恢复
Step 7.通过上述操作,Oracle 11g 数据库安装部署完成,查看是否进行如下环境变量的设置。
# Oracle 数据库环境变量设置
setx /M ORACLE_HOME "C:\app\Oracle\product\11.2.0\dbhome_1"
setx /M PATH "%PATH%;%ORACLE_HOME%\BIN"
# 语系设置
NLS_LANG = SIMPLIFIED CHINESE_CHINA.ZHS16GBK
# 监听目录
setx /M TNS_ADMIN "%ORACLE_HOME%\NETWORK\ADMIN"
Step 8.查看Windows 服务以此验证Oracle是否正常实例及监听。
# 看服务 ORCL表示实例名称
- OracleServiceORCL (启动)#@不建议自启
- OracleRemExecService
- OracleOraDb11g_home1TNSListener #@不建议自启
- OracleMTSRecoveryService
- OracleDBConsoleorcl
- OracleVssWriterORCL
- OracleOraDb11g_home1ClrAgent(未启动)
- OracleJobSchedulerORCL
#看端口
TCP 127.0.0.1:1521 0.0.0.0:0 LISTENING 2828
TCP 127.0.0.1:1521 127.0.0.1:49192 ESTABLISHED 2828
#看状态
lsnrctl status #查看oracle状态
LSNRCTL for 64-bit Windows: Version 11.2.0.1.0 - Production on 28-8月 -2019 11:1
2:52
Copyright (c) 1991, 2010, Oracle. All rights reserved.
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521))) LISTENER 的 STATUS
------------------------
别名 LISTENER
版本 TNSLSNR for 64-bit Windows: Version 11.2.0.1.0 - Produ
ction
启动日期 28-8月 -2019 09:58:26
正常运行时间 0 天 1 小时 14 分 27 秒
跟踪级别 off
安全性 ON: Local OS Authentication
SNMP OFF
监听程序参数文件 C:\app\Oracle\product\11.2.0\dbhome_1\network\admin\listener.ora
监听程序日志文件 c:\app\oracle\diag\tnslsnr\WIN-76Q3KD7PI52\listener\alert\log.xml
监听端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1521ipc)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521)))
服务摘要..
服务 "CLRExtProc" 包含 1 个实例。实例 "CLRExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
服务 "orcl" 包含 1 个实例。实例 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
服务 "orclXDB" 包含 1 个实例。实例 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
命令执行成功
Step 9.Oracle 数据库实例和监听的停止与启动。
停止
# 1.服务器中命令行执行如下命令,停止实例。
sqlplus "/ as sysdba"
# --- 该实例将关闭数据库并关闭,从而结束此实例的生命周期。
SQL> SHUTDOWN IMMEDIATE
# 2.服务器中命令行执行如下命令,停止监听。
lsnrctl stop
# 3.最后以管理员身份运行该脚本,停止Oracle服务相关命令。
# OrclService_Stop.bat
net stop "OracleDBConsoleorcl"
net stop OracleOraDb11g_home1TNSListener
net stop OracleServiceORCL
pause
exit
启动
# 1.首先以管理员身份运行该脚本,启用Oracle服务相关命令。
# OrclService_Start.bat
net start "OracleDBConsoleorcl"
net start OracleOraDb11g_home1TNSListener
net start OracleServiceORCL
pause
exit
# 2.服务器中命令行执行如下命令,停止实例。
sqlplus "/ as sysdba"
# --- 创建一个实例,该实例将挂载并打开数据库
SQL> STARTUP
ORACLE instance started.
# --- 此查询显示当前实例的启动时间。
SQL> SELECT
TO_CHAR(STARTUP_TIME,'MON-DD-RR HH24:MI:SS')
AS "Inst Start Time" FROM V$INSTANCE;
特别注意:
安装完之后oracle默认配置的监听是localhost,如果不仅仅是本地访问,需要其他机器能访问到的话需要修改监听的地址。
#开始 -> Oracle - OraDb11g_home1 -> 配置和移植工具 -> net manager (只是本身的ps/SQL连接的时候生效)
-> 服务命名 -> 数据库名称(比如我这里orcl) -> 地址配置 -> 127.0.0.1 1521
#保存配置
文件 -> 保存网络配置
#监听程序设置机器IP
# -> 数据库服务 -> 添加数据库 -> Oracle主目录就是ORACLH_HOME
# -> 监听地址 -> 将localhost改成外部IP地址 -> 192.168.1.129
Oracle 11g 数据库安装完毕后,一些注册表路径。
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Oracle11
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\Oracle Services for MTS
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\Oracle.VSSWriter.ORCL
0x02 客户端安装
1.PLSQL Developer 12(64bit)
描述:Oracle数据库的客户端工具,可以连接到外部Oracle数据库进行操作,这里我们可以使用PLSQL Developer 12(64bit)(简称 PL/SQL)进行连接Oracle数据库。
在此之前,我们需要从官网下载【PL/SQL】以及【instantclient_11_2】的安装包,你可以自行Google进行下载,也可以关注公众号【全栈工程师修炼指南】回复【oracle-20240804
】进行获取Oracle数据库的安装包及其相关工具。
Step 1.安装PL/SQL Developer 12(64bit) 以及解压 instantclient_11_2 到 ChoromeDownload 目录中。
Step 2.在instantclient_11_2
解压目录中,更改下载的tnsnames.ora
修改成为您要连接的Oracle服务器的IP端口以及服务名称等待,并且设置环境变量
192.168.1.129_bd =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.129)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
# 设置环境变量(指向instantclient_11_2并解压的目录)
setx /M TNS_ADMIN "F:\ChoromeDownload\instantclient_11_2"
Step 3.打开安装的PL/SQL软件,进行配置oci依赖库: F:\ChoromeDownload\instantclient_11_2\oci.dll
Step 4.然后点击【Session
】,点击【Logon
】,选择登录 192.168.1.129_bd
(前面在tnsnames.org文件中配置)数据库输入账号密码即可
192.168.1.129:1521/orcl
Step 5.使用 PLSQL 登录到数据后,通过如下SQL查看数据库视图中存储数据库的状态模式。
SQL> select open_mode from v$database;
OPEN_MODE
--------------------
READ WRITE
2.Navicat Premium 12
描述:除了可以使用PL/SQL客户端工具进行连接Oracle数据库外,我们也可以使用Navicat Premium 12(64bit)进行连接Oracle数据库。
温馨提示:Navicat 目前推出一款免费个人使用 lite 版本,可以满足我们日常开发使用,建议各位看友从官网下载安装,或者关注公众号【全栈工程师修炼指南】回复【oracle-20240804
】进行下载。
Step 1.安装并打开 Navicat Premium 12(64bit) 后,点击【工具】->【选项】->【环境】,配置 oci library 路径,为前面解压的 F:\ChoromeDownload\instantclient_11_2
目录,点击确定。
Step 2.新建连接,可以看到Navicat支持众多的数据库连接,选择Oracle数据库、
Step 3.填写连接名称、主机名、端口号、用户名和密码,然后测试连接,若连接成功,则点击【确定】。
温馨提示:如果本机安装有Oracle数据库的话直接在Oracle根目录下安装 C:\app\Oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora
文件进行修改配置配置oracle客户端的监听;
0x03 补充知识
知识1.Oracle监听器的静态注册与动态注册区别
如何查询某服务是静态注册还是动态注册?
# 在运行 lsnrctl status 常会看到如下返回值:
服务Orcl包含1个例程。
例程"mydata",状态 UNKOWN,包含此服务的一个处理程序。
服务Orcl包含1个例程。
例程"mydata",状态 READY,包含此服务的一个处理程序
服务Orcl包含1个例程。
例程"mydata",状态 BLOCK,包含此服务的一个处理程序
1.静态注册由于静态注册参数是手动静态添加与数据库无关
, 监听配置中数据库服务中的全局数据库名写任意内容与数据库无关
,只要保证SID正确即可连上数据库。数据库无法确认监听是否正确配置因此lsnrctl中的status显示状态为unkown
,即不保证能连通数据库;
监听器用来表明它不知道关于该实例的任何信息,只有当客户发出连接请求时,它才检查该实例是否存在,
# 在 listerner.ora 配置文件
> lsnrctl status
服务"WeiyiGeek"包含1个例程。
例程"mydata" 状态UNKOWN,包含此服务的一个处理程序
# WeiyiGee 从监听配置过程,数据库服务中的“全局数据库名”读到的值(即配置文件中GLOBAL_DBNAME的值)
# "mydata" 从监听配置中,数据库服务中SID读到的值(即SID_NAME的值)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = WeiyiGeek)
(ORACLE_HOME = /orahome/oracle/product/10.2.0/db_1)
(SID_NAME = mydata)
)
)
# 在 tnsname.ora 配置文件
服务名SERVICE_NAME即为WeiyiGeek,否则连接不到数据库。
# 在客户端连接服务器时,填写的主机字符串即为此服务命名192.168.1.129_bd
192.168.1.129_bd =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.129)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = WeiyiGeek) #关键点哟
)
)
静态注册监听不知道实例的具体状态,所以监听启动之初查看实例信息其状态信息显示为 UNKNOWN.例如:
> lsnrctl status LISTENER_PHAMR
Copyright (c) 1991, 2010, Oracle. All rights reserved.
Service "phamr" has 1 instance(s). 监听状态中的服务名
Instance "phamr", status UNKNOWN, has 1 handler(s) for this service... 监听状态中的实例名
2.动态注册描述: 动态注册的数据库通过状态信息中的状态READY或状态BLOCKED(对于一个备用数据库)来指明。不管何时关闭数据库,动态注册的数据库都会动态地从监听器注销,而与之相关的信息将从状态列表中消失。不管数据库是在运行还是已经关闭,监听器总是知道它的状态;该信息将被用于连接请求的回退(fallback)和负载平衡。
pmon 在数据库启动到mount或open时动态从参数文件中读取service_names
值缺省为dbca建立数据库时的全局数据库名(orcl)。设置参数service_names
为'a,b,c',命令如下:alter system set service_names='a,b,c'
;
# lsnrctl 状态如下:
服务“test”包含1个例程。
例程"WeiyiGeek",状态 UNKOWN,包含此服务的一个处理程序
服务"a"包含1个例程。
例程"WeiyiGeek",状态 READY,包含此服务的一个处理程序
服务"b"包含1个例程。
例程"WeiyiGeek",状态 READY,包含此服务的一个处理程序
服务"c"包含1个例程。
例程"WeiyiGeek",状态 READY,包含此服务的一个处理程序
服务 "WeiyiGeek" 包含一个例程。
例程"mydata",状态 READY, 包含此服务的一个处理程序
# 以上服务名a, b, c, WeiyiGeek都为READY为动态注册, 注意这里最后一条WeiyiGeek是PMON缺省动态注册到监听器内的。
不管参数service_names为何值pmon都会自动以全局数据库名(这里为WeiyiGeek)为服务名,动态注册一个监听。
自定义端口的动态监听注册若要启用非默认端口1521的动态监听注册,缺省状态Oracle不会进行动态注册。要启用动态注册,必须设置local_listener参数,并在服务端配置tnsnames.ora指定监听参数
,或者直接通过修改local_listener指定监听参数。步骤如下:1.服务端: Net Manager 配置监听程序,监听端口为1525(非默认端口)并且保存配置 2.指定监听参数
# 方式1:直接通过修改local_listener参数指定
SQL>alter system set LOCAL_LISTENER='(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.23)(PORT=1525))';
System altered
SQL>alter system register
System altered
# 方式2:在Oracle服务器端建立$ORACLE_HOME/network/admin/tnsnames.ora 解析文件位置并填入如下内容
WeiyiGeekOracleLogin =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS=(PROTOCOL=TCP)(HOST = 192.168.1.23)(PORT = 1525))
)
)
# 设置参数指定通过tnsnames.ora内的信息指定监听参数
SQL>alter system set local_listener=WeiyiGeekOracleLogin;
System altered
SQL>alter system register;
监听动态注册时的实例状态,来自PMON进程动态注册时的实例3种状态READY、BLOCKED和RESTRICED
READY:表示数据库实例已经处于mount或者open状态,可以接受客户端连接
BLOCKED:表示数据库实例还处于nomount状态或者该实例类型为ASM实例,不接受客户端连接,如果这时候客户端去连接数据库会报ora-12528错误
RESTRICED:表示数据库处于RESTRICED模式,不接受普通权限的远程客户端连接,如果这时候客户端去连接数据库会报ora-12526错误
动态与静态区别总结:1.静态注册(手动填写参数): 状态为 "Unknown"
而是通过搜索Listener.ora找到匹配的service后进行注册相应的服务
global_dbname
对应的是oracle对外的服务名,即初始化参数里的service_names
sid_name
对应的是oralce实例的名称,即初始化参数里的instance_name
2.动态注册(由PMON进程自动从参数文件获取): 状态为 "READY"
缺省情况下若启用动态注册监听端口号必须为1521,若启用其他端口的动态监听注册必须要做相关配置即(自定义端口的动态监听注册监听端口)
要实现动态注册,数据库的实例至少要处于nomount状态
注意事项:
静态注册监听客户端在配置tnsnames.ora服务命名时,"(Oracle 8i或更高版本)服务名"里填写内容要与
服务端静态注册监听器时的全局数据库名一致,
否则无法连通。如果在数据库实例启动后再启动监听器(Listener.ora文件中不需要配置相关的SID信息), PMON会自动对监测到的Service进行注册.
实例既可以动态注册也可以同时是静态注册,状态分别显示为READY和UNKNOWN
0x0n 入坑出坑
问题1.新手面临最容易出错的两个文件
Oracle 在安装完毕后将会在 C:\app\Oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN
目录中,生成两个监听配置文件(主) listener.ORA
,以及监听登录配置文件(从) tnsnames.ORA
,这两个文件在 Oracle 数据库的网络连接和通信中起着关键作用。
listener.ora 文件: 用于配置监听器的参数和属性,控制监听器如何接受和处理客户端连接请求, 即是监听器本身的属性和行为。(服务端)
tnsnames.ora 文件: 用于定义客户端如何连接到数据库实例,提供了数据库实例的连接信息,以便客户端应用程序能够正确连接到数据库。(客户端)
正常监听(连接)配置文件参考
# listener.ora Network Configuration File: C:\app\Oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.ora
# Generated by Oracle configuration tools.
# listener.ora文件两大模块
# SID_LIST_LISTENER 模块:配置监听的静态注册特性,包含数据库服务名、ORACLE_HOME、实例名等信息。
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = C:\app\Oracle\product\11.2.0\dbhome_1)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:C:\app\Oracle\product\11.2.0\dbhome_1\bin\oraclr11.dll")
)
(SID_DESC =
(GLOBAL_DBNAME = orcl) #数据库服务名称
(ORACLE_HOME = C:\app\Oracle\product\11.2.0\dbhome_1)
(SID_NAME = ORCL) #实例名称
)
)
# LISTENER 模块:监听名字、连接协议、监听主机、监听端口等基本配置信息
# 监听默认名字是LISTENER也可以配置别名
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.129)(PORT = 1521))
)
)
ADR_BASE_LISTENER = C:\app\Oracle
# tnsnames.ora Network Configuration File: C:\app\Oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora
# Generated by Oracle configuration tools.
LISTENER_ORCL =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
ORACLR_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
(CONNECT_DATA =
(SID = CLRExtProc)
(PRESENTATION = RO)
)
)
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
# 配置远程连接重要参数
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
问题2.连接 Oracle 11g 数据库并打开时报 ORA-29275: partial multibyte character 错误。
问题: 利用Native打开Oracle数据库时报ORA-29275错误。原因: 与字符集存储方式有关系,可以修改客户端和服务器的字符集存储方式。
温馨提示:作者最近10年的工作学习笔记(涉及网络、安全、运维、开发),需要学习实践笔记的看友,可添加作者账号[WeiyiGeeker],当前价格¥199,除了获得从业笔记的同时还可进行问题答疑以及每月远程技术支持,希望大家多多支持,收获定大于付出!
如果此篇文章对你有帮助,请你将它转发给更多的人!
学习推荐 往期文章
若文章写得不错,不要吝惜手中转发,点 👍、在看,若有疑问的小伙伴,可在评论区留言你想法哟💬!