Oracle创建多实例
在linux服务器上创建orcl实例时忘了设置编码,默认使用系统UTF-8的编码,但是项目数据库使用有的是GBK,所以想再创建一个实例挂载成GBK编码的数据库。
因为是远程服务器,没法弹出dbca的可视化界面,因此需要手动使用命令进行创建。
一、使用oracle用户登录
操作过程中需要使用频繁切换
O
R
A
C
L
E
H
O
M
E
和
ORACLE_HOME和
ORACLEHOME和ORACLE_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 device
、Permission denied
、Read-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
之后就可以再次登录了。虽然不知道什么原因,但是确实能生效,还要多多研究啊。