X86_64平台下Oracle 11g R2 X64 for Linux的软件安装、数据库安装、
服务配置、数据库启动和停止、SQLPlus使用
平台: CentOS-5.5 Linux
1. 数据库软件安装
(1)创建oracle用户和用户组
root用户登录后,执行user.sh脚本,创建用户和用户组,脚本如下
#!/bin/bash
#
# Author: zhankunlin
# Description: 创建oracle 用户和用户组
#
curUser=`who am i | awk '{print $1}'`;
if [ "$curUser" != "root" ]; then
echo "This script must be executed by user 'root' "
echo "Error! exit"
exit
fi
groupadd oinstall ;
groupadd dba ;
useradd -m -g oinstall -G dba oracle ;
mkdir /sdd1/oracle ;
mkdir /sdd1/oracle/11gR2_database_X64 ;
mkdir /sdd1/oracle/11gR2_Inventory ;
chown -R oracle:oinstall /sdd1/oracle ;
chmod -R 775 /sdd1/oracle ;
id oracle ;
passwd oracle ;
(2)设置内核参数
root用户登录后,执行kernel_parameter.sh脚本,设置内核参数,脚本如下
#
# Author: zhankunlin
# Date: 2011/11/17
# Description: set the kernel parameters for oracle 11g R2
#
curUser=`who am i | awk '{print $1}'`;
if [ "$curUser" != "root" ]; then
echo "This script must be executed by user 'root' "
echo "Error! exit"
exit
fi
# 修改后当即生效
sysctl -w kernel.sem='250 32000 100 128' ;
sysctl -w fs.file-max=6815744 ;
sysctl -w net.ipv4.ip_local_port_range='9000 65500' ;
sysctl -w net.core.rmem_default=262144 ;
sysctl -w net.core.rmem_max=4194304 ;
sysctl -w net.core.wmem_default=262144 ;
sysctl -w net.core.wmem_max=1048576 ;
sysctl -w fs.aio-max-nr=1048576;
# 修改配置文件,重启后生效
echo '
# oracle require
kernel.sem = 250 32000 100 128
fs.file-max = 6815744
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
fs.aio-max-nr = 1048576
' >> /etc/sysctl.conf
附:如果不知道内核参数的全名是什么,可以使用命令 sysctl -a 查看所有的内核参数,然后从中grep自己想要的参数。
(3) 设置oracle用户的环境变量
oracle用户登录后,执行env.sh脚本,设置环境变量,脚本如下:
#!/usr/bin/env bash
#
# Author: zhankunlin
# Date: 2011/11/17
# Description: set environment variables of 'oracle' user for oracle 11g R2
# user 'oracle' execute
curUser=`who am i | awk '{print $1}'`;
if [ "$curUser" != "oracle" ]; then
echo "This script must be executed by user 'oracle' "
echo "Error! exit"
exit
fi
echo "
# oracle env
export ORACLE_BASE=/sdd1/oracle/11gR2_database_X64
export ORACLE_HOME=\$ORACLE_BASE/product/11.2.0.1.0/db_1
export NLS_LANG='simplified chinese'_china.ZHS16GBK
export PATH=\$PATH:\$ORACLE_HOME/bin
export LANG=zh_CN.GB18030
export EDITOR=vi
export LD_LIBRARY_PATH=\$ORACLE_HOME/lib:/lib:/usr/lib
" >> ~/.bash_profile
(4) 安装相关软件包
相关的软件包都在CentOS-5.5光盘1中能找到,拷贝出来,使用root用户登录,安装即可,这些包均是Oracle 安装所需:
libaio-devel-0.3.106-5.i386.rpm
libaio-devel-0.3.106-5.x86_64.rpm
unixODBC-devel-2.2.11-7.1.i386.rpm
unixODBC-devel-2.2.11-7.1.x86_64.rpm
pdksh-5.2.14-36.el5.x86_64.rpm
sysstat-7.0.2-3.el5.x86_64.rpm
安装:rpm -ivh *.rpm
(5) 安装
root 解压下载的软件包 linux.x64_11gR2_database_1of2.zip 和 linux.x64_11gR2_database_2of2.zip
oracle用户登录系统,
执行 /sdd1/11gR2_database_X64/database/runInstaller 进行安装。
执行先决条件检查,若存在问题,可以先进行解决,解决后,"重新检查",若硬件限制的错误不能解决,忽略。
使用 root 执行脚本,这一步很重要,一定要执行,执行完后点击确定,进行下一步。
[root@gd47 oraInventory]# cd /sdd1/oracle/11gR2_Inventory/oraInventory
[root@gd47 oraInventory]# ./orainstRoot.sh
[root@gd47 db_1]# cd /sdd1/oracle/11gR2_database_X64/product/11.2.0.1.0/db_1
[root@gd47 db_1]# ./root.sh
(6) 参考资料:
http://greatdeer007.blog.163.com/blog/static/16366517420105331141251/
2. 网络服务配置
若安装Oracle数据库软件时选择的是只安装数据库软件,不创建数据库,则我们需要在安装完毕后使用dbca创建数据库,创建数据库之前,必须使用netca工具配置监听程序。
[oracle@gd47 oracle]$ netca
Oracle Net Services 配置:
打开工具后,选择监听程序配置,设置时,端口一般设置为 1521
正在配置监听程序:ORACLELISTENER
监听程序配置完成。
Oracle Net 监听程序启动:
正在运行监听程序控制:
/sdd1/oracle/11gR2_database_X64/product/11.2.0.1.0/db_1/bin/lsnrctl start ORACLELISTENER
监听程序控制完成。
监听程序已成功启动。
成功完成 Oracle Net Services 配置。退出代码是0
查看监听进程
[oracle@gd47 oracle]$ netstat -an | grep 1521
tcp 0 0 :::1521 :::* LISTEN
[oracle@gd47 oracle]$ ps -ef | grep oracle
oracle 11664 1 0 17:13 ? 00:00:00 /sdd1/oracle/11gR2_database_X64/product/11.2.0.1.0/db_1/bin/tnslsnr ORACLELISTENER -inherit
3. 数据库安装
使用 dbca 工具可以创建oracle数据库,注意字符集,创建数据库前注意当前终端 LANG 的设置.
若 LANG=zh_CN.GB18030,数据库字符集会默认设置为simplified chinese_china.ZHS16GBK。
中文Windows 默认是 simplified chinese_china.ZHS16GBK 字符集。
4. 数据库启动和停止
(1) 首先启动 listener 进程
#!/bin/bash
#
# Author: zhankunlin
# Date: 2011-11-29
# Desc: start/stop LISTENER of oracle database
#
case $1 in
"start")
lsnrctl start
;;
"stop")
lsnrctl stop
;;
"status")
lsnrctl status
;;
*)
echo "Usage: $0 <start|stop|status>"
exit
;;
esac
(2) 启动数据库实例
注意 ORACLE_SID 是一个重要的环境变量,在启动数据库实例时起作用,它指数据库ID号。
#!/bin/bash
#
# Author: zhankunlin
# Date: 2011-11-29
# Desc: start/stop oracle database service
#
function usage()
{
echo "$0 <dbSID> <start|stop>"
echo "use: start/stop oracle database service"
}
if [ $# -lt 2 ]; then
usage;
exit
fi
dbSID=$1
op=$2
### function region ###
function start()
{
echo "start database $dbSID"
export ORACLE_SID=$dbSID # 只有 ORACLE_SID 环境变量设置后, 才可使用 conn / as sysdba 来登录, 否则提示错误
#lsnrctl start
sqlplus /nolog <<EOF
conn / as sysdba
startup
EOF
echo "start finished"
}
function stop()
{
echo "stop database $dbSID"
export ORACLE_SID=$dbSID
#lsnrctrl stop
sqlplus /nolog <<EOF
conn / as sysdba
shutdown immediate
EOF
echo "stop finished"
}
### function region end ###
case $op in
"start")
start
;;
"stop")
stop
;;
*)
usage
;;
esac
(3) 启动 OEM
注意 ORACLE_UNQNAME 是一个重要的环境变量,在启动数据库实例时起作用,它指数据库名。
#!/bin/bash
#
# Author: zhankunlin
# Date: 2011-11-29
# Desc: start/stop OEM of oracle database
#
function usage()
{
echo "$0 <dbName> <start|stop|status>"
echo "use: start/stop OEM of oracle database"
}
if [ $# -lt 2 ]; then
usage;
exit;
fi
dbname=$1
op=$2
## function region start ##
function oemOp()
{
dbname=$1 #函数的第一个参数,并不是整个脚本的第一个参数
op=$2
echo "$op OEM of database $dbname"
export ORACLE_UNQNAME=$dbname # 只有 ORACLE_UNQNAME 环境变量设置后, 才可使用 emctl start/stop dbconsole 来启动和停止OEM
emctl $op dbconsole
}
## function region end ##
oemOp $dbname $op
5. SQLPlus使用
(一) 让SQLPlus支持上下左右按键
Oracle SQLPLus 是不支持上下左右,查阅历史键的,通过 rlwrap 软件可以使sqlplus使用非常方便。
下载安装 rlwrap 软件,然后使用 rlwrap sqlplus 命令启用 sqlplus,使得支持上下左右,delete 等命令。
建议 alias sqlplus='/usr/local/bin/rlwrap sqlplus'
(二) 常用命令
【1】 登陆和连接
(1) Windows SQLPlus连接远程Oracle数据库
连接字符串写成:192.123.456.2:1521/orcl
(2) Linux SQLPlus 连接远程Oracle数据库
方式一:简易连接,不用进行网络配置(其实就是tnsname.ora文件),但只支持oracle10G以上。
命令【所有都适应】:sqlplus 用户名/密码@ip地址[:端口]/service_name [as sysdba]
命令【本地】: sqlplus zkl/zkl@orcl as sysdba 用户名/密码 @网络服务名 as 身份
示例:sqlplus sys/pwd@ip:1521/test as sysdba
备注:使用默认1521端口时可省略输入
方式二:进行网络配置 oracle9i和以前的版本
2.1图形化操作:Net Configuration Assistant--> 本地Net服务名配置-->添加->服务名->协议(选tcp)->主机名称->端口->完成。
2.2文本化操作:编辑$ORACLE_HOME/NETWORK/ADMIN/tnsnames.ora文件
test =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = ip或主机名称)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = 数据库的服务名称)
)
)
参考:http://www.cnblogs.com/zhou__zhou/archive/2010/03/19/sqlplus.html
(3) 常用连接命令
sqlplus /nolog
conn zkl/zkl @orcl
conn sys/zkl @orcl as sysdba
或者
export ORACLE_SID=orcl
sqlplus /nolog
conn / as sysdba 《必须首先设置环境变量ORACLE_SID》
conn zkl/zkl
【2】用户和权限
(1)创建用户并赋予权限
SQL> CREATE USER "ZKL" IDENTIFIED BY "zkl" //密码是 zkl ,注意密码大小写
SQL> GRANT "CONNECT" TO "ZKL";
SQL> GRANT "RESOURCE" TO "ZKL";
SQL> alter USER "ZKL" IDENTIFIED BY "zkl" //修改密码
SQL> commit;
//创建用户并指定表空间
create user testserver_user identified by testserver_user
default tablespace test_data
temporary tablespace test_temp;
(1)
使用SYS用户登陆数据库,在OEM中创建了一个新用户zkl,并授予了系统权限SYSDBA。
然后使用该用户登陆数据库(以normal身份和sysdba身份都可登陆),使用该用户创建表和插入数据到表中时,出现了“ORA-01950: 表空间'USERS'中无权限”错误。
到网上找了一下,原来是没有把resource和connect角色赋给用户,使用SYS用户登陆,执行语句grant resource,connect to zkl。解决了问题。
此外,通过OEM查看用户zkl权限,还有一个 UNLIMITED TABLESPACE 系统权限没有赋给用户,以防万一,这里也赋予一下。
grant resource,connect to zkl;
GRANT UNLIMITED TABLESPACE TO ZKL WITH ADMIN OPTION;
参考:http://youchenglin.iteye.com/blog/631202
Oracle 11g 下这两个角色的权限
CONNECT角色:
CREATE SESSION --建立会话
RESOURCE角色: --是授予开发人员的
CREATE CLUSTER --建立聚簇
CREATE INDEXTYPE
CREATE OPERATOR
CREATE PROCEDURE --建立过程
CREATE SEQUENCE --建立序列
CREATE TABLE --建表
CREATE TRIGGER --建立触发器
CREATE TYPE --建立类型
(2)
在PL/SQL中,使用zkl用户,以normal身份登陆数据库后,
创建 INDUSTRY 表,并插入数据,commit。
然后在 sqlplus 中,使用zkl用户,以sysdba身份登陆(conn zkl/zkl @zkl as sysdba),查询不到INDUSTRY表,而以普通身份登陆,能查询到(conn zkl/zkl @zkl)。
在C++程序中也可以访问到数据表。
(3) Oracle 11g 中 scott用户(密码tiger)的角色和权限
CONNECT, RESOURCE 角色
UNLIMITED TABLESPACE 系统权限
(4) scott 用户解锁
新装完Oracle10g后,用scott/tiger用户登录,会出现以下错误提示:
conn scott/tiger
error:
oracle10g the account is locked
oracle10g the password has expired
原因:
默认Oracle10g的scott不能登陆。被禁用了。
解决方法:
(1)以DBA的身份登录
conn sys/password @orcl as sysdba;
(2)解锁
alter user scott account unlock;
(3)使用scott用户登陆,弹出一个修改密码的对话框,修改密码
conn scott/tiger
SQL> conn sys/sys as sysdba;
Connected.
SQL> alter user scott account unlock;
User altered.
SQL> commit;
Commit complete.
SQL> conn scott/tiger 请输入新密码,并确认后OK
Password changed
Connected.
【3】表和表空间
(1) 创建表
create table TerminalStatus
(
TerminalStatusID NUMBER(6) not null,
TerminalStatus VARCHAR2(10),
constraint PK_TERMINALSTATUS primary key (TerminalStatusID)
);
(2) 修改表
alter table goods modify ( INVOICE_ID NUMBER(20) NOT NULL );
(3) 查看表结构
SQL> desc industry;
(4) 列出某个用户建立的所有表
SQL> conn sys/zkl @zkl as sysdba
已连接。
SQL> select OWNER, TABLE_NAME from dba_tables where owner ='ZKL';
(5) 创建表空间 HELLO
CREATE SMALLFILE TABLESPACE "HELLO" DATAFILE '/sdd1/oracle/11gR2_database_X64/oradata/orcl/hello_table_space' SIZE 100M LOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO ;
表空间已创建。
(6) 在表空间HELLO上创建数据表,
注意数据表是用户拥有的,并不是表空间所拥有的,指定表空间只是指定数据表中数据对应的存储文件的位置,同一个用户创建的表的表名必须唯一。
语句:create table Student ( StuID varchar2(10) primary key, StuName varchar2(30) not null ) tablespace HELLO;
(7) 查询表空间 HELLO 上的所有表
SQL> select table_name, tablespace_name from dba_tables where TABLESPACE_NAME = 'HELLO';
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
STUDENT HELLO
【4】其它命令
(1) edit 命令保存缓存命令
使用edit命令可以将缓冲区中保存的所有历史命令写入文件中,若配置了 EDITOR 环境变量为vi,则会自动调用vi编辑器。 export EDITOR=vi
SQL> edit
(2) 执行本地SQL脚本
登陆进入 sqlplus 后,使用如下命令:
@文件路径
如
SQL> @/usr/test.sql