varkai

要么孤独,要么庸俗

Oracle Linux 7 安装 Oracle Database 12c

2019.06.08 运维

前言

之前工作数据库一直使用的 Oracle Database 11g,所使用的系统是 Oracle Linux 6,鉴于两者都比较老旧,而且都停止维护支持了,所以今后再部署数据库,肯定会使用较新的系统和数据库,于是这一阵先在虚拟机里折腾折腾,把安装文档整理出来,方便以后安装部署,下面是我的安装环境:

虚拟机软件:VMware Workstation 15 Pro
虚拟机:Oracle Linux 7.8
数据库:Oracle Database 12c Release 2

下面是安装 Oracle 12c 数据库对系统的一些关键要求:

分类要求
内存至少1GB
/tmp 目录至少1GB
swap 分区内存在1GB到2GB之间:大小为内存的1.5倍
内存在2GB到16GB之间:大小和内存大小一致
内存大于16GB:大小为16GB

安装环境配置

首先通过 SSH 连接或者本地登入到 Oracle Linux 系统,以下命令执行用户除非特别指出,默认为 root 用户。

配置 hosts 和 network

这里需要在 /etc/hosts 文件中添加一行主机 IP 指向 HOSTNAME 的一行记录,另外需要在 /etc/sysconfig/network 文件中添加一行 HOSTNAME 的变量,如果这里不设置,数据库安装过程中的网络配置会报错。

  1. 查看主机 HOSTNAME:
$ hostname
oracle-test
  1. /etc/hosts 文件末尾添加一行主机 IP 指向 HOSTNAME 的一行记录:
$ sed -i '$a\192.168.98.210 oracle-test' /etc/hosts
  1. /etc/sysconfig/network 文件末尾添加一行 HOSTNAME 的变量:
$ sed -i '$a\HOSTNAME=oracle-test' /etc/sysconfig/network

扩容 /dev/shm

# 调整 tmpfs 大小,size 可以设置为物理内存大小
$ vim /etc/fstab
tmpfs /dev/shm tmpfs defaults,size=8G 0 0
# 重新挂载让设置生效
$ mount -o remount /dev/shm

安装 Oracle 预安装检测包

Oracle 官方提供了一个名为 oracle-database-server-12cR2-preinstall 的 RPM 包来进行安装前的系统依赖安装检测,系统参数设定、oracle 用户建立等工作,省去了手工配置的繁琐,强烈推荐使用,直接通过 yum 安装即可:

$ yum install oracle-database-server-12cR2-preinstall

安装完成后,使系统参数生效:

$ sysctl -p

现在 oracle 用户已经帮我们建立,只需要修改下密码就可以了:

$ passwd oracle

创建 Oracle 数据库安装目录

# Oracle 数据库安装基目录
$ mkdir -p /u01/app/oracle
# Oracle 数据库软件包解压目录
$ mkdir -p /u01/app/oracle/oracle-software

配置 oracle 用户的环境变量

修改 oracle 用户的环境变量文件 /home/oracle/.bashrc

$ vim /home/oracle/.bashrc

在文件末尾添加如下内容:

# Oracle 主机名
export ORACLE_HOSTNAME=oracle-test
# Oracle 数据库安装基目录
export ORACLE_BASE=/u01/app/oracle
# Oracle 数据库安装目录
export ORACLE_HOME=$ORACLE_BASE/product/12.2.0/dbhome_1
# Oracle 数据库实例名
export ORACLE_SID=orcl
# 添加系统环境变量
export PATH=$ORACLE_HOME/bin:/usr/sbin:$PATH
# 添加系统环境变量
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
# 设置 Oracle 客户端字符集
export NLS_LANG='AMERICAN_AMERICA.AL32UTF8'

使环境变量生效:

$ source /home/oracle/.bashrc

配置防火墙

可以直接禁用防火墙,并关闭开机自启:

# 关闭防火墙
$ systemctl stop firewalld.service
# 关闭开机自启
$ systemctl disable firewalld.service

为了安全,不建议执行以上操作,更合理的做法是防火墙放通 Oracle 所需的端口(默认是 1521):

$ firewall-cmd --zone=public --add-port=1521/tcp --permanent

重新加载防火墙:

$ firewall-cmd --reload

查看端口号是否开启

$ firewall-cmd --zone=public --query-port=1521/tcp
yes

关闭 selinux,将 SELINUX=enforcing 改为 SELINUX=disabled

$ sed -i "s/^SELINUX=.*/SELINUX=disabled/" /etc/selinux/config

关闭 selinux 需重启系统才能生效:

$ reboot

开始安装

首先将 Oracle 安装文件上传到系统的 /tmp 目录,然后将文件解压到之前建立的 Oracle 软件包目录:

$ unzip /tmp/linuxx64_12201_database.zip -d /u01/app/oracle/oracle-software

然后把 /u01/app/ 目录下的所有文件和文件夹的拥有者更改为指定的用户和组:

$ chown -R oracle:oinstall /u01/app/

使用 oracle 用户登入到系统图形化界面,然后进入到软件安装文件目录,执行 runInstaller 文件进行安装:

# 进入安装目录
$ cd /u01/app/oracle/oracle-software/database/
# 执行安装
$ ./runInstaller

此时,系统会弹出 Oracle 的图形化安装界面,安装步骤如下:

  1. 取消勾选 我希望通过 My Oracle Support 接收安全更新。,点击 下一步

1-1. 在弹出的确认框中选择

  1. 选择 创建和配置数据库,点击 下一步
  1. 选择 服务器类,点击 下一步
  1. 选择 单实例数据库安装,点击 下一步
  1. 选择 高级安装,点击 下一步
  1. 选择 企业版,点击 下一步
  1. 数据库安装路径设置,默认即可,点击 下一步
  1. 产品清单路径设置,默认即可,点击 下一步
  1. 选择 一般用途/事务处理,点击 下一步
  1. 全局数据库名和 SID 设置,取消勾选 创建为容器数据库,点击 下一步
  1. 配置选项,首先根据自身情况调整分配给数据库的内存比例,然后点击 字符集 选项卡:

11-1. 根据自身情况选择相应的数据库字符集,点击 下一步

  1. 数据库存储设置,默认即可,点击 下一步
  1. 集中管理选项,默认为不使用,点击 下一步
  1. 恢复选项,默认为不使用恢复,如果有需要,可以安装完成后配置,点击 下一步
  1. 数据库管理员账户密码设置,这里选择 对所有账户使用相同的口令,密码强度要求为必须同时包含大写字母,小写字母和数字,点击 下一步
  1. 操作系统组设置,默认即可,点击 下一步
  1. 这里会对数据库的安装先决条件进行检查,如果不通过,则会列出所有不满足的条件,如果通过,则会自动进入下一步:
  1. 这里会列出数据库安装设置的概要,确认无误后,点击 安装
  1. 数据库开始进行安装:

19-1. 安装过程中,会弹出一个 执行配置脚本 的对话框:

根据对话框提示,使用 root 用户执行对话框中列出的两个文件,执行过程中如有对话选项,一路回车即可:

$ cd /u01/app/oraInventory/
$ ./orainstRoot.sh

$ cd /u01/app/oracle/product/12.2.0/dbhome_1/
$ ./root.sh

两个脚本都执行完成后,回到安装界面,点击 执行配置脚本 对话框中的 确定 继续进行安装。

  1. 到这里数据库就安装好了,而且监听和数据库都已经帮我们配置好了,最后点击 关闭 按钮结束安装:

安装后的配置

兼容性设置

在使用旧版本的客户端驱动连接 Oracle 12c 数据库报 ORA-28040 没有匹配的认证协议 错误,我们需要在数据库服务器端 $ORACLE_HOME/network/admin/sqlnet.ora 文件中添加一行 SQLNET.ALLOWED_LOGON_VERSION=8 配置,允许旧版本的驱动连接:

$ sed -i '$a\SQLNET.ALLOWED_LOGON_VERSION=8' /u01/app/oracle/product/12.2.0/dbhome_1/network/admin/sqlnet.ora

Oracle 自动启动和关闭

Oracle 数据库默认不是开机自动启动的,需要额外的配置。

首先修改 /etc/oratab 文件,找到文件中的 orcl:/u01/app/oracle/product/12.2.0/dbhome_1:N 将末尾的 N 修改为 Y

$ sed -i 's/^orcl:\/u01\/app\/oracle\/product\/12.2.0\/dbhome_1:N/orcl:\/u01\/app\/oracle\/product\/12.2.0\/dbhome_1:Y/' /etc/oratab

接着在 /etc/systemd/system/ 目录下新建 Oracle 服务的启动配置文件 oracle-rdbms.service

$ touch /etc/systemd/system/oracle-rdbms.service

然后编辑 oracle-rdbms.service 文件,将以下内容复制到该文件后保存退出:

# /etc/systemd/system/oracle-rdbms.service
# Invoking Oracle scripts to start/shutdown Instances defined in /etc/oratab
# and starts Listener
[Unit]
Description=Oracle Database(s) and Listener
After=syslog.target network.target

[Service]
LimitMEMLOCK=infinity
LimitNOFILE=65535
Type=oneshot
RemainAfterExit=yes
User=oracle
Environment="ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_1"
ExecStart=/u01/app/oracle/product/12.2.0/dbhome_1/bin/dbstart $ORACLE_HOME >> 2>&1 &
ExecStop=/u01/app/oracle/product/12.2.0/dbhome_1/bin/dbshut $ORACLE_HOME >> 2>&1 &

[Install]
WantedBy=multi-user.target

最后设置开机自启动:

$ systemctl enable oracle-rdbms.service

我们可以重启系统后,通过 oracle 用户查看 Oracle 服务进程和监听程序确认自动启动是否设置成功:

# 检查 oracle 服务是否启动
$ ps -ef | grep orcl

# 检查监听是否启动
$ lsnrctl status

数据库配置

DEFERRED_SEGMENT_CREATION

从 Oracle 11g 开始,数据库有个参数 DEFERRED_SEGMENT_CREATION,当这个参数设置为 true 时,当创建一个表的时候,不会给它马上分配空间,只有向这个表中插入第一条数据的时候才开始分配空间,而使用 exp 导出数据的时候是不会导出没有分配空间的表,使用 expdp 就不会受到影响,所以这里把这个参数设置为 false,让新建的表都马上分配空间。

首先使用 oracle 用户登入系统,进入 sqlplus 环境:

$ sqlplus /nolog

使用管理员连接到数据库:

SQL> CONN /AS SYSDBA

查看数据库当前空间分配设置,默认为 TRUE

SQL> SHOW PARAMETER DEFERRED_SEGMENT_CREATION;

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation	     boolean	 TRUE

DEFERRED_SEGMENT_CREATION 参数设置为 FALSE

SQL> ALTER SYSTEM SET DEFERRED_SEGMENT_CREATION=FALSE;

DB_SECUREFILE

DB_SECUREFILE 参数必须初始化配置,否则使用低版本 dmp 文件导入数据时会报错:

SQL> ALTER SYSTEM SET DB_SECUREFILE=PERMITTED SCOPE=BOTH;

PROCESSES

PROCESSES 参数控制数据库允许的最大连接数,可以根据自身情况进行修改:

SQL> ALTER SYSTEM SET PROCESSES = 500 SCOPE = SPFILE;

PASSWORD_LIFE_TIME

PASSWORD_LIFE_TIME 参数是数据库用户的密码有效期策略,默认为密码180天过期。

首先查看用户的配置文件是哪个,一般是 DEFAULT

SQL> SELECT USERNAME,PROFILE FROM DBA_USERS;

查看指定配置文件(如 DEFAULT)的密码有效期设置:

SQL> SELECT * FROM DBA_PROFILES S WHERE S.PROFILE='DEFAULT' AND RESOURCE_NAME='PASSWORD_LIFE_TIME';

将密码有效期由默认的180天修改成无限制:

SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;

最后重启数据库:

SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;