Oracle19CRAC是一个具有高稳定性、高可用性、可扩展、高安全性的数据库实现方式,可以满足业务的发展需要。
Oracle19CRAC环境在数据库和实例之间存在一对多的关系,Oracle19CRAC环境可以有多个实例,这些实例访问共享存储上的一组存储文件。集群的每个节点都本地安装了网格基础设施GI(Grid),OracleClusterware和Oracle自动存储管理(ASM)一起构成了Oracle的网格基础结构。Oracle19CRAC的实例是一组处理数据库文件的进程和内存,缓存融合CacheFusion是ORACLERAC(RealApplicationCluster)集群中的一种无磁盘缓存一致性机制,它直接把数据库的副本从持有实例的内存缓存提供给请求实例的内存缓存。缓存融合和集群接口都使用专用网络互连进行集群节点间的通信。
Oracle19CRAC安装步骤如下:
1.软件下载:
从Oracle官网下载软件:
_193000_grid_home
_193000_db_home
_193000_examples
下载完成后放入创建出来的相应目录中。
jdk解压放入/usr/local/,并重命名成java目录。
_193000_grid_home放到创建后的$GRID_HOME变量设置的目录中。
_193000_db_home放入之后设置的Oracle安装目录$ORACLE_HOME变量的目录中。
注意:下载后的安装软件只需放入一个Oracle节点即可。一般我是放置到racnode1的节点相应目录。
2.主机规划及网络、网口规划:
操作系统:(7.6.1810)
Oraclerac1:192.168.163.149(ens33)192.168.239.149(ens34)用户名:root,密码:(实验暂时用简单密码,生产需更换成复杂密码)
Oraclerac2:192.168.163.150(ens33)192.168.239.150(ens34)用户名:root,密码:(实验暂时用简单密码,生产需更换成复杂密码)
ens33(NAT)设置成仅NAT网络地址转换模式,设置成Public公共网络的IP地址。客户端连接的时候直接连接、对外提供服务访问公共网络IP地址。客户端软件一般连接SCAN(SingleClientAccessNetwork)的地址。
ens37(仅主机)设置成仅主机模式,设置成Private私有网络的IP地址,用来提供内网节点间通信、集群管理和CacheFusion缓存融合、OracleAutoStorageManage(ASM)自动存储管理的功能。
Openfiler1:共享存储设备,这里采用openfiler软件模拟的共享存储。192.168.163.151(eth0)(关闭外网)192.168.239.151(eth1)用户名:root,密码:(实验暂时使用简单密码,生产需更换成复杂密码)
3.网络规划:
网卡ens33连接公共网络,使用IP地址段是192.168.163.128/24网关使用192.168.163.2模拟的Windows10电脑客户端使用192.168.163.1的IP地址。
网卡ens34用于oraclerac专用互连和网络存储服务器以便进行共享iscsi访问。供Oracle用来传输clustermanager和cachefusion的相关数据,使用的IP地址段是192.168.239.128/24网关使用192.168.239.2。
4.存储规划:
存储(openfiler):192.168.239.151(eth1)(仅主机)用户名:root,密码:自己设置。
WebadministratorGUIURL::openfiler密码:password(这个WEBUI界面的用户名和密码是默认的)
5.IP规划:
其中2个节点的RAC,分成racnode1和racnode2。
还有一个存储节点是openfiler1。以下文件是/etc/hosts的内容:
192.168.163.149
192.168.163.150
192.168.239.149
192.168.239.150
192.168.163.151
192.168.239.151
192.168.163.152
192.168.163.153
192.168.163.154
192.168.163.155
192.168.163.156
注意:
节点配置:
节点racnode1和racnode2都是2核心8G内存2000G(不立即分配磁盘)的配置。
数据库集群名称是racdb,实例名是racdb1和racdb2。
网络配置:
racnode1节点公网IP:192.168.163.149私网IP:192.168.239.149虚拟IP:192.168.163.152
racnode2节点公网IP:192.168.163.150私网IP:192.168.239.150虚拟IP:192.168.163.153
openfiler1节点公网IP:192.168.163.151私网IP:192.168.239.151虚拟IP:不需要。openfiler1一般网卡eth1公网IP地址可以设置ONBOOT=no。存储走内部网络,可以提高网络传输速度和稳定性,公网关闭即可。
SCAN名称是:racnode-cluster-scanIP地址是:192.168.163.154~156。
6.Oracle软件组件规划:
软件组件分成两种:GridInfrastructure和OracleRAC组件。
GridInfrastructure组件:操作系统用户是grid,主组是oinstall,辅助组是asmadmin、asmdba、asmoper。主目录路径是/home/grid。Oracle基目录设置是/u01/app/grid,Oracle主目录设置是/u01/app/19.3.0.0/grid。
OracleRAC组件:操作系统用户是oracle,主组是oinstall,辅助组是dba、oper、asmdba。Oracle主目录是/home/oracle。Oracle基目录是/u01/app/oracle,Oracle主目录设置是/u01/app/oracle/product/19.3.0.0/dbhome_1。
7.存储组件规划:
存储组件分成3种:OCR/VT(集群注册表/表决磁盘VotingDisk)、数据库文件、快速恢复区(FRA)。
存储组件文件系统采用ASM(OracleAutoStorageManager)自动存储管理。
卷大小OCR/VT设置3块100G的卷大小,ASM卷组名是+CRS,ASM冗余级别是Normal。在Openfiler中的卷组名分别是racdb-crs1、racdb-crs2、racdb-crs3。
卷大小数据文件设置3块400G的卷大小,ASM卷组名是+DATA,ASM冗余级别是Normal。在Openfiler中的卷组名分别是racdb-data1、racdb-data2、racdb-data3。
卷大小快速恢复区设置3块100G的卷大小,ASM卷组名是+FRA,ASM冗余级别是Normal。在Openfiler中的卷组名分别是racdb-fra1、racdb-fra2、racdb-fra3。
Oracle中冗余方式分成External、Normal、High等。三种模式需要的磁盘组中磁盘分别为1、3、5。
其中External代表使用外部共享存储设备或者是磁盘的系统底层RAID实现数据高可用。
其中Normal代表正常的冗余模式。提供2份镜像来保护数据(镜像数据一次),有效磁盘空间是所有磁盘设备空间总和的1/2。
其中High代表高安全性的冗余模式。提供3份镜像来保护数据(镜像数据2次),用来提高性能和数据的安全,最少需要3块硬盘。有效磁盘空间是所有磁盘设备空间总和的1/3。冗余级别提高了,是以牺牲硬件的代价来保证的。
本次安装我采用openfiler软件虚拟出9个iscsi-target中划分的LUN分区,分别3块磁盘充当CRS、DATA数据库文件、FRA快速恢复区文件。
CRS的磁盘是racdb-crs1~3,DATA数据库文件的磁盘是racdb-data1~3、快速恢复区FRA的磁盘是racdb-fra1~3。
8.网卡IP配置如下:
[root@racnode1~]BOOTPROTO=dhcp
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
ONBOOT=no
ONBOOT=yes
IPADDR=192.168.163.149
NETMASK=255.255.255.0
GATEWAY=192.168.163.2
DNS2=202.106.46.151
DNS1=192.168.163.149
DNS2=192.168.163.150
[root@racnode1~]BOOTPROTO=dhcp
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
ONBOOT=no
ONBOOT=yes
IPADDR=192.168.239.149
NETMASK=255.255.255.0
DNS1=192.168.163.149
DNS2=192.168.163.150
9.关闭网卡IPV6设置:
sysctl-p
systemctldisableNetworkManager
10.用户和组的说明:
安装过程中涉及到10个用户组和用户,说明如下:
组角色权限
oinstall安装和升级ORACLE软件
dbasysdba创建、删除、修改、启动、关闭数据库,切换日志归档模式,备份恢复数据库
opersysoper启动、关闭、修改、备份、恢复数据库,修改归档模式
asmdbasysdba自动存储管理管理ASM实例
asmopersysoper自动存储管理启动、停止ASM实例
asmadminsysadmin挂载、卸载磁盘组,管理其他存储设备
backupdbasysbackup启动关闭和执行备份恢复(19c)
dgdbasysdg管理DataGuard(19c)
kmdbasyskmsyskm加密管理相关操作
racdbarac管理
11.用户创建和密码设置:
/usr/sbin/groupadd-g50001oinstall
/usr/sbin/groupadd-g50002dba
/usr/sbin/groupadd-g50003oper
/usr/sbin/groupadd-g50004backupdba
/usr/sbin/groupadd-g50005dgdba
/usr/sbin/groupadd-g50006kmdba
/usr/sbin/groupadd-g50007asmdba
/usr/sbin/groupadd-g50008asmoper
/usr/sbin/groupadd-g50009asmadmin
/usr/sbin/groupadd-g50010racdba
/usr/sbin/useradd-u50011-goinstall-Gdba,asmdba,asmoper,asmadmin,racdbagrid
/usr/sbin/useradd-u50012-goinstall-Gdba,oper,backupdba,dgdba,kmdba,asmdba,asmadmin,racdbaoracle
echo"oracle"|passwd--stdinoracle(实验暂时用简单密码,生产需更换成复杂密码)
echo"oracle"|passwd--stdingrid(实验暂时用简单密码,生产需更换成复杂密码)
chage-M-1grid
12.RAC两个节点和存储节点都需要设置主机名进行/etc/hosts文件修改:
注意:不能出现环回(loopback)地址。
vim/etc/:
yuminstallbind*bind-utilsbind-chroot-y
cp-rp/usr/share/doc//sample/var/*/var/named/chroot/var/
编辑主配置文件,添加876的zone参数
vim/var/named/chroot/etc/:
options
{
directory"/var/named";
listen-onport53{any;};
allow-query{any;};
};
zone"876"{
typemaster;
file"876";
};
zone"163.168.192."{
typemaster;
file"192.168.163.ptr";
};
zone"239.168.192."{
typemaster;
file"192.168.239.ptr";
};
新建876的域名解析文件
vim/var/named/chroot/var/named/876
$TTL1D
@(
0;serial
1D;refresh
1H;retry
1W;expire
3H);minimum
NS@
配置DNS反向解析
拷贝配置文件模板,新建域名解析反向解析文件
cp-p/var/named/chroot/var/named//var/named/chroot/var/named/192.168.239.ptr
:
$TTL1D
@(
0;serial
1D;refresh
1H;retry
1W;expire
3H);minimum
@
149
150
151
禁用bind默认启动方式,改用bind-chroot方式启动
systemctlstopnamed
systemctlstartnamed-chroot
systemctlrestartnamed-chroot
14.两个节点(racnode1和racnode2)和存储节点关闭selinux和系统防火墙:
systemctlstopfirewalld
mv/etc//root
vim/etc/ssh/:
UseDNSno
LoginGraceTime0
systemctlrestartsshd
17.配置共享存储openfiler:
openfiler汉化:
使用Vmwareworkstations软件创建虚拟机,添加另外的磁盘设备。
下载_64-的安装包和
汉化包,并且按照需要进行共享存储模拟软件的汉化。
登录图形界面:
浏览器地址栏中输入
输入账号:openfiler
输入密码:password
配置openfiler存储过程,需要有openfiler使用经验。只要映射出9个LUN分区即可。
18.两个节点(racnode1和racnode2)设置开机自动登录和挂载:
vim/etc//,在文件末尾添加以下内容:
/usr/bin/systemctlenableiscsid
/usr/bin/systemctlenableiscsi
/usr/bin/systemctldaemon-reload
/usr/bin/systemctlstartiscsid
/usr/bin/systemctlstartiscsi
/usr/sbin/:3260
/usr/bin/systemctlstartiscsid
/usr/bin/systemctlstartiscsi
/usr/bin/systemctlenableiscsid
/usr/bin/systemctlenableiscsi
if[`/usr/bin/|grep'received'|awk-F'''{print$4}'`=3][`/usr/sbin/
:3260|wc-l`=9];then
/usr/sbin/::3260-l;
/usr/sbin/::3260-l;
/usr/sbin/::3260-l;
/usr/sbin/::3260-l;
/usr/sbin/::3260-l;
/usr/sbin/::3260-l;
/usr/sbin/::3260-l;
/usr/sbin/::3260-l;
/usr/sbin/::3260-l;
else
exit0;
fi
/usr/sbin/oracleasmscandisks
/usr/sbin/oracleasmlistdisks
vim/usr/lib/systemd/system/,末尾添加上:
[Install]
WantedBy=
vim/etc/iscsi/
=manual
cp-p/etc/redhat-release{,.bak}
wq!保存退出
21.两个节点(racnode1和racnode2)引用兼容性系统变量
systemctlstopavahi-daemon
cp-p/etc/sysconfig/network{,.bak}
cp-p/etc/default/grub
grub2-mkconfig-o/boot/grub2/
systemctlstopntpd
systemctlstopchronyd
rm-rf/etc/
26.两个节点(racnode1和racnode2)依赖包配置及固定屏幕分辨率
cp-p/etc/security/{,.bak}
cp-p/etc//login{,.bak}
cp-p/etc/{,.bak}
sysctl-p
30.两个节点(racnode1和racnode2)扩容swap空间
ddif=/dev/zeroof=/home/oracle/swapfilebs=1Mcount=8192
chmod0644/home/oracle/swapfile
swapon-s
31.两个节点(racnode1和racnode2)设置swap文件开机自启动
设置开机自启动
blkid/home/oracle/swapfile
_261/java
cp-p/etc/profile{,.bak}
source/etc/profile
35.两个节点(racnode1和racnode2)创建grid用户登录脚本
_profile{,.bak}
39;
exportORACLE_SID=+ASM1
exportJAVA_HOME=/usr/local/java
exportORACLE_HOSTNAME=
exportORACLE_BASE=/u01/app/grid
exportGRID_HOME=/u01/app/19.3.0.0/grid
exportORACLE_HOME=/u01/app/19.3.0.0/grid
exportORACLE_PATH=/u01/app/oracle/common/sql
exportSQLPATH=/u01/app/common/oracle/sql
exportORACLE_TERM=xterm
exportNLS_DATE_FORMAT="yyyy-mm-ddHH24:MI:SS"
exportTNS_ADMIN=$ORACLE_HOME/network/admin
exportORA_NLS11=$ORACLE_HOME/nls/data
exportPATH=.:$PATH:$JAVA_HOME/bin:$ORACLE_HOME/bin:/usr/bin:/bin:/usr/local/bin:/u01/app/common/oracle/bin
exportLD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/oracm/lib:/lib:/usr/lib:/usr/local/lib
exportCLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib:$ORACLE_HOME/network/jlib
exportTHREADS_FLAG=native
exportTEMP=/tmp
exportTMPDIR=/tmp
umask022
if[$USER="oracle"]||[$USER="grid"];then
if[$SHELL="/bin/ksh"];then
ulimit-p16384
ulimit-n65536
else
ulimit-u16384-n65536
fi
umask022
fi
注意:其他节点把$ORACLE_SID和$ORACLE_HOSTNAME改成相应节点的值。
su–oracle
vim~/.bash_profile,添加下列内容:
aliasls="ls-Fa"
exportPS1="[`whoami`@`hostname`:"'$PWD]source~/.bash_profile
37.两个节点(racnode1和racnode2)创建Oracle基目录路径
mkdir-p/u01/app/19.3.0.0/grid
chown-Rgrid:oinstall/u01/app/oraInventory
mkdir-p/u01/app/oracle/product/19.3.0.0/dbhome_1
chmod-R775/u01
38.两个节点(racnode1和racnode2)更改所有Oracle安装所有者的ulimit设置
vim/etc/profile,添加以下内容:
if[$USER="oracle"]||[$USER="grid"];then
if[$SHELL="/bin/ksh"];then
ulimit-p16384
ulimit-n65536
else
ulimit-u16384-n65536
fi
umask022
fi
vim/etc/ssh/sshd_config
X11Forwardingno
su-grid
chmod-R700~/.ssh
touch~/.ssh/authorized_keys
~/.ssh/id_~/.ssh/authorized_keys
scp~/.ssh/authorized_:~/.ssh/authorized_keys
su–grid
sshracnode2“date;hostname”
“date;hostname”
注意:root和oracle用户需要做SSH互信。
42.两个节点(racnode1和racnode2)安装OracleASMLib软件包
上传_64.rpm
yuminstalloracleasm-y(相当于安装的是yuminstall-ykmod-oracleasm)
上传_64.rpm
/usr/sbin/oracleasmconfigure-i
依次输入gridasmadminyy
44.两个节点(racnode1和racnode2)加载oracleasm内核模块
/usr/sbin/oracleasmcreatediskCRSVOL1/dev/sdb1
/usr/sbin/oracleasmcreatediskCRSVOL3/dev/sdd1
/usr/sbin/oracleasmcreatediskDATAVOL2/dev/sdf1
/usr/sbin/oracleasmcreatediskFRAVOL1/dev/sdh1
/usr/sbin/oracleasmcreatediskFRAVOL3/dev/sdj1
46.两个节点(racnode1和racnode2)扫描和查看ASM磁盘
/usr/sbin/oracleasmlistdisks
47.两个节点(racnode1和racnode2)上传并解压Oracle软件
_193000_grid_/home/grid/software/oracle/
_193000_db_/home/oracle/software/oracle/
cd/home/grid
_193000_grid_
chown-Roracle:oinstallsoftware
cp-p/home/grid/software/oracle/cv/rpm//root/
exportCVUQDISK_GRP=oinstall
systemctlstoplibvirtd
cp-p/etc/sysconfig/network{,.bak}
route-n防止路由表中出现169.254.0.0的网段。
51.两个节点(racnode1和racnode2)修改自动挂载文件
vim/usr/lib/dracut//99base/:
mount-ttmpfs-omode=1777,noexec,nosuid,nodev,strictatime,size=3.9Gtmpfs/dev/shm/dev/null
注意:这个是为了解决PRVE-0421/etc/fstab中不存在用于装载/dev/shm的条目提示。
52.两个节点(racnode1和racnode2)修改文件解决验证/etc/完整性DNS超时PRVF-5636问题
vim/etc/:
53.两个节点(racnode1和racnode2)系统时间校时
时钟date设置:
date-s23:18:30;sshracnode2"date-s23:18:30"
setterm-blank0
55.两个节点(racnode1和racnode2)运行CVU手动检测集群配置
cd/home/grid/software/oracle
./,racnode2-methodroot输入root密码
56.两个节点(racnode1和racnode2)使用CVU验证硬件和操作系统设置
cd/home/grid/software/oracle
su–root
exportDISPLAY=192.168.163.149:0.0
exportDISPLAY=192.168.163.149:0.0
58.两个节点(racnode1和racnode2)进入安装目录
_193000_grid_/u01/app/19.3.0.0/grid
_193000_grid_
chown-Rgrid:oinstall*
oracleasmlistdisks
ln-s/usr/bin/scp/usr/local/bin/scp
59.两个节点(racnode1和racnode2)安装GRID
选择为新集群配置OracleGridInfrastructure(C)
网格即插即用选择:
创建本地SCAN
集群名称:racnode-cluster
SCAN名称:racnode-cluster-scan
SCAN端口:1521
60.两个节点(racnode1和racnode2)添加集群节点信息
选择添加—添加单个节点
公共主机名:
虚拟主机名:
输入grid用户的操作系统口令
注意:
出现INS-06006错误提示的时候,处理方法:
cd/home/grid/.ssh
ens33公用
oracleasmscandisks
su-grid
$crsctlcheckcrs
CRS-4638:OracleHighAvailabilityServicesisonline
CRS-4537:ClusterReadyServicesisonline
CRS-4529:ClusterSynchronizationServicesisonline
CRS-4533:EventManagerisonline
状态是ONLINE。
75.两个节点(racnode1和racnode2)使用asmca创建ASM磁盘组
exportDISPLAY=:0.0
xhost+
cd$ORACLE_HOME
./runInstaller
配置选项:
选择仅安装软件
数据库安装选项:
选择OracleRealApplicationClusters数据库安装。
节点选择:
全选
数据库版本:
选择企业版。
安装位置:
基目录选择:/u01/app/oracle
软件位置:/u01/app/oracle/product/19.3.0.0/dbhome_1
77.两个节点(racnode1和racnode2)设置操作系统组
数据库管理员OSDBA组:dba
数据库操作员OSOPER组:oper
数据库备份和恢复(OSBACKUPDBA)组:backupdba
DataGuard管理(OSDGDBA)组:dgdba
加密秘钥管理(OSKMDBA)组:kmdba
RealApplicationCluster管理(OSRACDBA)组:racdba
78.两个节点(racnode1和racnode2)使用root身份执行脚本
勾选自动运行配置脚本,并且输入root用户密码。
79.两个节点(racnode1和racnode2)保存响应文件
80.两个节点(racnode1和racnode2)确认root身份认证
安装过程中会确认是否使用root身份执行安装脚本,选择确定。
81.两个节点(racnode1和racnode2)查看服务状态
$su-grid-c"crsctlstatres-t"
82.两个节点(racnode1和racnode2)使用dbca命令创建数据库
$dbca
数据库操作:
选择创建数据库
部署类型:
选择高级配置
数据库类型选择:OracleRealApplicationCluster(RAC)数据库
配置类型:管理员管理的
数据库选择模板:一般用途或者事务处理
节点选择:
全选节点
83.两个节点(racnode1和racnode2)设置数据库标识
全局数据库名:
SID前缀:racdb
勾选创建为容器数据库PDB
勾选将本地还原表空间用于PDB
选择创建包含一个或者多个的容器数据库
PDB数量选1
PDB名称选择pdb
84.两个节点(racnode1和racnode2)选择存储选项
数据库文件存储类型选择:自动存储管理ASM
数据文件位置:+RACDB_DATA/{DB_UNIQUE_NAME}
勾选使用Oracle-ManagedFiles(OMF)
85.两个节点(racnode1和racnode2)快速恢复选项
勾选指定快速恢复区
恢复文件存储类型选择:自动存储管理ASM
快速恢复区选择:+FRA
勾选启用归档,并且勾选自动归档
归档日志文件格式:%t_%s_%
86.两个节点(racnode1和racnode2)配置选项
内存:
内存使用自动共享内存管理
系统总内存大小:7800(8G)
SGA:2340MB
PGA:780MB
即SGA+PGA占内存总大小的40%。并且SGA占75%,PGA占25%。
进程数:
默认块大小是8192BYTE,进程数是300。
字符集:
数据库字符集选择:ZHS16GBK
国家字符集选:AL16UTF16通用字符集
默认语言:简体中文
默认地区:中国
连接模式:共享服务器模式进程数1
87.两个节点(racnode1和racnode2)设置管理选项
勾选定期运行集群验证实用程序CVU检查
配置EnterpriseManager(EM)DatabaseExpress
EMDatabaseExpress端口:5500
勾选将EMDatabaseExpress端口配置为全局端口
88.两个节点(racnode1和racnode2)使用用户身份证明
所有账户使用同一管理口令,输入数据库用户的密码。
89.两个节点(racnode1和racnode2)选择创建数据库选项
勾选创建数据库
勾选生成数据库创建脚本。
90.两个节点(racnode1和racnode2)进行先决条件检查
选择下一步
91.两个节点(racnode1和racnode2)显示概要信息
选择保存响应文件—重命名响应文件,选择完成,进入数据库安装过程。
92.两个节点(racnode1和racnode2)Finish完成数据库Oracle19CRAC安装
93.客户端修改本地解析
Windows+x打开cmd管理员模式
notepad%windir%\system32\drivers\etc\hosts
添加DNS本地解析:
192.168.163.149
192.168.163.150
192.168.163.151
192.168.163.152
192.168.163.153
192.168.163.154
192.168.163.155
192.168.163.156
192.168.239.149
192.168.239.150
192.168.239.151
94.Oracle19CRAC客户端配置
在本地文件中加入下列内容:
RACDB=
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=1521))
(CONNECT_DATA=
(SERVER=SHARED)
(SERVICE_NAME=)
)
)
95.客户端使用PL/SQL连接
Windows+X打开命令提示符(管理员)
输入tnspingRACDB,确保结果为OK!
打开OraclePL/SQL客户端软件
选择用户名为sys
密码选择设置好的sys用户密码
数据库选择RACDB
角色选择sysdba
96.后记
佛为心,道为骨,儒为表,大度看世界;
技在手,能在身,思在脑,从容过生活。
三千年读史,不外功名利禄;
九万里悟道,终归诗酒田园!
走多远,不问双脚,问志向;看多远,不看眼睛,问胸襟!





