原文地址:https://oracle-base.com/articles/18c/read-only-oracle-homes-18c
原文作者:Tim Hall

Oracle 18C 引入了只读 Oracle 主目录的概念,其中所有配置和日志文件都可以与 Oracle 二进制文件分开保存。

目录

为什么要这么做?

对于其他一些产品,将配置与二进制文件分开是一种常见的做法。

  • Tomcat 具有软件所在的 CATALINA_HOME 和配置、应用程序文件和日志文件所在的 CATALINA_BASE 的概念。
  • WebLogic 安装的最佳实践是将配置(域和应用程序)保留在中间件主目录之外。
  • Oracle 数据库安装的最佳实践是将数据文件保存在 ORACLE_HOME 目录之外。

只读 Oracle 主目录的概念是数据库产品的自然演变,它可以在更新补丁和升级期间更轻松地在现有 Oracle 主目录之间进行克隆和切换,而无需查找所有其他配置文件。

先决条件

本文假设您已经安装了 Oracle 数据库 18C 的仅软件安装,如下所述:

注意在创建数据库实例之前停止。

启用只读 Oracle 主目录

roohctl 脚本(只读 Oracle Home CTL)用于启用只读 Oracle Home,通过下方例子演示:

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
$ cd $ORACLE_HOME/bin
$ ./roohctl -enable
Enabling Read-Only Oracle home.
Update orabasetab file to enable Read-Only Oracle home.
Orabasetab file has been updated successfully.
Create bootstrap directories for Read-Only Oracle home.
Bootstrap directories have been created successfully.
Bootstrap files have been processed successfully.
Read-Only Oracle home has been enabled successfully.
Check the log file /u01/app/oracle/cfgtoollogs/roohctl/roohctl-180728AM112212.log.
$

AI写代码bash

* 1
* 2
* 3
* 4
* 5
* 6
* 7
* 8
* 9
* 10
* 11

“homes” 和 “dbs” 目录已经在 ORACLE_BASE 目录下被创建 :

1
2
3
4
5
6
7
8
9
$ ls $ORACLE_BASE
cfgtoollogs checkpoints dbs diag homes product
$

AI写代码bash

* 1
* 2
* 3

在创建数据库之前,“dbs”目录将是空的,“homes”目录具有以下结构:

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
39
40
41
$ cd $ORACLE_BASE/homes
$ tree
.
└── OraDB18Home1
├── assistants
│ └── dbca
│ └── templates
├── dbs
├── install
├── network
│ ├── admin
│ ├── log
│ └── trace
└── rdbms
├── audit
└── log

13 directories, 0 files
$

AI写代码bash

* 1
* 2
* 3
* 4
* 5
* 6
* 7
* 8
* 9
* 10
* 11
* 12
* 13
* 14
* 15
* 16
* 17
* 18
* 19

创建数据库

启用只读 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
39
40
41
42
43
lsnrctl start

dbca -silent -createDatabase \
-templateName General_Purpose.dbc \
-gdbname ${ORACLE_SID} -sid ${ORACLE_SID} -responseFile NO_VALUE \
-characterSet AL32UTF8 \
-sysPassword SysPassword1 \
-systemPassword SysPassword1 \
-createAsContainerDatabase true \
-numberOfPDBs 1 \
-pdbName ${PDB_NAME} \
-pdbAdminPassword PdbPassword1 \
-databaseType MULTIPURPOSE \
-memoryMgmtType auto_sga \
-totalMemory 2000 \
-storageType FS \
-datafileDestination "${DATA_DIR}" \
-redoLogFileSize 50 \
-emConfiguration NONE \
-ignorePreReqs

AI写代码bash

* 1
* 2
* 3
* 4
* 5
* 6
* 7
* 8
* 9
* 10
* 11
* 12
* 13
* 14
* 15
* 16
* 17
* 18
* 19
* 20

检查文件系统

创建数据库后,将在新目录中创建文件,“dbs” 目录的内容如下所示(在一个可读写的 Oracle 主目录中,我们可以在 $ORACLE_HOME/dbs 目录下看到这些文件):

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
$ cd $ORACLE_BASE/dbs
$ tree
.
├── hc_cdb1.dat
├── initcdb1.ora
├── lkCDB1
├── orapwcdb1
└── spfilecdb1.ora

0 directories, 5 files
$

AI写代码bash

* 1
* 2
* 3
* 4
* 5
* 6
* 7
* 8
* 9
* 10
* 11

“homes” 目录的内容如下所示:

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
$ cd $ORACLE_BASE/homes
$ tree
.
└── OraDB18Home1
├── assistants
│ └── dbca
│ └── templates
├── dbs
├── install
├── log
│ ├── diag
│ │ └── adrci_dir.mif
│ └── localhost
│ └── client
│ └── tnslsnr_26425.log
├── network
│ ├── admin
│ ├── log
│ └── trace
└── rdbms
├── audit
└── log
├── cdb1_ora_26901.trc
├── cdb1_ora_27066.trc
├── cdb1_ora_27164.trc
├── cdb1_ora_27984.trc
├── cdb1_ora_27985.trc
├── cdb1_ora_29244.trc
├── cdb1_ora_29249.trc
├── opatch
│ ├── lsinv
│ │ ├── lsinventory2018-07-28_11-48-30AM.txt
│ │ ├── lsinventory2018-07-28_11-48-34AM.txt
│ │ ├── lsinventory2018-07-28_11-53-39AM.txt
│ │ ├── lsinventory2018-07-28_11-54-16AM.txt
│ │ ├── lsinventory2018-07-28_11-54-20AM.txt
│ │ └── lsinventory2018-07-28_11-58-00AM.txt
│ ├── opatch2018-07-28_11-48-30AM_1.log
│ ├── opatch2018-07-28_11-48-34AM_1.log
│ ├── opatch2018-07-28_11-53-39AM_1.log
│ ├── opatch2018-07-28_11-54-16AM_1.log
│ ├── opatch2018-07-28_11-54-20AM_1.log
│ ├── opatch2018-07-28_11-58-00AM_1.log
│ └── opatch_history.txt
├── qopatch.log
└── qopatch_log.log

19 directories, 24 files
$

AI写代码bash

* 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
* 39
* 40
* 41
* 42
* 43
* 44
* 45
* 46
* 47
* 48
* 49

路径和导航

“orabasetab” 文件包含 “/etc/oratab” 文件中的 ORACLE_HOME、ORACLE_BASE 和“$ORACLE_BASE/homes” 目录下的主目录名称之间的映射:

1
2
3
4
5
6
7
8
9
10
11
$ cat $ORACLE_HOME/install/orabasetab
#orabasetab file is used to track Oracle Home associated with Oracle Base
/u01/app/oracle/product/18.0.0/dbhome_1:/u01/app/oracle:OraDB18Home1:Y:
$

AI写代码bash

* 1
* 2
* 3
* 4

orabaseconfig 和 orabasehome 命令显示配置的有效位置,对于读写 Oracle 主目录,orabaseconfig 和 orabasehome 命令都返回 ORACLE_HOME 值。对于只读 Oracle 主目录,orabaseconfig 命令返回 ORACLE_BASE 位置。对于只读 Oracle 主目录,orabasehome 命令返回 “$ORACLE_BASE/homes” 目录下的相关路径:

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
39
40
41
42
43
44
45
# 读写 Oracle home.

$ . oraenv
ORACLE_SID = [cdb1] ?
The Oracle base remains unchanged with value /u01/app/oracle
$ $ORACLE_HOME/bin/orabaseconfig
/u01/app/oracle/product/18.0.0/dbhome_1
$ $ORACLE_HOME/bin/orabasehome
/u01/app/oracle/product/18.0.0/dbhome_1
$

# 只读 Oracle home.

$ . oraenv
ORACLE_SID = [cdb1] ?
The Oracle base remains unchanged with value /u01/app/oracle
$ $ORACLE_HOME/bin/orabaseconfig
/u01/app/oracle
$ $ORACLE_HOME/bin/orabasehome
/u01/app/oracle/homes/OraDB18Home1
$

AI写代码bash

* 1
* 2
* 3
* 4
* 5
* 6
* 7
* 8
* 9
* 10
* 11
* 12
* 13
* 14
* 15
* 16
* 17
* 18
* 19
* 20
* 21

如果 “$ORACLE_HOME/bin” 路径是 PATH 环境变量的一部分,我们可以如下导航:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ cd $(orabaseconfig)
$ pwd
/u01/app/oracle
$ cd $(orabasehome)
$ pwd
/u01/app/oracle/homes/OraDB18Home1
$

AI写代码bash

* 1
* 2
* 3
* 4
* 5
* 6
* 7