前言:安装期间看了无数的博客,帖子,每一篇开头都说“踩坑无数,我的帖子是最全的,最完整的,最保险之类的话”,但是我们自己按照博客安装的时候报错很多,所以没有最好的,能找到适合自己系统的就阿弥陀佛咯,当然了,下文也有很多直接copy别人的:
准备工作:
1:CentOS 7操作系统(我是单独挂载了一个20G的/oracle作为数据库的安装一级目录,我的机器内存是4G,swap我给加到了10G(swap最好是物理内存 x2),不会加的可以看我的博客)
2:oracle安装包两个 linux.x64_11gR2_database_1of2 , linux.x64_11gR2_database_2of2
3:配好yum源,具体可见博客
4:以下操作在没有创建oracle用户之前都是在root用户下面操作,建了oracle用户之后就在oracle用户下操作,除非特殊规定在root下面执行
开始干活:
1:安装依赖包
yum -y install binutils \
unixODBC-devel \
unixODBC \
sysstat \
pdksh \
make \
libstdc++-devel \
libstdc++ \
libgcc \
libaio-devel \
libaio \
glibc-headers \
glibc-devel \
glibc-common \
glibc \
gcc-c++ \
gcc \
expat \
elfutils-libelf-devel \
elfutils-libelf \
compat-libstdc++-33 \
ksh
2:查看依赖包是否安装成功
rpm -q \
ksh \
unixODBC \
sysstat \
pdksh \
make \
libstdc++-devel \
libstdc++ \
libgcc \
libaio-devel \
libaio \
glibc-headers \
glibc-devel \
glibc-common \
glibc \
gcc-c++ \
gcc \
expat \
elfutils-libelf-devel \
elfutils-libelf \
compat-libstdc++-33 \
binutils \
unixODBC-devel | grep "not installed"
会有一个显示未安装成功,没事儿,可忽略
3:创建oracle用户以及各用户组
groupadd oinstall
groupadd db
groupadd asmadmin
groupadd asmdba
useradd -g oinstall -G dba,asmdba -d /home/oracle oracle # -g表示主组 -G表示附属组 -d表示家目录
id oracle # 看下用户信息对不对
passwd oracle # 修改oralce用户密码
4:将hostname添加至 /etc/hosts
192.168.11.11 centos7 #centos7 为我的主机名
5:ping -c 3 centos7 # 看看能不能ping通
6、优化OS内核参数
Step1:vi /etc/sysctl.conf
## 内容如下(以下是我24G服务器的配置):
fs.aio-max-nr=1048576
fs.file-max=6815744
kernel.shmall=4194304
kernel.shmmni=4096
kernel.shmmax=17179869184
kernel.sem=250 32000 100 128
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=1048586
FreshQin题外话-详解参数:
kernel.shmall的单位是页。
简述:2097152 =8G ,4194304=16G
详述:对于X86的linux系统,一页=4k,也就是4096字节。kernel.shmall = 2097152 就是 2097152*4k/1024/1024 = 8G 就是说可用共享内存一共8G。
一个共享内存段的最大大小是16G,那么需要共享内存页数是 16GB/4KB=16777216KB/4KB=4194304 (页),也就是64Bit 系统下
16GB 物理内存,设置 kernel.shmall = 4194304 才符合要求(几乎是原来设置2097152
的两倍)。这时可以将shmmax 参数调整到 16G 了,同时可以修改SGA_MAX_SIZE 和
SGA_TARGET 为 12G(您想设置的SGA 最大大小,当然也可以是2G~14G 等,还要协调PGA
参数及OS 等其他内存使用,不能设置太满,比如16G)。
kernel.shmmni:
共享内存段的最大数量,shmmni 缺省值 4096 ,一般肯定是够用了
kernel.shmmax:
Shmmax 是核心参数中最重要的参数之一,用于定义单个共享内存段的最大值(以字节为单位),
设置应该足够大,能在一个共享内存段下容纳下整个的SGA ,设置的过低可能会导致需要创建多个共享内存段,这样可能导致系统性能的下降,最大值为16GB(在大多数情况下,该值应该比SGA大)。
其值应>=sag_max_size初始化参数的大小,否则SAG由多个内存段构成,效率降低,
还要不小于物理内存的一半,默认情况下在32位x86系统中,Oracle SGA最大不能超过1.7GB.
缺省为32M,对于oracle来说,该缺省值太低了,通常将其设置为2G(2147483648)
针对24G的服务器,至少12G的配置,则是17179869184
其他参数简单说明:
kernel.sem // 表示设置的信号量
fs.file-max // 表示一个进程可以打开的文件句柄的最大数量.
net.ipv4.ip_local_port_range //专用服务器模式下与用户进程通信时分配给用户的端口区间
net.core.rmem_default // 默认接收缓冲区大小
net.core.rmem_max // 接收缓冲区最大值
net.core.wmem_default // 默认的发送缓冲区大小
net.core.wmem_max // 发送缓冲区最大值
添加完毕在命令行执行 sysctl -p 使之生效
7、限制oracle用户的shell权限:
Step1:vi /etc/security/limits.conf
#在末尾添加
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
FreshQin题外话-limits.conf 配置说明:
<domain> <type> <resource> <value>
domain:
username|@groupname:设置需要被限制的用户名,组名前面加@ 与 用户名 区别。 * 表示所有用户(注意有的系统不支持哦)。
type:
soft 指的是当前系统生效的设置值,
hard 表明系统中所能设定的最大值(soft 的限制不能比har 限制高 )
- 就表明同时设置了 soft 和 hard 的值。
resource(针对Oracle的我们主要配置nproc nofile):
as-地址空间限制
rss-最大持久设置大小
cpu-以分钟为单位的最多 CPU 时间
core-限制内核文件的大小
date-最大数据大小
stack-最大栈大小
fsize-最大文件大小
noproc-进程的最大数目
nofile-打开文件的最大数目
memlock-最大锁定内存地址空间
maxlogins-此用户允许登录的最大数目
value: 限制的值
Step2:vi /etc/pam.d/login
#在末尾添加
session required /lib64/security/pam_limits.so
session required pam_limits.so
Step3:vi /etc/profile
#在末尾添加
if [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi
--------------------------------------------------------
使之生效:
source /etc/profile
8、创建oracle安装目录:
mkdir -p /oracle/app/oracle/product/11.2.0/client
mkdir /oracle/app/oracle/oradata
mkdir /oracle/app/oraInventory
mkdir /oracle/app/oracle/fast_recovery_area
chown -R oracle:oinstall /oracle
chmod -R 775 /oracle
创建 vi /etc/oraInst.loc
inventory_loc=/oracle/app/oraInventory
inst_group=oinstall
并授权:
chown oracle:oinstall /etc/oraInst.loc
chmod 664 /etc/oraInst.loc
9、配置oracle用户环境变量:
su - oracle ## oracle用户登陆(如果无法直接切换,请使用oracle/密码 登录)
vi .bash_profile
#注意修改你的hostname!
export ORACLE_HOSTNAME=cainiaoke
export ORACLE_BASE=/oracle/app/oracle
export ORACLE_SID=kehana
export ORACLE_HOME=/oracle/app/oracle/product/11.2.0/client
export LANG="en_us"
export NLS_LANG="AMERICAN_AMERICA.ZHS16GBK"
export NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS"
## 以上配置完成后,建议重启系统 或分别执行以下命令:
source /home/oracle/.bash_profile
10,解压oracle安装包
cd /oracle
unzip linux.x64_11gR2_database_1of2
unzip linux.x64_11gR2_database_2of2
11,修改静默安装响应文件
vi /oracle/database/response/db_install.rsp
在此文件中修改以下配置信息,切记不是添加,是修改
oracle.install.option=INSTALL_DB_SWONLY
ORACLE_HOSTNAME=centos7 #主机名替换成自己的
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/oracle/app/oraInventory # oraInventory目录最好别在ORACLE_BASE目录中
SELECTED_LANGUAGES=en,zh_CN
ORACLE_HOME=/oracle/app/oracle/product/11.2.0/client
ORACLE_BASE=/oracle/app/oracle
oracle.install.db.InstallEdition=EE
oracle.install.db.DBA_GROUP=dba
oracle.install.db.OPER_GROUP=dba
DECLINE_SECURITY_UPDATES=true
12,开始静默安装
cd /oracle/database
./runInstaller -silent -responseFile/oracle/database/response/db_install.rsp -ignorePrereq
[oracle@cainiaoke163 database]$ ./runInstaller -silent -responseFile /oracle/database/response/db_install.rsp -ignorePrereq
Starting Oracle Universal Installer...
Checking Temp space: must be greater than 120 MB. Actual 3424 MB Passed
Checking swap space: must be greater than 150 MB. Actual 10239 MB Passed
Preparing to launch Oracle Universal Installer from /tmp/OraInstall2021-02-04_10-35-13AM. Please wait ...[oracle@cainiaoke163 database]$ You can find the log of this install session at:
/oracle/app/oraInventory/logs/installActions2021-02-04_10-35-13AM.log
The following configuration scripts need to be executed as the "root" user.
#!/bin/sh
#Root scripts to run
/oracle/app/oraInventory/orainstRoot.sh
/oracle/app/oracle/product/11.2.0/client/root.sh
To execute the configuration scripts:
1. Open a terminal window
2. Log in as "root"
3. Run the scripts
4. Return to this window and hit "Enter" key to continue
Successfully Setup Software.
[oracle@cainiaoke163 database]$
出现successfully表示成功
然后用 root 用户执行以下两个脚本:
sh /oracle/app/oraInventory/orainstRoot.sh
sh /oracle/app/oracle/product/11.2.0/client/root.sh
13:静默方式配置监听
[oracle@cainiaoke bin]$ netca /silent /responseFile /oracle/database/response/netca.rsp
Parsing command line arguments:
Parameter "silent" = true
Parameter "responsefile" = /oracle/database/response/netca.rsp
Done parsing command line arguments.
Oracle Net Services Configuration:
Profile configuration complete.
Oracle Net Listener Startup:
Running Listener Control:
/oracle/app/oracle/product/11.2.0/client/bin/lsnrctl start LISTENER
Listener Control complete.
Listener started successfully.
Listener configuration complete.
Oracle Net Services configuration successful. The exit code is 0
[oracle@cainiaoke bin]$ netstat -antlp|grep 1521
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp6 0 0 :::1521 :::* LISTEN 29603/tnslsnr
安装完毕后并执行 netstat -antlp|grep 1521查看端口在不在
14,静默方式建立新库并建立对应的实例
vi /oracle/database/response/dbca.rsp
修改文件中一下内容,切记是修改,不是添加
GDBNAME= "ora11g"
SID =" ora11g"
SYSPASSWORD= "abcd1234"
SYSTEMPASSWORD= "abcd1234"
SYSMANPASSWORD= " abcd1234"
DBSNMPPASSWORD= " abcd1234"
DATAFILEDESTINATION=/oracle/app/oracle/oradata
RECOVERYAREADESTINATION=/oracle/app/oracle/fast_recovery_area
CHARACTERSET= "ZHS16GBK"
TOTALMEMORY= "1638"
修改完毕之后执行截图里面的命令
[oracle@cainiaoke163 ~]$ dbca -silent -responseFile /oracle/database/response/dbca.rsp
Enter SYS user password:
Enter SYSTEM user password:
Copying database files
1% complete
3% complete
11% complete
18% complete
26% complete
37% complete
Creating and starting Oracle instance
40% complete
45% complete
50% complete
55% complete
56% complete
57% complete
60% complete
62% complete
Completing Database Creation
66% complete
70% complete
73% complete
74% complete
85% complete
96% complete
100% complete
Look at the log file "/oracle/app/oracle/cfgtoollogs/dbca/orcl11g/orcl11g.log" for further details.
建库完毕之后执行命令查看实例进程在不在:
ps -ef|grep ora_|grep -v grep
查看监听状态:
lsnrctl status
登录数据库查看实例状态:
sqlplus / as sysdba
select status from V$instance;
[oracle@cainiaoke fast_recovery_area]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on Thu Feb 4 17:41:08 2021
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> select status from V$instance;
STATUS
------------
OPEN
SQL>
15,通过IP连接数据库(在oracle用户下操作)
sqlplus /nolog #登录oracle数据库控制台
conn / as sysdba #用管理员权限登录数据库
select name from v$database; #查看当前数据库名
select instance_name from v$instance; #查看当前实例名
我们知道用sqlplus命令登录数据库需要 用户 密码 IP 端口 实例名
实例名用上面最后一条命令可以查出
端口在 $ORACLE_HOME/network/admin/tnsnames.ora 里面
IP我们也可以添加在 $ORACLE_HOME/network/admin/tnsnames.ora 这个里面,将里面 HOST=后面的主机名换成本机的IP,并确认 $ORACLE_HOME/network/admin/listener.ora 里面 HOST= 内容为主机名
用户和密码我们可以登录数据库进行创建 create user test identified by abcd1234;
给用户授权举例如下 grant create session to test; 不受此权限的话sqlplus都连上不 回收权限举例如下:revoke create table from test;
重启数据库:
停监听:lsnrctl stop
停数据库:sqlplus / as sysdba shutdown immediate
开启监听:lsnrctl start
启动数据库:sqlplus / as sysdba startup
此时你可以使用 sqlplus test/abcd1234@192.168.11.11/kehana 登录数据库
如果重启机器发现数据库登不上了并且报错 ORA-27101:shared memory realm does not exis 有可能是因为数据库非正常关闭导致的,可以直接startup启动一下,或者startup force
oracle重启报错如下:
SQL> shutdown immediate
ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
Linux-x86_64 Error: 2: No such file or directory
我是直接revocer某个时间点,命令如下:
SQL> recover database until time '2021-02-06 12:12:12';
Media recovery complete.
在执行startup:
SQL> startup
ORACLE instance started.
Total System Global Area 1603411968 bytes
Fixed Size 2213776 bytes
Variable Size 402655344 bytes
Database Buffers 1191182336 bytes
Redo Buffers 7360512 bytes
Database mounted.
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
有个报错说必须要选择这俩LOG中的一个open,那我们就open一下:
SQL> alter database open resetlogs;
Database altered.
现在在执行shutdown immediate 和 startup就OK了
再看下监听状态就有实例挂在上面了
[oracle@cainiaoke admin]$ lsnrctl status
LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 18-FEB-2021 11:00:48
Copyright (c) 1991, 2009, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Start Date 18-FEB-2021 10:42:46
Uptime 0 days 0 hr. 18 min. 2 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /oracle/app/oracle/product/11.2.0/client/network/admin/listener.ora
Listener Log File /oracle/app/oracle/diag/tnslsnr/cainiaoke/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=cainiaoke)(PORT=1521)))
Services Summary...
Service "kehana" has 1 instance(s).
Instance "kehana", status READY, has 1 handler(s) for this service...
Service "kehanaXDB" has 1 instance(s).
Instance "kehana", status READY, has 1 handler(s) for this service...
The command completed successfully
查看连接oracle数据库的连接信息
1:查看当前自己登录的oracle数据库的信息
SELECT USER,SID,SERIAL#,UTL_INADDR.GET_HOST_ADDRESS AS HOST,SYS_CONTEXT('USERENV','IP_ADDRESS') AS LOCAL,SYSDATE FROM V$SESSION WHERE AUDSID=SYS_CONTEXT('USERENV','SESSIONID');
2:查看每个oracle数据库用户的连接总数
select username,count(username) from v$session where username is not null group by username;
3:获取当前连接数据库的客户端信息(IP等)
首先创建触发器trigger :
create or replace trigger on_logon_trigger after logon on database
begin
dbms_application_info.set_client_info(sys_context('userenv', 'ip_address'));
end;
/
创建完触发器之后再去查看连接数据库的客户端IP:
select sid,serial#,username,program,machine,client_info
from v$session
where username is not null
order by username,program,machine;
4:杀掉当前连接数据库的进程
利用上一步的命令我们可以看到目前哪些服务进程在连着数据库,或者使用下面这条命令更能直观的显示
select username,sid,serial# from v$session where username = 'HJGL'; #username换成自己的,注意大小写
上一条命令可以看到 SID 和 SERIAL# 这俩字段下的值
alter system kill session 'SID,SERIAL#'; 干掉连着的服务进程
5:批量杀掉连接数据库的服务进程
select 'alter system kill session '''||sid||','||serial#||''';' from v$session where username='HJGL'; #这条命令是将select 和 alter结合在一起
设置oracle可以远程连接
主要是更改俩配置文件
1:vi $ORACLE_HOME/network/admin/listener.ora
添加如下内容(根据自己的文件来修改)我的实例名以及库名都是kehana
[oracle@cainiaoke admin]$ cat listener.ora
# listener.ora Network Configuration File: /oracle/app/oracle/product/11.2.0/client/network/admin/listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = kehana)
(ORACLE_HOME = /oracle/app/oracle/product/11.2.0/client)
(SID_NAME = kehana)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.190.128)(PORT = 1521))
)
)
ADR_BASE_LISTENER = /oracle/app/oracle
2:vi $ORACLE_HOME/network/admin/tnsnames.ora
添加如下内容(根据自己的文件来修改)
[oracle@cainiaoke admin]$ cat tnsnames.ora
# tnsnames.ora Network Configuration File: /oracle/app/oracle/product/11.2.0/client/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
LISTENER_KEHANA =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.190.128)(PORT = 1521))
KEHANA =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.190.128)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = kehana)
)
)
然后就可以使用sqldeveloper或者navicat连接数据库了
如果navicat连接数据库报错 ORA-28547:connection to server failed, probable Oracle Net admin error 或者 oracle library is not loaded
请之oracle官网下载客户端 instant client https://www.oracle.com/database/technologies/instant-client/downloads.html
根据自己的系统位数来下载,或者根据你navicat的位数来下载,
有些人说只有下载32位的才可以,不好意思,我的机器只认64位的,32位的报错 oracle library is not loaded 所以32的如果报错就下载64的
下载完最好解压放在和navicat一起,有人说随便放-那我放在桌面第二天就被我一不注意删掉了是不是还得重新下,所以做事儿不要太随便
放好了之后打开navicat--工具--选项--环境,选择你刚刚解压出的那个 oci.ddl 然后关掉navicat重新打开,这个时候就不会报错了