环境准备
- 系统:CentOS 7.9 x64 位最小化安装的系统
- Oracle 版本: linux.x64_11gR2_database
安装依赖包
由于系统是使用的 CentOS 最小化安装,所以需要安装一些依赖库
1 | yum -y install binutils \ |
检查依赖包
1 | rpm -q \ |
添加 Oracle 用户组和用户
1 | # 创建相关组 |
配置主机名映射
修改 /etc/hosts,添加 主机地址解析
1
2IPADDR=$(ifconfig |grep broadcast | grep 192.168.64 | awk '{print $2}')
echo "$IPADDR $HOSTNAME" >> /etc/hosts测试解析
1
2
3
4
5ping -c3 oracle
PING centos-oracle (192.168.169.100) 56(84) bytes of data.
64 bytes from centos-oracle (192.168.169.100): icmp_seq=1 ttl=64 time=0.037 ms
64 bytes from centos-oracle (192.168.169.100): icmp_seq=2 ttl=64 time=0.052 ms
64 bytes from centos-oracle (192.168.169.100): icmp_seq=3 ttl=64 time=0.053 ms
优化 OS 内核参数
kernel.shmmax 参数设置为物理内存的一半,此处为内存 2G的一半;单位为 byte
1 | cat >>/etc/sysctl.conf <<EOF |
kernel.shmall: 共享内存页数的最大值。
Linux共享内存页大小为4KB, 共享内存段的大小都是共享内存页大小的整数倍。一个共享内存段的最大大小是16G,需要共享内存页数是 16GB/4KB=16777216KB/4KB=4194304(页)kernel.shmmax: 单个共享内存段的最大值。
shmmax是核心参数中最重要的参数之一,用于定义单个共享内存段的最大值,shmmax设置应足够大,能在一个共享内存段下容纳下整个的SGA,设置的过低可能会导致需要创建多个共享内存段,可能导致系统性能的下降 。64 位 linux 系统:可取的最大值为物理内存值 -1byte ,建议值为多于物理内存的一半,一般取值大于 SGA_MAX_SIZE 即可,可以取物理内存 -1byte 。
- 内存为 12G 时,该值为
12*1024*1024*1024-1 = 12884901887
- 内存为 16G 时,该值为
16*1024*1024*1024-1 = 17179869183
- 内存为 32G 时,该值为
32*1024*1024*1024-1 = 34359738367
- 内存为 64G 时,该值为
64*1024*1024*1024-1 = 68719476735
- 内存为 128G 时,该值为
128*1024*1024*1024-1 = 137438953471
- 内存为 12G 时,该值为
kernel.shmmni: 共享内存段的最大数量。
注意该参数不是shmmin,是shmmni,shmmin 表示内存段最小大小 ),shmmni缺省值4096 足够。shmmax(bytes) = shmmni(page size, default 4k) * shmall (page的个数)
下面专门说说kernel.sem:对应4个值 SEMMSL、SEMMNS、SEMOPM、SEMMNI
SEMMSL: 每个信号集的最大信号数量。
数据库最大 PROCESS 实例参数的设置值再加上 10 。Oracle 建议将 SEMMSL 的值设置为不少于 100。SEMMNS: 用于控制整个 Linux 系统中信号(而不是信号集)的最大数。
Oracle 建议将 SEMMNS 设置为:系统中每个数据库的 PROCESSES 实例参数设置值的总和,加上最大 PROCESSES 值的两倍,最后根据系统中 Oracle 数据库的数量,每个加 10 。使用以下计算式来确定在 Linux 系统中可以分配的信号的最大数量。它将是以下两者中较小的一个值:SEMMNS 或 (SEMMSL * SEMMNI)SEMOPM: 内核参数用于控制每个 semop 系统调用可以执行的信号操作的数量。semop 系统调用(函数)提供了利用一个 semop 系统调用完成多项信号操作的功能。一个信号集能够拥有每个信号集中最大数量的SEMMSL 信号,因此建议设置 SEMOPM 等于SEMMSL。Oracle 建议将 SEMOPM 的值设置为不少于 100。
SEMMNI :内核参数用于控制整个 Linux 系统中信号集的最大数量。Oracle 建议将 SEMMNI 的值设置为不少于 100。
修改 Oracle 用户的 shell 权限
限制 Oracle 用户的资源使用
1
2
3
4
5
6
7
8cat >>/etc/security/limits.conf <<EOF
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
* soft memlock unlimited
* hard memlock unlimited
EOF修改 Oracle 用户登录认证
1
2
3
4cat >>/etc/pam.d/login <<EOF
session required /lib64/security/pam_limits.so
session required pam_limits.so
EOF修改 /etc/profile 文件,在文件最下面添加以下内容
1
2
3
4
5
6
7
8
9
10
11if [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi
# 重新加载 profile
source /etc/profile
创建 Oracle 安装目录
1 | mkdir -p /data/app/oracle/product/11.2.0 |
配置 Oracle 用户环境变量
1 | # 切换到 oracle 用户 |
安装 Oracle
上传安装包到服务器并修改权限
1 | chown -R oracle:oinstall /home/oracle/linux.x64_11gR2_database_* |
解压 Oracle 压缩文件
1 | unzip linux.x64_11gR2_database_1of2.zip |
修改配置文件
~/database/response/db_install.rsp
中以下内容的值
1 | HOSTNAME=$(hostname) |
执行安装
1 | # 切换到 oracle 用户 |
安装期间可以根据提示,使用 tail 命令监看 oracle 的安装日志
1 | tail -f /u01/app/oracle/inventory/logs/installActions2021-04-06_12-32-00PM.log |
根据提示完成剩余配置
1 | su - root # 或者新开一个窗口,以 root 身份登录 |
配置默认监听
1 | su - oracle |
查看监听端口
1 | $ netstat -anptl |grep 1521 |
创建数据库
方法(一) 命令行创建数据库
直接在命令行使用 dbca 静默创建数据库
1
2
3
4
5
6
7
8
9
10
11
12
13
14dbca -silent -createDatabase \
-templateName General_Purpose.dbc \
-gdbName orcl \
-sid orcl \
-sysPassword Huaxue,001 \
-systemPassword Huaxue,001 \
-dbsnmpPassword Huaxue,001 \
-sysmanPassword Huaxue,001 \
-datafileDestination /u01/app/oracle/oradata \
-recoveryAreaDestination /u01/app/oracle/flash_recovery_area \
-characterSet ZHS16GBK \
-totalMemory 11468 \
-storageType FS \
-redoLogFileSize 50
方法(二) 使用 response 文件创建数据库
修改 ~/database/response/dbca.rsp 文件,注意 TOTALMEMORY 设置为总内存的 80%
1
2
3
4
5
6
7
8
9
10
11
12# vim ~/database/response/dbca.rsp
GDBNAME = "orcl"
SID = "orcl"
SYSPASSWORD = "oracle"
SYSTEMPASSWORD = "oracle"
SYSMANPASSWORD = "oracle"
DBSNMPPASSWORD = "oracle"
DATAFILEDESTINATION =/u01/app/oracle/oradata
RECOVERYAREADESTINATION=/u01/app/oracle/flash_recovery_area
CHARACTERSET = "AL32UTF8"
TOTALMEMORY = "1638"使用 response 文件执行静默创建数据库
1
2
3
4
5
6
7
8
9
10
11
12
13
14dbca -silent -responseFile ~/database/response/dbca.rsp
# 输出如下:
Copying database files
1% complete
3% complete
11% complete
...
Creating and starting Oracle instance
...
Completing Database Creation
...
100% complete
Look at the log file "/db/app/oracle/cfgtoollogs/dbca/orcl/orcl.log" for further details.
处理 sqlplus 无法退格问题
安装 rlwrap 和 readline 库
1
yum install rlwrap readline readline-devel
设置系统别名
1
2
3
4
5
6cat >> ~/.bash_profile <<EOF
# Config rlwrap alias
alias sqlplus='rlwrap sqlplus'
alias rman='rlwrap rman'
EOF刷新配置文件
1
source ~/.bash_profile
检查安装
查看 Oracle 实例进程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24ps -ef | grep ora_ | grep -v grep
# 输出如下
oracle 13464 1 0 13:43 ? 00:00:00 ora_pmon_orcl
oracle 13466 1 0 13:43 ? 00:00:00 ora_vktm_orcl
oracle 13470 1 0 13:43 ? 00:00:00 ora_gen0_orcl
oracle 13472 1 0 13:43 ? 00:00:00 ora_diag_orcl
oracle 13474 1 0 13:43 ? 00:00:00 ora_dbrm_orcl
oracle 13476 1 0 13:43 ? 00:00:00 ora_psp0_orcl
oracle 13478 1 0 13:43 ? 00:00:00 ora_dia0_orcl
oracle 13480 1 0 13:43 ? 00:00:00 ora_mman_orcl
oracle 13482 1 0 13:43 ? 00:00:00 ora_dbw0_orcl
oracle 13484 1 0 13:43 ? 00:00:00 ora_lgwr_orcl
oracle 13486 1 0 13:43 ? 00:00:00 ora_ckpt_orcl
oracle 13488 1 0 13:43 ? 00:00:00 ora_smon_orcl
oracle 13490 1 0 13:43 ? 00:00:00 ora_reco_orcl
oracle 13492 1 0 13:43 ? 00:00:00 ora_mmon_orcl
oracle 13494 1 0 13:43 ? 00:00:00 ora_mmnl_orcl
oracle 13496 1 0 13:43 ? 00:00:00 ora_d000_orcl
oracle 13498 1 0 13:43 ? 00:00:00 ora_s000_orcl
oracle 13509 1 0 13:43 ? 00:00:00 ora_qmnc_orcl
oracle 13525 1 0 13:43 ? 00:00:00 ora_cjq0_orcl
oracle 13534 1 0 13:43 ? 00:00:00 ora_q000_orcl
oracle 13536 1 0 13:43 ? 00:00:00 ora_q001_orcl查看监听状态
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
28lsnrctl status
# 输出如下
LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 06-APR-2021 13:45:04
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 06-APR-2021 12:44:36
Uptime 0 days 1 hr. 0 min. 27 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /db/app/oracle/product/11.2.0/network/admin/listener.ora
Listener Log File /db/app/oracle/diag/tnslsnr/python-dev/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=python-dev.59izt.com)(PORT=1521)))
Services Summary...
Service "orcl" has 1 instance(s).
Instance "orcl", status READY, has 1 handler(s) for this service...
Service "orclXDB" has 1 instance(s).
Instance "orcl", status READY, has 1 handler(s) for this service...
The command completed successfully登录 sqlplus,查看实例状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15sqlplus / as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on Tue Apr 6 13:45:33 2021
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to an idle instance.
SQL>
SQL> select status from v$instance;
STATUS
------------------------
OPEND查看数据库编码
1
2
3
4
5SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
--------------------------------------------------------------------------------
AMERICAN_AMERICA.AL32UTF8查看数据库版本信息
1
2
3
4
5
6
7
8
9select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
安装 oracle 客户端工具
安装 sqlplus
前往官网下载工具, 下载地址: 官方下载地址
1
2
3# 根据 Oracle 服务端版本选择对应的客户端版本,需要下载如下两个包
1. oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm
2. oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm安装
1
rpm -ivh oracle-instantclient11.2-*.rpm
配置环境变量
1
2
3
4
5# vim /etc/profile
LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib:${LD_LIBRARY_PATH}
export LD_LIBRARY_PATH
export PATH=/usr/lib/oracle/11.2/client64/bin:$PATH
配置语言字符集
对本服务器运行的 sqlplus 指定字符集,规避同数据库字符集不一致导致乱码问题。
连接数据库,执行语句查询 Oracle 服务器的语言、地域和字符集:
1
select * from nls_database_parameters;
按照查询结果拼接
1
NLS_LANGUAGE_NLS_TERRITORY.NLS_CHARACTEST
这里举例查到的是:
1
2
3NLS_LANGUAGE = AMERICAN
NLS_TERRITORY = AMERICA
NLS_CHARACTERSET = AL32UTF8即拼接为:
AMERICAN_AMERICA.AL32UTF8
在服务器设置环境变量
1
NLS_LANG="AMERICAN_AMERICA.AL32UTF8"
Oracle 数据库启停流程
Oracle 数据库的启停一定要按照以下顺序来,否则会导致数据库启动异常
启动 Oracle 数据库
1 | # 启动监听服务 |
关闭 Oracle 数据库顺序
1 | # 关闭数据库 |
配置开机启动
修改 /etc/oratab 文件,将实例改成运行启动
1
qdmwms:/u01/app/oracle/product/11.2.0:Y
创建 systemd 服务文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15cat > /usr/lib/systemd/system/oracle.service <<EOF
[Unit]
Description=Oracle Database(s) and Listener
Requires=network.target
[Service]
Type=forking
Restart=no
ExecStart=/u01/app/oracle/product/11.2.0/bin/dbstart /u01/app/oracle/product/11.2.0/
ExecStop=/u01/app/oracle/product/11.2.0/bin/dbshut /u01/app/oracle/product/11.2.0/
User=oracle
[Install]
WantedBy=multi-user.target
EOF配置 Oracle 服务开机启动
1
systemctl enable --now oracle.service
查看 Oracle 服务状态
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
36
37
38[root@qdmwms-db ~]# systemctl status oracle.service
● oracle.service - Oracle Database(s) and Listener
Loaded: loaded (/usr/lib/systemd/system/oracle.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2021-06-21 15:45:54 CST; 7min ago
Process: 1056 ExecStart=/u01/app/oracle/product/11.2.0/bin/dbstart /u01/app/oracle/product/11.2.0/ (code=exited, status=0/SUCCESS)
CGroup: /system.slice/oracle.service
├─1135 /u01/app/oracle/product/11.2.0//bin/tnslsnr LISTENER -inherit
├─1713 ora_pmon_qdmwms
├─1715 ora_psp0_qdmwms
├─1783 ora_vktm_qdmwms
├─1787 ora_gen0_qdmwms
├─1789 ora_diag_qdmwms
├─1791 ora_dbrm_qdmwms
├─1793 ora_dia0_qdmwms
├─1795 ora_mman_qdmwms
├─1797 ora_dbw0_qdmwms
├─1799 ora_lgwr_qdmwms
├─1801 ora_ckpt_qdmwms
├─1803 ora_smon_qdmwms
├─1805 ora_reco_qdmwms
├─1807 ora_mmon_qdmwms
├─1809 ora_mmnl_qdmwms
├─1811 ora_d000_qdmwms
├─1813 ora_s000_qdmwms
├─1896 ora_arc0_qdmwms
├─1899 ora_arc1_qdmwms
├─1901 ora_arc2_qdmwms
├─1903 ora_arc3_qdmwms
├─1909 ora_qmnc_qdmwms
├─1991 ora_cjq0_qdmwms
├─2003 ora_q000_qdmwms
├─2005 ora_q001_qdmwms
├─2473 ora_smco_qdmwms
└─2479 ora_w000_qdmwms
Jun 21 15:45:33 qdmwms-db systemd[1]: Starting Oracle Database(s) and Listener...
Jun 21 15:45:35 qdmwms-db dbstart[1056]: Processing Database instance "qdmwms": log file /u01/app/oracle/product/11.2.0/startup.log
Jun 21 15:45:54 qdmwms-db systemd[1]: Started Oracle Database(s) and Listener.
错误排查
安装过程
安装过程错误一
1
2
3
4
5WARNING: A log of this session is currently saved as: /tmp/OraInstall2021-04-06_12-17-27PM/installActions2021-04-06_12-17-27PM.log. Oracle recommends that if you want to keep this log, you should move it from the temporary location to a more permanent location.
INFO: Finding the most appropriate exit status for the current application
INFO: Exit Status is -2
INFO: Shutdown Oracle Database 11g Release 2 Installer
INFO: Unloading Setup Driver解决方案
1
修改 DECLINE_SECURITY_UPDATES= 的值为 true,即 DECLINE_SECURITY_UPDATES=true
安装过程错误二
1
2[FATAL] [INS-32033] Central Inventory location is not writable.
CAUSE: Central Inventory location was not writable.解决方法
1
2# inventory 目录不可写,重新修改目录权限
chmod 0777 -R /db/app/oracle
执行语句报错处理
ORA-01034 错误: oracle not available
1
2
3
4
5
6
7
8
9
10# 切换到 oracle 用户: su - oracle
# 登录 Oracle 控制台: sqlplus / as sysdba
# 查看当前实例:select status from v$instance;
# 错误提示如下:
select status from v$instance
*
ERROR at line 1:
ORA-01034: ORACLE not available
Process ID: 0
Session ID: 0 Serial number: 0解决方法:启动数据库
1
SQL> startup
ORA-01102: cannot mount database in EXCLUSIVE mode
解决方法:
- 找到安装目录下的$ORACLE_HOME/dbs/ 目录下,查看当前使用lkORCL文件的用户(fuser -u lkORCL),kill 掉 lkORCL 使用者(fuser -k lkORCL)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20# fuser -u lkORCL
/db/app/oracle/product/11.2.0/dbs/lkORCL: 25560(oracle) 25566(oracle) 25570(oracle) 25572(oracle) 25576(oracle) 25578(oracle) 25580(oracle) 25582(oracle) 25584(oracle) 25586(oracle) 25588(oracle) 25590(oracle) 25602(oracle) 25617(oracle) 25619(oracle) 25621(oracle) 25806(oracle) 25808(oracle)
# fuser -k lkORCL
/db/app/oracle/product/11.2.0/dbs/lkORCL: 25560 25566 25570 25572 25576 25578 25580 25582 25584 25586 25588 25590 25602 25617 25619 25621 25806 26258
# 关闭数据库实例
SQL> shutdown immediate
# 再次启动
SQL> startup
ORACLE instance started.
Total System Global Area 1068937216 bytes
Fixed Size 2220200 bytes
Variable Size 281022296 bytes
Database Buffers 780140544 bytes
Redo Buffers 5554176 bytes
Database mounted.
Database opened.