如何Oracle Database 19c 配置 Linux 服务器的持久内存上运行
原文地址:How to configure Linux Server to run Oracle Database 19c on Persistent Memory
原文作者: Alain Fuhrer
持久内存简介
在过去的几年里,存储介质变得越来越先进和快速。如今,SSD 磁盘几乎成为标准存储,如果 Oracle 数据库确实具有 I/O 关键工作负载,则通常使用 nvme 存储。
数据库存储的最新发展是持久内存,与 nvme 相比,它改善了延迟和 I/O 吞吐量。Oracle 也认识到了 PMEM 的优势,它也被用于最新一代的 Exadata。
持久内存上的 oracle 数据库最重要的特点之一是 SGA 和数据文件之间没有物理 I/O,但块是由内存分配的复制,速度无与伦比。
在本文的后续部分中,我将展示如何在持久内存上创建 Oracle 数据库 19c 以及适用哪些限制。
Oracle 19c 和持久内存的限制
PMEM 和 Oracle 19c 仍有一些限制。使用 21c 简化了配置,但 21c 是一个创新版本,因此大多数数据库仍然在 19c 版本上运行。因此,此处显示了此设置。以下限制适用:
您必须至少在 19.12 版上
您的数据库必须在企业版上运行
APP Direct 模式下的 PMEM 仅支持版本 19c 的 Oracle Memory Speed Filesystem。WHO 在 21c 中不是强制性的
每个数据库最多可以挂载 2 个 OMS 文件系统
配置
所以现在让我们从技术部分开始,以及我们如何准备操作系统和数据库在持久内存上运行
检查 PMEM 设置
我们在一个 4 插槽服务器上运行,每个插槽有 1 个 3TB 的 PMEM 模块。该模块可以在应用程序直接模式下使用,这允许我们在其上存储数据库文件。
以下查询显示了服务器配置。您会看到服务器在 AppDirect 模式下具有 3TB 的 RAM 和额外的 12TB 的 PMEM (4 x 3 TB)
ipmctl show -memoryresources
MemoryType | DDR | PMemModule | Total
=============================================================
Volatile | 3072.000 GiB | 0.000 GiB | 3072.000 GiB
AppDirect | - | 12168.000 GiB | 12168.000 GiB
Cache | 0.000 GiB | - | 0.000 GiB
Inaccessible | 0.000 GiB | 17.244 GiB | 17.244 GiB
Physical | 3072.000 GiB | 12185.244 GiB | 15257.244 GiB
ipmctl show -region
SocketID | ISetID | PersistentMemoryType | Capacity | FreeCapacity | HealthState
==================================================================================================
0x0000 | 0xfb7a7f48d30e2ccc | AppDirect | 3042.000 GiB | 0.000 GiB | Healthy
0x0001 | 0xdd287f48160d2ccc | AppDirect | 3042.000 GiB | 0.000 GiB | Healthy
0x0002 | 0xa8bd7f4889eb2ccc | AppDirect | 3042.000 GiB | 0.000 GiB | Healthy
0x0003 | 0xf5be7f48a2102ccc | AppDirect | 3042.000 GiB | 0.000 GiB | Health
为了使博客的配置更清晰,我将只配置 1 个模块
配置命名空间
PMEM 没有分区,我们必须在 PMEM 模块上配置命名空间。要在其上运行 oracle 数据库,我们必须使用默认模式“fsdax”,它允许我们使用 Linux 文件系统 (XSF / EXT4) 的 DAX(直接访问)功能
ndctl create-namespace
# Check created Namespace
ndctl list -u
[
{
"dev":"namespace1.0",
"mode":"fsdax",
...
# Reconfiguring the NVDIMM namespaces from a different mode to fsdax can be done with this command
ndctl create-namespace --force --reconfig=namespace1.0 --mode=fsdax --map=mem
ndctl list -u
[
{
"dev":"namespace1.0",
"mode":"fsdax",
...
在第一个 PMEM 设备上创建命名空间后,我们将看到一个设备 /dev/pmem0
设置直接访问 (DAX) 文件系统
XFS 文件系统具有支持 DAX 的挂载功能。确保 XFS 使用 HugePages 映射创建从 PMEM 设备中的物理页面到虚拟页面的映射。
为此,我们必须通过将条带单元大小 (su) 指定为 2 MB 并将条带宽度大小 (sw) 指定为 1 来格式化设备。
# reflink option must be disabled, because reflink and dax do not work together
mkfs.xfs -m reflink=0 -d su=2m,sw=1 /dev/pmem0
# Mount Device with DAX option.
# Don't forget to configure the mount in /etc/fstab that he is still available after a reboot
mount -o dax /dev/pmem0 /mnt/pmem0
# verify Mount
mount | grep dax
# Sample Output. Its important that the mount option is dax=always
mount | grep dax
/dev/pmem0 on /mnt/pmem0 type xfs
(rw,relatime,attr2,dax=always,inode64,logbufs=8,logbsize=32k,sunit=4096,swidth=4096,noquota)
为 Oracle Memory Speed Filesystem (OMS) 创建 Uber 文件
uber 文件类似于传统的基于内核的文件系统中的卷。uber文件存储了Oracle Memory Speed Filesystem
的所有元数据和数据。uber文件与一个Oracle实例是一一对应的关系。您可以通过使用 Oracle 实例标识符 (SID) 结束 uber 文件名来正式建立关联。在我们的示例中,我们将创建数据库ORAPMEM
# create uber file with fallocate
fallocate -l 800G /mnt/pmem0/omsuberfile.ORAPMEM (Size must be an exact multiple of 2MB)
# Change Permission of OMS uber File to oracle:oinstall
chown oracle:oinstall /mnt/pmem0/omsuberfile.ORAPMEM
chmod 644 /mnt/pmem0/omsuberfile.ORAPMEM
# Check that extents are correctly aligned on 2MB boundaries
xfs_bmap /mnt/pmem0/omsuberfile.ORAPMEM
# Sample Output (Extent Num:[Start Offset..End Offset]:Start block..End Block)
/mnt/pmem0/omsuberfile.test:
0: [0..4095]: 1765978112..1765982207
1: [4096..16773119]: 1765982208..1782751231
2: [16773120..20971519]: 1782751232..17869496
为 OMS 文件系统创建挂载点
下一步是为 oms 文件系统准备一个挂载点。挂载点必须满足以下要求:
挂载目录必须有数据库的 SID 名称
该目录必须具有只读权限。使用读/写我们将在挂载命令期间收到错误
mkdir -p /u03/oms_fs1/oracle/oradata/ORAPMEM
chmod -wx /u03/oms_fs1/oracle/oradata/ORAPMEM
chown -R oracle:oinstall /u03
使用 DBCA 准备数据库创建脚本
下一步是使用 dbca 为数据库创建数据库脚本。重要的是要知道,只能使用 dbca 而不是数据库生成脚本。原因是,此时 /etc/oratab 中不存在数据库,只要服务器上不存在数据库,我们就无法为数据库文件创建和挂载 OMS 文件系统。此限制仅适用于 Oracle 19c,因为对于 Oracle 21c,oms 文件系统不再是强制性
的 根据Oracle 支持说明 2795728.1 ,使用 dbca 进行设置期间的重要步骤
- 选择高级设置
- 选择单实例数据库
- 事物模板通用或事务处理
- 在本例中设置 DB 名称 LI99DB02
- 创建为非容器数据库
- 将存储属性设置为文件系统,并将您准备的挂载点 /u03/omsfs_1/oradata/{DB_UNIQUE_NAME} 作为数据库文件位置
- 使用 OMF
- 取消选择“创建数据库”和“另存为数据库模板”
- 选择“生成数据库创建脚本”
- 单击完成以存储脚本
检查已创建的 Init.ora 并验证“db_file_create_dest”参数是否设置为 OMS 文件系统的挂载点 (/u03/omsfs_1/oradata/{DB_UNIQUE_NAME})
在 Oracle 二进制文件中链接 OMS
我们必须将 OMS 功能链接到内核中,因为在 oracle 二进制文件中默认情况下不会激活 OMS
export ORACLE_HOME=/u00/app/oracle/product/19.0.0.0.0.F
export ORACLE_SID=ORAPMEM
export LD_LIBRARY_PATH=/u00/app/oracle/product/19.0.0.0.0.F/lib
cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk oms_on
启动 OMS 守护进程
在启动时,OMS 守护进程创建一个共享内存段供 OMS 独占使用。每个实例将创建一个守护进程。
因此,您必须在启动 OMS 守护程序之前设置实例标识符 (SID)。
您不应手动删除共享内存段或删除/编辑配置文件。
守护程序的跟踪文件位于 $ORACLE_BASE/diag/oms。
在服务器重新启动之前运行的所有守护程序将在重新启动后重新启动。
验证 LD_LIBRARY_PATH 是否设置为 $ORACLE_HOME/lib,因为如果没有,您会在守护进程启动期间收到以下错误
./oms_daemon: error while loading shared libraries: libclntsh.so.19.1: cannot open shared object file:No such file or directory
export ORACLE_SID=ORAPMEM
$ORACLE_HOME/bin/oms_daemon
# Sample Output
Starting daemon as a detached background.
OMS binary located at /u00/app/oracle/product/19.0.0.0.0.F/bin/oms_daemon
OMS daemon startup: oms_test successfully created
OMS daemon creating tracefile
/u00/app/oracle/diag/oms/ORAPMEM_oms_20758.trc
创建并挂载 OMS 文件系统
现在我们准备好创建和挂载 OMS 文件系统。为此,oracle 提供了一个名为“omsfscmds”的实用程序。
如果我尝试从 $ORACLE_HOME/bin 目录启动该工具,我会收到一些库丢失的错误。
经过一番研究,我发现你必须安装一个额外的包。这在 oracle 支持中没有记录。
yum install librdmacm
现在我们可以运行 omsfscmds 并创建和挂载文件系统
# create and mount file system
$ORACLE_HOME/bin/omsfscmds
OMS> mkfs /mnt/pmem0/omsuberfile.ORAPMEM
OMS:mkfs:No blocksize specified, using 4K
OMS:mkfs: Device /mnt/pmem0/omsuberfile.ORAPMEM formatted with blocksize 4096
OMS> mount /mnt/pmem0/omsuberfile.ORAPMEM /u03/oms_fs1/oracle/oradata/ORAPMEM
OMS:mount: Mounted /mnt/pmem0/omsuberfile.ORAPMEM at /u03/oms_fs1/oracle/oradata/ORAPMEM
# Check if Filesystem is correctly mounted
OMS> lsmount
fsindex : 0
Mountpt : /u03/oms_fs1/oracle/oradata/ORAPMEM
Deviceid: /mnt/pmem0/omsuberfile.ORAPMEM
创建数据库并享受性能?
如果文件系统挂载成功,可以执行准备好的脚本在OMS文件系统上创建数据库。
在接下来的几天里,我将在 PMEM 上使用 oracle 进行一些基准测试