Oracle创建多实例

Oracle创建多实例

在linux服务器上创建orcl实例时忘了设置编码,默认使用系统UTF-8的编码,但是项目数据库使用有的是GBK,所以想再创建一个实例挂载成GBK编码的数据库。

因为是远程服务器,没法弹出dbca的可视化界面,因此需要手动使用命令进行创建。

一、使用oracle用户登录

操作过程中需要使用频繁切换 O R A C L E H O M E 和 ORACLE_HOME和 ORACLEHOMEORACLE_BASE,需要事先查看环境变量里有没有配置这两个变量,如果没有配置先配置一下,不然敲路径会敲的头大。使用export ORACLE_HOME=<oracle_home_directory>设置会话的变量。

二、复制参数文件

找到参数文件复制一份,修改其中的参数

$ cd $ORACLE_HOME/dbs
$ cp initorcl.ora initorclgbk.ora

参数如下:

db_name='ORCLGBK'
sga_max_size=3G
processes = 150
audit_file_dest='$ORACLE_BASE/admin/orclgbk/adump'
background_dump_dest='$ORACLE_BASE/admin/orclgbk/bdump'
core_dump_dest='$ORACLE_BASE/admin/orclgbk/cdump'
user_dump_dest='$ORACLE_BASE/admin/orclgbk/udump'
audit_trail ='db'
db_block_size=8192
db_domain=''
log_buffer=7036928
db_recovery_file_dest='$ORACLE_BASE/flash_recovery_area'
db_recovery_file_dest_size=2G
diagnostic_dest='$ORACLE_BASE'
dispatchers='(PROTOCOL=TCP) (SERVICE=ORCLXDB)'
open_cursors=300
remote_login_passwordfile='EXCLUSIVE'
undo_tablespace='UNDOTBS1'
# You may want to ensure that control files are created on separate physical
# devices
control_files = (/u01/app/oracle/oradata/orclgbk/control01.ctl, /u01/app/oracle/oradata/orclgbk/control02.ctl)
compatible ='11.2.0'

三、创建实例相关目录

$ cd $ORACLE_BASE/admin
$ mkdir orclgbk
$ cd orclgbk
$ mkdir adump bdump cdump udump
$ cd $ORACLE_BASE/oradata
$ mkdir orclgbk

四、启动实例

$ export ORACLE_SID=orclgbk #这里的sid一定要和参数文件保持一致,即init<ORACLE_SID>.ora
$ sqlplus /nolog  #注意没有空格
SQL> conn / as sysdba #这时候已经连接到空闲实例了
SQL> startup nomount; #这时候只有实例没有数据库,因此不能挂载数据库
SQL> select instance_name from v$instance; #查询一下实例名称,应该就是orclgbk了

这个时候可能会有一个ORA-09925(No such or directory)的报错,具体的错误处理在文章最后。

这里需要创建一下密码文件保存sys用户密码,否则不能登录sys用户

#这是shell命令,需要退出sqlplus
$ orapwd file="$ORACLE_HOME/dbs/orapworclgbk" password=system entries=10;

五、创建数据库

CREATE DATABASE orclgbk 
    MAXLOGFILES 16 
    MAXLOGMEMBERS 4 
    MAXDATAFILES 1024 
    MAXINSTANCES 1 
    MAXLOGHISTORY 680 
    CHARACTER SET ZHS16GBK 
DATAFILE 
'/home/oracle/tbsfiles/systbsfiles/system01.dbf'
    SIZE 500M REUSE 
    EXTENT MANAGEMENT LOCAL
UNDO TABLESPACE undotbs1 DATAFILE 
'/home/oracle/tbsfiles/systbsfiles/undotbs01.dbf'
    SIZE 800M
SYSAUX DATAFILE 
'/home/oracle/tbsfiles/systbsfiles/sysaux01.dbf'
    SIZE 500M
DEFAULT TEMPORARY TABLESPACE TEMP TEMPFILE
'/home/oracle/tbsfiles/systbsfiles/temp01.dbf'
    SIZE 500M
DEFAULT TABLESPACE USERS DATAFILE
'/home/oracle/tbsfiles/systbsfiles/users01.dbf'
    SIZE 500M
LOGFILE GROUP 1
	 ('/opt/app/oracle/redo/redo01a.rdo',
	  '/home/oracle/redo/redo01b.rdo') SIZE 50M,
	 GROUP 2
	 ('/opt/app/oracle/redo/redo02a.rdo',
	  '/home/oracle/redo/redo02b.rdo') SIZE 50M,
	GROUP 3
	 ('/opt/app/oracle/redo/redo03a.rdo',
	  '/home/oracle/redo/redo03b.rdo') SIZE 50M 
USER sys IDENTIFIED BY system 
USER system IDENTIFIED BY system;

上面语句格式化后可能有换行符,直接复制执行会报错,可以使用下边的,我执行过没有问题的创建语句,内容和上边一样的:

SQL> CREATE DATABASE orclgbk MAXLOGFILES 16 MAXLOGMEMBERS 4 MAXDATAFILES 1024 MAXINSTANCES 1 MAXLOGHISTORY 680 CHARACTER SET ZHS16GBK DATAFILE '/u01/app/oracle/oradata/orclgbk/system01.dbf'SIZE 1024M REUSE  EXTENT MANAGEMENT LOCAL UNDO TABLESPACE undotbs1 DATAFILE  '/u01/app/oracle/oradata/orclgbk/undotbs01.dbf' SIZE 1024M SYSAUX DATAFILE  '/u01/app/oracle/oradata/orclgbk/sysaux01.dbf' SIZE 1024M DEFAULT TEMPORARY TABLESPACE TEMP TEMPFILE '/u01/app/oracle/oradata/orclgbk/temp01.dbf' SIZE 1024M DEFAULT TABLESPACE USERS DATAFILE '/u01/app/oracle/oradata/orclgbk/users01.dbf' SIZE 10240M LOGFILE GROUP 1 ('/u01/app/oracle/oradata/orclgbk/redo01a.rdo') SIZE 200M,GROUP 2 ('/u01/app/oracle/oradata/orclgbk/redo02a.rdo') SIZE 200M,GROUP 3 ('/u01/app/oracle/oradata/orclgbk/redo03a.rdo') SIZE 200M USER sys IDENTIFIED BY system USER system IDENTIFIED BY system;

可以看到这就是一行的,里边数据库文件的路径和日志文件路径需要修改成你自己的,但是数据库文件必须包含system、sysaux、undotbs、temp和users这几个表空间,创建耗时和你创建文件的大小有关,文件越大创建时间越长。

这时候再查看实例状态已经是open了select status from v$instance;

六、创建数据字典和系统视图

没有数据字典数据库是无法识别select、from等这些关键字的,所以这步也是必须的;需要说明的是创建过程中可能会出现部分错误信息,不需要太担心;有些可能是已经存在的,只用看最后执行完成时有没有successfull completed这样的字眼就可以了,有warning不用管。

SQL> conn sys as sysdba
SQL> @?/rdbms/admin/catalog.sql;
SQL> @?/rdbms/admin/catproc.sql;
--以上这两个脚本执行时间比较长,可能需要10-20分钟左右,耐心等待
SQL> @?/rdbms/admin/catblock.sql;
SQL> @?/rdbms/admin/catoctk.sql;
SQL> @?/rdbms/admin/owminst.plb;

七、配置监听

有监听才能用客户端连接

$ cd $ORACLE_HOME/network/admin
$ vi listener.ora
#添加一个orclgbk的监听
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = orcl)
      (ORACLE_HOME = /oracle/inst1/product/11.2.0/db_1)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = orclgbk)
      (ORACLE_HOME = /oracle/inst1/product/11.2.0/db_1)
      (SID_NAME = orclgbk)   
  )
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.14.54.199)(PORT = 1521))
    )
  )
:wq

八、启动实例

万事俱备,只欠启动。

先停掉刚才已经启动的orclgbk实例

--为了确保每次连接的实例正确需要先设置ORACLE_SID
$ export ORACLE_SID=orclgbk
$ sqlplus / as sysdba
--如果刚才都没有退出或关闭sqlplus就不必执行上边这两步了
SQL> shutdown immediate;
SQL> exit;
--需要重启监听
$ lsnrclt stop
$ lsnrctl start
$ sqlplus / as sysdba
SQL> startup;
--这时候已经把数据库启起来了,可以创建一个用户进行连接测试了

九、关于ORA-09925报错的处理

创建完实例后在启动时可能会报该错误,该错误在oracle的错误代码库中指向系统级错误:

09925, 00000,  "Unable to create audit trail file"
// *Cause:  ORACLE was not able to create the file being used to hold
//          audit trail records.
// *Action: Check the UNIX error number for a possible operating system error.
//          If there is no error, contact ORACLE customer support.

所以具体需要看系统的报错信息,一般下边就会跟着系统的报错信息
在这里插入图片描述

这里可以看到有一个No such file or directory的linux报错信息,说明缺少文件了。除此之外还有诸如:No space left on devicePermission deniedRead-only file system等系统级错误。对于这三种错误比较好理解和解决,没有磁盘空间、权限不足以及只读文件系统,这三点可以统一归在权限不足上,需要检查oracle相关的目录是否都归属于oracle,再或者就是你的用户就不是oracle。

剩下这个文件不存在的错也有可能是权限或磁盘空间不足造成的,如果都不是那就需要看一看是不是什么锁导致的无法创建文件;这种情况基本都发生在创建多实例的时候,在创建第一个实例时是不会出现该错误的;也就是说有其他的oracle实例正在运行导致占用了一些审计日志相关的锁,网上的说法是检查共享内存段是否被stuck,通过ipcs -a进行查看:

[oracle@xxx ~]$ ipcs -a
--------- 消息队列 -----------
键        msqid      拥有者  权限     已用字节数 消息
------------ 共享内存段 --------------
键        shmid      拥有者  权限     字节     nattch     状态
0x00000000 4          oracle     600        524288     2          目标
0x00000000 9          oracle     600        524288     2          目标
0x00000000 10         oracle     600        524288     2          目标
0x00000000 13         oracle     600        16777216   2          目标
0x00000000 14         oracle     600        524288     2          目标
0x00000000 15         oracle     600        4096       0
0x00000000 16         oracle     600        4096       0
0x00000000 17         oracle     600        4096       0
0x4e0fa718 18         oracle     600        20480      172
0x00000000 22         oracle     600        4194304    2          目标
0x00000000 23         oracle     600        33554432   2          目标
--------- 信号量数组 -----------
键        semid      拥有者  权限     nsems
0xe17d5080 6          oracle     600        152
0xe17d5081 7          oracle     600        152
0xe17d5082 8          oracle     600        152

看到确实有占用,对于共享内存段(Shared Memary Segments)使用ipcs -m <shmid>进行解除,对于信号量数组(Semaphore Arrays)使用ipcs -s <semid>解除。如:

[oracle@xxx ~]$ ipcs -m 4
[oracle@xxx ~]$ ipcs -m 9
[oracle@xxx ~]$ ipcs -m 10
...
[oracle@xxx ~]$ ipcs -s 6
[oracle@xxx ~]$ ipcs -s 7
[oracle@xxx ~]$ ipcs -s 8

之后就可以再次登录了。虽然不知道什么原因,但是确实能生效,还要多多研究啊。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值