本文基于Redhat 6.7操作系统,已经成功安装了Oracle 12c数据库,配置好了内核参数和环境变量,仅介绍一下如何新建一个实例
Oracle Database版本:Oracle Database 12c Release 2(
12.2.0.1.0
)
下载地址:http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html
第一步,在之前创建好的,dba用户组下面的用户执行dbca,弹出图形界面
选择第一项,创建数据库,点击下一步
在第二页“创建模式”中选择“高级配置”,典型配置会留下很多大坑,很不推荐。
第三页选择单实例数据库,因为我们这里只创建一个能用的简单数据就行,如果想要做RAC集群,那么你还需要部署硬盘,这种情况会另写一片文章介绍
选择模板可以选择“定制数据库”或“一般用途或事务处理”,由于定制数据库是不基于模板的,所以创建过程非常缓慢,可能需要好几个小时的时间,而“一般用途或事务处理”是基于Oracle提供的模板创建,创建速度很快,5分钟不到即可完成,而且可配置的选项已经足够了,所以选择“一般用途或事务处理”。点下一步
第四页是充满大坑的选项,全局数据库名字可以随便填,但是SID必须是上面的名字+Sid格式来书写,否则后面会报找不到.ora文件的错误。
“容器数据库”是12c版本新加的一个功能,但是这个功能可能很少有人用,最麻烦的是一旦勾选了这个选项,那么你新建的数据库用户必须以C##开头,特别不方便,所以此处强烈建议不勾选容器数据库,除非你真的有这方面需求。
第五页默认即可
第六页指定快速恢复区,推荐全部勾选(图中没有勾选),有用快速恢复区之后,使用rman做的完整备份会被放到快速恢复区去,启用归档以后可以使用rman快速创建全库备份。如果此处不填写,那么以后再想启用归档就要把数据库实例停止之后再设置归档,而且会导致归档不完整,所以推荐建立实例的时候就开启归档。另外点击“编辑归档模式参数”按钮之后可以选择归档文件的保存地点,建议选择一个和快速恢复区、表空间不同的硬盘来存储,提高安全性。
注意快速恢复区还有一个大小限制,尽量设置的大一点并且定期清理快速恢复区的备份,否则快速恢复区满了之后会卡死数据库的。点击Edit archive mode parameters还可以配置归档日志的参数
“网络配置”页面一般使用oracle默认自建的LISTENER即可,使用默认1521端口,如果你想使用别的端口,或者多个端口,就勾选下面的创建新监听程序。一般推荐创建一个新的,以后改起端口来方便。
Data Vault选项保持默认(全都不勾选)即可
内存管理,如果不知道怎么配置那么就使用默认即可
第二个选择最大进程限制,这个也很关健,软件会根据你的cpu和内存情况提供给你一个默认值,但是如果你的应用线程池特别大,你又部署了好几台应用服务器的话,那么数据库连接数就会成倍增长,如果数据库连接数满了,那你用sqlplus就登录不进去了,所以一般推荐改的大一点,不过为了防止数据库性能被耗尽,也不要太大,1000左右就可以。
注意上面还可以选择块大小,也就是db_block_size这个参数,此参数和表空间文件的最大大小息息相关,根据操作系统的不同CentOS默认是8192,单个表空间的文件容器最大为32GB,如果你的数据量很大不想频繁增加表空间文件(最多1024)个,那么应该增大块大小,如果你前面第三页“部署类型”选择的是“定制数据库”,那么此处是可以修改的,如下图
第三个标签容易留下大坑,最重要的是最上面数据库的存储方式,一定要选择UTF-8,下面的默认语言一定要选择“英语(美国)”,否则在使用命令行和SQLPULS的时候,中文字符很容易变成????,同样的问题还会出现在你应用的日志上,还是使用英文远离乱码的困扰好。
连接模式选择“专用服务器模式”
示例方案保持默认不勾选就行,点击下一步
EM据说是个精简版的Oracle,一般不用配置
配置管理员账户密码,一定要牢记,一会登录要用上
创建选项推荐勾选另存为数据库模板,这样可以很快的创建一模一样的数据库,为其他的测试环境创造便利。点击定制存储位置可以看到这个实例所创建的表空间的位置
注意这一步特别的关健,直接关系到你的数据库存放的位置,一般来说我们都会专门挂一个硬盘存放表空间和备份文件,所以这里一般是要手动修改表空间和控制文件的存放位置的,一定不要改错。同时,如果做集群,更需要注意这个存放位置一定要放到共享磁盘上去
修改默认如下图
还能看到重做日志的位置,并设置重做日志的大小,可以选择一个不同于表空间的位置存储,提高安全性。表空间和重做日志是肯定得有的,归档文件和快速恢复区是可选的,一般推荐全部都设置,并且放在不同的存储设备上。
修改默认后
如果你前面第三页“部署类型”选择的是“定制数据库”,那么这个页面的配置也会更为丰富,所以我还是推荐自己定制,
比如我们可以增加数据库控制文件的存放位置和数量,存放位置越多,那么全部丢失的概率就越小,推荐放到不同的磁盘上去,修改完本页不要忘记点击Apply
数据库表空间会默认帮我们建立几个,我们也可在这用图形化的界面再创建几个,并且指定默认表空间,非常方便
这里还可以指定块大小,要和前面数据库块大小配置的一样才可以,如果不一样那么在创建过程中会报错退出
这里一般采用默认值即可,但是要注意图上圈内的内容,我们可以指定这是一个大文件表空间(普通表空间,8K块大小的每个表空间文件最大为32G,16K最大为64G,可以通过添加表空间文件来扩大表空间,而大文件表空间单个文件可以上TB,不能通过增加表空间文件的方式来增加表空间大小)为了灵活性还是推荐普通表空间,这样我们可以把表空间文件分散在不同的磁盘或者存储上增加并行的速度,但是需要手工去增加表空间文件。第二个选项是设置为默认表空间,这样在新建用户的时候就不用指定默认表空间了。
注意设置完毕之后一定要点击右下角的Apply,不然不会保存
在下面的Datafiles选项里能看到刚刚新建表空间后自动建立的表空间文件,文件大小已经在上一个界面设置好了,这里可以在options选项卡里配置是否自动增长和最大大小。一般来说要打开自动增长,不然你这个表空间大小到达初始大小之后就满了不能插入新数据了,但是如果你的磁盘大小空间不够或者有限制的话你可以去掉这个功能。最大大小是在不超过最大限制的情况下的最大大小(8K块最大32G单个文件,16K最大64G单个文件),比如你的磁盘就剩10G了,而这个表空间文件最大是64G,那么我就可以限制一下防止超出了磁盘的容量。
点击下一步浏览一下概要
点击完成开始创建数据库实例,因为是基于模板创建,所以几分钟就可以了
完成之后注意“服务器参数文件名”这个配置文件,一定要以Sid.ora结尾,不然启动不了实例,需要修改配置的时候也是直接修改这个ora文件然后重启。
然后打开终端
使用dba组的用户(非root)执行sqlplus,要注意配置好环境变量。语法是sqlplus sys/sys的密码@数据库ip:端口/数据库实例名 as sysdba,如下图
然后我们就以dba的权限操纵数据库了,可以执行创建用户和分配表空间的操作
然后查看一下数据库的读写权限,还有默认的表空间的存放位置,我们新建的表空间最好也放到同一位置下
然后执行创建用户分配表空间的指令,如果前面都没问题那么此处应该都很顺利
注意如果报错权限不足,请检查是不是以sysdba用户登录的。请不要以system用户登录。
如果报错ORA-65096:公用用户名或角色名无效,那么说明你开了oracle容器,用户名要以C##开头。
建立完用户之后我们使用数据库客户端比如DBVisualizer或者Navicat这种,由于DBVisualizer使用的是JDBC连接,可以测试JDBC的兼容性,所以我比较喜欢用。
如果使用PLSQL那么一定要用12c的PLSQL,如果你用11g的netca,那么是连不上的,会报下面的错误
ORA-28040
:http://blog.csdn.net/kongxx/article/details/44887379
很顺利的连接成功,说明JDBC可用。顺道提一下,JDBC的连接url应该是类似于下面这种格式:
jdbc\:oracle\:thin\:@127.0.0.1\:1521/oadb
注意JDBC要注意版本的问题,对于12c的数据库要用12c的JDBC去连接,否则会报错找不到数据库实例的错误或者用户名密码错误。
JDBC的下载地址http://www.oracle.com/technetwork/database/features/jdbc/jdbc-drivers-12c-download-1958347.html
注意ojdbc6.jar是给JDK1.6版本使用的,ojdbc7.jar是给JDK1.7和1.8使用的,注意不要下载错了。
附录:sqlplus不能连接数据库,而数据库已经建好的解决方案
使用DBCA创建完数据库以后,数据库实例是自动启动的,通过SQLPLUS和RMAN可以很轻松的连上(环境变量中ORACLE_SID要指定正确)。但是一旦在SQLPLUS里停止了这个实例,那么可能就再也连不上了。停止实例的命令是
shutdown immediate
或者
shutdown normal
那么你再通过SQLPLUS登录的时候,会报“ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务”的错误,此时使用
lsnrctl status
命令也看不到刚刚关掉的数据库实例。
然后使用dbca想要修改这个数据库实例,DBCA报错该实例不属于当且节点。这个数据库实例就像被从本地删掉了一样。
出现这个问题的原因是当前数据库实例没有静态绑定到数据库监听器。数据库监听器只能监听到已经启动的数据库实例,所以就连接不上了,解决方法就是添加监听器对实例的静态绑定,那样不管数据库实例启动没有都可以通过SQLPLUS登录进去了。
方法是修改/u01/product/12.2.0/dbhome_1/network/admin/listener.ora,这个文件
【修改前】
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
)
修改后添加了一个SID列表,如下
# listener.ora Network Configuration File: /u01/product/12.2.0/dbhome_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = recoverySid)
(ORACLE_HOME = /u01/product/12.2.0/dbhome_1)
(GLOBAL_DBNAME = recovery)
)
(SID_DESC =
(GLOBAL_DBNAME = oadb)
(ORACLE_HOME = /u01/product/12.2.0/dbhome_1)
(SID_NAME = oadbSid)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
)
上面的SID_NAME和GLOBAL_DBNAME按照你上面创建实例的实际情况填写,可以填一个也可以填多个实例,注意一定不要填反了,SID_NAME就是以Sid结尾的名字。ORACLE_HOME就填环境变量中的ORACLE_HOME就可以,需要根据这个去bin目录下查找一个可执行文件。
配置好listener.ora之后,使用如下语句重启监听器
lsnrctl stop
lsnrctl start
进行重启,重启之后再使用lsnrctl status查看,就可以看到被我们关掉的实例的名字了,其状态应该为UNKNOWN,如果不配置listener.ora,那我们是看不到实例的名字的。
[alex@localhost ~]$ lsnrctl status
LSNRCTL for Linux: Version 12.2.0.1.0 - Production on 19-OCT-2017 08:31:55
Copyright (c) 1991, 2016, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 12.2.0.1.0 - Production
Start Date 19-OCT-2017 08:21:39
Uptime 0 days 0 hr. 10 min. 15 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/product/12.2.0/dbhome_1/network/admin/listener.ora
Listener Log File /u01/diag/tnslsnr/localhost/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521)))
Services Summary...
Service "oadb" has 1 instance(s).
Instance "oadbSid", status UNKNOWN, has 1 handler(s) for this service...
Service "recovery" has 2 instance(s).
Instance "recoverySid", status UNKNOWN, has 1 handler(s) for this service...
Instance "recoverySid", status READY, has 1 handler(s) for this service...
Service "recoverySidXDB" has 1 instance(s).
Instance "recoverySid", status READY, has 1 handler(s) for this service...
The command completed successfully