环境:
- window server 2019
- oracle19c
- navicat15.0.11
- pl/sql developer 14.0.1 x64位
- .net framework4.5
- .netcore 3.1
oracle安装文件:
链接:https://pan.baidu.com/s/1jrD2Mg3gMPZp_btI-GtMXg
提取码:hnpt
plsql安装文件:
链接:https://pan.baidu.com/s/10Lh6dLzEAuDKga1MdlXZfA
提取码:b4uz
参考:
一、安装oracle19.3
安装包如下,大小为2.98G:
将它解压到c盘:
双击setup.exe进行安装:
因为密码设的太简单,下面弹出了警告框,直接点确定即可:
点击安装,下面等的时间要长,大概半小时:
看到上图说明安装成功了,点击关闭即可!
验证安装是否成功:
安装完毕后,打开命令行:
sqlplus /nolog
连按两次ctrl+c即可退出。
我们可以使用sqlplus登录后进行操作,如下是登录sys账户:
然后测一下tns联通性:
也可以登录web页面:https://localhost:5500/em/login
还可以查看下window服务:
此时,我们先来检查下listener.ora和tnsnames.ora的内容(这两个文件的位置可以从上面tnsping命令中看出来):
listener.ora:
tnsnames.ora:
二、使用navicate链接:
由于使用sys用户,所以需要在高级里设置以sysdba身份登录:
然后测试链接:
链接后如下:
三、使用pl/sql developer链接
四、修改配置文件,启用远程访问
4.1 修改oracle服务器的配置文件
找到对应位置的listener.ora和tnsnames.ora文件,在里面添加针对静态ip的监听和服务(实验的静态ip是:192.168.3.39):
- listener.ora
- tnsnames.ora
然后,重启Oracle服务和监听:
4.2 使用navicat连接oracle服务器
换一个计算机(不用安装oracle客户端),使用navicat进行连接,如下:
navicate:
4.3 使用pl/sql developer连接oracle服务器
虽然navicat可以在不安装Oracle客户端的情况下连接到远程oracle服务器,但这不代表pl/sql developer也可以。。。
下载oracle客户端:
地址:https://www.oracle.com/database/technologies/instant-client/downloads.html
也可以从我的网盘下载:
链接:https://pan.baidu.com/s/1GkOCX74h9Fre5CMpv-q4kA
提取码:ntpi
下载后如下:
将它解压到d盘即可:
然后,从oracle服务器拷贝tnsnames.ora文件到这个目录,如下:
然后,打开pl/sql developer,配置目录和oci.dll路径:
配置完成后重启pl/sql developer,输入连接信息如下:
点击确定后:
看到这里,说明已经连接成功了。
注意:
可能需要在客户端配置字符集,否则会提示如下:
这个时候,我们需要查看数据库中使用的字符集是哪个,然后在客户端的环境变量中设置,我的Oracle数据库用的是utf8,所以我设置如下(NLS_LANG=SIMPLIFIED CHINESE_CHINA.AL32UTF8
):
如果是gbk可以设置:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
五、c#连接oracle
新建.net 45控制台程序,安装Oracle.ManagedDataAccess
包(如果是.netcore程序安装:Oracle.ManagedDataAccess.Core
):
编写代码如下:
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Oracle.ManagedDataAccess.Client;
namespace OracleConnect
{
class Program
{
static void Main(string[] args)
{
var oracleConnection = new OracleConnection("Data Source=192.168.3.39/ORCL;Password=123456;User ID=sys;DBA Privilege=SYSDBA;");
oracleConnection.Open();
var cmd= new OracleCommand("select * from user_users", oracleConnection);
var adapter = new OracleDataAdapter(cmd);
var ds = new DataSet();
adapter.Fill(ds);
Console.WriteLine($"ds.Tables.Count={ds.Tables.Count},currentUserName={ds.Tables[0].Rows[0]["username"].ToString()}");
oracleConnection.Close();
Console.WriteLine("ok");
}
}
}
运行如下:
六、关于oracle逻辑体系
6.1 数据库与实例
数据库是一套完整的数据仓储,里面包含的数据、用户权限等信息。
实例是一组Oracle进程,这些进程加载了一个数据库,然后对外提供服务。
在oracle12c之前, 数据库和实例是1对多的关系。一般我们开发环境默认安装的话就是一个数据库对应一个实例(多个实例对应一个数据库的情况是RAC)。这一点和sqlserver差别比较大(sqlserver是一个实例对应多个数据库)。
在oracle12c之后, 出现了可插拔数据库(PDB)和容器数据库(CDB)的概念,这有点类似于sqlserver的实例和数据库的关系了,具体来说:安装oracle的时候选择“创建为容器数据库”,这样就安装了一个容器数据库和一个可插拔数据库了,我们可以把项目数据都放在可插拔数据库里,每个可插拔数据库都是相互独立的,这样只需要一个oracle实例就可以管理多个oracle数据库(PDB)了。
看下图:
6.2 数据库和表空间、用户、模式(Schema)的关系
- 一个Oracle数据库可以有多个表空间;
- 一个表空间可以对应多个实际的物理文件;
- 一个表空间可以供多个用户使用;
- 一个用户只能有一个默认的表空间(可以在用户使用过程中修改用户的表空间);
- 一个用户默认对应一个同名的模式(Schema),用户的其他对象(如:表、索引等)都在这个模式中。模式的概念主要是针对一系列资源对象来说的,而用户的概念主要是针对权限来说的。在oracle中用户和模式默认是1对1的,只允许创建用户,不允许创建模式;
- 访问数据库资源的完整名称是
schema.tablename
,比如:select * from user1.table1
;
它们的关系如下图:
6.3 用户角色、权限
oracle中的用户、角色和权限具有如下图关系:
总结来说:
- 可以将权限授予角色,然后将角色授予用户,这样用户就有了角色上的权限;
- 也可以直接将权限授予用户;
- 也可以将角色a授予另一个角色b,这样角色b将具有角色a的权限。
权限的概念:>权限分为两中(系统权限和用户权限)。
系统权限是针对用户设定的。而对象权限是用来控制用户访问其他用户模式对象的。
我们新建了一个用户并指定用户的默认表空间:
create user test1 identified by 123456 default tablespace data_test;
此时,test1还不能连接到oracle。。。
我们需要授予connect角色:
grant connect to test1;
这样我们就能使用test1连接Oracle了,不过我们连接后还不能创建表,所以我们还需要把resource角色授权给test1,如下:
grant connect,resource to test1;
其实,仅授予这两个角色还是会有限制,如果想在开发中省去配置权限的时候,可以将dba角色授予test1。
grant connect,resource,dba to test1;
不过需要注意两个地方:
- 即使你授予了dba角色,你也不能使test1以sysdba身份登录(经实验:localhost可以,其他的不可以)。
- 授予dba角色后,这个用户将可以修改所有的用户数据的权限,生产环境中慎用。
- 如果想精细控制用户的权限,可参考:《Oracle权限管理详解》
6.4 DBA角色和SYSDBA角色
DBA角色是实实在在存在oracle数据库中的,我们可以通过select * from dba_roles;
查询出来,而SYSDBA只是概念上的一种标识,你在dba_roles
中是查询不出来它的。用户sys默认具有sysdba特权。如果你想让新建的用户以sysdba的身份登录,那么你需要执行grant sysdba to user1;
。
需要注意的是: 无论你用什么用户登录,一旦你选择以sysdba登录并且成功后,系统将认为你是sys账户,如下:
可以看到,虽然我们使用test1的账号登录,但是由于我们以sysdba身份登录,所以登录后显示当前用户是sys,而不是test1。
6.5 oracle安装后默认的表空间
使用sys账户以sysdba登录后查询即可:
或者使用sql查询:
可以看到,默认新建了五个表空间(DATA_TEST是我建的),它们的作用如下:
- system/sysaux:
system是oracle元数据存放的表空间,sysaux是辅助表空间。Oracle会在这里记录数据库的资源对象和数据情况。
- temp:
临时表空间,相当于一个临时的垃圾场。用于排序操作,比如你要做一次大数据量的查询,但在内存无法存储这么大量的数据,然后会在磁盘上建立一个临时的表空间用记存放这些数据。
- UNDOTBS1:
Undo 类型的表空间,当你对一张表或一条记录进行修改的时候,它会对修改之前的信息进行保存,这样可以保证数据的回滚。Undo 只包含undo类型的对象,不能包含任何其他对象,只适合于数据文件和区间管理。
- USERS:
用户存储数据的表空间,在新建用户的时候,如果我们没有默认的表空间,那么这个用户就是用USERS作为默认表空间,之后用户新建的表和数据都会存储到USERS表空间里。
6.6 oracle安装后默认的角色
直接使用sql语句查询(sys账户以sysdba身份登录):
select * from dba_roles;
可以看到,默认有90个角色,我们只需要知道最常用的几个就可以了,比如:connect、resources、dba。。。
6.7 oracle安装后默认的用户
直接使用sql语句查询(sys账户以sysdba身份登录):
select * from dba_users;
可以看到,安装后就已经有这么多用户了,不过它们大多都没有开启使用,我们关系最长用的几个就好了,比如:sys、system。。。
6.8 对比oracle(12c以前)和sqlserver体系
sqlserver:
oracle:
6.9 oracle的备份和还原
在Oracle12c以前,我们针对一个项目开发的流程是这样的:
- 新建表空间(项目单独所有)
- 新建账户,默认表空间为上面新建的
- 给这个账户赋权
- 当环境迁移的时候,将这个表空间进行备份,然后将备份到的dmp文件拿到另一个oracle服务器上进行还原
- 继续开发。。。
那么oracle表空间备份和还原的命令是什么呢?
答:EXPDP
和PMPDP
。具体细节,参考:《关于oracle数据库备份还原-impdp,expdp》
七、给项目准备“数据库”
7.1 新建表空间
注:我实验的时候是在服务器上本地连接到oracle服务器的
首先,找到Oracle数据文件的目录,如下:
执行下面语句:
create tablespace data_test datafile 'C:\app\Administrator\oradata\ORCL\data_test1.dbf' size 50M;
这样一个表空间就创建成功了,可以观察下创建好的文件:
7.2 新建用户
执行下面的语句:
create user test1 identified by 123456 default tablespace data_test;
7.3 给用户授权
执行如下命令:
grant connect, resource,dba to test1;
授权之后,我们就可以进行操作了。
连接后,先来个查询:
接下来,进行其他常规操作:
实验到此结束。。。