目的:
windows 系统下,实现:
1多台机器之间的通信。如有四台机器且在一个子网内,要先把机器连起来,能够互相ping,然后继续后续
2第二件事情,是搭建Oracle服务/客户端环境。为了更加贴近实际场景,选择把服务端和客户端放在不同的机器上(一般的教程可能是会选择放在同一台机器)。
过程
1搞定机器和通信
首先拿到多台计算机,一个路由器,网线/无线网卡若干,把硬件搭好。
以其中一台计算机A为例,CMD --- ipconfig 结果如下:
为了把服务端和客户端放在不同的机器上(后面甚至会是有多台机器上有相同服务器以形成服务器集群的形式),先要实现机器之间的通信。
问题:但是发现连接子网内多台windows 机器(在同一个子网内部)无法ping通。
解决:既然都在一个内网,网线等物理因素都是OK的,那便可能是防火墙的问题,选择关掉。先把所有的机器的网络类型设为专属网络,然后关掉专属网络下计算机的的防火墙,然后测试,发现可以ping通。
网络防火墙设置的详细步骤参考:/article/f3ad7d0f344d6209c3345b05.html
2搭建Oracle服务/客户端
操作系统是win10 64位;
1.1首先装一下java环境(略);
1.2然后去如下官网下载Oracle 12c Release 2(Version12.2.0.1.0,64位) 我下的时候能有几M每秒,挺快的;
/technetwork/database/enterprise-edition/downloads/index.html
(或者这里:http://218.94.103.156:8090/download/oracle/)
1.3然后运行安装,会选择安装位置,口令等(参考/onezg/p/8768597.html前半篇);
1.4然后运行SQL Plus ,以system 用户登进去看下是否装好了, 或者登陆https://localhost:5500/em/login可以看到管理界面;
1.5运行SQL developer ,可以更直观的看到表信息(参考/shootercheng/p/6204531.html)。
1.6这时只有system 用户,我决定创建一个用户,并授予其连接建表等权限。
create user xxx identified by xxx; --后面是密码,前面是name
问题:ORA-65096:公用用户名或角色无效
解决:创建用户的时候用户名需要以c##开头,如c##pofile
错误写法: create user xxxidentified by oracle;正确写法: create user c##xxx identified by oracle;
授予权限:
grant connect,resource,dba to c##xxx;grant create session, connect, resource to c##xxx;
1.7SQL developer测试这个新建的用户并执行一个建表语句和插入语句
SQL developer配置新用户同1.5操作。
create table DEMO_USER(USER_ID NUMBER(9,0) not null,USER_NAME VARCHAR2(120) not null,STATE CHAR(1) not null,CREATE_DATE DATE not null,STATE_DATE DATE not null,EMAIL VARCHAR2(120) not null,LOST_FOUND_KEY NUMBER(9,0) not null,constraint PK_DEMO_USER primary key (USER_ID))ALTER TABLE DEMO_USER ADD CONSTRAINT EMAIL UNIQUE (EMAIL); --创建唯一约束select * from DEMO_USER;insert into DEMO_USER(USER_ID,USER_NAME, STATE, CREATE_DATE, STATE_DATE, EMAIL, LOST_FOUND_KEY)values(1,'admin','A', to_date('-06-08 20:20:59','yyyy-mm-dd hh24:mi:ss'),to_date('-06-08 20:20:59','yyyy-mm-dd hh24:mi:ss'), '5461XXXXX@', 14947);
1.8 换一台机器,使用PLSQL连接这个新用户
一些前提的说明:装数据库服务端的机器IP为192.168.1.112, SID是 orcl ,新用户用户名是 c##profile,PLSQL所在机器的IP是 192.168.1.107。
首先,在机器192.168.1.107上,按如下官网地址下一个32位的Oracle客户端,注意选对应数据库的版本,这个下载网速不是很快。
/technetwork/database/database-technologies/instant-client/downloads/index.html
然后,打开PLSQL,点击取消不进行登录,选择“工具”菜单下“首选项”,填写如下。
Oracle主目录名:XXX\instantclient_12_2 --注意是新下的这个32位的Oracle客户端的对应地址,不是PLSQL原来的那个
OCI库:XXX\instantclient_12_2\oci.dll,--注意是新下的这个32位的Oracle客户端的对应地址,不是PLSQL原来的那个
然后,设置环境变量如下:
NLS_LANG SIMPLIFIED CHINESE_CHINA.ZHS16GBK
ORACLE_HOME XXX\instantclient_12_2 --注意是新下的这个32位的Oracle客户端的对应地址,不是PLSQL原来的那个
path XXX\instantclient_12_2
TNS_ADMIN XXX\instantclient_12_2 ---环境变量的作用是确定软件字符编码和配置文件tnsnames.ora的读取位置
然后,tnsnames.ora的正确写法如下(放哪里都无所谓,根据环境变量写的位置去放即可):
host写成服务器所在机器的静态IP,service_name写SID,默认的是orcl,我一开始以为是新建的用户名,这样会报解析不了或者找不到对应服务的错误。
然后,直接连可能会报监听服务不存在!这时说明服务端的监听服务没打开或者没配好,回到192.168.1.112机器,
xxx\product\12.2.0\dbhome_1\network\admin目录下会有listener.ora 文件和tnsnames.ora 文件,需要修改并重启下监听服务,或者重启下电脑也行。
# listener.ora Network Configuration File: C:\AFile\progam\Oracle\oracle12\product\12.2.0\dbhome_1\network\admin\listener.ora# Generated by Oracle configuration tools.SID_LIST_LISTENER =(SID_LIST =(SID_DESC =(SID_NAME = CLRExtProc)(ORACLE_HOME = C:\AFile\progam\Oracle\oracle12\product\12.2.0\dbhome_1)(PROGRAM = extproc)(ENVS = "EXTPROC_DLLS=ONLY:C:\AFile\progam\Oracle\oracle12\product\12.2.0\dbhome_1\bin\oraclr12.dll")))(SID_DESC =(GLOBAL_DBNAME = ORCL)(ORACLE_HOME = C:\AFile\progam\Oracle\oracle12\product\12.2.0\dbhome_1)(SID_NAME = ORCL)))LISTENER =(DESCRIPTION_LIST =(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.112)(PORT = 1521))(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))))
# tnsnames.ora Network Configuration File: C:\AFile\progam\Oracle\oracle12\product\12.2.0\dbhome_1\network\admin\tnsnames.ora# Generated by Oracle configuration tools.LISTENER_ORCL =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.112)(PORT = 1521))ORACLR_CONNECTION_DATA =(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)))(CONNECT_DATA =(SID = CLRExtProc)(PRESENTATION = RO)))ORCL =(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.112)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = orcl)))
----------------------------------------------------------------------
OK 换了台机器,IP都换了,记录下过程:
首先改下上文的几处服务器IP
启java应用,需要改DB配置文件,这时报了:
Oracle12c连接问题ORA-28040:没有匹配的验证协议
在oracle服务端的找到如下文件:
$ORACLE_HOME/network/admin/sqlnet.ora
加入如下:
SQLNET.ALLOWED_LOGON_VERSION=8
然后报了:
oracle 12c ORA-01017: 用户名/口令无效; 登录被拒绝
改一下密码,改成纯数字;
alter user XXX identified by XXX
最后,回到PLSQL所在机器,输入新用户和口令,发现可以成功登陆上去。
Conclusion
第一个,关于机器通信,主要是防火墙导致的,较为简单。
第二个。关于oracle客户端和服务端,服务端的SID是orcl,这个我目前不清楚为什么默认是这个。要想在其他机器上使用客户端连到数据库用户,首先要更改部分设置,使用32位的客户端。然后要正确配置PLSQL的tnsnames.ora配置文件。然后要保证数据库服务端的监听程序正常配置和打开,也就是配置服务端的listener.ora 文件和tnsnames.ora。这样即可实现!
本文记录了操作步骤,和一些配置的方法以及一些错误。