Oracle 12c 数据库概述
ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。比如SilverStream就是基于数据库的一种中间件。ORACLE数据库是目前世界上使用最为广泛的数据库管理系统,作为一个通用的数据库系统,它具有完整的数据管理功能;作为一个关系数据库,它是一个完备关系的产品;作为分布式数据库它实现了分布式处理功能。但它的所有知识,只要在一种机型上学习了ORACLE知识,便能在各种类型的机器上使用它。
Oracle 12c 可插拔数据库体系结构
Oracle 12c 中引入了一个新功能就是Oracle Multitenant,这个功能可以在多租户容器数据库中,创建并维护许多个可插拔数据库。Oracle Multitenant是Oracle企业版中需要额外付费的组件。然而,在所有Oracle版本中都可以在一个可插拔数据库中免费使用它。
多租户容器数据库(CDB)是指能够容纳一个或者多个可插拔数据库的数据库。容器是指CDB中的数据文件和元数据的集合。可插拔数据库是指可以通过克隆另一个数据库轻松创建的数据容器。如果有必要,也可将可插拔数据库从一个CDB传送到另一个CDB。
所有含有一组主数据文件和元数据的CDB都是根容器。每个CDB也会含有种子容器,它是用于创建其它可插拔数据库的模板。每个CDB都由一个根容器、一个种子容器和0个、1个或多个可插拔数据库构成。
----------------安装环境------------------
安装系统:CentOS 7
IP地址:192.168.100.135
安装所需硬盘大小:40G 或重新挂载一块40G硬盘 (安装就需要15G左右,大小当然越大越好)
内存:4G(不建议少于4G)
SWAP(虚拟内存) : 8G (不建议少于8G)
Oracle 数据库软件包,无需解压缩,可直接调用。
百度网盘:链接:https://pan.baidu.com/s/1v1h3_wrB6er8HCpONh9xRQ 密码:a0h2
准备工作:
关闭防火墙
[root@oracle ~]# systemctl stop firewalld.service
[root@oracle ~]# systemctl disable firewalld.service
[root@oracle ~]# setenforce 0
挂载新硬盘以便安装
步骤:
[root@localhost ~]# cd /dev
[root@localhost dev]# fdisk /dev/sdb
n
p
回车
回车
回车
w
[root@localhost dev]# mkfs -t xfs /dev/sdb1
[root@localhost dev]# mkdir /orc
[root@localhost dev]# vim /etc/hostname
HOSTNAME=oracle #修改主机名,便于管理,修改完成后保存退出
[root@localhost dev]# vim /etc/hosts
192.168.100.135 oracle #末尾插入一行
重启虚拟机,识别硬盘
[root@oracle ~]# mount /dev/sdb1 /orc
[root@oracle ~]# df -h
----------------安装步骤------------------
1.yum安装环境依赖包
[root@oracle ~]# yum -y install binutils compat-libcapl compat-libstdc++-33 gcc gcc-c++ glibc glibc-devel ksh libaio libaio-devel libgcc libstdc++ libstdc++-devel libXi libXtst make sysstat unixODBC unixODBC-devel
2.调整内核参数
[root@oracle ~]# vim /etc/sysctl.conf
#末行添加
fs.aio-max-nr = 1048576 #异步IO请求数目,推荐值是:1048576(1024*1024也就是1024K个)
fs.file-max = 6815744 #打开的文件句柄的最大数量,防止文件描述符耗尽的问题
kernel.shmall = 2097152 #共享内存总量 页为单位,内存除以4K所得
kernel.shmmax = 4294967295
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128 #数值对应含义:SEMMSL: 每个信号集的最大信号数量
#SEMMNS:用于控制整个 Linux 系统中信号的最大数
#SEMOPM:内核参数用于控制每个semop系统调用可以执行的信号操作的数量
#SEMMNI:内核参数用于控制整个 Linux 系统中信号集的最大数量
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 #套接字发送缓冲区大小的最大值
#修改完成后保存退出
[root@oracle ~]# sysctl -p #使其生效
3.添加管理用户,组
[root@oracle ~]# groupadd oinstall
[root@oracle ~]# groupadd dba
[root@oracle ~]# useradd -g oinstall -G dba oracle
[root@oracle ~]# passwd oracle
更改用户 oracle 的密码 。
新的 密码:
123123
4.创建并修改Oracle安装目录权限
[root@oracle ~]# mkdir -p /orc/app/oracle
[root@oracle ~]# chown -R oracle.oinstall /orc/app/
[root@oracle ~]# chmod -R 755 /orc/app/oracle/
5.修改Oracle源码包权限
[root@oracle oracle]# chown -R oracle:oinstall /home/oracle/database/
[root@oracle oracle]# chmod -R 755 /home/oracle/database/
6.修改oracle用户环境配置
[root@oracle ~]# vim /home/oracle/.bash_profile
#删除末尾两行数据并插入以下内容
umask 022 #权限,设置的是反掩码
ORACLE_BASE=/opt/app/oracle #指定基目录
ORACLE_HOME=/opt/app/oracle/product/12.2.0/dbhome_1/ #指定数据存放路径
ORACLE_SID=orcl #指定实例名称
NLS_LANG="SIMPLIFIED CHINESE_CHINA".UTF8 #简体中文语言字符集
PATH=$PATH:$HOME/.local/bin:$HOME/bin:$ORACLE_HOME/bin
LANG=zh_CN.UTF-8
export PATH LANG NLS_LANG ORACLE_BASE ORACLE_HOME ORACLE_SID
#修改完成后保存退出
7.配置Oracle用户资源限制
#使用pam_limits认证模块
[root@oracle ~]# vim /etc/pam.d/login
#在第7行左右下插入以下内容
session required /lib/security/pam_limits.so
session required pam_limits.so
#修改完成后保存退出
[root@oracle ~]# vim /etc/security/limits.conf #编辑对资源的限制
#在末尾插入
oracle soft nproc 2047 #但用户可用使用的进程数量
oracle hard nproc 16384
oracle soft nofile 1024 #用户可打开的文件数量
oracle hard nofile 65536
oracle soft stack 10240 #堆栈设置
#修改完成后保存退出
[root@oracle ~]# vim /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
#修改完成后保存退出
8.安装Oracle安装包
Oracle 数据库软件包,无需解压缩,可直接调。
百度网盘:链接:https://pan.baidu.com/s/1v1h3_wrB6er8HCpONh9xRQ 密码:a0h2
下载文件后挂载到 /opt 下面
[root@oracle ~]# xhost + #允许所有用户访问Xserver
access control disabled, clients can connect from any host
[root@oracle ~]# chmod -R 777 /opt/database/
[root@oracle ~]# su - oracle #切换用户
[oracle@oracle ~]$ export DISPLAY=:0.0
[oracle@oracle ~]$ cd /opt/database/
[oracle@oracle database]$ ls
install response rpm runInstaller sshsetup stage welcome.html
[oracle@oracle ~]$ ./runInstaller #执行安装脚本
正在启动 Oracle Universal Installer...
8.进入图形化安装(无图片演示的均为默认选项)
点击单实例数据库安装,下一步
典型安装,自行设置口令 ,下一步
操作安装后,在安装到79%左右的时候弹出小窗口,要求运行两个脚本,这时候用root用户进行操作
#另开一个终端,以ROOT身份登录
[root@oracle abc]# /orc/app/oraInventory/orainstRoot.sh
[root@oracle abc]# /orc/app/oracle/product/12.2.0/dbhome_1/root.sh
等待完成再回到图形化界面点确定,继续安装。(需要等待一段时间)
至此Oracle数据库安装完毕
但是新安装的Oracle数据库是十分不安全的,接下来会介绍基本的装后优化
首先需要理解的是控制文件的概念和基本管理
-------------控制文件管理--------------
控制文件:为二进制文件,初始化大小由CREATE DATABASE指定,可以使用RMAN备份。
- 记录了当前数据库的结构信息,同时也包含数据文件及日志文件的信息以及相关的状态,归档信息等等。
- 在参数文件中描述其位置,个数等等。通常采用分散放开,多路复用的原则。在mount阶段被读取,open阶段一直被使用。
- 维护数据库一致性(数据库启动时会比较控制文件与联机日志文件中的ckpt,即起始scn号,如相等则正常启动,否则需要介质恢复)。
- 一个控制文件只能属于一个数据库。
- 控制文件的任意修改将写入到初始化参数中指定的所有控制文件中,读取时则仅读取第一个控制文件。
- 控制文件只能连接一个数据库,控制文件的大小一般不要超过MB,最多为个,最少一个,互为镜像.
-
控制文件中包含的内容
- 数据库的名字、ID、创建的时间戳
- 表空间的名字
- 联机日志文件、数据文件的位置、个数、名字
- 联机日志的Sequence号码
- 检查点的信息
- 撤销段的开始或结束
- 归档信息
- 备份信息
-
数据库启动从nomount状态启动到mount状态时必须读取控制文件,以获取数据文件和日志文件的位置;如果控制文件实效,数据库将无法启动;而且数据库实时运行过程中,系统也在不停向控制文件中写入stop scn以及checkpoint scn,如果控制文件无法写入,数据库也会宕机。遇到这种情况如果有备份的控制文件,只需要在nomount状态将正确的备份控制文件覆盖到已实效的控制文件,然后启动数据库到open状态即可解决问题。因此系统默认至少同时有几个相同的控制文件互为备份,而且相同的控制文件最好是放在不同的磁盘目录,分散风险。
-
12c安装完成后默认情况下,控制文件有2个,由上述可知,如果Oracle在安装完成后没有更改控制文件的话,会存在很大的安全隐患,所以建议优化控制文件等。
准备工作:
需要使用root用户,给/opt 777权限,以便于Oracle用户读写操作
[root@HOSTNAMEoracle ~]# chmod 777 /opt/进入Oracle
[root@HOSTNAMEoracle ~]# su - oracle
[oracle@HOSTNAMEoracle ~]$ sqlplus / as sysdba
1.查看控制文件位置
SQL> select name from v$controlfile;
2.查看控制文件内容
#控制文件中存放,创建数据库信息、重做日志信息、数据文件及归档日志文件记录等信息
SQL> select type,record_size,records_total,records_used from v$controlfile_record_section;
3.存储多重控制文件
SQL> alter system set
2 control_files='/orc/app/oracle/oradata/orcl/control01.ctl',
3 '/opt/control02.ctl' scope=spfile; #变更控制文件02的路径,增加安全性
参数更改完毕后需要关闭Oracle数据库,在/orc/app/oracle/oradata/orcl控制文件的路径中进行更改,并重启Oracle才能生效
SQL> shutdown immediate; #关闭数据库
SQL> ho cp /orc/app/oracle/oradata/orcl/control02.ctl /opt/control02.ctl #使用 ho命令在不退出数据库的情况下执行系统命令
SQL> startup #开启数据库
SQL> select name from v$controlfile; #查看控制文件位置
4.备份控制文件
SQL> alter database backup controlfile to '/opt/control.bak'; #执行备份
数据库已更改。
SQL> ho ls /opt #在sql环境中运行系统命令
control02.ctl control.bak ORCLfmap rh
--------------重做日志-------------
Oracle数据库在运行当中,用户更改的数据首先会存放在数据库高速缓冲区当中,为了提升磁盘读写,oracle机制不会频繁的将缓冲区的数据写到磁盘,而是等到检查点或者数据高速缓冲区达到一定数量时才会写入数据库文件;倘若在检查点或者数据量等条件还没满足系统就挂了,那么此时用户提交的数据就会丢失,因为数据还在内存里,为了防止数据丢失,oracle提出了重做日志。
-
日志的模式:
在线日志:在线日志模式,不会主动提交日志,服务器关闭就会丢失部分数据。切换日志组时会自动提交文件并保存,后切换的日志组内写入的文件会丢失。
归档日志:只要写入数据就会提交到硬盘进行保存。
重做日志组:由一个或多个相同的联机日志文件组成一个联机重做日志组至少两个日志组,每组一个成员(建议每组两个成员,分散放开到不同的磁盘),由LGWR后台进程同时将日志内容写入到一个组的所有成员。
LGWR的触发条件
- 在事务提交的时候(COMMIT)
- Redo Log Buffer 三分之一满
- Redo Log Buffer 多于一兆的变化记录
- 在DBWn写入数据文件之前
1.重做日志查询
#查看重做日志组的组号,序列,大小,个数数量,归档状态,日志组状态
SQL> select group#,sequence#,bytes,members,archived,status from v$log;
新安装完Oracle数据库后,查看下重做日志文件状态,确认归档文件模式是否开启。如果没有开启,建议开启,增加安全性,防止部分数据丢失。
2.归档日志管理
#查看归档日志模式
SQL> archive log list;
开启归档日志模式:
SQL> shutdown immediate; #关闭Oracle数据库
SQL> startup mount; #启动实例,加载数据库但是并不打开数据库
SQL> alter database archivelog; #启用归档日志模式
SQL> alter database open; #启动打开数据库
SQL> archive log list; #查看归档日志模式
3.方便查看日志组,可以稍作下修改
SQL> set line 120; //设置显示宽度120
SQL> col member for a50; //member列显示宽度50字符宽度
SQL> select group#,status,type,member from v$logfile; //使用logfile视图查看
PS:status 含义
1:空白 正在使用
2:stale 内容不完整
3:invalid 无法访问 如刚建立
4:deleted 文件已不再有用
/orc/app/oracle/oradata/orcl/ //控制文件和重做日志文件都在此路径
4.关于重做日志组的新建和删除
---------------------新增重做日志组--------------------------------
SQL> alter database add logfile group 4
2 ('/orc/app/oracle/oradata/orcl/redo04a.log',
3 '/opt/redo04b.log') size 10m;
数据库已更改。
-------------------删除重做日志组--------------------------------
SQL> alter database drop logfile group 4;
数据库已更改。
#当前日志组不可删除 解决方法:切换日志组: alter system switch logfile;
-------------------添加/删除重做日志文件--------------------------
SQL> alter database add logfile member
2 '/opt/redo01b.log' to group 1,
3 '/opt/redo02b.log' to group 2;
数据库已更改。
SQL> alter database drop logfile member
2 '/opt/redo02b.log';
数据库已更改。