📄 oracle+
字号:
mount oracle光盘,通常mount目录为/SD-CDROM_1
root用户,ORACLE_OWNER=oracle,执行光盘上orainst中oratab.sh,建立/var/opt/oracle/oratab
安装时,选custom方式,安装时不建立数据库,字符集可选Simplified Chinese
1.3 HP-UX
1.3.1 Oracle 8
流程大致与unixware相同,调整kernel参数可通过sam,选择/Kernel Configuration/Actions/Apply Tuned Parameter Set/OLTP Database Server System,另外为提高I/O能力,还需调整以下参数:
核心参数 参考值 解释
bufpages 61992 缓冲页
dbc_max_pct 10 动态缓存占内存最大百分比
dbc_min_pct 10 动态缓存占内存最小百分比
nbuf
设定共享库目录SHLIB_PATH,不是LD_LIBRARY_PATH
SHLIB_PATH=$SHLIB_PATH:$ORACLE_HOME/lib;export SHLIB_PATH
1.4 Linux
1.4.1 kernel 2.0 & glibc 2.0
代表产品为Red Hat Linux 5.1。
Oracle 8在RedHat5.1上能成功安装,安装软件包为805ship.tgz
一般不会在RedHat5.1上安装Oracle8i以上的版本
修改共享内存最大尺寸限制:
在系统初始化脚本/etc/rc.d/rc.sysinit中加入:
echo 2147483648 >/proc/sys/kernel/shmmax
重启计算机。这样做避免了Oracle分配的共享内存碎片化,对提高效率有好处。
原$ORACLE_HOME/precomp/admin/pcscfg.cfg中sys_include有误,使proc预处理pc程序失败,安装结束后,应设为:sys_include=(/usr/include,/usr/lib/gcc -lib/i386-redhat-linux/egcs-2.91.66/include)(视gcc版本而定)
1.4.2 kernel 2.2 & glibc 2.1
代表产品为Red Hat Linux 6.2。
修改共享内存最大尺寸限制:
在系统初始化脚本/etc/rc.d/rc.sysinit中加入:
echo 2147483648 >/proc/sys/kernel/shmmax
重启计算机。这样做避免了Oracle分配的共享内存碎片化,对提高效率有好处。
原$ORACLE_HOME/precomp/admin/pcscfg.cfg中sys_include有误,使proc预处理pc程序失败,安装结束后,应设为sys_include=(/usr/include,/usr/lib/gcc -lib/i386-redhat-linux/egcs-2.91.66/include) (视gcc版本而定)
1.4.2.1 Oracle 8
本来已经很少有人在LinuxKernel2.2的系统中安装Oracle8.0.5,但笔者实在怀念8.0.5纯粹的文本界面和与之相处的无数不眠之夜,故收录如下:
Oracle8在kernel为2.2.x的linux中是无法正常运行的,运行可执行文件如svrmgrl,sqlplus时会导致"Segmentation fault",原因在于这些linux使用了默认的libc2.1,与Oracle8程序重连接所需的libc2.0不兼容。Oracle的补丁程序其实是将Oracle可执行程序的重连接脚本中libc位置重新定位到libc2.0上去,并用旧版的gcc,ld重新连接可执行文件。为此必须先在系统中安装兼容库和相应工具。这是权宜之计,而且仅对RedHat有效。
root用户
rpm -ivh tcl-8.0.3-20.i386.rpm Oracle的Intelligent Agent要使用
rpm -ivh compat-binutils-5.2-2.9.1.0.23.1.i386.rpm
rpm -ivh compat-glibc-5.2-2.0.7.1.i386.rpm
rpm -ivh compat-egcs-5.2-1.0.3a.1.i386.rpm
rpm -ivh compat-egcs-c++-5.2-1.0.3a.1.i386.rpm
rpm -ivh compat-libs-5.2-1.i386.rpm
版本号可略有差异
oracle用户安装Oracle8.0.5但不创建instance,如选择安装文档,则会产生如下错误:
A write error occurred while try to copy '/home/oracle/setup_oracle/unixdoc/server.805/install/lnx_server.805.map' to '/oracle/product/8.0.5/doc/server.805/install/lnx_server.805'(No such file or directory).
这是安装程序的一个bug-不能创建目录。可进入$ORACLE_HOME/doc,mkdir -p server.805/install,再选择Retry
从ftp.oracle.com/pub/www/otn/linux下载glibcpatch.tgz,在某一目录(如~/patch)下展开
cd ~/patch
glibcpatch.sh
经过一段时间后,看到"Applied glibc patch for Oracle 8.0.5.x successfully",表明补丁成功。此时就能成功创建instance。
1.4.2.2 Oracle 8i
推荐使用典型安装,否则会产生难以预料的错误。
1.4.3 kernel 2.4 & glibc 2.2
代表产品为Red Hat Linux 7.3,SuSE Linux 7.3。
1.4.3.1 Oracle 8i
与Oracle8在RedHat Linux 6.2上安装所遇到的问题一样,Oracle 8i使用的glibc 2.1与操作系统自带的glibc 2.2不能兼容,解决的方法也一样,要安装glibc 2.1的兼容库,并重新连接Oracle各组件。
除非万不得已,不建议使用兼容方式,因此省略安装步骤,可参阅网上有关文档。
1.4.3.2 Oracle 9i
RedHat 7.3
修改共享内存最大尺寸限制:
在系统初始化脚本/etc/rc.d/rc.sysinit中加入:
echo 2147483648 >/proc/sys/kernel/shmmax。
修改信号量参数:
在系统初始化脚本/etc/rc.d/rc.sysinit中加入:
echo 250 32000 100 128 >/proc/sys/kernel/sem。
这4个参数依次为SEMMSL(每个用户拥有信号量最大数量),SEMMNS(系统信号量最大数量),SEMOPM(每次semop系统调用操作数),SEMMNI(系统信号量集最大数量),事实上只有SEMOP是需要调整的。
重启计算机。
在连接可执行文件过程中,会发生中断,打开$ORACLE_HOME/ctx/lib/env_ctx.mk,找到INSO_LINK,在-L$(CTXLIB) -L$(LDLIBFLAG)m后加入-L$(LDLIBFLAG)dl,重试。
SuSE 7.3
与RedHat类似,但SuSE没有/etc/rc.d/rc.sysinit,笔者选择/etc/rc.d/rc,将核心参数修改添加到最后exit语句之前。
安装过程中没有发生任何问题。
1.5 Solaris
Oracle 8i在Solaris 7,8 Intel Platform上均能顺利安装,未测试Solaris Sparc Platform。
Oracle 9i目前无Solaris Intel Platform上的版本,由于条件所限,未测试在Solaris Sparc Platform上的Oracle 9i。
修改下列核心参数:
核心参数 参考值 解释
shmmax 物理内存/2 共享内存段最大尺寸
shmmin 1 共享内存段最小尺寸
shmmni 100 系统共享内存段标识最大数目
shmseg 10 每个进程所能使用最大共享内存段数目
semmni 100 系统信号量标识最大数目
semmsl init.ora.processes+10 每个信号量标识包含的信号量数目
semmns sum(init.ora.processes)*10+max(init.ora.processes)+count(init.ora)*10 系统信号量最大数目
semopm 100 每个semop调用最大操作数目
rlim_fd_max 4096 系统文件句柄最大数目
rlim_fd_cur 1024 每个进程文件句柄最大数目
修改/etc/system,并重启使核心参数生效
例:
set shmsys:shminfo_shmmax=2147483648
set shmsys:shminfo_shmmin=1
set shmsys:shminfo_shmmni=100
set shmsys:shminfo_shmseg=10
set semsys:seminfo_semmni=200
set semsys:seminfo_semmsl=200
set semsys:seminfo_semmns=1000
set semsys:seminfo_semopm=100
set semsys:seminfo_semmap=200
set semsys:seminfo_semmnu=250
set semsys:seminfo_semvmx=32767
set msgsys:msginfo_msgmni=200
set msgsys:msginfo_msgmap=200
set msgsys:msginfo_msgmax=65536
set msgsys:msginfo_msgmnb=655360
set msgsys:msginfo_msgssz=64
set msgsys:msginfo_msgtql=1000
set msgsys:msginfo_msgseg=16384
set rlim_fd_max=4096
set rlim_fd_cur=1024
参见solaris_7_8/system
注意:
一定要先重建好kernel后再安装,因为oracle安装时根据kernel动态连接程序,如果先安装oracle,即使随后正确调整kernel,也会带来许多问题,如oracle进程不能拉起,instance创建失败等。
在kernel参数中,对数据库运行影响最大的主要是SHMMAX,SEMMNS,SEMMNI,SEMMSL,SHMMAX取内存一半即可,SEMMNS理论上应等于SEMMNI*SEMMSL,实际取一个较大值即可。
SEMMNS: 信号量最大个数,有些系统可忽略,因为他与SEMMNI,SEMMSL有关。
2 创建
所有参见内容都在附件01_install_02_create_03_init/下。
以oracle用户进行操作,设定数据库实例名为oradb(长度建议不要超过8个字符)。
2.1 Oracle 8 & 8i
2.1.1 工具创建
Oracle 8
运行$ORACLE_HOME/bin/orainst(安装数据库时必须选中oracle installer),选择create database object,安装界面中选Oracle Enterprise Server(RDBMS)
mount point暂为$ORACLE_BASE,字符集为ZHS16CGB231280或ZHS16GBK,调整system,tools,users,rbs,temp,redolog等尺寸。
创建过程中会提示输入osdba,osoper的UNIX组,这是向instance表明此组的成员享有角色sysdba或sysoper的权限,从而用connect / as sysdba替换掉connect internal
Oracle 8i
进入X WINDOW,运行dbassist
2.1.2 手工创建
任何工具都有其局限性,熟练的数据库管理员可采用手工方法创建数据库,以增加对系统的灵活控制。
对于手工建库Oracle 8与Oracle 8i的区别主要是建立的数据字典和存储过程有些不同,Oracle8i的dbassistant可以生成建库脚本供以后使用。
取得/8i/initoradb.ora,编辑如db_name,control_file,dump_dest等参数,以符合实际情况。如不需要生成remote_login_passwordfile,可在initoradb.ora中设remote_login_passwordfile=none;如需要,在initoradb.ora中设remote_login_passwordfile=exclusive,运行orapwd file= password= 必须创建新生成文件所要用到的目录,如在配置文件中指定的bdump,cdump,udump等目录,以及数据文件存储目录。
将initoradb.ora转移到$ORACLE_BASE/admin/oradb/pfile/,并连接到$ORACLE_HOME/dbs/initoradb.ora。
ln -s $ORACLE_BASE/admin/oradb/pfile/initoradb.ora $ORACLE_HOME/dbs/initoradb.ora
取得8i/createdb.sh,编辑如pfile,数据文件目录等参数,以符合实际情况,并转移到$ORACLE_BASE/admin/oradb/create/下,执行。
相关系统表:
v$database
v$datafile(file#,ts#,name)
v$tablespace(ts#,name)
v$parameter(SQL>show parameter)
v$sga(SQL>show sga)
2.1.3 MTS(multi-threaded server)
Oracle8使用两种配置模式:dedicated server(专用模式)和shared server(即multi-threaded server共享模式),缺省使用专用模式。在连接数不很大且保持长期连接的情况下,专用模式为每个连接设立一个专用oracle服务进程,以保持较高的性能和稳定性。而当连接数上升到非常高的数目且不保持长期连接时,数据库管理开销增大,并且占用大量系统资源,给操作系统形成带来极大的压力。在这种情况下,共享模式更为有利,它通过缓冲池和预先设定数目的server提供服务,每个连接不再有专用的oracle服务进程,每次SQL操作由分配器(dispatcher)确定oracle服务进程。
multi-thread仅表示分配器展开的多个服务流程,并非操作系统意义上的多线程
配置:
¢ initoradb.ora
加入
mts_dispatchers = "(address=(protocol=TCP))(dispatchers=10)" #初始分配器数量
mts_max_dispatchers = 15 #最大分配器数量
mts_servers = 50 #初始服务进程数量
mts_max_servers = 80 #最大服务进程数量
mts_service = oradb3 #MTS方式下对外提供的数据库服务,非service_name
表明instance能够提供MTS服务,不意味着取消dedicated方式
¢ listener.ora
应删除所有SID_LIST,SID_LIST的存在决定LISTENER以dedicated还是shared方式启动oracle连接。如SID_LIST存在,LISTENER不再接受instance的登记,以dedicated方式启动oracle连接; 如SID_LIST不存在,LISTENER启动时不为任何instance服务,由instance来登记MTS service,以shared方式启动oracle连接
¢ client
MTS在client端配置颇为怪诞,在tnsnames.ora中的host一定要写数据库server的名字,而且必须作全名解析,似乎server端接收到client端请求后会将主机字符串返回,应此client端必须能够解析,否则会报出诸如"database service not exist"的错误
tnsnames.ora
dbserver.soar.com =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS=(PROTOCOL=TCP)(HOST= dbserver)(PORT = 1521))
)
(CONNECT_DATA =(SERVICE_NAME = oradb))
)
/etc/hosts
10.0.0.1 dbserver.soar.com dbserver
启动:先起LISTENER,后起instance
以下步骤均在数据库open状态下,由system用户完成
2.1.4 调整临时表空间
alter tablespace temp temporary; #Oracle8的orainst没有将temp的缺省值permanent改为temporary,这样用户在temp上暂存的数据均为永久对象,很快将temp空间耗完。Oracle8i已修正。
SQL>alter tablespace temp default storage (initial 128k next 128k maxextents 5000 pctincrease 0);
SQL查询操作如group by,order by,distinct,join等需要在临时段上展开数据,须充分考虑临时段的大小。
如果实例启动参数指定hash_join_enabled=true(缺省为true),当oracle选择以hash join方式进行表与表的联接,oracle根据查询操作的实际情况计算出hash_multiblock_io_count,此参数从属于session,平时显示为0,即hash join一次I/O读写需要的连续数据空间。这样当此参数大于临时段的next扩展块时,hash join操作会中断。如果预知联接表的规模比较巨大,可使用alter tablespace temp default storage(next …)将next值设为较大值,待全部操作完成后,再恢复正常。
2.1.5 调整回滚表空间
先将建库工具缺省设定的若干个回滚段删除
SQL>alter rollback segment r01 offline;
SQL>drop rollback segment r01;
根据实际需要创建回滚段(如r01-r10),供联机处理和批处理使用
SQL>create rollback segment r01 storage(initial 128k next 128k maxextents 5000 optimal 5M) tablespace rbs;
SQL>alter rollback segment r01 online;
注意修改$ORACLE_HOME/dbs/initoradb.ora中的激活回滚段段名
另创建一个尺寸无限制的回滚段(r99),供特殊用途
SQL>create rollback segment r99 storage(initial 128k next 128k maxextents 5000) tablespace rbs;
如果在创建回滚段时使用create public rollback segment,则不需要在$ORACLE_HOME/dbs/initoradb.ora中用rollback_segment=(…)选项激活,推荐使用public方式
相关系统表:
SQL>select segment_name, initial_extent, next_extent, max_extents, extents,bytes from dba_segments where segment_type='ROLLBACK'; #回滚段占用空间状况
SQL>select segment_name, status from dba_rollback_segs; #回滚段状态
2.1.6 调整日志
建立日志组
SQL>alter database add logfile group x('log1a','log1b') size 10M;
增加日志组成员
SQL>alter database add logfile member 'log1c' to group x;
删除日志
数据库实例至少需要2个日志组,只有状态为inactive的日志组才能被删除,而当前日志组状态为current,上一个切换的日志组状态为active,这就意味着至少存在3个日志组才能删除其中的一个,如果要更新全部日志组,只能删除一个,再创建一个,直至全部被更新。
SQL>alter database drop logfile group x;
如果要删除的日志组是当前日志组,必须先将其切换至状态为inactive,再删除。
SQL>alter system switch logfile;
删除日志组成员
SQL>alter database drop logfile member 'log1c';
相关系统表
v$log #日志组状态、占用空间、顺序号等
v$logfile #日志组文件
2.1.7 调整用户表空间
创建表空间
假定表数据在ts_data,索引在ts_index
SQL>create tablespace ts_data default storage(initial 10M next 10M maxextents 5000 pctincrease 0) datafile 'path/data_01.dbf' size 500M;
SQL>create tablespace ts_index default storage(initial 5M next 5M maxextents 5000 pctincrease 0) datafile 'path/index_01.dbf' size 500M;
参考命令:删除表空间
SQL>drop tablespace data including contents; #删除表空间及其包含的所有数据对象
相关系统表:
user(dba)_tablespaces
增加表空间尺寸
假定表空间ts_data由path/data_01.dbf和path/data_02.dbf(500M)组成
增加一个数据文件:
SQL>alter tablespace ts_data add datafile 'path/data_03.dbf' size 500M;
扩大原有文件大小:
SQL>alter database datafile 'path/data_01.dbf' resize 1000M;
移动表空间数据文件
假如要求为:将path1下data_01.dbf移至path2下,并把文件名改为data01.dbf
实例处于关闭状态
sqlplus "/ as sysdba"
SQL>startup mount
回到shell环境下
$ mv path1/data_01.dbf path2/data01.dbf
$ mv path1/data_02.dbf path2/data02.dbf
再到sqlplus环境中
SQL>alter database rename file 'path1/data_01.dbf' to 'path2/data01.dbf';
或
SQL>alter tablespace tbsdata rename datafile 'path/data_01.dbf' to 'path2/data01.dbf';
SQL>alter database open;
查看剩余空间
SQL>select tablespace_name,sum(bytes),max(bytes) from dba_free_space group by tablespace_name;
注意:空闲数据块总和sum(bytes)够用并不意味每个空闲块都满足分配需要,所以当表空间不够分配扩展块的时候,还要查看最大空闲数据块max(bytes)的大小。
合并空闲块
如果表空间上的数据对象经常发生类似drop-create的变动,加之未采用统一的扩展块尺寸,使那些采用较大扩展块的数据对象不能利用较小的空间碎片,造成空间浪费。可通过将较小的空闲块合并成较大的空闲块的方法,减少空间浪费。
SQL>alter tablespace tbsdata coalesce;
2.1.8 创建用户
SQL>create user dbuser identified by oracle default tablespace data temporary tablespace temp quota unlimited on data quota 0 on system quota 0 on tools quota 0 on users;
SQL>grant connect to dbuser;
SQL>grant create procedure to dbuser; #这些权限足够用于开发及生产环境
SQL>grant select on dba_pending_transactions to dbuser; #二阶段提交过程中类似Tuxedo的软件需要检索挂起交易的状态,所以必须得到对此视图的select权限,以sys用户身份赋予
修改用户可使用alter user dbuser ...
参考命令:
drop user dbuser cascade; #删除用户及其所有的数据对象
revoke connect from dbuser; #取消用户角色权限
相关系统表:
user(dba)_users
user(dba)_role_privs 角色权限
user(dba)_sys_privs 系统权限
user(dba)_tab_privs 对其他用户表操作的权限
user_ts_quotas 表空间限额
2.1.9 创建数据对象
相关系统表:
user_catalog(cat)
user_objects(obj)
表和索引建立在表空间上,如果不指定表空间,使用本用户的缺省表空间(default tablespace);如果不指定本对象的存储参数,使用建于其上的表空间的缺省存储参数(default storage)。
表(table)
建表脚本通常是以下形式:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -