CentOS中安装Oracle

下载地址

Win64

http://download.oracle.com/otn/nt/oracle11g/112010/win64_11gR2_client.zip

http://download.oracle.com/otn/nt/oracle11g/112010/win64_11gR2_database_1of2.zip

http://download.oracle.com/otn/nt/oracle11g/112010/win64_11gR2_database_2of2.zip

Win32

http://download.oracle.com/otn/nt/oracle11g/112010/win32_11gR2_client.zip

http://download.oracle.com/otn/nt/oracle11g/112010/win32_11gR2_database_1of2.zip

http://download.oracle.com/otn/nt/oracle11g/112010/win32_11gR2_database_2of2.zip

Oracle Database 11g Release 2 (11.2.0.1.0) for Linux x86-64

http://download.oracle.com/otn/linux/oracle11g/R2/linux.x64_11gR2_client.zip

http://download.oracle.com/otn/linux/oracle11g/R2/linux.x64_11gR2_database_1of2.zip

http://download.oracle.com/otn/linux/oracle11g/R2/linux.x64_11gR2_database_2of2.zip

Oracle Database 11g Release 2 Client (11.2.0.1.0) for Linux x86

http://download.oracle.com/otn/linux/oracle11g/R2/linux_11gR2_client.zip

http://download.oracle.com/otn/linux/oracle11g/R2/linux_11gR2_database_1of2.zip

http://download.oracle.com/otn/linux/oracle11g/R2/linux_11gR2_database_2of2.zip

注意

client不用安装

下载可以使用迅雷,其他工具无法下载。

用户及环境配置

1 创建运行oracle数据库的系统用户和用户组

1
2
3
4
5
6
7
8
9
10
11
12
#切换到root
su root  
#创建用户组oinstall
groupadd oinstall
#创建用户组dba
groupadd dba
#创建oracle用户,并加入到oinstall和dba用户组
useradd -g oinstall -G dba -m oracle
#设置用户oracle的登陆密码,不设置密码,在CentOS的图形登陆界面没法登陆
passwd oracle
#查看新建的oracle用户
id oracle

2、修改/etc/sysctl.conf文件

1
vi /etc/sysctl.conf

添加如下内容

1
2
3
4
5
6
7
8
9
10
11
fs.file-max = 6815744
fs.aio-max-nr = 1048576
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 4194304
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576

使用命令使 sysctl.conf 配置生效。

1
/sbin/sysctl -p

3、修改操作系统核心参数
输入命令:

1
vi /etc/security/limits.conf

将下列内容加入该文件。

1
2
3
4
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536

4.、修改/etc/pam.d/login 文件,

输入命令:

1
vi /etc/pam.d/login

将下列内容加入该文件。

1
2
session required /lib/security/pam_limits.so
session required pam_limits.so

5、 编辑 /etc/profile

输入命令:

1
vi /etc/profile

将下列内容加入该文件。

1
2
3
4
5
6
7
8
if [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi

6、切换为 root 用户,关闭 selinux

1
2
su root
vi /etc/selinux/config

修改SELINUX为disabled,如下:

1
2
SELINUX=disabled
SELINUXTYPE=targeted

软件包依赖

安装oracle之前需要许多软件包依赖,使用如下命令安装。

1
yum -y install binutils compat-libcap1 compat-libstdc++-33 compat-libstdc++-33*i686 compat-libstdc++-33*.devel compat-libstdc++-33 compat-libstdc++-33*.devel gcc gcc-c++ glibc glibc*.i686 glibc-devel glibc-devel*.i686 ksh libaio libaio*.i686 libaio-devel libaio-devel*.devel libgcc libgcc*.i686 libstdc++ libstdc++*.i686 libstdc++-devel libstdc++-devel*.devel libXi libXi*.i686 libXtst libXtst*.i686 make sysstat unixODBC unixODBC*.i686 unixODBC-devel unixODBC-devel*.i686

检测依赖是否都已安装

1
rpm -q binutils compat-libstdc++-33 elfutils-libelf expat gcc gcc-c++ glibc glibc-common glibc-devel glibc-headers libaio libaio-devel libgcc libstdc++ libstdc++-devel make sysstat unixODBC unixODBC-devel | grep "未安装"

目录生成

如果安装失败可以先删除之前的安装文件

再重新创建文件夹

1
rm -rf /data/tools/oracle

创建数据库软件目录和数据文件存放目录,注意磁盘空间即可,这里我放到oracle用户下,输入如下命令:

1
2
3
4
mkdir -p /data/tools/oracle/app
mkdir -p /data/tools/oracle/app/oracle/product/11.2.0/db_1
mkdir -p /data/tools/oracle/app/oradata
mkdir -p /data/tools/oracle/oraInventory

更改目录属主为 oracle 用户所有,输入命令:

1
chown -R oracle:oinstall /data/tools/oracle

解压

1
2
3
4
unzip linux.x64_11gR2_database_1of2.zip
unzip linux.x64_11gR2_database_2of2.zip

mv database /home/oracle/

使用图形化界面安装

安装 vnc server

用于图形化界面安装

1
2
yum -y install tigervnc-server 
yum -y install xorg-x11-server-utils-7.7-20.el7.x86_64

如果没有安装Linux图形界面,则需要安装:

1
2
3
4
#【检查是否安装了图形界面】
rpm -qa |grep gnome
#【安装】
yum groupinstall "X Window System" "Chinese Support" "Desktop"

配置使用gnome桌面

1
vi /root/.vnc/xstartup

结尾添加一行

1
gnome &

切换到oracle用户

1
su - oracle

启动vnc服务

1
2
3
4
5
6
#启动vnc服务 
vncserver
#查看启动的服务
vncserver -list
#后面的:2是上面列表对应的值
export DISPLAY=localhost.localdomain:2

配置使用gnome桌面

1
vi /home/oracle/.vnc/xstartup

结尾添加一行

1
gnome &

vncserver

1
2
3
4
#列出当前用户所建立的所有远程桌面。
vncserver -list
#关闭vncserver
vncserver -kill :n

环境变量

配置 oracle 用户环境变量

切换为oracle用户登录

1
su - oracle

编辑 .bash_profile ,输入命令:

1
vi ~/.bash_profile

添加如下环境变量。

1
2
3
4
5
export ORACLE_BASE=/data/tools/oracle/app
export ORACLE_HOME=/data/tools/oracle/app/oracle/product/11.2.0/db_1
export ORACLE_SID=orcl
export PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib

生效

1
2
source ~/.bash_profile
echo $ORACLE_HOME

安装

切换到oracle用户

1
su - oracle

进入 database 目录,使用./runInstaller命令安装,如下

1
2
3
cd database
export LANG=en_US.UTF-8
./runInstaller

vnc viewer安装

Windows上使用vnc viewer连接

连接地址是192.168.7.101:1

前面的是服务器的IP,后面的可以通过下面的命令查看

1
vncserver -list

取消勾选

image-20230131154738506

安装选项,三个选项分别为:

①创建并配置一个新数据库。

②只安装数据库软件,适用于已有Oracle数据库数据用于数据迁移的。

③升级已有数据库。

这里选择第一个选项。

image-20230131154712068

选择服务器模式

image-20230131154914014

选择单实例

image-20230131155011502

选择自定义安装

image-20230131155106778

添加简体中文

image-20230131155207716

选择企业版

image-20230131155248720

安装位置会自动使用之前设置的环境变量的值,直接下一步

image-20230131155323237

image-20230131155423853

以下保持默认下一步

image-20230131160153005

image-20230131160230070

内存使用4G

image-20230131160434595

字符集使用UTF-8

image-20230131160512994

以下保持默认

image-20230131160603024

image-20230131161139805

自动备份

开不开启都可以

开启的话 注意密码为之前创建用户的密码

image-20230131161303715

设置Oracle用户密码,密码强度弱会显示红色,但是不影响。

image-20230131161623087

image-20230131161802869

忽略所有

image-20230131161931970

点击Finish进行安装

安装过程中报错

image-20230131162305687

错误1

Error in invoking target ‘install’ of makefile ‘/data/tools/oracle/app/oracle/product/11.2.0/db_1/ctx/lib/ins_ctx.mk’.

日志中的错误为

1
INFO: //usr/lib64/libstdc++.so.5: undefined reference to `memcpy@GLIBC_2.14'

解决方式

编辑创建脚本:

fix_ins_ctx.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Fix ctx/lib/ins_ctx.mk

ORACLE_HOME=/data/tools/oracle/app/oracle/product/11.2.0/db_1

cat << __EOF__ > /tmp/memcpy_wrap.c
#include <stddef.h>
#include <string.h>

asm (".symver wrap_memcpy, memcpy@GLIBC_2.14");
void *wrap_memcpy(void *dest, const void *src, size_t n) {
return memcpy(dest, src, n);
}
__EOF__

if [[ -e "${ORACLE_HOME}/ctx/lib/ins_ctx.mk" ]]; then
sed -i -e 's/\$(INSO_LINK)/\$(INSO_LINK) -Wl,--wrap=memcpy_wrap \$(ORACLE_HOME)\/ctx\/lib\/memcpy_wrap.o/g' ${ORACLE_HOME}/ctx/lib/ins_ctx.mk
gcc -c /tmp/memcpy_wrap.c -o ${ORACLE_HOME}/ctx/lib/memcpy_wrap.o && rm /tmp/memcpy_wrap.c
fi

运行

1
2
chmod 777 fix_ins_ctx.sh
./fix_ins_ctx.sh

错误2

Error in invoking target ‘agent nmhs’ of makefile ‘/data/tools/oracle/app/oracle/product/11.2.0/db_1/sysman/lib/ins_emagent.mk’.

解决方式

打开ins_emagent.mk,将里面的

1
$(MK_EMAGENT_NMECTL)

替换为

1
$(MK_EMAGENT_NMECTL) -lnnz11

注意:lnnz$(MK_EMAGENT_NMECTL)之间有空格,然后点击重试按钮或者retry按钮

image-20230201004626171

新打开控制台,使用root运行

1
2
/data/tools/oracle/oraInventory/orainstRoot.sh
/data/tools/oracle/app/oracle/product/11.2.0/db_1/root.sh

image-20230201005058522

直接回车即可。

命令行安装

安装

1
2
su - oracle
cd database

复制配置文件

1
2
3
mkdir ~/etc
cp response/* ~/etc/
chmod 700 ~/etc/*.rsp

添加配置

1
vi ~/etc/db_install.rsp

修改如下的项,不要直接覆盖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#安装类型
oracle.install.option=INSTALL_DB_SWONLY
#主机名称(hostname查询)
ORACLE_HOSTNAME=hadoop01
#安装组
UNIX_GROUP_NAME=oinstall
#INVENTORY目录(不填就是默认值)
INVENTORY_LOCATION=/data/tools/oracle/oralnventory
#选择语言
SELECTED_LANGUAGES=en,zh_CN
#oracle_home
ORACLE_HOME=/data/tools/oracle/app/oracle/product/11.2.0/db_1
#oracle_base
ORACLE_BASE=/data/tools/oracle/app
#oracle版本
oracle.install.db.InstallEdition=EE
#自定义安装,否,使用默认组件    
oracle.install.db.isCustomInstall=false
#dba用户组
oracle.install.db.DBA_GROUP=dba
#oper用户组
oracle.install.db.OPER_GROUP=oinstall
#数据库类型
oracle.install.db.config.starterdb.type=GENERAL_PURPOSE
#globalDBName
oracle.install.db.config.starterdb.globalDBName=orcl
#SID
oracle.install.db.config.starterdb.SID=orcl
#自动管理内存的内存(M)
oracle.install.db.config.starterdb.memoryLimit=4096
#设定所有数据库用户使用同一个密码
oracle.install.db.config.starterdb.password.ALL=oracle
SECURITY_UPDATES_VIA_MYORACLESUPPORT=false
#设置安全更新(貌似是有bug,这个一定要选true,否则会无限提醒邮件地址有问题,终止安装。PS:不管地址对不对)
DECLINE_SECURITY_UPDATES=true

运行安装

1
./runInstaller -silent -ignorePrereq -ignoreSysPrereqs -responseFile ~/etc/db_install.rsp

可按他提示的查看日志,新增一个命令窗口,执行

1
tail -f /data/tools/oracle/oralnventory/logs/installActions2023-01-31_06-19-59PM.log

根据提示新打开一个窗口运行以下命令

image-20230131182708406

运行

1
2
/data/tools/oracle/oralnventory/orainstRoot.sh
/data/tools/oracle/app/oracle/product/11.2.0/db_1/root.sh

启动监听程序

1
2
su - oracle
vi ~/.bash_profile

如下

1
2
3
4
5
6
7
8
9
10
11
#for oracle
export ORACLE_BASE=/data/tools/oracle/app
export ORACLE_HOME=/data/tools/oracle/app/oracle/product/11.2.0/db_1
export ORACLE_SID=orcl
export ROACLE_PID=ora11g
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib
export PATH=$PATH:$ORACLE_HOME/bin

export LANG="zh_CN.UTF-8"
export NLS_LANG="SIMPLIFIED CHINESE_CHINA.AL32UTF8"
export NLS_DATE_FORMAT='yyyy-mm-dd hh24:mi:ss'

配置生效

1
source ~/.bash_profile

配置监听程序

1
netca /silent /responsefile /home/oracle/etc/netca.rsp

启动监听程序

1
lsnrctl start

建库

静默dbca建库

1
vi ~/etc/dbca.rsp

内容如下

1
2
3
4
5
6
7
8
[GENERAL]
RESPONSEFILE_VERSION = "11.2.0"
OPERATION_TYPE = "createDatabase"
[CREATEDATABASE]
GDBNAME = "orcl"
SID = "orcl"
TEMPLATENAME = "General_Purpose.dbc"
CHARACTERSET = "AL32UTF8"

运行

1
dbca -silent -responseFile ~/etc/dbca.rsp

查看

查看oracle实例进程

1
ps -ef | grep ora_ | grep -v grep

删除实例

1
dbca -silent -deleteDatabase -sourcedb orcl

查看监听状态

1
lsnrctl status

重启Oracle

切换为oracle用户登录

1
su - oracle

启动

1
2
3
4
5
6
#启动监听
lsnrctl start
sqlplus /nolog
connect /as sysdba
#启动数据实例
startup

启动过程中发现内存不够 执行

1
mount -o remount,size=3G /dev/shm/

退出

1
quit

停止

1
2
3
4
5
6
7
8
sqlplus /nolog
conn /as sysdba
#停止 Oracle 服务
shutdown immediate;
quit

#停止监听器
lsnrctl stop

测试

查看

1
lsof -i:1521

连接数据库

1
2
sqlplus / as sysdba
select status from v$instance;

SQL语法

数据库实例

1
2
3
4
5
6
#查看登录的数据库实例
select instance_name from v$instance;
#查看当前登录的用户
show user
#查看数据字典包含哪些字段
desc dba_users;

全局查找

1
2
3
4
5
6
7
8
9
10
-- 查看所有的表
select * from dba_tables;
select * from dba_tab_columns;
-- 查看数据文件
select name from v$datafile;
-- 查看表空间
select * from dba_tablespaces;

select * from dba_tablespaces t where t.TABLESPACE_NAME = 'ZDB';
select * from dba_tables t where t.TABLE_NAME = 'T_USER';

表空间和用户

临时表空间

1
2
3
4
5
6
7
创建临时表空间
create temporary tablespace ZDB_TEMP
tempfile '/data/tools/oracle/app/oradata/zdb_temp.dbf'
size 256m
autoextend on
next 500m maxsize 20000m
extent management local;

表空间

1
2
3
4
5
6
7
-- 创建表空间
create tablespace ZDB datafile '/data/tools/oracle/app/oradata/zdb.dbf'
size 512M reuse autoextend on next 40M maxsize unlimited default storage(
initial 128k next 128k minextents 2 maxextents unlimited
);
-- 重命名表空间
alter tablespace ZDB rename to MDB;

注意

一个用户可以有多个表空间,一个表空间可以有多个用户,但是为了方便,一个用户只设置一个表空间,这样在执行SQL的时候就不用再指定表空间了。

建用户

1
2
3
create user zhangjian identified by zhangjian
default tablespace ZDB
temporary tablespace temp;

指定表空间给用户

1
alter user zhangjian default tablespace ZDB;

修改密码

1
alter user zhangjian identified by zhangjian;

删除用户

1
2
3
4
5
6
--查看用户的连接状态
select username,sid,serial# from v$session;
--找到要删除用户的sid和serial并杀死
alter system kill session '74,91';
--删除用户,及级联关系也删除掉
drop user zhangjian cascade;

Oracle赋权限

1
grant connect,resource,dba to zhangjian;

表操作

创建表

1
2
3
4
5
CREATE TABLE T_USER (
"ID" NUMBER NOT NULL ,
"NAME" VARCHAR2(100) NULL ,
PRIMARY KEY ("ID")
);

在表空间下建表

1
2
3
4
5
CREATE TABLE T_USER (
"ID" NUMBER NOT NULL ,
"NAME" VARCHAR2(100) NULL ,
PRIMARY KEY ("ID")
) tablespace ZDB;

用户下建表

1
2
3
4
5
CREATE TABLE "ZHANGJIAN"."T_USER" (
"ID" NUMBER NOT NULL ,
"NAME" VARCHAR2(100) NULL ,
PRIMARY KEY ("ID")
);

删除表

1
DROP TABLE T_USER;

插入数据

1
2
insert into T_USER(id,name) values(3,'xiaoming_oracle');
insert into T_USER(id,name) values(4,'xiaohong_oracle');

用户到期

重新设置密码

1
2
3
4
sqlplus /nolog
connect /as sysdba
alter user zhangjian identified by zhangjian;
ALTER USER zhangjian ACCOUNT UNLOCK;

修改有效期

1
2
3
4
5
# 获取有效期
SELECT * FROM dba_profiles s WHERE s.profile='DEFAULT' AND resource_name='PASSWORD_LIFE_TIME';

# 有效期设置为永久
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;

Java连接

jar包位置

/data/tools/oracle/app/oracle/product/11.2.0/db_1/jdbc/lib

找到ojdbc6.jar添加到Maven中

image-20230201103738112

添加到maven中

1
mvn install:install-file -Dfile="D:\Jars\ojdbc6.jar" -DgroupId="com.oracle" -DartifactId="ojdbc6" -Dversion="11.2.0.3" -Dpackaging=jar -DgeneratePom=true

pom中引用

1
2
3
4
5
6
<!--连接Oracle-->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.3</version>
</dependency>

Java中使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.sql.*;

public class OracleTest {
public static void main(String[] args) throws Exception {
Statement stmt = null;
PreparedStatement pstmt = null;
ResultSet rs = null;

Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@192.168.7.101:1521:orcl";
String uname = "zhangjian";
String pwd = "zhangjian";
Connection conn = DriverManager.getConnection(url, uname, pwd);
System.out.println(conn.getClass().getName());
//发送sql语句
stmt = conn.createStatement();
//建立ResultSet结果集对象,执行sql语句
String sql = "select * from t_user";
rs = stmt.executeQuery(sql);
while (rs.next()) {
int id = rs.getInt("ID");
String name = rs.getString("NAME");
System.out.println(String.format("id:%s name:%s", id + "", name));
}
}
}

开放防火墙

开放1521端口

1
2
firewall-cmd --zone=public --add-port=1521/tcp --permanent
firewall-cmd --reload